Está en la página 1de 10

Cap tulo 4 Estructuras de control

Los programas que se han hecho hasta el momento presentan siempre una misma secuencia de acciones: Se piden datos al usuario, asignando a variables valores obtenidos con raw input Se efectan clculos con los datos introducidos por el usuario, guardando el resultado u a en variables (mediante asignaciones). Se muestran en pantalla los resultados almacenados en variables (mediante la sentencia print) Es posible alterar el ujo de ejecucin de los programas para hacer que tomen decisiones o a partir de los datos y resultados intermedios y ejecuten ciertas sentencias y otras no. El primer tipo de alternacin del ujo de control se efecta con sentencias condicionales o u o de seleccin y el segundo tipo con sentencias iterativas o de repeticin. Las sentencias que o o permiten alterar el ujo de ejecucin se engloban en las denominadas estructuras de control o de ujo.

4.1.

Sentencias condicionales

Cmo hacer que cierta parte del programa se ejecute o deje de hacerlo en funcin de o o una condicin determinada? Los lenguajes de programacin convencionales presentan una o o sentencia especial cuyo signicado ser Al llegar a este punto, ejecuta estas) accines) slo a o o si esta condicin es cierta. Este tipo de sentencia se denomina condicional o de seleccin y o o en Python es de la siguiente forma:

43

44 if condicin: o accin o

CAP ITULO 4. ESTRUCTURAS DE CONTROL

Vease un ejemplo. Diseese un programa para resolver cualquier ecuacin de primer grado n o de la forma ax + b = 0 Donde x es la incgnita. Los pasos a seguir sern: o a 1. Pedir el valor de a y b (d gase que son de tipo otante). 2. Calcular el valor de x como
b a

3. Mostran en pantalla el valor de x a=float(raw_input(Valor de a: )) b=float(raw_input(Valor de b: )) x=-b/a print Solucion: ,x El programa no funciona bien cuando a vale 0, se produce un error de divisin por cero. o En la medida de lo posible se ha de tratar de evitar los errores en tiempo de ejecucin: se o detiene la ejecucin del programa y se muestran mensajes de error poco comprensibles para o el usuario del programa. Si al escribir el programa se ha previsto una solucin para todo o posible error de ejecucin, se puede tomar el control de la situacin en todo momento. Por o o lo que el programa ser: a a=float(raw_input(Valor de a: )) b=float(raw_input(Valor de b: )) if a=0: x=-b/a print Solucion: ,x if a==0: print La ejecucin no tiene solucin o o Analizando detenidamente las l neas del programa. En la l nea 4 aparece la sentencia condicional if seguida de lo que debe ser una condicin. La condicin se lee fcilmente si se o o a sabe que = signica distinto de, por lo que la l nea ser si a es distinto de 0. La l a nea que empieza con if debe nalizar obligatoriamente con dos puntos y se debe dejar un sangrado despus de los dos puntos. Esta mayor identacin indica que la ejecucin de estas dos l e o o neas

4.1. 1

45

depende de que se satisfaga la condicin a = 0. Slo cuando sta es cierta se ejecutan las o o e l neas de mayor sangrado. As pues, cuando a valga cero esas l neas no se ejecutarn, evitando a de este modo el error de divisin por cero. Las dos ultimas l o neas empiezan, con una sentencia condicional donde en lugar de =, el operador de comparacin utilizado es ==. La sentencia o se lee si a es igual a 0. Es importante destacar que es == y no = unicamente, que es un error bastante comn. u

4.1.1.

Sentencias condicionales anidadas

Las estructuras de control pueden anidarse, es decir, aparecer unas dentro de otras. El programa que se mostr como ejemplo quedar o a: a=float(raw_input(Valor de a: )) b=float(raw_input(Valor de b: )) if a=0: x=-b/a print Solucion: ,x if a==0: if b=0: print La ecuacion no tiene solucion if b==0: print La ecuacion tiene infinitas soluciones Recuerda que en los programas en Python la identacin determina de que sentencia o depende cada bloque de sentencias. Para aanzar los conceptos presentados, se presenta otro ejemplo para resolver ecuaciones de segundo grado que tienen la forma: ax2 + bx + c = 0 (4.1)

Cules son los datos del problema? Los coecientes a, b y c. Que se desea calcular? Los a valores de x que hacen cierta la ecuacin. Dichos valores son: o

b2 4ac 2a b b2 4ac x2 = 2a x1 =

b +

(4.2) (4.3)

Un problema que se debe considerar es la divisin por cero que tiene lugar cuando a vale o 0. Trtese de evitar el problema de la divisin por cero del mismo modo que antes, pero a o

46

CAP ITULO 4. ESTRUCTURAS DE CONTROL

