Resolución de problemas con Python 1 Características de software que guían este curso...

Post on 25-Jan-2016

219 views 1 download

Transcript of Resolución de problemas con Python 1 Características de software que guían este curso...

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

B>A

NO

B

NO

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