Upload
ignacio-santos-marquez
View
216
Download
1
Embed Size (px)
Citation preview
1
Resolución de problemas con Python Características de software
que guían este curso Herramientas
Mantenibilidad Legibilidad Semántica (identificadores), documentación, subprogramación, diseño…
Reusabilidad Subprogramación, diseño
Robustez ≈eficacia Condicionales
(Eficiencia) Diseño
2
U4Condicionales y gestión
de excepciones¡¡¡¡A por la robustez!!!!
3
Datos
problema
simple
entero realcarácterbooleano
Ingeniero = Oreja+catalejomodelo
orde
nado
r
solución
asignación/referencia
Llamada procedimiento
whilefor Do while
if c: bloque1[ else: bloque2]
n bucles
0 o 1alternativas
1 o n0 o n
iterativo
n conocido
recursivo
n desconocido
case
gestión excepciones
Subprogramación
procedimiento
barajar complejidad
Proceso
hacer
función
Disponible en todos los lenguajesFrecuente en otros lenguajes y no disponible en PythonDisponible en Python, no frecuente en otros lenguajes
compuesto
arregloLista/tupla
EstructuratuplaNombre/record/clase
fichero
cadena
1secuencias
Pregunta 10 del test
4
Como seguimos las instrucciones, hoy por hoy
5
Tipo de datos simple{dominio}
Objeto dato definido sobre un dominio, y sus operaciones
tipo objeto dominio operaciones
mes 7 ={1,2,3,4….12} siguiente, anterior, número_días
diaSemana martes {lunes,…domingo} siguiente, anterior, ¿laborable?
sueldo 1275,43 salarioMinimo<=s<=80.000 +,-,*,%....¿cobrado?...
ComponenteColor 145 0<=componenteColor<=255 +,-,maximizar, anular…
6
Implicaciones: a) Piensa en un “dato compuesto”, por ejemplo, y que se pueda modificar uno de sus componentes sin
re-asignar/re-referenciar el “dato compuesto”
b
b = [1,2,3,4] 1 2 3 4b
a =b
a
1 2 3 4 a [1]=8
ba
1 8 3 4
b = [1,2,3,4] 1234
1234
a =b1234
1234
1834
a [1]=8
Asignación: son posiciones independientes
no afecta a b
Referenciación: son 2 nombres para la misma posición b[1]=8 efecto lateral
6Python llama mutables a los TD compuestos, para los que da servicio de modificar elementos individuales, sin re-referenciar el dato completo, les. Los tipos que sólo pueden cambiar su valor con referenciación los llama inmutables
Asignación versus Referenciaciónotros lenguajes Python
7
Datos
problema
simple
entero realcarácterbooleano
Ingeniero = Oreja+catalejomodelo
orde
nado
r
solución
asignación/referencia
Llamada procedimiento
whilefor Do while
if c: bloque1[ else: bloque2]
n bucles
0 o 1alternativas
1 o n0 o n
iterativo
n conocido
recursivo
n desconocido
case
gestión excepciones
Subprogramación
procedimiento
barajar complejidad
Proceso
hacer
función
Disponible en todos los lenguajesFrecuente en otros lenguajes y no disponible en PythonDisponible en Python, no frecuente en otros lenguajes
compuesto
arregloLista/tupla
EstructuratuplaNombre/record/clase
fichero
cadena
1secuencias
8
Condicionales
Barcelona
Roma por Cádiz
Roma por Santander
Roma por Portugal
Gas
olin
era
Santander
Cádiz
M40
R2-Alcalá
A2-Alcala
SI condicion: ….ENTONCES SI condicion ENTONCES…. SINO CASO de que ordinal HAZ
9
Condicionales o alternativas 0-1 veces(el cuerpo)
Hasta ahora: instrucciones secuenciales {referenciación + llamada a procedimientos} todas se hacían exactamente una vez
if expresion_bool: cuerpo1else: cuerpo2
Símbolo inicial y terminal
Proceso
Entrada/Salida
Decisión
Dirección del flujo
Conector de líneas de flujo
Conector entre dos páginas
año
esBisiesto? 365366
Diagrama de flujoSintaxis
10
Diseño de casos de prueba
Una fábrica funciona ininterrumpidamente (7dias*24horas). Se desea calcular el tiempo, expresado en horas y minutos, que ha trabajado un empleado, sabiendo el momento de entrada y el de salida (expresados en horas y minutos). Un trabajador no puede trabajar más de 8 horas seguidas, de modo que el momento de entrada y el de salida, corresponden al mismo día (si entrada <= que la salida) o a días consecutivos (en caso contrario). Caso de haber trabajado más de 8 horas, el programa dará una alerta. Completa las salidas esperadas (valores de x e y) en los siguientes casos de pruebas:
Caso prueba
11:00|11:15 12:33|20:33 12:30|14:15 23:00|2:13 23:55|2:15 6:15|19:30
Salida deseada
xh, ym xh, ym xh, ym xh, ym xh, ym xh.ym ¡¡ALERTA!!
11
Diseño de casos de pruebaMayor de dos números, o iguales
Prográmalo Inicio
A,B
A>B A
SÍ
B>A
NO
B
NO
SÍ
Son iguales
Fin
"""********************************************** PROGRAMA: MayorDe2numeros.py *
* OBJ: pide 2 números e indica cual es el mayor, o si son iguales *
*********************************************"""
a = float(input('primer número: '))
b = float(input('segundo número: '))
if a>b:print ('el primero es mayor', a)
else:
if b>a: print ('el segundo es mayor',b) else:print ('son iguales:',b)
Diseño de casos de prueba
a b c Salida
3.0 3.0 3.03.0 3.0 2.03.0 2.0 3.02.0 3.0 3.03.0 4.0 5.0
-2. X X 1
1.0 2.0 6.0
[1] Probamos sólo un lado, porque en el capítulo siguiente aprenderemos a reusar el código que pide un lado. Si no es así, habrá que probar las tres entradas
Tipo triángulo
13
Eficiencia ¿son manías?Tipo triángulo
versión Máximo Medio Tiempo V1 28 28*99=2772 8,4 V2 12 12*99=1188 3,6 V3 5 2*(33+33/2)+5(33+33/2)=346,5 1.05 V4 4 2*33+4*66=330 1
Si tu oficio fuera el transporte y existieran dos tipos de carburante, tales que con uno
fueras de Madrid a Barcelona en 1 hora y en 8,4 horas con el otro, ¿cuál elegirías?
Si tuvieras que contratar a un programador para tu empresa, y de los dos candidatos, uno que programa al estilo de v1 y otro al de la v4 ¿a cuál contratarías?
14
"""********************************************************************** PROGRAMA: segundoGrado **OBJ: raíces de ecuación ax**2+bx+c=0, a,b,c introducidos por usuario **********************************************************************"""from math import sqrt
try: a = float(input('a: ')) b = float(input('b: ')) c = float(input('c: ')) r = sqrt(b**2-4*a*c) x1 = (-b+r)/2.0/a x2 = (-b-r)/2.0/a print('x1 =',x1,' x2 = ',x2)
except: print('estos datos dan problemas')
Gestión de excepcionesax2+bx +c=0, a
acbbraiz
2
42
N=int(imput(‘entero’)
15
"""*********************************************************************** PROGRAMA: segundoGrado **OBJ: raíces de ecuación ax**2+bx+c=0, a,b,c introducidos por usuario ***********************************************************************"""from math import sqrttry: a = float(input('a: ')) b = float(input('b: ')) c = float(input('c: '))except ValueError: print('los valores han de ser numéricos')else: try: r = sqrt(b**2-4*a*c) x1 = (-b+r)/2.0/a x2 = (-b-r)/2.0/a print('x1 =',x1,' x2 = ',x2) except ZeroDivisionError: if b!=0: print('ecuación primer grado. x=', -c/b) elif c==0: print ('la ecuación tiene infinitas soluciones') else: print('la ecuación no tiene solución') except ValueError: print('no tiene raíces reales') except: print('estos datos dan problemas')
16
Evitar condicionales anidados"""********************************************************************** PROGRAMA: estacion.py ** Obj: estación del año correspondiente dia/mes dados por usuario ** OJO: no comprueba validez de la entrada * *********************************************************************"""
def estacion (d,m): """devuelve la estación que corresponde a d/m (dia,mes) * * 20/03 al 19/06 Primavera * * 20/06 al 21/09 Verano * * 22/09 al 20/12 Otoño * * 21/12 al 19/03 Invierno PRE dia, mes formarían parte de una fecha válida """ plana=mes*100+dia #agrupo para comparar de una vez if plana<=319:estacion = 'invierno' elif plana<=619:estacion = 'primavera' elif plana<=921:estacion = 'verano' elif plana<=1221:estacion = 'otoño' else: estacion = 'invierno' return estacion
#Probadordia = int(input('día: '))mes = int(input('mes: '))# aqui iría la validación de fechaprint ('la estación de',dia,'/',mes,'es', estacion(dia,mes))
17
Bucle definido
""" ************* Tabla de multiplicar del n ****************** """
n = int(input('introduzca el num de la tabla deseada, entre 0 y 10: '))
for i in range(1,10+1): print (n, '*','%2d'%i,'=', i*n)
for e in s: cuerpo
Rage es un generador de secuencias en un rango desde (incluido).. hasta (excluido)
18
Pendiente de temas anteriores
• U1: Errores en tiempo de traducción/ejecución• U2: Lenguajes con fuerte control de tipo/sin control• U3: REVISAR referenciación/asignación