mostrando un mensaje distinto, pues cuando a vale 0 la ecuacin no es de segundo grado, o sino de primer grado. from math import sqrt a=float(raw_input(Valor de a: )) b=float(raw_input(Valor de b: )) c=float(raw_input(Valor de c: )) if a=0: x1=(-b+sqrt(b**2-4*a*c))/(2*a) x2=(-b-sqrt(b**2-4*a*c))/(2*a) print x1=%4.3f y x2=%4.3f %(x1,x2) if a==0: print No es una ecuacin de segundo grado o

4.1.2.

En caso contrario

Hasta el momento se ha desarrollado sentencias condicionales que conducen a ejecutar una accin si se cumple una condicin y a ejecutar otra si esa misma condicin no se cumple: o o o if condicin: o acciones if condicin contraria: o otras acciones Este tipo de combinacin es muy frecuente, hasta el punto de que se ha incorporado al o lenguaje de programacin una forma abreviada que signica lo mismo: o if condicin: o acciones else otras acciones La palabra else signica si no o en caso contrario. Es muy importante que se respete la identacin, las acciones siempre un poco a la derecha y el if y el else, alineados en la misma o columna. De esta manera, el programa queda: from math import * a=float(raw_input(Valor de b=float(raw_input(Valor de c=float(raw_input(Valor de if a=0:

a: )) b: )) c: ))

4.1. 1 x1=(-b+sqrt(b**2-4*a*c))/(2*a) x2=(-b-sqrt(b**2-4*a*c))/(2*a) print x1=%4.3f y x2=%4.3f % (x1,x2) else: if b=0: x=-c/b print Solucion de la ecuacion: x=%4.3f %x else: if c=0: print La ecuacion no tiene solucin o else: print La ecuacin tiene infinitad soluciones o

47

Aparecen sentencias condicionales anidadas en otras sentencias condicionales que, a su vez, estn anidadas. Ahora que se sabe utilizar sentencias condicionales, procedemos hacer a un programa que calcule el mximo de una serie de nmeros. Para empezar hay que pedir a u dos nmeros enteros y mostrar en pantalla cul es el mayor de los dos. u a A continuacin se introducir una nueva estructura sintctica planteando un nuevo proo a a blema. Imag nese que se tiene un programa que a partir del radio de una circunferencia calcula su dimetro, per a metro o rea. Slo se requiere mostrar al usuario una de las tres a o cosas. Vase este ejemplo: e

from math import * radio =float(raw_input(Da el radio del circulo: )) #Menu print Escoge una opcin: o print a) Calcular el dimetro a print b) Calcular el permetro print c) Calcular el rea a opcion = raw_input(Teclea a, b o c) if opcion ==a: #calculo del diametro diametro=2*radio printEl diametro es,diametro else: if opcion ==b: #calculo el perimetro perimetro=2*pi*radio print El perimetro es, perimetro else: if opcion ==c #calculo de area area=pi*radio**2 print El area es, area

48

CAP ITULO 4. ESTRUCTURAS DE CONTROL

4.1.3.

Forma compacta para estructuras condicionales elif )

En el programa enterior se presenta un problema de esttica, ya que este programa e se puede escribir de manera ms elegante. La serie de l a neas que permiten seleccionar el clculo que hay que efectuar en funcin de la opcin de men seleccionada. Cada opcin a o o u o aparece indentada ms a la derecha que la anterior, as que el clculo del rea acaba con a a a tres niveles de sangrado. Qu ocurrir si se tiene que elaborar un men muy complicado e a u con muchas opciones? El sangrado terminar tan a la derecha, que leer el programa se har a a complicad simo. El compilador de Python permite una forma muy compacta de expresar fragmentos de cdigo de la siguiente forma: o if condicin: o else: if condicin: o Si se tiene un else inmediatamente seguido por un if, todo se puede escribir de la siguiente manera: if condicion: elif otra condicin: o Por lo que se ahorra un espacio de sangrado. El ultimo programa se covierte en: from math import * radio =float(raw_input(Da el radio del circulo: )) #Menu print Escoge una opcin: o print a) Calcular el dimetro a print b) Calcular el permetro print c) Calcular el rea a opcion = raw_input(Teclea a, b o c) if opcion ==a: #calculo del diametro diametro=2*radio printEl diametro es,diametro elif opcion ==b: #calculo el perimetro perimetro=2*pi*radio print El perimetro es, perimetro

4.2. SENTENCIAS ITERATIVAS else opcion ==c #calculo de area area=pi*radio**2 print El area es, area else: printsolo hay tres opciones a,b o c Otro ejemplo ms sencillo del uso de condicionales, a x=-1 if x<0: print "Negativo" elif x<5: print "Pequeno" else: print "Grande"

