Estructuras de Control en Programación
Estructuras de Control en Programación
Hasta este punto se han desarrollado algoritmos que son muy sencillos por su estructura
secuencial, en donde las instrucciones se ejecutan una sola vez en el orden en que están
escritas. La forma general de este tipo de algoritmos es la siguiente:
1. Obtener datos.
2. Calcular resultados parciales.
3. Calcular resultados finales.
4. Imprimir los resultados.
5. Fin de algoritmo.
Estos algoritmos tienen un flujo de control secuencial. Flujo de control se refiere al orden
de ejecución de las instrucciones individuales de un algoritmo. En los algoritmos
secuenciales, o de flujo lineal, las instrucciones se efectúan una después de otra desde el
inicio hasta el final del algoritmo. Cuando un programa requiera la modificación del flujo
lineal se deben utilizar estructuras de control.
La mayoría de los algoritmos prácticos son no secuenciales, y no siguen este patrón, por lo
que requieren de dos estructuras de control muy importantes: la decisión y la repetición.
Las estructuras de control son condicionales, lo que significa que su funcionamiento está
controlado por condiciones booleanas, simples o compuestas. Por tanto, antes de empezar
el estudio de las estructuras control se sugiere al estudiante regresar a revisar el tema
[Link] DATOS LÓGICOS O BOOLEANOS del capítulo I.
Los lazos se utilizan para ejecutar varias veces un fragmento de un algoritmo, repitiendo
las mismas operaciones, pero con datos diferentes cada vez. Por ejemplo, se puede escribir
un algoritmo que calcule el salario semanal de los 800 empleados de una fábrica.
Evidentemente se requiere de un lazo que calcule 800 veces un salario. Cada cálculo debe
incluir los datos de una persona particular (nombre, horas trabajadas, pago por hora, etc.), y
estos serán diferentes a los de cualquier otra persona.
1
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
SANGRÍA (INDENTATION)
En Python, el concepto de sangría (indentation en inglés) es muy importante. La mayoría
de los lenguajes, como C, C++ o Java utilizan llaves {} para definir un bloque (conjunto) de
instrucciones. Por el contrario, Python usa sangrías.
Sangría se refiere a colocar espacios al inicio de las líneas de código de un bloque de
instrucciones.
Los bloques de instrucciones forman el cuerpo de las estructuras de control: repeticiones y
decisiones. Entonces, el bloque en las estructuras como while o if..else empieza escribiendo
cada instrucción del bloque cierto número de posiciones (por lo menos una) hacia la derecha
con respecto al inicio de la estructura.
Observe que las instrucciones están indentadas. Indentar significa empezar a escribir
cierto número de posiciones (por lo menos una) hacia la derecha con respecto al inicio del
while. No se permite utilizar llaves {}, como sería en otros lenguajes.
El lazo consta de la palabra while seguida de su condición booleana, sin paréntesis, que
termina con dos puntos (:). El cuerpo del while está formado por un bloque de una o más
instrucciones indentadas.
Al conjunto de dos o más instrucciones indentadas se le llama bloque de instrucciones.
Indentar las instrucciones es muy importante porque de esta manera el interprete identifica
qué instrucciones pertenecen al while. Por ejemplo, Si una instrucción while de cuatro
instrucciones se hubiera escrito sin respetar la indentación así:
2
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Por ejemplo, si se escribe el siguiente fragmento de algoritmo que incluye un lazo while
con su bloque de instrucciones indentado:
A=1
while A <= 3:
print( “HOLA”) # instrucción 1 del while
A= A + 1 # instrucción 2 del while
‘’’PROGRAMA whileImprimeHola
Programa que imprime tres veces la palabra HOLA
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
‘’’
A= 1
while A <= 3:
print("HOLA\n")
A= A + 1
3
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Como segundo ejemplo que utiliza un ciclo while es el siguiente. Escribir un programa
que calcule la suma de los primeros n enteros positivos.
''’PROGRAMA sumaNumeros
Este programa suma los primeros n enteros positivos: 1+2+3+4+5+ … + n.
Ejemplo: si n= 5 entonces 1+2+3+4+5= 15
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
# input lee el número como cadena (string). int es el cast que lo convierte en número entero
n= int(input("Hasta que numero (entero positivo) quieres sumar ? "))
suma= 0; numero= 1
print("La suma de los primeros ", n, " enteros positivos es ", suma)
Observar que while solamente tiene dos instrucciones. La instrucción print() no está
indentada y no pertenece al while, por lo que se ejecutará una sola vez.
La explicación del código es la siguiente:
En la primera línea (no se toman en cuenta los comentarios ni las líneas en blanco) se pide
el dato “hasta que número se va a sumar” y se asigna a la variable n.
En la segunda línea se inicializan las variables suma a cero y numero a 1. Observe qiue
cuando hay dos o más instrucciones diferentes en la misma línea, cada instrucción se separa
de la otra con um punto y coma.
La variable suma almacena los resultados parciales y el final de sumar los n números. La
variable numero representa a cada uno de los n números que se van a sumar, uno a la vez.
En la tercera línea inicia el while para sumar los números. La condición (numero <= n)
indica que las instrucciones del lazo se ejecutarán mientras (while) sea cierto que el valor de
la variable numero es menor o igual a n, que es la cantidad de números que se quieren sumar.
4
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Es importante entender que antes de entrar al lazo while por primera vez, se debe evaluar la
condición (numero <= n). Como de línea 1 se tiene que numero= 1, entonces la condición
es verdadera y se entra a la primera de las n repeticiones (iteraciones) del lazo.
Dentro del lazo y en cada una de las iteraciones, la primera instrucción incrementa el valor
de suma con el valor que en ese momento tenga la variable numero; la segunda instrucción
incrementa en uno el valor de numero. Esta modificación a la variable numero es un paso
vital para que en un cierto momento numero sea mayor a n y la condición (numero <= n) se
convierta en falsa para terminarla ejecución del lazo. Si esto no ocurriera entonces se tendría
un lazo infinito que causaría que las dos instrucciones del lazo nunca terminaran su
ejecución, lo cual es un gravísimo error.
Cada vez que termina una iteración se regresa al inicio del lazo para volver a evaluar su
condición. Si continúa siendo verdadera se vuelve a entrar al lazo para efectuar otra iteración,
es decir, para volver a ejecutar sus dos instrucciones. Pero si es falsa en ese momento termina
la ejecución del lazo y se pasará a ejecutar la siguiente instrucción del algoritmo, que en este
ejemplo es la línea 6, donde se imprime el resultado de la suma. Observar que la instrucción
print("La suma de los primeros ", n, " enteros positivos es ", suma)
no está indentada dentro de while. De esta manera el interprete Python sabe que no
pertenece al lazo y, por tanto, se ejecutará una sola vez. La salida, para n= 5, es:
5
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Pero sin importar cuál es el método elegido, para utilizarlos adecuada y correctamente, se
deben incluir en el while los siguientes tres pasos que aseguran que el lazo siempre terminará
de manera correcta. Los pasos son los siguientes:
El valor inicial no siempre debe ser 1. Puede ser cualquier valor positivo o negativo, cero
incluido.
+
´KLPaso II. Incluir la variable de control dentro de la condición del lazo.
Después de inicializar la variable de control, esta debe colocarse dentro de la condición
booleana del lazo. En el algoritmo SumaNumeros se utilizó la siguiente instrucción:
6
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
De esta forma se garantiza que mientras la condición (numero <= n) sea verdadera el lazo
continúa, pero también se garantiza que en algún momento (cuando numero > n) la condición
del lazo tendrá el valor falso y el lazo habrá terminado.
Ahora que ya se conocen los tres pasos para asegurar que una repetición termine de manera
correcta, veamos las tres formas de control: contador, dato centinela y pregunta directa.
y que las iteraciones continúan mientras (while) la condición booleana sea cierta. Entonces,
y de acuerdo a los pasos para controlar el lazo mencionados en la sección anterior, el contador
se debe inicializar a un valor apropiado y después debe aparecer en la condición booleana.
Por ejemplo en:
Primero se inicializa la variable que desempeña el papel de contador para llevar la cuenta
de cuantas iteraciones se han realizado del total. En este ejemplo la inicialización es con el
valor 1, pero pudo haberse inicializado a cualquier valor, incluso cero o negativo. El valor
inicial apropiado para un contador lo determina el problema que se esté resolviendo.
A continuación, se incluye el contador dentro de la condición booleana del lazo. El lazo
continúa mientras contador tenga un valor que haga que la condición booleana sea cierta.
Cuando contador obtenga un valor que haga falsa a la condición, el lazo termina.
Además, se debe incluir en alguna de las instrucciones del cuerpo del lazo alguna manera
de modificar el valor del contador con el propósito que en algún momento obtenga un valor
tal que haga que la condición booleana se convierta en falsa y el lazo se dé por terminado.
En nuestro ejemplo la instrucción que modifica a contador es:
Ahora la forma general del while con los tres pasos de control mencionados es:
El siguiente ejemplo utiliza un while controlado por contador. Escribir un programa que
imprima una lista de los precios de alimentos con el siguiente formato de salida:
FRITANGAS LINCE
LISTA DE PRECIOS
CANT QUESADILLAS GORDITAS REFRESCOS
1 20.00 15.00 13.00
2 40.00 30.00 26.00
3 60.00 45.00 39.00
. . . .
n ###.## ###.## ###.##
'''PROGRAMA listaPreciosGorditas
Imprime una lista de los precios de quesadillas, gorditas y refresco.
Utiliza un ciclo while con contador para imprimir la lista
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
PRECIO_QUESADILLA= 15.0
PRECIO_GORDITA= 20.0
PRECIO_REFRESCO= 13.0
print(" ", cant, " ", quesadilla, " ", gordita," ", refresco)
cant= cant + 1
print("\nFin de lista")
8
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
la cuarta instrucción imprime cada una de las líneas de salida de la lista por medio de la
instrucción
print(" ", cant, " ", quesadilla, " ", gordita," ", refresco)
Este proceso se repite mientras la condición booleana del while se mantenga verdadera.
Cuando la condición toma el valor falso, el ciclo while se dá por terminado.
Observe que la salida no es adecuada porque las columnas se distorsionan conforme crece
el número de renglones. Para evitar este efecto se requiere controlar la manera en que se
imprimen las diferentes columnas. Este control se logra mediante diferentes técnicas para
formatear la salida. Formatear significa mostrar la información en los renglones y columnas
correspondientes de acuerdo a un diseño previo, que se puede hacer en una hoja de
cuadrícula.
9
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
El método .format()
Una de las maneras de utilizar el método .format() se conoce como formateo avanzado.
Formateo avanzado
Permite controlar las alineaciones (o justificaciones) a la derecha, al centro o a la izquierda
de lo que se quiere imprimir. Para esto utiliza los siguientes símbolos de alineación:
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
A l i n e a c i ó n a l a d e r e c h a
10
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
A l i n e a c i ó n a l c e n t r o
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
A l I n e a c i ó n a l a i z q u i e r d a
'''PROGRAMA pythonMetodoFormat
Muestra ejemplos de como utilizar el método .format() para formatear la salida de un
programa.
'''
11
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Observe que en las instrucciones del programa se reservan 30 caracteres para imprimir las
cadenas, pero éstas tienen menos de 30 caracteres. Por ésta razón el interprete Python coloca
espacios antes o después de la cadena para completar los 30 caracteres.
entonces solo se imprimirá cadena a tr, que son los primeros 11 caracteres de la cadena.
la cadena se alineará a la derecha utilizando 30 columnas y solo se imprimirá cadena a que son
los primeros 8 caracteres de la cadena.
El siguiente programa muestra el truncamiento de cadenas.
12
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA pythonMetodoFormat2
Muestra ejemplos de como utilizar el método .format() para formatear la salida de un
programa para truncar la cadena que se va a imprimir
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya '''
print("#Cadena sin truncar")
print("Cadena que se va a truncar")
print("\n#Truncamiento a 11 caracteres")
print("--------10--------20--------30")
print( "{:.11}".format("Cadena que se va a truncar") )
print("\n#Truncamiento a 18 caracteres")
frase= "Cadena que se va a truncar"
print("--------10--------20--------30")
print( "{:.18}".format(frase) )
13
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Cada dato, con su respectivo método .format(), se separa del siguiente con una coma ( , ).
14
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
En la sección anterior hemos visto varios métodos .format con un solo valor dentro de sus
paréntesis, como en el ejemplo anterior que utilizaba cuatro .format() para imprimir los
cuatro datos:
Con la instrucción
Pero se puede escribir una instrucción equivalente que de el mismo resultado escribiendo
dentro de un solo format los cuatro datos. Esto hará que la instrucción sea más compacta y
ocupe menos espacio. Entonces, la instrucción anterior se puede reescribir así:
Observe que entre las llaves "{:>16}" "{:>24}" "{:>11}" "{:>12}" que indican el
formato de cada dato no hay comas de separación.
15
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Observe nuevamente que entre las llaves {:^10} y {:^12} no hay comas de separación. La
instrucción anterior es equivalente a los siguientes dos format():
"{:^10}".format("i"), "{:^12}".format("xi*xi")
i xi*xi
El siguiente programa utiliza esta forma de escribir format()
'''PROGRAMA formatoMultiple
Imprime una tabla del cuadrado de los números enteros del 1 a N
'''
i= 0
xi= 0
print("{:^10}{:^12}".format("i", "xi*xi"))
print("{:^22}".format("-"*17))
while i< N:
i= i+1
xi= pow(i,2)
print("{:>5}{:>13}".format(i, xi))
print("\nFin de tabla")
16
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Formateo de números
También se puede reservar la cantidad de columnas que se desean para imprimir números
enteros o reales (float). Para esto se toman en cuenta los dígitos, el punto decimal (solo para
números float) y el posible signo algebráico ( + ó - ). Tanto el punto decimal como el
signo ocupan una columna.
La forma general de un print que utilice al método format() con números enteros es:
donde n es la cantidad de columnas que se quieren reservar para imprimir el número entero, y
d es simplemente el símbolo que le indica al interprete Python que se va a imprimir un número
entero. Ejemplo:
print("{:10d}".format(324))
Esta instrucción ocupa 10 columnas para imprimir el número entero 324, empezando desde
la derecha. Como se pidieron 10 columnas y 324 sólo ocupa 3, entonces Python pone 7
espacios a la izquierda para llenar las 10 posiciones. Esto se muestra en el siguiente programa.
'''PROGRAMA FormatNumerosEnterosConEspacios
Muestra ejemplos de como utilizar el método .format() para formatear la salida de
datos numéricos enteros, rellenando con espacios a la izquierda del número si este
no ocupa todas las posiciones.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
17
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("{:010d}".format(824))
18
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Esta instrucción ocupa 10 columnas para imprimir el número entero 824, empezando desde
la derecha. Como se pidieron 10 columnas y 824 sólo ocupa 3, entonces Python pone 7 ceros
a la izquierda para llenar las 10 posiciones. Esto se muestra en el siguiente programa.
'''PROGRAMA formatNumerosEnterosConCeros
Muestra ejemplos de como utilizar el método .format() para formatear la salida de
datos numéricos enteros, rellenando con ceros a la izquierda del número si este no
ocupa todas las posiciones.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
19
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se hace lo mismo para números float (reales) . Si se desea rellenar con ceros en vez de con
espacios, entonces sólo hay que poner un cero antes del valor de n, de la siguiente manera:
print("{:010.2f}".format(824.47))
Esta instrucción ocupa 10 columnas para imprimir el número float 824.47, empezando desde
la derecha. Se reservaron 10 columnas totales, y de esas 2 son para la parte fraccionaria.
Como se pidieron 10 columnas y 824.47 sólo ocupa 6, entonces Python pone 4 ceros a la
izquierda para llenar las 10 posiciones. Esto se muestra en el siguiente programa.
Los números reales se denominan float en Python. Un número float consta de una parte
entera separada de una parte fraccionaria por un punto. Pueden ser positivos o negativos.
Ejemplos:
20
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
La precisión la decide el usuario dependiendo de cuál sea el propósito para ese número. Por
ejemplo, es común que una cantidad en pesos y centavos tenga una precisión de dos dígitos (a
centésimas). Una aproximación comúnmente utilizada para la constante PI es 3.1416, que tiene
una precisión de 4 dígitos (a diezmilésimas).
Para formatear con el método .format() un número float hay que especificar dos partes
importantes:
Por ejemplo,
La forma general de un print que utilice al método format() con números float es:
print( "{:15.4f}".format(234.7642))
En el print() se indica que para imprimir el número 234.7642 se reservan quince columnas
(posiciones) en total, y de ese total, tres son para la parte entera, una para el punto decimal y
cuatro para la parte farccionaria. Como esto da un total de ocho posiciones, y se reservaron
quince, entonces la diferencia entre 15 - 8 (7 posiciones) se rellenarán con 7 espacios a la
izquierda del número; esto se muestra a continuación:
21
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
a) print( "{:15.1f}".format(234.7642))
b) print( "{:15.3f}".format(234.7642))
Caso 2.- Si m es mayor a la cantidad de dígitos fraccionarios, se añaden ceros a la derecha del
número. Ejemplo
a) print( "{:15.7f}".format(234.7642))
22
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
23
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
dato= 5274.613
print("\nJustificación a la izquierda")
print( "{:<25.4f}".format(dato))
print("\nJustificación al centro")
print( "{:^25.4f}".format(dato))
print("\nJustificación a la derecha")
print( "{:>25.4f}".format(dato))
La salida es:
'''PROGRAMA listaPreciosGorditasVersión 2
Imprime una lista de los precios de quesadillas, gorditas y refresco. Utiliza un ciclo while
con contador para imprimir la lista que incluye formateo con el método .format()
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
PRECIO_QUESADILLA= 15.0
PRECIO_GORDITA= 20.0
PRECIO_REFRESCO= 13.0
renglones= int(input("cuantos renglones para la lista? "))
24
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("{:>7}".format("CANT"),"{:>12}".format("QUESADILLAS"),
"{:>10}".format("GORDITAS")
"{:>11}".format("REFRESCOS"),sep="")
#print("{:>7}”"{:>12”"{:>10}""{:>11}".format("CANT","QUESADILLAS","GORDITA
S","REFRESCOS"),sep="")
cant= 1
while cant <= renglones:
quesadilla= cant * PRECIO_QUESADILLA
gordita= cant * PRECIO_GORDITA
refresco= cant * PRECIO_REFRESCO
print("{:>6}".format(cant), "{:>11.2f}".format(quesadilla),
"{:>11.2f}".format(gordita), "{:>11.2f}".format(refresco), sep="")
#print("{:>6}""{:>11.2f}""{:>11.2f}""{:>11.2f}".format(cant,quesadilla,gordita,refresco),
sep= "")
cant= cant + 1
print("\nFin de lista")
Observe que ahora las columnas ya no están distorsionadas y que el punto decimal de los
números reales está en la misma columna.
25
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
El siguiente diagrama muestra una matriz de seis renglones y cuarenta y dos columnas.
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
F R I T A N G A S L I N C E
L I S T A D E P R E C I O S
C A N T Q U E S A D I L L A S G O R D I T A S R E F R E S C O S
# # # # # # . # # # # # # . # # # # # # . # #
1 1 5 . 0 0 2 0 . 0 0 1 3 . 0 0
2 3 0 . 0 0 4 0 . 0 0 2 6 . 0 0
print("{:>29}”.format(“FRITANGAS LINCE"))
La frase “LISTA DE PRECIOS” del segundo renglón termina en la columna 30. Entonces,
la instrucción print() reserva para ese renglón 30 columnas con alineación a la derecha así:
print("{:>30}”.format(“LISTA DE PRECIOS"))
En el tercer renglón se imprimen con un solo print() cuatro datos, cada uno con su
respectivo método .format().
Observe que CANT es el primer dato del renglón y termina en la columna 7. Entonces se
reservan las primeras 7 columnas para imprimir CANT.
En general, para calcular la cantidad de columnas totales para imprimir del segundo dato
en adelante se resta el número de la columna donde termina el dato que se va a imprimir
menos el número de la columna donde termina el dato inmediatamente anterior.
Aplicando lo anterior, Para determinar la cantidad de columnas totales que se requieren
para QUESADILLAS se hace la resta de 19, que es la columna donde termina
QUESADILLAS, menos 7, que es la columna donde termina CANT.
26
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se tiene entonces 19 – 7= 12. Esto significa que las siguientes 12 columnas después de 7
son para QUESADILLAS.
Similarmente, para calcular las columnas para GORDITAS la resta es 29 – 19= 10; para
REFRESCOS es 40 – 29= 11. Entonces, el print() respectivo es:
print("{:>7}".format("CANT"), "{:>12}".format("QUESADILLAS"),
"{:>10}".format("GORDITAS"), "{:>11}".format("REFRESCOS"), sep="")
Es importante observar que el print() termina con el argumento sep="" para eliminar el
espacio que pone print() por default cuando los datos a imprimir están separados por una
coma. Revisar tema Argumento sep= de la página 49, unidad I.
Para quesadillas: 17 – 6 = 11
Para gorditas : 28 – 17= 11
Para refrescos: 39 – 28= 11
Finalmente se toma en cuenta la precisión del número que se va a imprimir. En este caso,
por ser pesos y centavos, la precisión es de dos dígitos fraccionarios. Por tanto, el print() que
imprime el cuarto renglón es el siguiente:
print("{:>6}".format(cant), "{:>11.2f}".format(quesadilla),
“{:>11.2f}".format(gordita), "{:>11.2f}".format(refresco), sep= "")
27
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
EMPRESAS LINCE
REPORTE DE NOMINA SEMANAL
NOMBRE SAL. BRUTO IMPUESTO SAL. NETO
XXXXXXXXXX ####.## ####.## ####.##
. . . ... . . . ...
XXXXXXXXXX ####.## ####.## ####.##
En este diseño se indica una cadena de caracteres con una sucesión de X; para un numero
real cada dígito se indica con un símbolo de número (#) y un punto decimal. Los puntos
suspensivos indican que puede haber varias líneas de salida.
El programa es el siguiente:
'''PR0GRAMA salarioSemanalSinConcatenarSalida
Calcula el salario semanal neto (salario con descuento de impuesto) de varios empleados
de una empresa. Los datos de cada empleado son: nombre, horas semanales trabajadas y pago
por hora. El numero de empleados también es un dato.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
PORCENTAJE_IMPUESTO= 0.25
numEmpleados= int( input("cuantos empleados? ") )
print("{:>44}".format("EMPRESAS LINCE"))
print("{:>50}".format("REPORTE DE NOMINA SEMANAL"))
print("{:>16}".format("NOMBRE"), "{:>24}".format("SAL. BRUTO")
,"{:>11}".format("IMPUESTO"), "{:>11}".format("SAL. NETO"))
contador= 1
while contador <= numEmpleados:
nombre= input("Nombre del empleado? ")
horas= int(input("Horas trabajadas? "))
pagoHora= float(input("Pago por hora? "))
contador= contador + 1;
print("Fin de reporte") # esta instrucción ya no es parte del ciclo while
su salida es la siguiente:
En este caso, la salida está mezclada con los datos de entrada, por lo que no es legible.
Aunque el resultado es correcto numéricamente, una persona tendrá dificultades para
comprenderla.
Para resolver está situación y tener una salida más adecuada y fácilmente comprensible se
requiere que las líneas de salida para cada empleado se almacenen temporalmente como
una cadena (string) en una variable que se imprimirá cuando finalice el ciclo while.
Para esto se requiere la operación de contatenación de cadenas. Concatenar cadenas
significa unir una cadena al final de la cadena anterior para tener como resultado una cadena
más grande. Se podría decir que concatenar significa “sumar” cadenas. En Python la
concatenación se hace con el símbolo “+”.
Ejemplo, si se tienen las siguientes tres cadenas
cadena1= “Hola “
cadena2= “amigos. Bienvenidos “
cadena3= “a mi casa.”
29
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA salarioSemanalConcatenarSalida
El programa calcula el salario semanal neto (salario con descuento de impuesto) de varios
empleados de una empresa. Los datos de cada empleado son: nombre, horas semanales
trabajadas y pago por hora. El numero de empleados también es un dato.
Para evitar que los datos de entrada se intercalen con las líneas del resultado, primero se
almacenan en la variable salida, de tipo string, todas las líneas que se quieren mostrar en la
salida. Despues manda la variable salida a pantalla con una instruccion print(salida).
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
PORCENTAJE_IMPUESTO= 0.25;
contador= contador + 1
30
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("{:>44}".format("EMPRESAS LINCE"))
Ahora, en la segunda versión del programa, las instrucciones que utilizan el operador de
asignación (=) y que tienen la forma general:
le indican a la máquina que en vez de mandar a la pantalla de salida las cadenas, las guarde
en la variable salida, la cual estará almacenada en la memoria de la computadora. Por
ejemplo, la primera línea de la salida en el programa anterior se puede escribir así:
print(salida)
su salida es la siguiente:
31
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Observar que ahora los datos de entrada están separados de la salida y son más fáciles de
leer y comprender por una persona.
La ejecución de este programa procedió así: al inicio de la ejecución del programa se piden
los datos. Después se procesan los datos con las instrucciones
y cada línea del resultado para un empleado se almacena en memoria en la variable salida
por medio de la siguiente instrucción:
print(salida)
para mandar todas las líneas del resultado de una sola vez.
Ahora ya no se tiene mezclada la entrada de datos con la salida y el reporte se puede leer y
apreciar con toda facilidad. Las instrucciones del programa que permiten realizar este tipo de
salida son las que están resaltadas en negrita.
32
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
while numero<= 0:
print("Error. El numero es cero o negativo. Dame un numero mayor a cero: ")
numero= int(input( "Dame un numero mayor a cero: ") )
Si se analiza este código se verá que el lazo while se ejecutará mientras sea verdadero que
la variable numero sea menor o igual a cero, lo que significa que hay un error en el dato
leído. Si se lee un valor que sea cero o negativo, la condición (numero<= 0) será verdadera
y se volverá a entrar al lazo para pedir nuevamente un número. Mientras se sigan metiendo
números que hagan verdadera a la condición se estará “atrapado” en el lazo. La única manera
de salir del lazo es introduciendo un valor mayor a cero que haga falsa a la condición. En
Python, la salida es:
33
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Ejemplo 2. Para verificar que un número esté en un cierto rango, por ejemplo, entre 0 y
100, se puede escribir el siguiente código, suponiendo que el número es una calificación:
''' Verificar que la calificación (valor entero) este en el rango 0 a 100, limites incluidos. Es
decir, no se permiten calificaciones fuera del rango 0 a 100. '''
print("\nLa calificación ", calificación, " es correcta") # este print no es parte del while
Este ejemplo utiliza la condición compuesta ((calificacion< 0) or (calificacion > 100)) que
incluye las dos condiciones individuales
34
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se pide al usuario que teclee su nombre y después se le solicita que confirme si es correcto.
Si lo es, contestará con una s, la cual hará falsa a la condición y abandonará el lazo. Pero si
contesta con una n entonces la condición será verdadera y se volverá a entrar al ciclo para
volver a pedir el nombre.
Una salida de ejemplo es:
35
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
import winsound
y después se puede escribir una pequeña función que active el beep cuando la función sea
invocada (llamada) por otro código. La función es la siguiente:
Este es un ejemplo de una función creada por el usuario. Estas funciones se estudiarán en
el capítulo 3.
Esta función recibe como parámetros los valores de frecuencia y duración. Dentro de esta
función esta la instrucción que genera el sonido. Los valores para los parámetros los manda
el código que invoca (llama) a la función. Un ejemplo es el siguiente:
suenaBeep(1000, 900)
Escribir un programa que calcule el salario semanal, incluyendo impuestos, de cada uno
de los empleados de una fábrica. El salario se calcula multiplicando las horas semanales
trabajadas por el pago por hora. El impuesto es el 15% del salario.
Se debe validar que las horas trabajadas estén en el rango 35 a 50, que el pago por hora no
sea menor a $50.00 ni mayor a $100.00, y que el departamento sea A, B, C. Si hay algún
error en los datos, sew debe sonar el beep.
Los datos de entrada para cada empleado son el nombre, las horas semanales trabajadas, el
pago por hora y el departamento al que está asignado (A, B, C).
'''PROGRAMA calculoSalarioValidacion
Calcula el salario semanal delos empleados de una empresa. El empleado esta asignado a
uno de los tres departamentos de la empresa (A, B, C). El salario se calcula multiplicando el
numero de horas trabajadas por el pago por hora. Hay un impuesto del 15% sobre el salario.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
import winsound
def suenaBeep():
[Link](frequency, duration)
36
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
TASA_IMPUESTO= 0.15
salida= ""
37
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
cuentaEmpleados= cuentaEmpleados + 1
print("\n")
print(salida)
38
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
A cada una de las columnas de datos se les llama campos, y a cada campo se les puede
asignar un dato centinela. Cada campo tiene dos tipos de datos: los datos procesables y el
dato centinela, que se coloca al final del campo.
Los datos centinela deben ser del mismo tipo de su campo: un campo string debe tener un
centinela string, un campo int debe tener un centinela int, y un campo float debe tener un
centinela float.
En este ejemplo el campo string NOMBRE tiene el centinela string “$”, el campo int
HORAS tiene el centinela int -99 y el float PAGOxHORA tiene el centinela float -999.99.
Además, los valores de los datos centinela se eligen de manera que no puedan ser
confundidos por datos procesables. Por ejemplo, el centinela $ difícilmente puede ser
confundido con el nombre de una persona. Asi mismo, el centínela -99 no podría confundirse
con horas de trabajo porque estas no pueden ser negativas. Razonamiento similar para el
centinela -999.99.
Aunque cada campo puede tener su centinela, en la condición booleana de un lazo while no
es necesario colocar todos los centinelas; uno es suficiente. Se elige uno de los campos para
utilizar su centinela.
A continuación, se presentará un pequeño código que mostrará como funciona un while con
centinela. El código calculará el sueldo semanal de cada empleado y lo imprimirá. Los datos
son como los del ejemplo de arriba. El centinela se toma del campo NOMBRE.
39
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
40
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
El ciclo while termina porque ya se encontró el dato centinela y ya no hay más datos a
procesar.
El siguiente programa ilustra el ejemplo de arriba con más detalles, como el formato y la
concatenación de la salida, además de la validación de los datos de entrada.
'''PROGRAMA calculoSalarioCentinela
Utiliza un while controlado con dato centinela para calcular el salario semanal de los
empleados de una empresa. El empleado esta asignado a uno de los tres departamentos
de la empresa (A, B, C). El salario se calcula multiplicando el número de horas trabajadas
por el pago por hora. Hay un impuesto del 15% sobre el salario.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
TASA_IMPUESTO= 0.15
salida= ""
salida= salida + ("{:>40}".format("EMPRESAS LINCE\n"))
salida= salida + ("{:>49}".format("TALON DE PAGO PARA EL EMPLEADO\n"))
salida= salida + ("{:>13}".format("NOMBRE") +"{:>20}".format("DEPTO.") +
"{:>10}".format("SALARIO")+"{:>11}".format("IMPUESTO")+
"{:>8}".format("PAGO\n"))
41
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("\n")
print(salida)
42
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
43
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
La salida debe incluir, para cada chofer, el codigo del chofer, el kilometraje total, el costo
total de la gasolina consumida,,los viaticos del chofer, y el costo total del viaje (gasolina mas
viticos). El formato de salida debe ser el siguiente:
AUTOTRANSPORTES LINCE
CODIGO CHOFER: ## KILOMETRAJE TOTAL: ####.#
COSTO GASOLINA ($) VIATICOS ($) TOTAL GASTOS ($)
####.## ####.## #####.##
. . . . . . . . .
CODIGO CHOFER: ## KILOMETRAJE TOTAL: ####.#
COSTO GASOLINA ($) VIATICOS ($) TOTAL GASTOS ($)
####.## ####.## #####.##
En este diseño de formato de salida los puntos suspensivos indican que puede haber màs
de dos choferes.
PRECIO_GALON= 50.0;
PRECIO_VIATICO= 15.0;
salida= ""
salida= salida + "{:>40}".format("AUTOTRANSPORTES LINCE") + "\n"
salida= salida + "{:>45}".format("REPORTE DE VIÁTICOS DE CHOFERES") + "\n"
La ejecución de este programa procede así: al inicio de la ejecución de esta nueva versión
del programa se piden los datos, como lo muestra la siguiente pantalla:
Después se procesan los datos y se muestra la salida debajo de los datos de entrada:
45
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
El usuario responde con una S para continuar o con una N para salir del lazo. Desde luego
que el mensaje puede variar, pero la idea básica es la misma: permitir que el usuario controle
la ejecución del lazo a través de su respuesta. El siguiente ejemplo ilustra esta forma de
control.
Se quiere consultar el costo de equilibrio (no hay pérdidas ni ganancias) para producir un
libro, y cual debe ser su precio de venta aplicando un factor de ganancia de 2.1 veces el costo
de equilibrio.
Requiere como datos el título del libro, el número de páginas y la cantidad de libros a
producir. Los datos constantes son: factor de producción= 0.726 y el costo fijo= 2450 Este
costo incluye todos los gastos que se deben hacer para producir el libro, como renta del taller,
sueldo de empleados, pago de luz, etc.
'''PROGRAMA PrecioLibrosConsulta
Permite hacer consultas sobre costo de equilibrio (no hay perdidas ni ganancias) de
producir un libro y cual debe ser su precio de venta. Los datos son el titulo del libro, el
numero de páginas, la cantidad de libros a producir.
Se supone un factor de ganancia de 2.1 veces el costo de equilibrio.
Los datos constantes son: factor de producción = 0.726 y costo fijo= 2450(renta, luz, papel,
tinta, salarios, etc.)
46
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("{:>33}".format("EDITORIAL LINCE"))
print("{:>39}".format("RESULTADO DE LA CONSULTA\n"))
print("{:7}".format("TEXTO: "), titulo)
47
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Mientras se conteste con una S el ciclo while continuará su ejecución. Cuando se conteste
N se abandonará el ciclo y se imprimirá el mensaje FIN DE CONSULTAS.
48
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
FUNCIÓN range()
La función range() genera una secuencia de números enteros entre un límite inferior y
uno superior.
Caso 1. range(N). Función range con un solo argumento. N es la cantidad de números que
se quieren producir. El rango empieza en 0 y termina en N - 1 con incrementos de 1.
N= 10
range(N)
crea la lista 0, 1, 2, 3, 4, 5, 6 ,7, 8, 9.
Observe qjue aunque N= 10, el 10 no se imprime porque entre 0 y 9 están los 10 valores
pedidos.
Caso 2. range(N, M). Función con dos argumentos. N es el límite inferior del rango y M
es el superior. Crea números desde N hasta M-1, en incrementos de 1.
range(4, 12)
Similar al caso 1, el ultimo valor generado es uno menor al límite superior del rango. En
este ejemplo, el límite superior es 12, por lo que el último valor generado es 11.
Caso 3. range(N, M, I). Función con tres argumentos. Crea números desde N hasta M-1
en incrementos de I.
range(12, 38, 3)
crea la lista 12, 15, 18, 21, 24, 27, 30, 33, 36.
Aquí se creo la lista en incrementos de 3 iniciando en 12. Observe que en este caso el rango
se terminó en el número 36 debido a que si a 36 se suman 3 el resultado sería 39 y se habría
rebasado el límite superior M-1 (38 -1= 37)
49
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Observe que el lazo está controlado por la variableDecontrol, la cual toma el primer valor
de rango como su valor inicial y a cada pasada por el lazo se incrementa de uno en uno hasta
llegar a N - 1, y entonces el lazo termina.
Cuando se explicó el ciclo while, el primer ejemplo se referia a imprimir tres veces la
palabra Hola. Este ejercicio se reescribirá con for añadiendo el valor de la variable de control
i para observar claramente los valores que genera range().
for i in range(3)
print(i, “ Hola”)
Observe que el lazo está controlado por la variable de control, que en este caso es i, la cual
toma un valor inicial (0 en este ejemplo) y a cada pasada por el lazo se incrementa en una
unidad. En el momento que el valor de la variable de control sea igual a 2 (en este ejemplo)
el lazo termina.
La ejecución de este ciclo es: inicialmente i= 0. y se entra por primera vez al lazo para
imprimir el primer hola y se regresa al inicio del for para incrementar el valor de i en 1.
Ahora i= 1.
Se imprime el segundo hola y se regresa al inicio del for para volver a incrementar el valor
de i en 1. Ahora i= 2.
Se imprime el tercer hola y se da por terminado el lazo.
Al salir del lazo se imprime el mensaje final. Observe que i nunca toma el valor 3, porque
range(3) generan los tres valores 0, 1 y 2 y nunca llega a 3.
Al terminar el lazo, i= 2
50
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Otra forma de lograr los mismos tres “hola” con un range() de dos argumentos es:
5 hola
6 hola
7 hola
Al terminar el lazo: i= 7
Observe nuevamente que i nunca toma el valor del límite superior, 8, porque range(5, 8)
generan los tres valores 5, 6 y 7 y nunca llega a 8.
Similar al ejemplo anterior, el lazo está controlado por la variable de control i, la cual toma
un valor inicial (5 en este ejemplo) y a cada pasada por el lazo se incrementa en una unidad.
En el momento que el valor de la variable de control sea igual a 7 el lazo termina.
La ejecución de este ciclo es: inicialmente i= 5. y se entra por primera vez al lazo para
imprimir el primer hola. Se regresa al inicio del for sumar 1 al valor de i. Ahora i= 6.
Se imprime el segundo hola y se regresa al inicio del for para volver a incrementar el valor
de i en 1. Ahora i= 7.
Se imprime el tercer hola y se da por terminado el lazo. Observe que i nunca toma el valor
8, porque range(5, 8) generan los tres valores 5, 6 y 7 y nunca llega a 8 .
Hay que advertir que hay infinidad de pares de argumentos que hacen que el for se ejecute
tres veces, por ejemplo 1 y 4; 20 y 23; 245 y 248, etc.
La salida de estos dos ciclos es:
51
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Algunos otros ejemplos generales de la sintaxis del for son los siguientes:
El rango de este ciclo generará los seis valores 0, 1, 2, 3, 4, 5, por lo que el for imprimirá
seis Hola. El valor del rango debe ser un número entero positivo. No se acepta el cero o
negativos.
Estos tres ejemplos son equivalentes en el sentido que todos imprimen tres Hola. También
se debe observar que en un for con dos argumentos los valores del rango pueden ser
números enteros positivos, negativos o cero.
Es importante aclarar que en un rango el primer valor debe ser menor que el segundo valor.
Por ejemplo, si se escribe
✓ También podría haberse escrito el ciclo for con un range() de tres argumentos para
indicar un incremento. Aquí también se acepta el cero o negativos. Ejemplos:
52
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
10 hola
13 hola
16 hola
print("La suma de los primeros ", N, " enteros positivos es ", suma)
La diferencia principal con la versión anterior que usaba while con contador es:
53
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
1, 2, 3, 4, 5, … , N +1
1, 2, 3, 4, 5, 6, 7
1, 2, 3, 4, 5, 6, 7, 8
que tiene como única instrucción el incremento de suma con el valor que tenga la variable
numero en cada repetición. Observar que ahora ya no se requiere incrementar explicitamente
la variable de control numero con la instrucción
numero= numero + 1
54
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA forIteraUnaCadena
Muestra como el control de una instrucción for se puede hacer con un string (cadena)
AUTOR: ing. José Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
cuenta= 0
for letra in “Elefante”:
print(“Hola”)
cuenta= cuenta + 1
55
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
la variable letra irá tomando sucesivamente cada letra de la cadena “Elefante”. Al llegar a la
e final terminará la ejecución del for. Entonces,
cuando letra= “E” se imprime el primer Hola,
cuando letra= “l” se imprime el segúndo Hola,
cuando letra= “e” se imprime el tercer Hola,
cuando letra= “f” se imprime el cuarto Hola,
cuando letra= “a” se imprime el quinto Hola,
cuando letra= “n” se imprime el sexto Hola,
cuando letra= “t” se imprime el septimo Hola,
cuando letra= “e” se imprime el octavo Hola.
Se imprimieron 8 Hola
En Python se tiene:
56
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Observe que se inicia con la palabra from (desde) y que el nombre de la biblioteca
se separa con la palabra import del nombre de la función.
Aquí, cada nombre de función se separa de la siguiente con una coma. Los puntos
suspensivos indican que se pueden incluir más funciones, no solo dos.
import math
[Link](x)
• randint(a,b)
• randrange(a, b, c)
57
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
0, 1, 2, 3, 4, 5
'''PROGRAMA generaAleatorioEnteros
Genera aleatoriamente N números enteros. Se usan el contador cuentaNumeros para
controlar el lazo while.
AUTOR: ing. José Rodríguez Ruiz depto. Sistemas y Computación ITCelaya '''
import random
cuentaNumeros= 1
58
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA cuentaNegativos
Genera aleatoriamente N números enteros y cuenta cuantos de ellos son negativos. Se usan
los contadores cuentaNumeros para controlar el lazo while, y cuentaNegativos, para llevar
la cuenta de los negativos.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya '''
import random
cuentaNumeros= 1
cuentaNegativos= 0
N= int(input("Cuantos numeros se van a leer? "))
while cuentaNumeros <= N:
numero= [Link](-10, 12)
print(numero)
if(numero < 0.0):
cuentaNegativos= cuentaNegativos + 1
cuentaNumeros= cuentaNumeros + 1
print("Del total de ", N, " números ", cuentaNegativos, " son negativos")
59
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
✓ Función randrange(a, b, c). Esta función admite uno, dos o tres argumentos.
Si se usa esta función con uno o dos argumentos se comporta de manera muy similar a
randint() con uno o con dos argumentos. Ver los ejemplosd anteriores.
Cuando se utiliza con tres argumentos, el primero es el límite inferior del rango, el
segundo es el límite superior y el tercero es el incremento. Ejemplo:
[Link](10, 40, 5)
'''PROGRAMA randrangeExamplesInt
Muestra la utilización de la biblioteca random y de las funciones
randint() y randrange() para generar números aleatorios enteros '''
import random
60
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Recuerde que como son números aleatorios, en cada corrida los números van a cambiar.
✓ La Función choice()
61
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA randomExamplesFloat
Muestra la utilización de la biblioteca random y de la funcion choice() para generar
números aleatorios
'''
import random
print("#En cada repetición se escoge al azar uno de los numeros del rango 5 a 40")
for i in range(5):
print([Link](range(5, 40)))
print("#En cada repetición se escoge al azar una de las letras de la cadena \"AEIOU\"")
for i in range(5):
print([Link]("AEIOU"))
62
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
➢ Un objeto list es similar al arreglo (array) de otros lenguajes, aunque más versátil
y poderoso. Por ejemplo, un arreglo tradicional solo puede guardar elementos del
mismo tipo de dato, pero un list de Python puede almacenar alementos de diferenten
tipo, incluyendo otros list (list anidado). El siguiente list contiene cadenas de
nombres de animales.
["gato", "ave", "perro", "cebra", "león", "perico"]
“gato” se identifica con el índice cero, “ave” con el uno, “perro” con el dos, y asì
sucesivamente.
La función choice también puede seleccionar aleatoriamente alguno de los elementos de
un list. Por ejemplo, la instrucción
Este list tiene cadenas, dígitos, una variable (dato), y dos list.
Si se escriben las siguientes instrucciones:
dato = 43
lista = ["s", 0, [1, 2, dato]”, “cadena ["avion", "carro"], 4.56]
for i in range(5):
print([Link](lista)
63
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA randomExamplesFloat2
Muestra la utilización de la biblioteca random y de la funcion choice() con un list para
generar números aleatorios.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
import random
print("#Se escoge al azar una de las palabras del list")
for i in range(5):
print([Link](["gato", "ave", "perro", "cebra", "león", "perico"]))
64
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
0.36367908769945445
0.919138316555906
'''PROGRAMA pyAleatoriosReales
Este programa utiliza las funciones aleatorias:
65
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
for i in range(5):
numeroAleatorioFloat= [Link]()
print("Número aleatorio", i+1, " ", numeroAleatorioFloat)
for i in range(5):
numeroAleatorio= [Link](12.0, 90.0)
print("Número aleatorio", i+1, " ", numeroAleatorio)
66
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
...
a) b) c)
En este ejemplo, cuando la variable de control i del lazo for exterior toma el valor 0, este
se mantiene constante; el lazo for interior se ejecuta completamente tomando los valores
j= 0, j= 1, y j= 2.
67
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Una vez que la ejecución del lazo interior haya terminado su procesamiento, se regresa al
inicio del lazo exterior donde el valor de i se incrementa. Por tanto, cuando i= 1, el lazo
interior se ejecuta nuevamente de principio a fin para los valores j= 0, j= 1 y j=2. El lazo
termina.
La prueba de este fragmento de algoritmo es:
i j Salida
0 --- EQUIPO 1
0 0 Jugador 1
0 1 Jugador 2
0 2 Jugador 3
1 --- EQUIPO 2
1 0 Jugador 1
1 1 Jugador 2
1 2 Jugador 3
print("\n")
Observe que el cuadrado consiste de un plano cartesiano formado por renglones y columnas.
En un cuadrado, desde luego, el número de renglones es igual al número de columnas. Por
68
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
eso, para dibujar el cuadrado es suficiente con especificar el número de renglones (pudo haber
sido también el número de columnas).
Para dibujar el cuadrado el programa utiliza una repetición anidada formada por dos lazos
for. El primero (externo) controla los renglones y el segundo (interno) controla las columnas.
Entonces, se mantiene fijo el valor de la variable renglon del for exterior mientras el valor
de la variable columna del lazo interior va cambiando su valor desde 0 hasta nReng -1.
Así, se dibuja con asteriscos un renglón completo antes de pasar al siguiente. Aquí la
palabra dibuja significa imprimir un asterisco por cada vuelta a través del lazo interior, el
cual se reproduce a continuación para comodidad del lector:
Entonces, al terminar cada ejecución del lazo interior se tendrá un renglón de asteriscos.
Para iniciar el siguiente renglón, se salta de línea con la instrucción print("\n") y se termina
el lazo exterior.
El lazo exterior se repite tantas veces como renglones haya solicitado el usuario. Al terminar
todas las repeticiones (iteraciones) del lazo exterior, se tendrá el cuadrado completo.
Una salida de ejemplo es:
69
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
suma= 0
for j in range(alumnos):
numero= float(input(f"Teclea la calificacion: {j+1} "))
suma= suma + numero
print("\nEl promedio del grupo ", i+1, " es: ", prom, "\n")
70
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
2.5.1 INSTRUCCIÓN if
La instrucción if se utiliza cuando se quiere ejecutar una acción sólo si su condición
booleana es verdadera. Si es falsa no se hace nada. La instrucción if en diagrama de flujo es
la siguiente:
ENTRADA
SALIDA
if condición booleana:
instrucción 1
instrucción 2
instrucción 3
. . .
Las instrucciones se ejecutan solo en el caso de que la condición booleana sea verdadera.
Si es falsa, la operación no se efectúa y el algoritmo continuará su ejecución en la instrucción
que inmediatamente siga a la estructura if. A continuación, se presenta un ejemplo que usa
if.
El ejemplo consiste en hacer un algoritmo pseudocódigo que calcule el precio final que
pagaría un cliente por un artículo. Hay un descuento del 10% solo si la etiqueta del artículo
tiene marcado un precio igual o mayor a $150.00.
Observe en el enunciado del ejercicio se tiene una especificación respecto a qué hacer en
caso de que la condición sea cierta, pero no hay instrucciones sobre qué hacer si la condición
es falsa. Este es un caso apropiado para usar la instrucción if. Aplicando los pasos del Ciclo
de desarrollo de un algoritmo a este problema se tiene:
71
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Una vez que se ha resuelto el problema de manera manual, sin pensar siquiera en una
computadora, utilizando solamente nuestra lógica y como instrumentos papel y lápiz
(posiblemente una calculadora), entonces es momento de empezar a organizar nuestras ideas
de manera más formal.
Continuando con el paso I, entender problema, del Ciclo de desarrollo de un algoritmo,
ahora se consideran los tres aspectos principales de cualquier sistema: salida, proceso y
entrada, en este orden exclusivamente para este paso.
72
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Salida. El problema pide calcular el precio final a pagar por un artículo. El diseño de la salida
es como se ve a continuación:
Donde cada # representa un dígito. Observe que se incluye un punto decimal, lo que significa
que el resultado se considera de tipo real (float).
3. Imprimir la salida.
4. Fin de algoritmo.
Los números al inicio de cada paso son para facilitar su identificación durante la prueba del
algoritmo. Después de haber realizado la prueba los números se pueden eliminar.
Para todos estos casos el algoritmo deberá trabajar correctamente. Si se recupera el resumen
de los cálculos manuales:
Es importante observar que la prueba incluyó tres corridas diferentes del algoritmo. Una
corrida para precio= $200.00, otra para precio= $150.00, y una más para precio= $100.00.
Esto es necesario ya que, como se mencionó anteriormente, cada corrida prueba un caso
particular para un caso general. Por corrida se entiende ejecutar el algoritmo completamente
desde el primer paso hasta el último.
Cuando la prueba demuestre que el algoritmo es correcto, entonces es el momento de
convertirlo a programa. Para este ejemplo el programa Python es el siguiente.
74
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''
precio= float(input("Dame el precio etiqueta: "))
if precio >= 150:
precio= precio - precio * 0.1
Observe que no tiene ciclo de repetición. Una salida de ejemplo para tres corridas es:
Esta simple modificación a la salida del problema obliga a rediseñar el algoritmo para
escribir una segunda versión que incluya los cambios pedidos. A esta segunda versión se le
75
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
puede llamar descuentoIf2, para indicar que al algoritmo anterior se le han hecho algunas
modificaciones (mantenimiento), pero se refiere al mismo problema.
El programa con esa modificación en la salida es:
precioPagar= precioEtiqueta
descuento= 0.0
76
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
“Se tienen varios grupos de tres números cada uno. Encontrar el mayor de cada grupo.”
‘’’PROGRAMA mayorDeTresNumerosIf
Lee grupos de tres números y encuentra el mayor de cada grupo. El centinela es el -9
Un ejemplo de los datos es:
mayor= num1
print("\nGrupo ", grupo, ": ", num1, ",",num2, ",",num3, " El mayor es: ", mayor, sep= "")
77
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
78
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
CONTADORES Y ACUMULADORES
Aparte de utilizar un contador para saber cuantas repeticiones (iteraciones) se han realizado
y decidir cuando salir de un ciclo, en muchos programas que utilizan repeticiones se requiere
contar cuantas veces ha sucedido un evento particular (por ejemplo, de una lista cuantas
personas son hombres o cuantas personas son mujeres) o acumular el valor de una o más
variables para obtener un total (por ejemplo, cual es el total de salarios pagados a 10
empleados). Esto es para lo que se utilizan los contadores y los acumuladores.
CONTADORES
Un contador es una variable cuyo valor se modifica en una cantidad constante. Es decir,
puede incrementar o decrementa su valor, pero siempre en una cantidad constante. Por
ejemplo, de dos en dos. Así, si el contador empieza en cero y se incrementa de dos en dos, la
sucesión es: 0, 2, 4, 6, 8, etc. Pero si se incrementa de cuatro en cuatro los valores son: 0, 4,
8, 12, 16, etc.
Los usos más frecuentes para un contador son:
79
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se teclearon 7 nombres
En este programa, el contador se llama contadorNombres y se inicializa con el valor cero
antes de entrar al while:
0
contadorNombres
contadorNombres= contadorNombres + 1
contadorNombres= 0 + 1
1
contadorNombres
80
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
(verdadero) y se entra nuevamente al ciclo while para volver a incrementar el contador con
la instrucción
contadorNombres= contadorNombres + 1
contadorNombres= 1 + 1
contadorNombres
A continuación se pide otro nombre o el centinela y el proceso se repite mientras se siga
contestando con un nombre diferente al centinela
Cuando se teclea el centinela f la condición booleana del while toma el valor falso y la
ejecución del while termina.
Por último, ya fuera del while, se imprime el último valor que obtuvo contadorNombres
para indicar cuantos nombres se leyeron con la instrucción
'''PROGRAMA cuentaNegativos
Genera aleatoriamente N números enteros y cuenta cuantos de ellos son negativos. Se usan
los contadores cuentaNumeros para controlar el lazo while, y cuentaNegativos, para llevar
la cuenta de los negativos.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya '''
import random
cuentaNumeros= 1
cuentaNegativos= 0
81
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
cuentaNumeros= cuentaNumeros + 1
print("Del total de ", N, " números ", cuentaNegativos, " son negativos")
82
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
ACUMULADORES
Un acumulador es una variable cuyo valor se incrementa (o decrementa) en una cantidad
variable a cada repetición.
Los acumuladores se usan principalmente para obtener el total final de un conjunto de
cantidades diferentes. Se deben inicializar a un valor apropiado (generalmente uno o cero)
antes de entrar a un lazo. Dentro del lazo se incrementan (o decrementan) en una cantidad
que es diferente en cada repetición. El uso de los acumuladores se muestra en el siguiente
programa que calcula la suma de los cuadrados de un conjunto de números.
'''PROGRAMA sumaCuadrados
Calcula la suma de los cuadrados de los números de una lista de N números.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
salida= ""
NÚMERO CUADRADO
20.0 400.0
10.0 100.0
9.8 96.7
5.0 25.0
6.0 36.0
La suma de los cuadrados es: 657.7
83
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
ENTRADA
SALIDA
if condición booleana:
instrucción 1.1
instrucción 1.2
instrucción 1.3
. . .
else:
instrucción 2.1
instrucción 2.2
instrucción 2.3
. . .
Las instrucciones del bloque 1 se ejecutan solo en el caso de que la condición booleana
sea verdadera. Si es falsa, se ejecutan las instrucciones del bloque 2. Después de ejecutar
cualquiera de estas operaciones (pero no las dos al mismo tiempo) el algoritmo continúa su
ejecución en la instrucción que inmediatamente siga a la estructura if..else. El siguiente
ejemplo usa if..else.
Un ejemplo es el siguiente. Leer un número entero y determinar si es par o non.
84
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Con este if..else, si se teclea el número 90, entonces la condición booleana es verdadera
y se imprime
El número 90 es par
El número 45 es non
PROBLEMA. Dados tres números positivos mayores que cero que representan las
longitudes de los lados de un probable triángulo, construya un programa que determine si los
datos corresponden a un triángulo. Considere que un triángulo se forma cuando la suma de
los lados menores es más grande que el lado mayor. Considere también que los tres números
están ordenados de mayor a menor. Además, si se tiene un triangulo, calcule su área con
la fórmula
Desde luego que hay muchísimos casos particulares para cada uno de los casos generales.
Por ejemplo:
Para el caso 1) algunos casos particulares son: (5, 4, 3), (8, 7, 3), (6, 6, 4), y muchísimos más;
Para el caso 2) algunos casos particulares son: (10, 3, 4), (12, 4, 7), etc.
Puesto que se van a resolver algunos casos particulares de manera manual, conviene elegir
valores sencillos. Seleccionando los lados (5, 4, 3) para el caso general 1), y (12, 4, 7) para
el caso general 2), los cálculos son los siguientes:
85
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Para que se forme un triángulo se debe cumplir a < b+ c. Entonces 5 < 4 + 3 cumple la
condición. Se forma un triángulo.
Su área es:
s= (a+b+c) / 2 s= (5+4+3) / 2 s= 12 / 2= 6 s= 6
area= 6
El lado mayor es a= 12, Por tanto, para que se forme un triángulo se debe cumplir
a < b+ c.
Una vez que se ha resuelto el problema de manera manual, sin pensar siquiera en una
computadora, utilizando solamente nuestra lógica y como instrumentos papel y lápiz
(posiblemente una calculadora), entonces es momento de empezar a organizar nuestras ideas
de manera más formal.
Continuando con el paso I, entender problema, del Ciclo de desarrollo de software, ahora
se considera la salida, el proceso y la entrada de datos, en este orden exclusivamente para
este paso.
Salida. El problema pide determinar si con los lados proporcionados se forma ó no se forma
un triángulo. Si se forma un triángulo, entonces también hay que calcular su área. El diseño
de la salida debe considerar ambos casos: 1) hay triángulo; 2) no hay triángulo:
Cada # representa un dígito. Observe que se incluye un punto decimal, lo que significa que
el resultado se considera de tipo real (float).
86
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Proceso. Utilizar un if..else para averiguar si con los lados proporcionados se forma un
triángulo. Es decir, se debe probar la condición if (a < b + c). Si se cumple hay triángulo y
se calcula su área. Si no se cumple no hay triángulo.
Entrada. Los datos de entrada son las longitudes de los tres lados del posible triángulo.
Los números al inicio de cada paso son para facilitar su identificación durante la prueba del
algoritmo. Después de haber realizado la prueba los números se pueden eliminar.
87
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Para todos estos casos el algoritmo deberá trabajar correctamente. Si se recupera el resumen
de los cálculos manuales:
caso 2) a= 12 b= 4 c= 7 no no hay
entonces la prueba procede como sigue:
Caso 1)
paso ladoA ladoB ladoC (A< B+C) salida
1 5 4 3 ---- ----
2 5 4 3 verdadero Con los lados 5, 4 y 3 se forma un triángulo
Su área es 6
Caso 2)
paso ladoA ladoB ladoC (A< B+C) salida
1 12 4 7 ---- ----
2 12 4 7 falso Con los lados 12, 4 y 7 no se forma un triángulo
Es importante observar que la prueba incluyó dos corridas diferentes del algoritmo. Una
corrida para el caso donde se forma un triángulo, y otra para el caso donde no se forma un
triángulo. Esto es necesario ya que, como se mencionó anteriormente, cada corrida prueba
un caso particular de un caso general.
Cuando la prueba demuestre que el algoritmo es correcto, entonces es el momento de
convertirlo a programa. Para este ejemplo el programa Python es el siguiente.
88
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
print("Con los lados ", ladoA, ", ", ladoB, "y ", ladoC, "se forma un triángulo.")
print(" con area= ", area)
else:
print("Con los lados ", ladoA, ladoB, "y ", ladoC, " no se forma un triángulo.")
89
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
TEMPERATURA TEMPERATURA
caso 1) 100˚C 212˚F
caso 2) 212˚F 100˚C
Una vez que se ha resuelto el problema de manera manual, sin pensar siquiera en una
computadora, utilizando solamente nuestra lógica y como instrumentos papel y lápiz
(posiblemente una calculadora), entonces es momento de empezar a organizar nuestras ideas
de manera más formal.
Continuando con el paso I, entender problema, del Ciclo de desarrollo de software, ahora
se considera ahora la salida, el proceso y la entrada de datos, en este orden exclusivamente
para este paso.
Cada # representa un dígito. Observe que se incluye un punto decimal, lo que significa que
el resultado se considera de tipo real (double o float).
Proceso. Utilizar un if..else para averiguar cuál es la opción elegida por el usuario: 1)
Convertir Celsius a Fahrenheit; 2) convertir Fahrenheit a Celsius. Es decir, se debe probar la
condición if(codigoConversion == 1). Si se cumple se convierte de Celsius a Fahrenheit. De
lo contrario se convierte de Fahrenheit a Celius.
Entrada. El único dato de entrada es una temperatura.
90
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
1. Mostrar menú de opciones y leer la opción del usuario: qué tipo de conversión desea.
2. if(codigoConversion == 1)
Convertir la temperatura Celsius a Fahrenheit e imprimir la salida del caso 1).
Else (de lo contrario) convertir la temperatura Fahrenheit a e imprimir la salida del
caso 2).
3. Fin de algoritmo.
'''PROGRAMA conversionTemperaturas
Convierte una temperatura Celsius a Fahrenheit o una temperatura Fahrenheit a Celsius. El
usuario decide cual conversion desea. La formula para convertir una temperatura fahrenheit
a celsius es:
celsius = (fahrenheit - 32) / 1.8
91
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Caso 1)
paso codigoConversion gradosC gradosF salida
1 1 ---- ---- ----
2 1 100 212
SALIDA
100 grados Celsius equivalen a 212 grados Fahrenheit
Caso 2)
paso codigoConversion gradosC gradosF salida
1 2 ---- ---- ----
2 2 212 100
SALIDA
Es importante observar que la prueba incluyó dos corridas diferentes del algoritmo. Una
corrida para el caso donde la temperatura de entrada es Celsius, y otra para el caso donde la
temperatura de entrada es Fahrenheit. Esto es necesario ya que, como se mencionó
anteriormente, cada corrida prueba un caso particular de un caso general.
92
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se hizo una encuesta a un grupo de personas. Los datos de cada una de las personas son el
nombre, su edad, su sexo (M para masculino y F para femenino) y su estado civil (C para
casado y S para soltero). Se debe hacer un ´programa que imprima el reporte de la encuesta
con el siguiente formato
REPORTE DE ENCUESTA
NOMBRE EDAD EDO. CIVIL
xxxxxxxxxxxxx ## solter@
. . .
xxxxxxxxxxxxx ## casad@
TOTAL PERSONAS ##
TOTAL MUJERES ##
TOTAL CASADAS ##
TOTAL PERSONAS MAYORES DE 18 ##
El programa es el siguiente
93
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
REPORTE DE ENCUESTA
NOMBRE EDAD EDO. CIVIL
xxxxxxxxxxxxx ## Solter@
. . .
xxxxxxxxxxxxx ## Casad@
TOTAL PERSONAS ##
TOTAL MUJERES ##
TOTAL CASADAS ##
TOTAL PERSONAS MAYORES DE 18 ##
'''
salida= ""
totalPersonas= 0
totalMujeres= 0
totalMayores18= 0
totalCasadas= 0
94
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
if edoCivil== 'C':
estadoCivil= "CASAD@"
else:
estadoCivil= "SOLTER@"
print("\n")
print(salida)
print("FIN DE REPORTE")
95
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
96
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
ENTRADA
F condición V F condición V
booleana 3 booleana 2
SALIDA
97
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
if condiciónBooleana 1: F
if condiciónBooleana 2:
operación1
else:
operación2
else:
if condiciónBooleana 3: F
operación3
else:
operación4
'''ALGORITMO mayorDeTresNúmerosAnidación
Lee tres valores y determina cual es mayor. Utiliza una anidación de if..else
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
1. Leer A, B, C
2. if(A > B):
if(A > C):
mayor= A # A > B, A > C
else:
mayor= C # A > B, C > A
else:
if(B > C):
mayor= B # B > A, B > C
else:
mayor= C # C > B, C > A
98
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Si A es mayor que B, entonces se toma la parte verdadera del if y se ignora su parte else
(todas las instrucciones debajo de la línea sólida). Ahora se evalúa el segundo if: if(A > C),
que tiene sus respectivas ramas verdadero y falso.
Si A es mayor que C, entonces se toma la parte verdadera de este if y se ignora su parte
else y se asigna el valor de A a la variable mayor; esto indica que A es el mayor de los tres
números.
Pero si C es mayor que A, se toma la parte else y se asigna el valor de C a la variable
mayor. Aquí termina la evaluación de la parte verdadera del if exterior cuya condición es (A
> B).
Volviendo a la primera comparación, if(A > B). Si es falsa entonces significa que B es
mayor. Se toma su parte else.
A continuación se evalúa la comparación if(B > C). Si B es mayor que C, se toma su parte
verdadera, se ignora la parte else y se asigna el valor de B a la variable mayor.
Pero si C es mayor que B, se toma la parte else y se asigna el valor de C a mayor.
Con esto se habrán evaluado todas las posibilidades y al final de este proceso se habrá
encontrado el mayor de los tres números A, B, C.
Es importante entender que el paso 2 termina inmediatamente después de que se hace una
asignación a la variable mayor. Por ejemplo, cuando se ejecuta mayor= A, en este momento
se da por terminado el paso 2. Esto significa que las otras asignaciones a mayor ya no se
ejecutan, por lo que al finalizar este paso, mayor tiene un valor único. Lo mismo sucede
cuando se hace cualquier otra asignación a mayor.
En el paso 3 se imprime el valor que se la haya asignado a mayor en el paso 2.
Caso 1) A= 5 B= 14 C= 3
Caso 2) A= 12 B= 4 C= 7
Caso 3) A= 8 B= 12 C= 26
99
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Caso 1)
paso A B C (A > B) (A > C) (B > C) mayor salida
1 5 14 3 ---- ---- ---- ---- ----
2 5 14 3 falso no se evalúa verdadero B=14
3 5 14 3 falso no se evalúa verdadero B=14 LOS NUMEROS SON 5, 14 y 3
EL VALOR MAYOR ES 14
Caso 2)
paso A B C (A > B) (A > C) (B > C) mayor salida
1 12 4 7 ---- ---- ---- ---- ----
2 12 4 7 v v no se evalúa A=12
3 12 4 7 v v no se evalúa A=12 LOS NUMEROS SON 12, 4 y 7
EL VALOR MAYOR ES 12
Caso 3)
paso A B C (A > B) (A > C) (B > C) mayor salida
1 8 12 26 ---- ---- ---- ---- ----
2 8 12 26 f no se evalúa f C=26
3 8 12 26 f no se evalúa f C=26 LOS NUMEROS SON 8, 12 y 26
EL VALOR MAYOR ES 26
'''PROGRAMA mayorDeTresNúmerosAnidación
Lee tres valores y determina cual es mayor. Utiliza una anidación de if..else anidado.
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
A= float(input("Dame primer numero A: "))
B= float(input("Dame segundo numero B: "))
C= float(input("Dame tercer numero C: "))
100
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Aplicando los pasos del Ciclo de desarrollo de un algoritmo a este problema se tiene:
101
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
I. ENTENDER PROBLEMA. Se deja como ejercicio al alumno que resuelva con lápiz
y papel algunos casos particulares del problema. A continuación se define el formato de la
salida, el proceso (operaciones) que se deba realizar, y los datos de entrada.
PROCESO. La tarifa que cada turista debe pagar se calcula de acuerdo a lo siguiente:
Si el turista es residente del estado, el costo por los primeros tres días de estancia en el
parque es de $1000.00 por día. Después de tres días el costo se reduce a $800.00 por día. Si
el turista no es residente del estado, el costo por los primeros 5 días es de $1100.00 por día.
Después de cinco días el costo se reduce a $900.00 por día.
ENTRADA. Los datos de entrada son el nombre de cada turista; un código que tiene una
R para residente del estado y N no residente; y los días de estancia en el parque. Un ejemplo
para cuatro turistas es:
Observe que al final de la lista de datos procesables se han añadido los tres datos centinela
“fin”, ´X´, y -99. También observe que los datos centinela deben de ser del mismo tipo de
dato que su respectivo dato procesable. Así, como el dato nombre es de tipo cadena (String)
su respectivo dato centinela también es una cadena (“fin”); el dato código es de tipo carácter
(char) y su respectivo dato centinela también lo es (´X´); y finalmente, el dato días es de tipo
entero al igual que su centinela (-99). Además, los datos centinela se eligieron de tal modo
que difícilmente puedan ser confundidos con datos procesables.
El programa es el siguiente:
102
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA TarifasParqueLinceCentinela
Calcula e imprime la tarifa a pagar para cada uno de los turistas con base en el número de
días de estancia en el parque estatal y en su status: residentes o no residentes del estado.
Se utiliza un while con el centinela FIN en el campo NOMBRE
AUTOR: ing. josé Rodríguez Ruiz depto. Sistemas y Computación ITCelaya
'''
salida= ""
totalTuristas= 0
totalDiasEstancia= 0
totalCuenta= 0.0
nombre= input("Dame nombre del primer turista o FIN para terminar ")
nombre= [Link]()
if codigo == "R":
status= "RESIDENTE"
else:
status= "FORANEO"
if codigo == 'R':
if dias > 3:
cuenta= 3 * 1000 + (dias - 3) * 800
else:
cuenta= dias * 1000
else:
if(dias > 5):
cuenta= 5 * 1100 + (dias - 5) * 900
else:
cuenta= dias * 1100
103
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
nombre= input("Dame nombre del siguiente turista o FIN para terminar ")
nombre= [Link]()
print(salida)
print("\nTermina programa")
104
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
INSTRUCCIÓN elif
En muchas aplicaciones se necesitan varias decisiones anidadas en forma de “cascada”
para probar varias alternativas mutuamente excluyentes (al elegir una automáticamente se
desechan las otras). Desde luego que podían usarse if ..else independientes (no anidados),
pero en este caso se tendrían que evaluar todas y cada una de las alternativas aún cuando no
fuera necesario. Para situaciones de este tipo se puede utilizar un if..else anidado también ,
como el que se vió en la sección anterior.
También se puede utilizar la instrucción elif. La instrucción elif es la contracción para un
else seguido de un if (ver if..else anidado).
ENTRADA
condición
Falso Verdadero
booleana 1
Operación 1
Operación 2
Operación 3
Falso Verdadero
condición
booleana n
SALIDA
105
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
En este ejemplo la “cascada” está sobre el valor falso de las condiciones booleans, pero
también puede estar sobre las condiciones verdaderas. Aunque en este ejemplo hay cuatro
niveles de condiciones boolenas, en un programa en particular puede haber cualquier número
de niveles
if condición booleana 1:
operación 1
elif condición booleana 2:
operación 2
elif condición booleana 3:
operación 3
. . .
elif condición booleana n:
operación n - 1
else:
operación n
Aunque se tienen varias alternativas de bono, estas son mutuamente excluyentes, porque
ningún empleado puede caer en más de una de ellas. Esta situación es apropiada para
resolverse con elif. El algoritmo se presenta a continuación. Se deja como ejercicio al
estudiante que aplique todos los pasos del Ciclo de desarrollo de algoritmos.
106
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
'''PROGRAMA bonoDeNavidad
Calcula el bono de navidad para los empleados de una fábrica de acuerdo a las horas
extras trabajadas y a las horas que estuvieron ausentes de su trabajo.
print("{:>15}".format("NOMBRE"),
"{:>20}".format("FÓRMULA"),"{:>10}".format("BONO ($)"))
print("{:25}".format(nombre), "{:9.1f}".format(resulFormula), "{:11.2f}".format(bono))
El algoritmo empieza leyendo los datos del empleado en el paso 1. En el paso 2 se evalúa
la fórmula en que se basa la asignación del bono. El resultado se almacena en la variable
resulFormula. Con esto se evita repetir la evaluación de resulFormula en cada uno de los
if..else anidados del siguiente paso.
En el paso 3 se determina el bono. Inicia con la comparación if(resulFormula > 40). Si es
verdadera se ejecuta la instrucción bono= 10000 y se ignora su parte elif y el paso 3 habrá
terminado ya que las otras comparaciones elif no se evalúan porque están contenidas en la
parte elif de la primera comparación.
Por el contrario, si la primera comparación, if(resulFormula > 40), es falsa se continúa
con la siguiente comparación de su parte elif y se repite el proceso que se explicó
anteriormente hasta que se asigne un valor a la variable bono.
Por ejemplo, si en el paso 2 la variable resulFormula obtiene el valor 25, la primera
comparación del paso 3, if(resulFormula > 40), es falsa y se toma su else para evaluar la
segunda comparación, if(resulFormula > 30). Esta comparación también es falsa, por lo que
nuevamente se toma la parte elif para evaluar la tercera comparación, if(resulFormula > 20),
En este caso la comparación es cierta y se asigna a bono el valor 6000 y ya no es necesario
evaluar la cuarta comparación. En este momento termina el paso 3.
Una vez terminado el paso 3, se imprime el nombre del empleado y su bono en el paso 4.
107
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
Se deja como ejercicio que el estudiante haga la prueba para otros casos posibles.
I. ENTENDER PROBLEMA
Cálculos manuales.
Proceso. Se inicializan las variables para máximo y mínimo (para sueldo y para nombre)
con los datos del primer empleado. Después se comparan estas variables con los sueldos de
los restantes empleados para encontrar los verdaderos sueldos máximo y mínimo.
Entrada. Los datos son: nombre y sueldo de cada empleado, número de empleados.
108
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
7. Imprimir salida
8. Fin de algoritmo
Los números en las líneas del algoritmo son para indicar en la prueba cual es el paso que se
está ejecutando. Para correr el programa en computadora esos números deben eliminarse. La
prueba se hará con los siguientes datos de entrada
Nombre Sueldo
Luis Alva $5600.00
Raul Gutiérrez $7350.00
Pedro Solís $4450.00 Sueldo Máximo: Raul Gutierrez: $7350.00
María Nava $6180.00 Sueldo Mínimo: Pedro Solis $4450.00
Para la prueba se necesitará una tabla con renglones para cada uno de los pasos y con
columnas para cada una de las variables.
4 4 Luis Alva 5600 Luis Alva 5600 Luis Alva 5600 2 --- ---
5 4 Raul Guti 7350 Luis Alva 5600 Luis Alva 5600 2 --- ---
6 4 Raul Guti 7350 Raul Guti 7350 Luis Alva 5600 2 verdadero ---
4 4 Raul Guti 7350 Raul Guti 7350 Luis Alva 5600 3 verdadero ---
5 4 Pedro Sol 4450 Raul Guti 7350 Luis Alva 5600 3 verdadero ---
6 4 Pedro Sol 4450 Raul Guti 7350 Pedro Sol 4450 3 falso verdadero
109
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
4 4 Pedro Sol 4450 Raul Guti 7350 Pedro Sol 4450 4 falso verdadero
5 4 María Nav 6180 Raul Guti 7350 Luis Alva 5600 4 falso verdadero
6 4 María Nav 6180 Raul Guti 7350 Pedro Sol 4450 4 falso falso
4 4 María Nav 6180 Raul Guti 7350 Pedro Sol 4450 5 falso falso
'''PROGRAMA sueldoMaxMin
Obtiene los datos de n empleados y encuentra quien gana el sueldo máximo y quién el
Sueldo mínimo. Por simplicidad se considera que todos lo sueldos son diferentes. '''
110
PROGRAMACIÓN ORIENTADA A OBJETOS ING. JOSÉ RODRÍGUEZ RUIZ
111