49

4.2.
4.2.1.

Sentencias iterativas
La sentencia while

En ingls while signica mientras. Esta sentencia se utiliza en: e while condicion: accin o accin o accin o El signicado en Python tiene el signicado Mientras se cumpla esta condicin, repite o estas acciones. Las sentencias que denotan este repeticin se denominan bucles. Los bucles o son muy utiles a la hora de confeccionar programas, pero tambin son engaosos, se corre el e n riesgo que no nalicen nunca. Ejemplo: i=0 while i<10: print i La condicin del bucle siempre se satisface, dentro del bucle nunca se modica el valor o de i y si i no se modica, jams llegar a 10. La computadora empieza a mostrar el nmero a a u

50

CAP ITULO 4. ESTRUCTURAS DE CONTROL

0 una y otra vez, sin nalizar nunca. Se tiene entonces un ciclo innito. Cuando se ejecuta un bucle sin n, la computadora se queda como suspendida y nunca devuelve el control. Ahora que se ha presentado lo fundamental de los bucles, resulvanse algunos ejemplos e concretos. Hgase un programa que calcule la suma de los 1000 primeros nmeros, es decir, a u un programa que calcule la sumatoria:
1000 i=1

(4.4)

El programa queda de la siguiente manera: sumatoria=0 i=1 while i<=1000: sumatoria += i i+=1 print sumatoria z u Vamos a construir un algoritmo1 que resuelva la ra cuadrada de un nmero. Una posible forma podr consistir en tomar un segmento que va de 0 a y. Luego cortamos a la mitad a este segmento y y a este nuevo punto lo llamamos x0 . De nuevo cortamos el intervalo que va de 0 a x0 e iteramos este proceso. Este mtodo se puede generalizar y llegar al mtodo e e de biseccin. Es decir, x0 = y/2, si dividimos el intervalo de nuevo, x0 < y de donde o y y y 1 > y = y. Luego denimos x1 = 2 (x0 + x ). De esta forma vemos que el proceso de x iteracin queda dado por: o y 1 xn+1 = (xn + ) 2 xn El algoritmo se ve como: y=nmero al que queremos sacar raz u x0=y/2 x1=1/2(x0+y/x0) x2=1/2(x1+y/x1) ... Ejemplo: Calculemos la ra cuadrada de 9. z

Se puede decir que un algoritmo es una serie de pasos que describen un proceso detalladamente.

4.2. SENTENCIAS ITERATIVAS

51

y=9 9 x0 = = 45 2 9 y =2 = x0 45 1 1 (45 + 2) = (65) = 325 = x1 2 2 9 y = 28 = x1 325 ... El cdigo quedar de la siguiente forma: o a #raices cuadradas y=float(raw_input(Da el numero y: )) # y=25 x=1.0 i=0 while i<10: x_nuevo=1./2.*(x+(y/x)) print i, x_nuevo x=x_nuevo i+=1 Algo que es notorio es ver que el programa converge sumamente rpido. El algoritmo a tiene una convergencia cuadrtica, es decir, que la convergencia se duplica a cada paso. Es a un algoritmo muy sencillo, por lo que es muy eciente. Un ejemplo bastante sencillo que nos muestra la sentencia while es la serie de Fibonacci: a, b = 0, while b < print a,b = 1 10: b b, a+b

4.2.2.

Bucle for-in

Hay otro tipo de bucle en Python, el bucle for-in, que se puede interpretar como para todo elemento de una serie, hacer una accin. Un bucle for-in presenta el siguiente aspecto: o

52 for variable in serie de valores: accin o accin o Vese el siguiente ejemplo: a

CAP ITULO 4. ESTRUCTURAS DE CONTROL

numero=int(raw_input(Da un nmero)) u print %d elevado a %d es %d % (numero, print %d elevado a %d es %d % (numero, print %d elevado a %d es %d % (numero, print %d elevado a %d es %d % (numero,

2, 3, 4, 5,

numero**2) numero**3) numero**4) numero**5)

Con el bucle for-in se puede resumir este programa: numero=int(raw_input(Da un entero)) for potencia in [2,3,4,5]: print %d elevado a %d es %d print % (numero, potencia, numero**potencia) El bucle se lee de forma natural de la siguiente manera: para toda potencia de la serie de valores 2,3,4 y 5, haz la siguiente accin. o La funcin range devuelve una lista de nmero enteros. Vease el siguiente ejemplo: o u for i in range(1,6): print i Al ejecutar el programa se ver en la pantalla los nmeros del 1 al 5. La lista que devuelve a u range es usada pr el bucle for-in como serie de valores a recorrer.