LIBRO Lógica, Algoritmos y Programación en Python Un Enfoque Práctico
LIBRO Lógica, Algoritmos y Programación en Python Un Enfoque Práctico
iii
iv
Dedicado a
mi familia
v
vi
Índice general
Prefacio 1
1. Pensamiento Lógico 5
1.1. Habilidades del pensamiento . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1. Lógica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2. Tablas de verdad . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.3. Ejercicios Lógica . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.4. Habilidades Lógico Matemáticas . . . . . . . . . . . . . . . . . 14
1.1.5. Ejercicios de habilidades lógico-matemáticas . . . . . . . . . . 19
1.1.6. Teoría de conjuntos . . . . . . . . . . . . . . . . . . . . . . . . 21
1.1.7. Ejercicios de conjuntos . . . . . . . . . . . . . . . . . . . . . . 26
1.2. Aritmética en la lógica . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.2.1. Los números naturales . . . . . . . . . . . . . . . . . . . . . . 27
1.2.2. Ejercicios de números naturales . . . . . . . . . . . . . . . . . 30
1.2.3. Los números enteros . . . . . . . . . . . . . . . . . . . . . . . 30
1.2.4. Ejercicios de números enteros . . . . . . . . . . . . . . . . . . 36
1.2.5. Mínimo común múltiplo . . . . . . . . . . . . . . . . . . . . . 36
1.2.6. Ejercicio mcm . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.2.7. Máximo común divisor . . . . . . . . . . . . . . . . . . . . . . 38
1.2.8. Ejercicios MCD . . . . . . . . . . . . . . . . . . . . . . . . . . 39
vii
viii ÍNDICE GENERAL
3. Estructuras secuenciales 61
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.2. Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.3. Estructuras secuenciales . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.1. Ejemplo suma de dos números . . . . . . . . . . . . . . . . . . 62
3.3.2. Ejemplo área y perímetro de un rectángulo . . . . . . . . . . . 64
3.3.3. Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.3.4. Ejemplo área de una circunferencia . . . . . . . . . . . . . . . 67
3.3.5. Ejemplo intercambio de variables . . . . . . . . . . . . . . . . 68
3.3.6. Ejemplo producción de leche . . . . . . . . . . . . . . . . . . . 69
3.3.7. Ejemplo sueldo semanal . . . . . . . . . . . . . . . . . . . . . 70
3.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4. Estructuras selectivas 73
4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.2. Estructuras selectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.2.1. Ejemplo: Dados dos valores determinar el mayor . . . . . . . . 75
4.2.2. Ejemplo: Determinar si un número es positivo o negativo . . . 76
4.2.3. Ejemplo: “CompuMax” . . . . . . . . . . . . . . . . . . . . . . 78
4.3. Estructuras if-elif-else . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.3.1. Ejemplo: Calculadora . . . . . . . . . . . . . . . . . . . . . . . 80
4.3.2. Ejemplo: Las brisas del caracol . . . . . . . . . . . . . . . . . 82
4.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5. Estructuras repetitivas 85
5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2. Estructuras repetitivas o de ciclo . . . . . . . . . . . . . . . . . . . . 85
5.2.1. Ejemplo: Suma diez cantidades con ciclo “Mientras que” . . . . 86
5.2.2. Ejemplo suma diez cantidades con ciclo “Desde” . . . . . . . . 87
5.2.3. Ejemplo cálculo de promedio de números . . . . . . . . . . . . 89
5.2.4. Ejemplo cálculo de promedio sin conocer la cantidad de números 91
5.2.5. Ejemplo cálculo de ahorro en un año . . . . . . . . . . . . . . 92
5.2.6. Ejemplo serie Fibonacci . . . . . . . . . . . . . . . . . . . . . 94
5.2.7. Ejemplo número primo . . . . . . . . . . . . . . . . . . . . . . 95
5.2.8. Ejemplo dibuja triángulo numérico . . . . . . . . . . . . . . . 97
5.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
ÍNDICE GENERAL ix
7. Funciones 135
7.1. Funciones con y sin retorno de valor . . . . . . . . . . . . . . . . . . . 136
7.1.1. Funciones sin retorno de valor . . . . . . . . . . . . . . . . . . 136
7.1.2. Funciones con retorno de valor . . . . . . . . . . . . . . . . . . 137
7.2. Argumentos y parámetros . . . . . . . . . . . . . . . . . . . . . . . . 138
7.3. Argumentos por valor y por referencia . . . . . . . . . . . . . . . . . 139
7.4. Funciones recursivas . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.4.1. Función recursiva sin retorno . . . . . . . . . . . . . . . . . . 140
7.4.2. Función recursiva con retorno . . . . . . . . . . . . . . . . . . 141
7.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Bibliografía 171
1
2 PREFACIO
Cuando se mencione en el texto algún elemento del lenguaje, éste aparecerá resal-
tado como la palabra hola.
Los ejemplos de código se muestran del siguiente modo:
1 def saludo () :
2 print ( " Hola mundo ... " )
3 print ( " Esta es mi primera función ... " )
4
5 saludo ()
Cada programa cuenta con números de línea para una mejor referencia. Siempre
que sea posible, los ejemplos de código van seguidos por la salida del programa (es
decir, el resultado de ejecutar el código).
Debido a su extensión, en el primer capítulo se van proponiendo ejercicios para el
lector por cada tema visto. En los siguientes capítulos, los ejercicios se proponen al
final.
3
4
Capítulo 1
Pensamiento Lógico
1.1.1. Lógica
Conceptos básicos
Lógica. Disciplina que estudia los métodos y principios que se usan para distinguir
el razonamiento bueno (correcto) del malo (incorrecto).
5
6 Capítulo 1
Premisa. Proposición aseverada o supuesta que sirve de apoyo o razón para aceptar
la conclusión de un argumento.
Lógica proposicional
La lógica proposicional es el nivel más básico de la lógica, se encarga de analizar
las relaciones entre proposiciones, así como la verdad o la falsedad de éstas.
Variables.Las variables proposicionales son los símbolos que sustituyen a las pro-
posiciones. Se llaman de ese modo porque su significado cambia en las diferentes
argumentaciones o expresiones donde se utilicen.
Inferencia lógica
Inferencia. Es un razonamiento, compuesto por proposiciones, por el cual se deriva
o extrae una conclusión de una o varias premisas.
Tipos de inferencia
1. Según el número de premisas
Inferencia inmediata. Es una forma de razonamiento que presenta una sola
premisa, de la cual derivamos una conclusión.
P: Si Lucía siempre es puntual
C: entonces, es falso que llegue tarde.
Pensamiento Lógico 7
Ejemplo
P=Está lloviendo
Q=Hace frío
P Q P∧Q
V V V
V F F
F V F
F F F
Disyunción
En razonamiento formal, una disyunción lógica (o) entre dos proposiciones es
un conector lógico (∨), cuyo valor de la verdad resulta en falso solo si ambas propo-
siciones son falsas, y en cierto de cualquier otra forma.
Ejemplo
P=Está lloviendo
Q=Hace frío
P Q P∨Q
V V V
V F V
F V V
F F F
Condicional
El condicional es una conectiva lógica que conecta dos proposiciones, representa-
do usualmente −→. En lógica proposicional, el condicional es una función de verdad
binaria, que se vuelve falso cuando Q es falsa siendo P verdadera, y se vuelve verda-
dero en cualquier otro caso.
Sea:
P=Está lloviendo
Q=Hace frío
P Q P−→Q
V V V
V F F
F V V
F F V
Bicondicional
El valor de verdad de un bicondicional «p si y solo si q» es verdadero cuando
ambas proposiciones (p y q) tienen el mismo valor de verdad, es decir, ambas son
verdaderas o falsas simultáneamente; de lo contrario, es falso.
Pensamiento Lógico 9
Sea:
P=Está lloviendo
Q=Hace frío
P Q P←→Q
V V V
V F F
F V F
F F V
Negación
La negación, también llamada complemento lógico, es una operación sobre
proposiciones, valores de verdad, o en general, valores semánticos. Intuitivamente, la
negación de una proposición es verdadera cuando dicha proposición es falsa, y vice-
versa.
Ejemplo
P=Está lloviendo
P qP
V F
F V
P qP P∧qP P−→(P∧qP)
V F F F
F V F V
En la proposición solo se tiene una variable (es decir, P), esta variable puede tomar
dos valores: verdadero o falso (ver Tabla 1.6 columna 1). Cabe destacar que el número
de filas de una tabla se encuentra relacionado con el número de variables. Y la relación
es mediante la fórmula 2n , en donde n es el número de variables. Por ejemplo, si se
tienen 3 variables (P, Q, R), el número de filas de la tabla sería de 23 = 8.
Ya que se tienen definidos los valores de las variables (ver Tabla 1.6 columna 1),
como primer paso, se realiza lo que se encuentra entre paréntesis. Lo que implica
que se debe obtener la negación de P (segunda columna de Tabla 1.6). Teniendo la
negación de P, se procede a realizar lo que falta de la expresión que se encuentra
entre paréntesis (tercera columna de Tabla 1.6). Finalmente se realiza la expresión
completa (cuarta columna de Tabla 1.6).
Ejemplo 2:
Construir la tabla de verdad de la siguiente proposición:
(P∨Q)∨qQ
P Q P∨Q qQ (P∨Q)∨qQ
V V V F V
V F V V V
F V V F V
F F F V V
Primero vemos cuántas variables tiene la proposición, en este caso, son 2 (P y Q).
Utilizamos la fórmula 2n para determinar el número de filas de la tabla, que sería
22 = 4 (ver Tabla 1.7 columnas 1 y 2). En seguida, realizamos lo que se encuen-
tra entre paréntesis en la proposición, es decir, P ∨ Q (ver Tabla 1.7 columna 3).
Posteriormente, obtenemos la negación de Q (ver Tabla 1.7 columna 4). Finalmen-
te, resolvemos la expresión (ver Tabla 1.7 columna 5) con los datos obtenidos en las
columnas anteriores de la tabla.
Circuitos lógicos
Un circuito digital es aquel que maneja la información en forma binaria, es decir,
con valores de "1 y 0".
Podemos ver los valores "verdadero - falso", del predicado P, como valores "1 y
0". En donde un 0 equivale a falso y un 1 a verdadero.
Conjunción
Disyunción
En resumen
Ejemplo 1
(qr∨qp) ∧ p
Solución:
Ejemplo 2
Solución
(p ∧ q) −→ (q∧qp)
cosas que pasan (si le añado 3 unidades a estas 5, obtendré 8 porque las he sumado,
etc.)” 2
Gracias a estas habilidades somos capaces de pensar de manera más o menos cohe-
rente, detectar regularidades en las relaciones entre las cosas y razonar lógicamente.
Acertijos
Los acertijos lógicos son pasatiempos o juegos que consisten en hallar la solución
de un enigma o encontrar el sentido oculto de una frase. Para resolver los acertijos
más comunes hay que hacer uso de la imaginación y de la capacidad de deducción[1].
La tienda misteriosa
Solución:
En la tienda se venden letras (o rótulos con letras). Cada letra de cada palabra
cuesta 100 pesos.
El camión grande
Tienes que pasar necesariamente al otro lado del puente. Cerca del puente hay tien-
das donde venden sierras, taladradoras, pulidoras y otras herramientas.
Solución:
El camino perdido
Conduces tu coche biplaza por una carretera perdida y nada transitada bajo una
intensa lluvia. De repente, encuentras a 3 personas refugiadas en un pequeño cobertizo
de 1 m2 : un antiguo amigo que una vez te salvó la vida y no tenías manera de volver
a contactar, una señora mayor de 60 años que necesita asistencia médica urgente o
morirá y la que, seguramente, podría ser la mujer de tu vida.
Nunca volverás a pasar por esa carretera, así que probablemente nunca vuelvas
a ver a esas personas. En tu coche solo puedes llevar a una persona más. ¿Qué harías?
Solución:
Sudoku
Es un juego matemático que se inventó a finales de la década de 1970, adquirió
popularidad en Japón en la década de 1980 y se dio a conocer en el ámbito interna-
cional en 2005 cuando numerosos periódicos empezaron a publicarlo en su sección de
pasatiempos. El objetivo del sudoku es rellenar una cuadrícula de 9 × 9 celdas (81
casillas) dividida en subcuadrículas de 3 × 3 (también llamadas “cajas” o “regiones”)
con las cifras del 1 al 9 partiendo de algunos números ya dispuestos en algunas de las
celdas. Aunque se podrían usar colores, letras, figuras, se conviene en usar números
para mayor claridad, lo que importa es que sean nueve elementos diferenciados, que
no se deben repetir en una misma fila, columna o subcuadrícula. Un sudoku está bien
planteado si la solución es única, algo que el matemático Gary McGuire ha demos-
trado que no es posible si no hay un mínimo de 17 cifras de pista al principio.
Reglas y terminologías
Además, cada número de la solución aparece solo una vez en cada una de las tres
“direcciones”, de ahí el “los números deben estar solos” que evoca el nombre del juego.
Ejemplo:
Conteo de figuras
Determinar cuántos cuadrados se encuentran en cada una de las figuras.
9 + 4 + 1 = 14
2+1
4+3+2+1
Completar valores
Completa los valores que faltan, sabiendo que el valor en cada círculo corresponde a
la suma de los valores en los dos círculos debajo.
Letras en desorden
Reto: Descubre los nombres de países que están escritos por las letras en desorden.
Pensamiento Lógico 19
Ejemplo:
tagriarlne: Inglaterra
urpe: Perú
omlaiboc: Colombia
xmioec:
iaalit:
aiusr:
ianhc:
anadac:
Había tres hombres sentados frente a la entrada y nada más de verlos dedujeron
quién era el sospechoso, aunque ninguno tenía coche ni las botas manchadas de
barro.
5. Completa los valores que faltan, sabiendo que el valor en cada círculo corres-
ponde a la suma de los valores en los dos círculos debajo.
Pensamiento Lógico 21
Conceptos básicos
ELEMENTO. Es cada uno de los objetos por los cuales está conformado un
conjunto. x ∈ A (El elemento x pertenece al conjunto A). El símbolo ∈
/ se utiliza
cuando un elemento no pertenece al conjunto.
∴ si B es un subconjunto de A se escribe B ⊆ A.
TIPOS DE CONJUNTOS
Conjunto universo (U, Ω)
Se denomina así al conjunto formado por todos los elementos del tema de referen-
cia.
U = {x/x es un animal}
A = {x/x es un mamífero}
B = {x/x es un reptil}
Conjunto vacío ( { }, ∅ )
Ejemplos:
Conjunto de los meses del año que terminan en a.
Conjunto de números impares múltiplos de 2.
Conjunto unitario
Conjuntos disjuntos
Se llaman conjuntos disjuntos aquellos que no tienen ningún elemento que perte-
nezca a ambos al mismo tiempo.
Ejemplo: Los dos conjuntos siguientes:
{x/x es un número natural}
{x/x es un día de la semana}
Son disjuntos ya que no tienen ningún elemento común.
Conjuntos iguales
Los conjuntos son iguales, si tienen los mismos elementos, por ejemplo: El conjun-
to { a, b, c } también puede escribirse:
{ a, c, b }, { b, a, c }, { b, c, a }, { c, a, b }, { c, b, a }
En teoría de conjuntos se acostumbra a no repetir los elementos, por ejemplo:
El conjunto { b, b, b, d, d } simplemente será { b, d }.
Conjunto infinito
Ejemplo:
U={1,2,3,4,5,6,7,8,9,10,11}
A={5,6,7,8,9,10}
B={2,4,6,8,10}
A ∪ B={2,4,5,6,7,8,9,10}
Intersección
Resta
Complemento
Encuentre:
A∩B
A∪B
A-B
B-A
3. Encuentre A ∪ B
A = {2,4,6,8,10,11,12,14,16}
B = {1,3,5,7,9,11,13,15,17}
U = {x/x es un número natural}, 1 ≤ x ≤ 25
4. Encuentre A ∩ B
A = {2,4,6,8,10,11,12}
B = {1,3,5,7,9,11,13}
U = x/x es un número natural, 1 ≤ x ≤ 15
Propiedad asociativa: Para sumar tres o más números naturales, el orden en que
se haga no modifica el resultado: a + (b + c) = (a + b) + c
Ejemplo
2+(7+1) = (2+7)+1 = 10
El elemento neutro es el 0: a + 0 = 0 + a
Ejemplo
4+0=0+4=4
El elemento neutro es el 1: a · 1 = 1 · a
Ejemplo:
12 · 1 = 1 · 12 = 12
Factor común: Una suma en la que los sumandos tienen un elemento en común,
puedes escribirla como el producto de dicho elemento y la suma de los sumandos
sin ese elemento. Es decir, a · b + a · c = a · (b + c)
Ejemplo:
2 · 5 + 2 · 7 = 2 · (5 + 7)
1. Un teatro tiene una capacidad máxima de 300 localidades. El día del estreno
de una obra se vendieron la mitad por teléfono y 50 a pie de taquilla.
¿Cuántas entradas quedaron por vender?
Si las entradas en taquilla cuestan $50.00 y las de venta telefónica $30.00. ¿Cuán-
to dinero habrá recaudado el teatro el día del estreno?
2. Elisa ha comprado 140 vestidos a $100.00 cada uno y los pone en venta a $150.00
la unidad.
Como solo consigue vender 30, los rebaja a $120.00, de modo que consigue
venderlos todos.
¿Qué beneficio ha obtenido por la venta de los vestidos?
Valor absoluto
El valor absoluto de un número es la distancia de dicho número al 0 y se representa
con el número entre las llamadas barras de valor absoluto ||.
Ejemplo:
Así pues, el valor absoluto de 5, |5|, es 5 pues dista 5 unidades del 0 y el valor absoluto
de -8, | − 8|, es 8 porque la distancia es de 8 unidades respecto al 0.
Observa que el valor absoluto de un número es positivo pues las distancias siempre
son positivas.
Si ambos sumandos tienen el mismo signo, se suman los valores absolutos y se man-
tiene el signo:
Ejemplo:
Observa que en el segundo ejemplo -4 está entre paréntesis. La razón es que no puede
haber nunca dos signos seguidos.
Si los sumandos tienen diferente signo, se restan los valores absolutos y se pone el
signo del sumando que tiene mayor valor absoluto.
Ejemplo:
Para hacer 5 + (-9) tienes que calcular los valores absolutos |5|=5, |-9|=9, restar-
los 9 – 5 = 4 y como -9 tiene mayor valor absoluto, el resultado será negativo, es
decir, 5 + (-9) = -4.
Propiedad asociativa: Para sumar tres o más números enteros, el orden en que
se haga no modifica el resultado: a + (b + c) = (a + b) + c
Pensamiento Lógico 33
Ejemplo:
5 + (-7 + 4) = (5 + (-7)) + 4
5 + (-3) = -2 + 4
2=2
El elemento neutro es el 0: a + 0 = 0 + a
Ejemplo:
-5 + 0 = 0 + (-5)
Para restar dos números enteros no tienes más que transformar la resta en una
suma, a – b = a + (-b) y operar como en el paso anterior:
Ejemplo:
6 – 10 = 6 + (-10) = -4
-2 – 5 = -2 + (-5) = -7
Para multiplicar dos números enteros tienes que multiplicar los valores absolutos
de ambos factores. El signo vendrá determinado por la siguiente regla:
Ejemplo:
4 · 8 = 32
4 · (- 8) = -32
-4 · 8 = -32
-4 · (- 8) = 32
El elemento neutro es el 1: a · 1 = 1 · a
Ejemplo:
-12 · 1 = 1 · (-12) = -12
Pensamiento Lógico 35
Factor común: Una suma en la que los sumandos tienen un elemento en común,
puedes escribirla como el producto de dicho elemento y la suma de los sumandos
sin ese elemento. Es decir, a · b + a · c = a · (b + c)
Ejemplo:
2 · 5 + 2 · (-7) = 2 · [5 + (-7)]
Para dividir dos números enteros tienes que dividir los valores absolutos de ambos
factores. El signo vendrá determinado por la siguiente regla:
Ejemplo:
54 / 6 = 9
54 / (- 6) = -9
-54 / 6 = -9
-54 / (- 6) = 9
3. La temperatura de un lugar descendió entre las 20:00 y las 2:00 del día siguiente
3 ºC cada hora.
4. Si salgo de casa con $30.00, compro tres entradas para un concierto de $7.00
cada una, recibo el dinero de las entradas de mis dos amigos y me gasto $4.00
en refrescos durante el concierto, ¿cuánto dinero me quedará?
de todos ellos (o el ínfimo del conjunto de los múltiplos comunes). Este concepto ha
estado ligado históricamente con números naturales, pero se puede usar para enteros
negativos o número complejo.
Ejemplo:
Solución
El MCD son los factores comunes con su menor exponente, esto es:
MCD(48,60) = 22 · 3 = 12
Ejemplo:
En una frutería se desea empaquetar 90 manzanas y 42 naranjas en bandejas. Cada
bandeja contiene el mismo número de piezas de fruta del mismo tipo. Además,
cada bandeja debe contener el mayor número posible de cada fruta.
Pensamiento Lógico 39
Solución
1. Calculamos el MCD(90,42)
El MCD son los factores comunes con su menor exponente, esto es:
MCD(90,42) = 2 · 3 = 6
Para el inciso b), dividimos entre 6 que es el MCD de 90 y 42. Así, 90 manzana
entre 6 piezas por bandeja es igual a 15 y 42 naranjas entre 6 piezas por bandeja
es igual a 7.
Fundamentos de algoritmos y de
Python
2.1. Introducción
En este capítulo se proporcionan los fundamentos tanto de algoritmos como de
Python, con la finalidad de tener bases sólidas que permitan dar seguimiento al libro.
Si te estás iniciando en el mundo de la programación se recomienda que no te saltes
este capítulo.
1. Preciso. Debe indicar el orden en el cual debe realizarse cada uno de los pasos
que conducen a la solución del problema.
2. Definido. Esto implica que el resultado nunca debe cambiar bajo las mismas
condiciones del problema, éste siempre debe ser el mismo.
41
42 Capítulo 2
2.3. Identificadores
Los identificadores son los nombres que se les asignan a los objetos, los cuales se
pueden considerar como variables o constantes, éstos intervienen en los procesos que
se realizan para la solución de un problema, por consiguiente, es necesario establecer
qué características tienen.
2.3.1. Constante
Un identificador se clasifica como constante cuando el valor que se le asigna a este
identificador no cambia durante la ejecución o proceso de solución del problema. Por
ejemplo, en problemas donde se utiliza el valor de PI, si el lenguaje que se utiliza para
codificar el programa y ejecutarlo en la computadora no lo tiene definido, entonces
se puede establecer de forma constante estableciendo un identificador llamado PI y
asignarle el valor correspondiente de la siguiente manera:
PI = 3.1416.
2.3.2. Variables
Los identificadores de tipo variable son todos aquellos objetos cuyo valor cambia
durante la ejecución o proceso de solución del problema. Por ejemplo, el sueldo, el
pago, el descuento, etcétera, que se deben calcular con un algoritmo determinado, o,
en su caso, contar con el lado (L) de un cuadrado que servirá para calcular y obtener
su área.
A las variables del algoritmo se les identifica con un nombre. El nombre es una
cadena de caracteres alfanuméricos que debe empezar con una letra y pueden ser
mayúsculas o minúsculas. Dentro del nombre puede haber números o guiones bajos.
Es muy recomendable que los nombres de las variables tengan un nombre que tenga
relación con lo que representa. No puede haber dos variables con nombres iguales
dentro de un algoritmo. Dado que una letra mayúscula es distinta de una minúscula,
la variable VAR1 es distinta a var1 [3].
En todos los lenguajes de programación existe un conjunto de palabras reservadas
que no se pueden utilizar como nombres de variables. En el transcurso del libro iremos
conociendo muchas de las palabras reservadas de Python.
Tipos de variables
Los elementos que cambian durante la solución de un problema se denominan
variables y se clasifican dependiendo de lo que deben representar en el algoritmo,
por lo que pueden ser de tipo entero, real, lógica y string. Sin embargo, existen otros
tipos de variables que son permitidos con base en el lenguaje de programación que
se utilice para crear los programas, por consiguiente, al estudiar algún lenguaje de
programación se deben dar a conocer esas clasificaciones.
Para el caso de este libro, se denominará variables de tipo entero a todas
aquellas cuyo valor no tenga valores decimales. Por ejemplo: a=7 y b=-8 son variables
enteras.
Por su parte, las variables de tipo real podrán tomar valores con decimales. Por
ejemplo: a1=3.1416, b2=-30.23. También son variables reales aquellas que incluyen
una potencia como a_real=1.23 ×103 .
En caso de que las variables tomen valores de caracteres, se designarán string o
de cadena, por ejemplo: nombre=“Juan Pérez”, ocupación=“estudiante”, etc.
Una variable lógica es aquella que solamente toma los valores Verdadero o
Falso. Ejemplo de variables lógicas son:
Y=Verdadero
X=Falso
Inicialización de variables
Una manera de inicializar una variable es darle valor desde el inicio del algoritmo.
Esto lo podemos hacer al declarar las variables. Por ejemplo, una variable llamada
44 Capítulo 2
c=a+b
a+b es 7
a-b es 3
a*b es 10
2.5. Pseudocódigo
Sin duda, en el mundo de la programación el pseudocódigo es una de las herra-
mientas más conocidas para el diseño de solución de problemas por computadora.
Esta herramienta permite pasar casi de manera directa la solución del problema a un
lenguaje de programación específico. El pseudocódigo es una serie de pasos claros y
bien detallados que conducen a la resolución de un problema.
La facilidad de pasar casi de forma directa el pseudocódigo a la computadora ha
dado como resultado que muchos programadores implementen de forma directa los
programas en la computadora, lo cual no es muy recomendable, sobre todo cuando
no se tiene la suficiente experiencia para tal aventura, pues se podrían tener errores
propios de la poca experiencia acumulada con la solución de diferentes problemas.
Por ejemplo, el pseudocódigo para determinar el área de un cuadrado se puede
establecer de la siguiente forma:
Inicio
Leer lado
area = lado * lado
Escribir area
Fin
Como se puede ver, se establece de forma precisa la secuencia de los pasos por
realizar; además, si se le proporciona siempre el mismo valor a la variable lado, el
resultado del volumen será el mismo y, por consiguiente, se cuenta con un final.
2.7. Python
Python es un lenguaje interpretado, de alto nivel y enfocado principalmente a la
legibilidad y facilidad de aprendizaje y uso.
Python es un lenguaje multiplataforma, lo que significa que puede usarse en mul-
titud de sistemas distintos. Funciona en computadoras con sistemas operativos Linux,
BSD, Windows, etc[4].
Python es software libre , y se distribuye bajo la licencia “Python Software Foun-
dation License”. Esto significa que se distribuye gratuitamente y no necesita del pago
de licencias para su uso, ya sea privado o comercial.
Guido van Rossum es el creador de Python; y la filosofía que quiso darle es que
el código debe ser limpio y legible, simple sin ser limitado. Dicha filosofía hace que
Python sea un lenguaje ideal para aprender e iniciarse en la programación.
Python es un lenguaje completo perfectamente funcional, muy potente, y viene
acompañado por una serie de paquetes que facilitan funciones para el trabajo con casi
cualquier cosa.
La legibilidad importa
Los casos especiales no son lo suficientemente especiales como para romper las
reglas
Los espacios de nombres son una idea genial. ¡Hagamos más de eso!
9. Haz clic en la opción Create New Project. Aparece un cuadro donde pondrás lo
siguiente: Location: C:\...\PycharmProjects\NombreProyecto
Fundamentos de algoritmos y de Python 51
Deja seleccionada la opción por default (New environment using), solo asegúrate
que en Base interpreter se encuentra la ubicación donde se instaló Python.
12. Aparecerá otro menú donde debes seleccionar la opción Python File. Asigna
como nombre al archivo “saludo”.
1. Si realizaste los pasos anteriores, entonces tendrás una vista como la siguiente:
Fundamentos de algoritmos y de Python 53
2.7.4. Variables
Las variables en Python son de cuatro tipos: enteras, reales, alfanuméricas y ló-
gicas, para las que se usan las palabras reservadas int, float, str y bool, respectiva-
mente.
Cada variable debe tener un nombre, el cual debe empezar con una letra y sola-
mente acepta letras, números y guiones bajos. El nombre de una variable no puede
tener acentos ni espacios.
Cada variable del programa consta de tres partes: nombre, tipo y valor. En
Python, una variable puede cambiar de tipo dentro del mismo algoritmo. En un
principio puede ser entera y más adelante podemos redefinirla como cadena o como
real. Por eso decimos que Python usa tipos dinámicos.
Una operación básica de un algoritmo es la asignación. Ésta consiste en asignarle
un valor a una variable. En Python para la asignación usamos el signo de igual =,
por ejemplo:
a =3.14 # Define una variable flotante
b =3 # Define una variable entera
cadena =" Juan " # Define una cadena o string
letra = ’a ’ # Define un caracter
booleano = True # Define un valor booleano
Para saber qué tipo de variable se está empleando usamos la instrucción type de
la siguiente manera:
>>>type(cadena)
<class ‘str’>
Fundamentos de algoritmos y de Python 55
Donde vemos que la variable cadena es del tipo string. En las variables a, b,
cadena, letra, booleano hemos asignado valores a estas variables. Al mismo tiempo
que Python designa el tipo de la variable (con base al valor que asignamos).
2.7.5. Operadores
Los operadores indican las operaciones que deseamos realizar sobre las variables
y los datos. Existen cuatro tipos de operadores:
1. Aritméticos
2. Relacionales
3. Lógicos
4. De asignación
Operadores aritméticos
Los operadores aritméticos requieren dos datos para poder efectuarse. La tabla
2.1 proporciona una lista de los operadores aritméticos básicos
Las operaciones indicadas dan un resultado del mismo tipo si es que ambos opera-
dores son del mismo tipo. En el caso de que uno sea entero y otro sea real el resultado
es real.
Operadores relacionales
Operadores lógicos
Los operadores lógicos se usan con variables lógicas (que también reciben el nombre
de variables boolenas). En estos operadores ambos datos deben ser datos lógicos. Si
a y b son variables lógicas, los operadores lógicos son los que se muestran en la tabla
2.3.
Operadores de asignación
() (Paréntesis)
** (Potencia)
* (multiplicación), / (división), // (división entera), % (módulo)
+ (suma), - (resta)
>(mayor que), <(menor que), >= (mayor o igual que),
<= (menor o igual que), == (igualdad), != (desigualdad)
“not” (negación)
“and” (y lógica)
“or” (o lógica)
Ejemplo
¿Cuál es el resultado de la siguiente expresión?
-4 * 7 + 2 ** 3 / 4 – 5
Seguimos con multiplicaciones y divisiones que tienen igual jerarquía. En este ca-
so, se empieza de izquierda a derecha, así tenemos entonces:
-28 + 2 – 5
Finalmente, realizamos la suma y la resta que tienen igual jerarquía, pero tomando
en cuenta que se va a empezar a operar de izquierda a derecha. Quedando el resultado
siguiente:
-31
dato = a + b / 2
dato =( a + b )/2
2.7.8. Comentarios
En Python existen dos maneras de escribir líneas de comentarios. La primera es
usando el símbolo de numeral # al principio de cada renglón de comentario, como en:
Otra forma de usar los comentarios es después de una instrucción, por ejemplo:
a = b + c #Ejemplo de suma
La segunda manera es por lo general más usada cuando hay varias líneas de co-
mentarios. El párrafo de comentarios abre con tres apóstrofos “ ‘ y se termina con tres
apóstrofos ” ’, por ejemplo:
Fundamentos de algoritmos y de Python 59
Estructuras secuenciales
3.1. Introducción
Para la solución de cualquier problema que se vaya a representar mediante pseu-
docódigo o código de Python, siempre tendremos que representar mediante letras,
abreviaciones o palabras completas los elementos que intervienen en el proceso de so-
lución. A estos elementos se les denomina variables o constantes. Por ejemplo: precio,
horas_trabajadas, edad, etc.
Con base en esto, para facilitar la lectura de un algoritmo se recomienda crear una
tabla donde se declaran las variables que se utilizarán y sus características o tipo, tal
y como se muestra en la tabla 3.1, que muestra las variables que se utilizarían para
obtener el área de un cuadrado.
Tabla 3.1: Declaración de las variables que se utilizarán para obtener el área de un
rectángulo.
Como se puede ver en la tabla 3.1, se utilizará la variable lado para representar el
lado del cuadrado, a la cual se les podrán asignar diferentes valores. Al utilizar esos
valores y aplicar la fórmula correspondiente se podrá obtener el área del cuadrado,
la cual es asignada a la variable denominada area. Además, se describe que esas
variables son de tipo real, lo cual implica que podrán tomar valores fraccionarios,
pero también pudieron haber sido enteras.
61
62 Capítulo 3
las operaciones o acciones para resolver el problema; esas estructuras pueden ser:
secuenciales, de selección y de repetición, las cuales se analizarán en su momento.
Debe tenerse presente que la solución de un problema dado mediante el uso de
una computadora es un sistema, por lo que debe tener una entrada de datos que serán
procesados para obtener una salida, que es la solución o información que se busca.
En la figura 3.1 se muestra el esquema de un sistema que transforma los datos en
información mediante un proceso.
Tabla 3.2: Variables utilizadas para determina la suma de dos números cualesquiera
Entradas en Python
La función input nos permite leer los datos que se introducen mediante el teclado.
Dicha función recibe como argumento una cadena, la cual le indica al usuario lo que
debe realizar. En el programa 3.1, los argumentos de la función input son las cadenas:
“Introduce el primer valor a sumar: ” e “Introduce el segundo valor a sumar: ”. La
función input devuelve una cadena, que corresponde al dato que el usuario introdu-
ce. Para este ejemplo el valor devuelto por input no se puede asignar directamente
64 Capítulo 3
a las variables a y b, ya que como dijimos anteriormente, dichos valores son cadenas.
Entonces, lo que se tiene que hacer es convertir las cadenas a enteros mediante la
función int, la cual recibe como argumento el dato que queremos convertir a entero.
Con la conversión realizada procedemos a almacenar los datos proporcionados por el
usuario en sus respectivas variables, quedando de la siguiente forma:
Salidas en Python
Una vez que la información introducida por el usuario fue procesada, es necesario
mostrarla de alguna forma. Al proceso de mostrar dicha información se le denomina
salida. En Python la salida estándar se muestra en la pantalla de la computadora, y
dicha salida es mostrada gracias a la función print, la cual recibe como argumento
la información que se quiere mostrar.
Con base en el programa 3.1, tenemos que la salida queda de la siguiente forma:
Analicemos como funciona print. Primero, vemos que recibe como argumento la
cadena f“La suma es: {suma}”. Donde suma es la variable que almacenó la suma
de los dos números introducidos por el usuario. La f y las llaves {} que están en la
cadena permiten que se puedan imprimir los valores de las variables. Esto quiere decir
que si, por ejemplo, en print se hubiera puesto como argumento la cadena “La suma
es: suma”, en lugar de mostrar el valor de la variable suma, se hubiera mostrado la
palabra suma. Entonces, es indispensable poner la f antes de introducir la cadena y
usar las llaves para incluir el valor de la variable que se quiere mostrar.
La función float
3.3.3. Bibliotecas
Muy a menudo, Python requiere usar funciones que vienen en bibliotecas (el con-
cepto es similar a una biblioteca de la vida real, por ejemplo, si se necesita una in-
formación vamos a la biblioteca y consultamos el libro que tiene dicha información).
Estas bibliotecas deben llamarse antes de usar las funciones de ella. Por ejemplo, las
funciones trigonométricas, la raíz cuadrada, los logaritmos, etc., vienen incluidos en la
biblioteca de funciones matemáticas denominada math. Para poder usar sus funciones
en nuestro programa usamos al principio del programa lo siguiente:
import math
Y para usar las funciones usamos, por ejemplo, para obtener el coseno de π:
math.cos(math.pi)
-1.0
Donde hemos usado la función cos y la constante pi que son parte de la biblioteca
math. Otra forma de importar las funciones de una biblioteca es usando:
cos(pi)
Función Ejemplo
Valor absoluto math.abs(-5)
Función exponencial math.exp(1)
Potencia ab math.pow(2,3)
Raíz cuadrada math.sqrt(9.0)
Coseno de un ángulo en radianes math.cos(0.7)
Seno de un ángulo en radianes math.sin(0.707)
Tangente de un ángulo en radianes math.tan(1)
Obtención de valor de pi math.pi
Obtención de valor de e math.e
... ...
de la circunferencia.
Algoritmo 3: Área circunferencia
Entradas: radio (real)
Salidas: area (real)
1: Inicio
2: Leer radio
3: area=pi*radio2
4: Escribir area
5: Fin
La representación del algoritmo en Python sería como el que se muestra en el
programa 3.3.
1 from math import pi
2
3 radio = float ( input ( " Introduce el radio de la circunferencia : " ) )
4 area = pi *( radio **2)
5 print ( f " El área de la circunferencia es : { area } " )
Programa 3.3: Circunferencia
Si se analiza el problema se puede establecer que los datos que se necesitan para
resolver el problema son los que se muestran en la tabla 3.6.
Nombre de la variable Descripción Tipo
litros_producidos Cantidad de litros producidos Real, Float
precio_galon El precio del galón Real, Float
galones Cantidad de galones que produce Real, Float
pago_total Ganancia por la entrega de la leche Real, Float
Para obtener la solución de este problema es necesario conocer las horas que labora
cada trabajador y cuánto se le debe pagar por cada hora de trabajo, con base en esto
se puede determinar que las variables que se requieren utilizar son las que se muestran
en la tabla 3.7.
3.4. Ejercicios
1. Se tienen tres variables A, B y C. Escribir las instrucciones necesarias para
intercambiar sus valores entre sí del modo siguiente:
B toma el valor de A
72 Capítulo 3
C toma el valor de B
A toma el valor de C
2. Una modista, para realizar sus prendas de vestir, encarga las telas al extranjero.
Para cada pedido, tiene que proporcionar las medidas de la tela en pulgadas,
pero ella generalmente las tiene en metros. Realice un algoritmo para ayudar
a resolver el problema, determinando cuántas pulgadas debe pedir con base en
los metros que requiere. Represéntalo mediante pseudocódigo y programa en
Python (1 pulgada = 0.0254 m).
3. Una empresa importadora desea determinar cuántos dólares puede adquirir con
equis cantidad de dinero mexicano. Realiza el pseudocódigo y el programa en
Python.
4. Una empresa que contrata personal requiere determinar la edad de las personas
que solicitan trabajo, pero cuando se les realiza la entrevista sólo se les pregunta
el año en que nacieron. Realiza el pseudocódigo y el programa en Python que
representen el algoritmo para solucionar este problema.
Capítulo 4
Estructuras selectivas
4.1. Introducción
Los problemas que se han presentado hasta el momento no implican cuestiona-
mientos como: “qué pasa si quiere comprar golosinas”, o bien, “qué pasa si no hay
lugares para la película que quería ver”, esto en el algoritmo de ir al cine, donde se
puede seguir haciendo muchos cuestionamientos que conducen a tomar una decisión.
Por consiguiente, los algoritmos, en determinados momentos, requieren ser selectivos
en lo que respecta a las acciones que deben seguir.
Es por eso que las estructuras selectivas son importantes para los algoritmos, de
modo que en la mayoría de los problemas se tiene presente una estructura selectiva
que implica seguir o no un determinado flujo de secuencia del problema en cuestión.
73
74 Capítulo 4
El programa 4.1 muestra la codificación en Python del algoritmo para saber si una
persona es mayor de edad. Primero, se pide al usuario que introduzca su edad, la cual
es almacenada en la variable edad. Posteriormente, mediante una selectiva simple (if)
analizamos si la edad es mayor o igual a 18 (condición). Si edad es mayor o igual a
18 se imprime una cadena con el texto “Eres mayor de edad”.
1 edad = int ( input ( " Escribe tu edad : " ) )
2
3 if edad >=18:
4 print ( " Eres mayor de edad ... " )
Programa 4.1: Mayor de edad
El programa 4.1 tiene como salida:
Escribe tu edad : 24
Eres mayor de edad ...
Escribe tu edad : 12
Eres menor de edad ...
Como se puede ver en el pseudocódigo 11, se comparan los dos valores leídos (a y
b) mediante una estructura selectiva compuesta. Si el valor a es mayor a b, entonces
la variable mayor toma el valor de a. En caso contrario, la variable mayor toma el
76 Capítulo 4
La tabla 4.2 muestra las variables que se requieren en la solución del problema.
3 if numero > 0:
4 print ( " El número es positivo " )
5 elif numero == 0:
6 print ( " El número es cero " )
7 else :
8 print ( " El número es negativo " )
Programa 4.6: Positivo negativo o cero
S o s para la suma
R o r para la resta
P o p o M o m para la multiplicación
D o d para la división
Procedemos a identificar las variables que utilizaremos para resolver este ejercicio.
Para este fin, la tabla 4.4 describe dichas variables.
personas no cae en ningún caso (por ejemplo, se digita un valor negativo), entonces
se notifica que se ha producido un error.
Algoritmo 16: Las brisas del caracol
Entradas: can_personas (Entero)
Salidas: pago_total (Entero)
1: Inicio
2: Leer can_personas
3: si can_personas>=1 and can_personas<=200 entonces
4: costo_platillo=95
5: de_lo_contrario si can_personas>200 and can_personas<=300 entonces
6: costo_platillo=85
7: de_lo_contrario si can_personas>300 entonces
8: costo_platillo=75
9: de_lo_contrario
10: Escribir “Error: cantidad de personas incorrecto”
11: fin_si
12: pago_total=costo_platillo*can_personas
13: Escribir pago_total
14: Fin
El programa en Python 4.8 es la solución al este ejercicio:
1 can_personas = int ( input ( " Introduce la cantidad de personas : " ) )
2
3 costo_platillo =0
4 if can_personas >=1 and can_personas <=200:
5 costo_platillo =95
6 elif can_personas >200 and can_personas <=300:
7 costo_platillo =85
8 elif can_personas >300:
9 costo_platillo =75
10 else :
11 print ( " Error : cantidad de personas incorrecto " )
12
13 pago_total = can_personas * costo_platillo
14 print ( f " El costo del banquete es : { pago_total } " )
Programa 4.8: Calculadora
El programa 4.8 tiene como salida:
Introduce la cantidad de personas : 245
El costo del banquete es : 20825
4.4. Ejercicios
1. Realiza un algoritmo para determinar cuánto se debe pagar por equis cantidad
de lápices considerando que si son 500 o más el costo es de 75¢; de lo contrario,
el precio es de 80¢. Represéntalo con el pseudocódigo y el programa en Python.
84 Capítulo 4
Estructuras repetitivas
5.1. Introducción
Hasta el momento, las soluciones planteadas a los problemas propuestos han sido
para una persona, un objeto o cosa, pero siempre de manera unitaria, tanto en las
soluciones que se plantearon con estructuras secuenciales como con las selectivas;
sin embargo, debemos considerar que, cuando se plantean problemas como calcular
un sueldo, cabe la posibilidad de que el cálculo se tenga que hacer para dos o más
empleados, un proceso de cálculo que por lógica debe ser el mismo para cada uno,
pero donde existe la posibilidad de que los parámetros que determinan ese sueldo sean
los que cambien. Por tal motivo se emplean estructuras denominadas repetitivas, de
ciclo o de bucle, e independientemente del nombre que se les aplique, lo que importa
es que permiten que un proceso pueda realizarse N veces, donde solo cambien los
parámetros que se utilizan en el proceso.
Para el caso de la estructura “Mientras que”, el ciclo se repite hasta que la condición
lógica resulta ser falsa; además, como se puede ver en la figura 5.1, en dicha estructura
85
86 Capítulo 5
lo que debe durar el ciclo (diez veces), ya dentro del ciclo el contador se incrementa
por cada vuelta que dé y se realice el proceso de leer un valor y acumularlo en la
suma.
En general, todo ciclo debe tener un valor inicial, un incremento y un verificador
que establezca el límite de ejecución.
El código en Python para este ejemplo se muestra a continuación (ver Programa
5.1):
1 con =1
2 suma =0
3
4 while con <=10:
5 n = float ( input ( " Introduce un valor a sumar : " ) )
6 suma = suma + n
7 con = con +1
8
m: el valor inicial
8 promedio = suma / n
9 print ( f " La suma total es : { promedio } " )
Tabla 5.3: Variables del ejemplo promedio sin número exacto de elementos
La tabla 5.3 muestra las variables que se van a utilizar para la solución de este
92 Capítulo 5
problema.
Algoritmo 21: Obtiene el promedio sin número exacto de elementos
Entradas: elemento (real)
Salidas: promedio (real)
1: Inicio
2: con=0
3: suma=0
4: Leer elemento
5: mientras elemento>0 hacer
6: suma=suma+elemento
7: con=con+1
8: Leer elemento
9: fin_mientras
10: promedio=suma/con
11: Escribir promedio
12: Fin
La representación del algoritmo para este problema se presenta mediante el pseu-
docódigo 21 y el programa en Python 5.5, en los cuales se utiliza el ciclo Mientras.
1 con =0
2 suma =0
3 elemento = float ( input ( " Introduce un elemento a promediar : " ) )
4
5 while elemento >0:
6 suma = suma + elemento
7 con = con + 1
8 elemento = float ( input ( " Introduce un elemento a promediar : " ) )
9
La tabla 5.4 muestra las variables que se requieren para plantear la solución del
problema.
Si es primo, solo debe haber dos divisores (1 y N), en caso contrario, el número no es
primo.
La tabla 5.6 muestra las variables que se necesitan para resolver este ejercicio.
9 con +=1
10
11 if conDivisores ==2:
12 R = " Es primo "
13 else :
14 R = " No es primo "
15
16 print ( R )
La tabla 5.7 muestra las variables que se necesitan para resolver este ejercicio.
Cualquiera de los bucles que hemos visto se pueden utilizar; sin embargo, por
elegancia, trabajaremos este ejercicio con un bucle Desde. El pseudocódigo 25 muestra
98 Capítulo 5
5.3. Ejercicios
1. Se requiere un algoritmo para determinar, de N cantidades, cuántas son menores
o iguales a cero y cuántas mayores a cero. Realiza el pseudocódigo y el programa
en Python para representarlo, utilizando el ciclo apropiado.
2. Realiza un algoritmo para generar e imprimir los números pares que se en-
cuentran entre 100 y 200. Realiza el pseudocódigo y programa en Python para
representarlo, utilizando el ciclo apropiado.
3. Una empresa tiene el registro de las horas que trabaja diariamente un empleado
durante la semana (seis días) y requiere determinar el total de éstas, así como el
sueldo que recibirá por las horas trabajadas. Realiza un algoritmo para deter-
minar esto y represéntalo mediante el pseudocódigo y el programa en Python,
utilizando el ciclo apropiado.
4. Un profesor tiene un salario inicial de $1500, y recibe un incremento de 10 %
anual durante 6 años. ¿Cuál es su salario al cabo de 6 años? ¿Qué salario
ha recibido en cada uno de los 6 años? Realiza el algoritmo y representa la
solución mediante el pseudocódigo y el programa en Python, utilizando el ciclo
apropiado.
Estructuras repetitivas 99
Cadenas y colecciones
6.1. Introducción
Las colecciones son objetos relacionados que pueden ser caracterizados por su
organización y las operaciones que se pueden hacer sobre ellos. Se entiende por objeto
cualquier tipo de dato.
Una colección permite agrupar varios objetos bajo un mismo nombre. Por ejemplo,
si necesitamos almacenar los nombres de alumnos de un curso de programación, sería
más conveniente ubicarlos a todos dentro de una misma colección de nombre alumnos.
6.2. Cadenas
6.2.1. Índices y slicing
Una cadena está conformada por caracteres (es decir, letras, números y símbolos),
a los cuales se puede acceder a través de sus índices. En el índice 0 se encuentra el
primer carácter y el último carácter de la cadena se encuentra en la posición menos
uno de la longitud de la cadena.
101
102 Capítulo 6
Teniendo claro el concepto de índices, podemos pasar a algo un poco más avan-
zado como son los slicing, los cuales permiten obtener una subcadena de la cadena
principal.
En resumen, éstas son sus principales opciones:
Además de estos cuatro casos que son los más comunes, también puedes utilizar
un tercer valor opcional llamado step o salto:
Otra de las opciones más interesantes del slicing es que el principio, el final y
el salto pueden ser números negativos. Esto indica que se empieza a contar desde el
final de la cadena.
En el mismo ejemplo de la cadena “Estela", si quisiéramos los caracteres desde el
segundo elemento hasta el cuarto, tendríamos que realizar lo siguiente:
1 cad = " Estela "
2
3 print ( cad [1:5])
Programa 6.3: Ejemplo cadena 3
Nota que el segundo carácter se encuentra a partir del índice 1, y el quinto elemento
se encuentra en el índice 4, el slicing va desde 1 hasta 5 ([1:5]); sin embargo, se detiene
una posición anterior a la que se le indica. Es decir, si el final es 5 se detiene en la
posición 4. Por eso, obtenemos la subcadena “stel”.
A continuación, un último ejemplo del uso de slicing, en donde partiendo de
la cadena “Estela”, queremos obtener la subcadena “stela”. Para ello realizamos lo
siguiente:
1 cad = " Estela "
2
3 print ( cad [1:])
Programa 6.4: Ejemplo cadena 4
En este punto es importante mencionar que las cadenas son inmutables, es decir,
no se pueden modificar, al menos no directamente. Veamos el siguiente ejemplo, en el
cual se intenta modificar el primer carácter de la cadena. Al ejecutarse este programa,
produce una excepción (un tipo de error).
1 cad = " Estela "
2
3 cad [0]= " e "
4
5 print ( cad )
Programa 6.5: Ejemplo cadena 5
Método upper
Este método permite cambiar una cadena a mayúsculas. Su uso es muy simple:
“cadena a convertir”.upper()
Ejemplo
1 cadena = " hola mundo " . upper ()
2
3 print ( cadena )
Programa 6.10: Ejemplo cadena a mayúsculas
En este caso, la cadena “hola mundo” invoca al método upper, con lo que se
convierte a mayúsculas y se almacena en la variable cadena, la cual se muestra con
la función print.
Método lower
Este método sirve para cambiar una cadena a minúsculas. Su función es igual de
sencilla y tiene el siguiente formato:
“cadena a convertir”.lower()
Ejemplo:
1 cadena = " HOLA MUNDO " . lower ()
2
3 print ( cadena )
Programa 6.11: Ejemplo cadena a minúsculas
Método count
Este método sirve para saber cuántas veces aparece un carácter en una cadena.
Su formato es:
cadena.count(caracter)
Donde cadena es una cadena de caracteres o una variable que tenga almacenada
una cadena; y caracter es el argumento que se quiere determinar cuántas veces
aparece en la cadena. Este método devuelve el número de apariciones del carácter en
la cadena.
Veamos su uso a través de un ejemplo:
1 cadena = " hola mundo " . count ( ’o ’)
2
3 print ( cadena )
Programa 6.12: Ejemplo count
El programa 6.12 tiene como salida:
2
Método find
Sirve para conocer el índice de la cadena donde aparece una palabra o carácter
determinado. Veamos su funcionamiento a través de un ejemplo:
1 cadena = " hola hola hola hola mundo " . find ( ’ mundo ’)
2
3 print ( cadena )
Programa 6.13: Ejemplo find
El programa 6.13 tiene como salida:
20
En este ejemplo tenemos la cadena “hola hola hola hola mundo”, y a través del
método find queremos determinar en qué índice de dicha cadena aparece la palabra
“mundo” (pasada como argumento a find). Si contamos de izquierda a derecha, em-
pezando desde 0, llegamos a la posición 20, que es donde se encuentra el inicio de la
palabra “mundo”. En caso de que la palabra o carácter que se busca no se encuentre,
el método find devuelve -1.
Cadenas y colecciones 107
Método islower
Este método devuelve un valor True si la cadena que lo invoca está completamente
en minúsculas. En caso contrario, devuelve False. Ejemplo:
1 cadena = " hola mundo " . islower ()
2
3 print ( cadena )
Programa 6.14: Ejemplo islower
Método startswith
Este método recibe como argumento una palabra o carácter y devuelve True si en
la cadena que invoca al método, dicha palabra o carácter aparece al inicio. Veamos el
ejemplo:
1 cadena = " hola mundo " . startswith ( ’ hola ’)
2
3 print ( cadena )
Programa 6.15: Ejemplo startswith
Método endswith
Este método sirve para verificar si la cadena termina con una palabra o carácter
que recibe como argumento. En caso de que sí termine con dicha palabra o carácter,
devuelve True, si no, devuelve False. Veamos el ejemplo:
1 cadena = " hola mundo " . endswith ( ’ mundo ’)
2
3 print ( cadena )
Programa 6.16: Ejemplo endswith
Método split
Este método separa los elementos de una cadena cada vez que encuentra un carác-
ter que se le pase como argumento. Devuelve una lista con los elementos separados,
por ejemplo:
1 cadena = " hola mundo " . split ()
2
3 print ( cadena )
Programa 6.17: Ejemplo split
El programa 6.17 tiene como salida:
[ ’ hola ’ , ’ mundo ’]
La cadena “hola mundo” invoca al método split sin pasarle ningún argumento; lo
cual quiere decir que separará la cadena por espacios en blanco que encuentre. Como
podemos ver en la salida, devuelve una lista (un concepto que veremos más adelante
en este capítulo) con los elementos separados.
Para dejar más claro el método split veamos otro ejemplo:
1 cadena = " hola - hola - mundo " . split ( ’ - ’)
2
3 print ( cadena )
Programa 6.18: Ejemplo split 2
El programa 6.18 tiene como salida:
[ ’ hola ’ , ’ hola ’ , ’ mundo ’]
Método join
Retorna una cadena resultante de concatenar la cadena que recibe como argumen-
to, separada por la cadena (S) sobre la que se llama al método.
S.JOIN(secuencia)
Método replace
Este método reemplaza un elemento por otro en una cadena de caracteres (la
que invoca al método replace). Tanto el elemento que se va a reemplazar como
el elemento reemplazado son pasados como argumentos. Este método devuelve una
cadena con el elemento reemplazado. Ejemplo:
1 cadena = " hola mundo " . replace ( ’o ’ , ’9 ’)
2
3 print ( cadena )
Programa 6.20: Ejemplo replace
Este bucle recorre la cadena y muestra cada letra en una línea distinta. La con-
dición del bucle es indice < len(fruta), de modo que cuando indice es igual a la
longitud de la cadena, la condición es falsa y no se ejecuta el cuerpo del bucle. El
último carácter al que se accede es el que tiene el índice len(fruta)-1, que es el
último carácter de la cadena.
Usar un índice para recorrer un conjunto de valores es tan común que Python
proporciona una sintaxis alternativa más simple — el bucle for:
1 fruta = " manzana "
2
3 for carac in fruta :
4 print ( carac )
Programa 6.22: Recorrido de una cadena con for
Cada vez que recorremos el bucle, se asigna a la variable carac el siguiente carácter
de la cadena. El bucle continúa hasta que no quedan más caracteres.
Para los recorridos con while y con for la salida es la siguiente:
110 Capítulo 6
m
a
n
z
a
n
a
6.3. Listas
Las listas en Python son una secuencia de valores que pueden ser de cualquier
tipo: cadenas, enteros, flotantes, contenido mixto o cualquier otro. En esta sección
hablaremos sobre los métodos de listas de Python y cómo crear, agregar elementos,
agregar al final, invertir y muchas otras funciones de listas de Python.
Como podemos observar en el ejemplo anterior, para crear una lista se deben
usar los corchetes []. Al imprimir la lista anterior, ésta nos muestra únicamente los
corchetes, los cuales son distintivos de una lista.
También podemos agregar datos a la lista al momento de crearla, por ejemplo:
1 lista =[ " Lunes " ," Martes " ," Miércoles " ," Jueves " ," Viernes " ]
2
3 print ( lista )
Programa 6.24: Ejemplo lista con datos
La salida del programa 6.24 es:
[ ’ Lunes ’ , ’ Martes ’ , ’ Miércoles ’ , ’ Jueves ’ , ’ Viernes ’]
1 lista =[ " Lunes " ," Martes " ," Miércoles " ," Jueves " ," Viernes " ]
2
Como podemos observar, esta lista contiene cadenas, números enteros, números
con parte fraccionaria e incluso una lista.
112 Capítulo 6
Inicialmente, se tiene una lista con elementos enteros que van desde el 1 al 5.
Posteriormente, mediante el método append se agrega un nuevo elemento al final de
dicha lista como podemos ver en la salida del programa.
Puede darse el caso en que se necesita agregar un elemento en la lista, pero no
al final, si no en una posición específica. El método insert soluciona este problema.
Dicho método es invocado por la lista en la que se va a insertar un elemento, recibe
como argumentos la posición en la que se debe insertar el elemento, así como el
elemento que se va a agregar. Ejemplo:
1 lista =[1 ,2 ,4 ,5]
2
Inicialmente se tiene una lista con cuatro elementos [1,2,4,5], el método insert
agrega el elemento 3 en la posición 2 (son datos que insert recibe como argumentos).
El primer argumento es la posición en la que se va a insertar el elemento, y el segundo
argumento es el elemento que queremos insertar.
Para agregar varios elementos simultáneamente al final de la lista usaremos el
método extend. Este método recibe como argumento una lista con los elementos que
se quieren insertar en la lista que lo invoca. Su uso se ejemplifica a continuación:
1 lista =[1 ,2 ,3 ,4 ,5]
2
3 lista . extend ([6 ,7 ,8])
4
5 print ( lista )
Programa 6.32: Ejemplo extend
Inicialmente se tiene una lista con elementos enteros del 1 al 5. Mediante el método
extend se agregan tres elementos más a la lista, los cuales son: 6, 7 y 8. La salida nos
presenta la lista con todos los elementos integrados.
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8]
El operador + permite unir, en una sola lista, los elementos de las listas a las que
se aplica dicho operador. Veamos el siguiente ejemplo:
1 lista1 =[1 ,2 ,3 ,4 ,5]
2 lista2 =[6 ,7 ,8]
3
4 lista3 = lista1 + lista2
5
6 print ( lista3 )
Programa 6.33: Ejemplo suma listas
3 print (3 in lista )
Programa 6.34: Ejemplo in
Se tiene una lista con 6 elementos, cinco números enteros y una cadena. Poste-
riormente, en un print se pregunta si el elemento 3 se encuentra en la lista (3 in
lista). Como efectivamente el elemento 3 se encuentra en la lista, se imprime True.
Cabe aclarar que también se pudo almacenar en una variable el resultado de evaluar
3 in lista. La salida del programa 6.34 es:
True
En la misma lista con 6 elementos, lista invoca al método index y le pasa como
argumento el elemento “Juan”. Como efectivamente el elemento se encuentra en la
lista, index devuelve la posición 5 que es donde se encuentra dicho elemento.
Vemos una lista con varios elementos, dicha lista invoca al método count pasándole
como argumento el elemento 1. Como dicha invocación se encuentra en un print, se
imprime 4, que es el número de veces que aparece el elemento 1 en la lista.
Cadenas y colecciones 115
Se tiene una lista con seis elementos, esta lista invoca al método pop, el cual no
recibe argumentos. Por lo tanto, se elimina el último elemento de la lista (“Juan”).
Al imprimir la lista, muestra únicamente los elementos que quedaron (ver salida del
programa 6.37).
El método pop también puede recibir como argumento una posición, en la cual se
encuentra el elemento que se quiere eliminar. Veamos el siguiente ejemplo:
1 lista =[1 ,2 ,3 ,4 ,5 , " Juan " ]
2
3 lista . pop (3)
4
5 print ( lista )
Programa 6.38: Ejemplo pop con argumento
La salida del programa 6.38 es:
[1 , 2 , 3 , 5 , ’ Juan ’]
En este caso se tiene una lista con seis elementos. Al método pop que es invocado
por la lista se le pasa como argumento la posición 3, con lo que se le indica a pop que
elimine de la lista el elemento que se encuentra en esa posición. Recordemos que el
primer elemento de la lista se encuentra en la posición 0.
Para eliminar un elemento de la lista pasando como argumento el elemento, dispo-
nemos del método remove, el cual a diferencia de pop, no requiere conocer la posición
del elemento. Veamos un ejemplo:
1 lista =[1 ,2 ,3 ,4 ,5 , " Juan " ]
2
3 lista . remove ( " Juan " )
4
5 print ( lista )
Programa 6.39: Ejemplo remove
Tenemos la lista con seis elementos y queremos eliminar el elemento “Juan”. En-
tonces, la lista invoca a remove, el cual recibe como argumento a dicho elemento.
Finalmente, al mostrar la lista notamos que el elemento “Juan” ya no se encuentra en
la lista.
116 Capítulo 6
[1 , 2 , 3 , 4 , 5]
En algunas ocasiones será necesario vaciar por completo la lista. Para este fin
disponemos del método clear, el cual al ser invocado realiza este vaciado. El método
clear no recibe argumentos. Veamos el siguiente ejemplo:
1 lista =[1 ,2 ,3 ,4 ,5 , " Juan " ]
2
3 lista . clear ()
4
5 print ( lista )
Programa 6.40: Ejemplo clear
Para este ejemplo, utilizamos la lista de los ejemplos anteriores. Dicha lista invoca
al método clear, el cual vacía por completo la lista.
[]
5 print ( lista )
Programa 6.41: Ejemplo reverse
La salida del programa 6.41 es:
[ ’ Juan ’ , 5 , 4 , 3 , 2 , 1]
[ -7 , 0 , 1 , 3 , 4 , 5 , 9]
La variable dia, definida ad hoc en el propio bucle, va a tomar, uno a uno, todos
los elementos de la lista semana, comenzando por ‘Lunes’ y terminando en ‘Domingo’.
118 Capítulo 6
6.4. Tuplas
Las tuplas son inmutables, es decir, no se pueden modificar. No se podrá añadir,
eliminar, ni modificar los elementos. Veamos entonces qué podemos hacer con las
tuplas y qué ventajas tiene el utilizarlas.
Al igual que en las listas, en una tupla puede haber elementos de diferentes tipos
de datos. Veamos el siguiente ejemplo:
1 tupla =(4 , " Hola " ,6.78 ,[1 ,2 ,3 ,4])
2
3 print ( tupla )
Programa 6.46: Ejemplo tupla con diferentes elementos
En el ejemplo, se crea una tupla con elementos de diferentes tipos de datos, entre
ellos: números, cadenas y listas.
Como ya habíamos mencionado, no se pueden agregar nuevos elementos a las tu-
plas. Por ejemplo, si intentamos usar el método append después de crear la tupla,
tendríamos como salida un error. Tampoco se pueden modificar, ni eliminar los ele-
mentos existentes, cualquier intento de realizar alguna de estas operaciones en la tupla
genera un error.
Entonces ¿qué podemos hacer con las tuplas?
Para conocer qué posición ocupa un elemento en la tupla disponemos del método
index, el cual al ser invocado por la tupla devuelve dicha posición. Este método recibe
como argumento el elemento que queremos saber su posición. Veamos el ejemplo:
1 tupla =(4 , " Hola " ,6.78 ,[1 ,2 ,3 ,4])
2
3 print ( tupla . index ( " Hola " ) )
Programa 6.50: Método index
En este ejemplo, se crea la tupla con cinco elementos de todo tipo de datos. Luego
a la función list se le pasa como argumento dicha tupla y se almacena la lista que
nos devuelve list en la variable lista.
Cadenas y colecciones 121
1. Las tuplas son más rápidas que las listas y consumen menos memoria.
2. Hace que el código sea más seguro ya que “protege contra escritura” los datos
que no necesitan ser cambiados. Usar un tupla en lugar de una lista es como
tener una declaración de afirmación implícita de que estos datos son constantes
y que se requiere un pensamiento especial (y una función específica) para anular
eso.
3. Algunas tuplas se pueden usar como claves de diccionario (específicamente,
tuplas que contienen valores inmutables como cadenas, números y otras tuplas).
122 Capítulo 6
6.5. Diccionarios
Los diccionarios en Python, al igual que las listas y las tuplas, nos permiten
almacenar diferentes tipos de datos: cadenas, enteros, flotantes, booleanos, tuplas,
listas e inclusive otros diccionarios.
Los diccionario son mutables, es decir, es posible modificarlos, agregar o quitar
elementos de él.
A diferencias de las listas y de las tuplas, los diccionarios no se rigen por la regla
de los índices. En este caso, todos los valores que se almacenen en el diccionario no
corresponderán a un índice, sino a una clave.
Todos los valores necesitan tener una clave y cada clave necesita tener un valor.
Algo interesante para mencionar y a tener muy en cuenta es que una clave podrá
ser cualquier objeto inmutable en Python, ya sea una cadena, un entero, un flotante
o una tupla, etc.
Podemos decir entonces que un diccionario tiene dos elementos por posición: clave
y valor. Y es importante mencionar que las claves no pueden ser duplicadas.
diccionario={}
Para agregar elementos por default (es decir, elementos que no necesitan de un
método en particular para ser agregados) a un diccionario, es necesario indicar la
clave y el valor. Veamos un ejemplo en el que se requiere traducir un color de español
a inglés.
1 diccionario ={ " azul " : " blue " , " rojo " : " red " , " verde " : " green " }
2
3 print ( diccionario )
Programa 6.56: Diccionario
La salida del programa 6.56 es:
{ ’ azul ’: ’ blue ’ , ’ rojo ’: ’red ’ , ’ verde ’: ’ green ’}
el siguiente ejemplo:
1 diccionario ={ " azul " : " blue " , " rojo " : " red " , " verde " : " green " }
2
3 print ( diccionario [ " azul " ])
Programa 6.57: Acceso a un elemento del diccionario
La salida del programa 6.57 es:
blue
5 print ( diccionario )
Programa 6.59: Modificar un elemento del diccionario
124 Capítulo 6
En este ejemplo, se modifica el valor del elemento que tiene como clave la cadena
“azul”. Dicha modificación consiste en cambiar el color de “blue” a “BLUE” (ver línea 3
de programa 6.59). Finalmente, se muestra el diccionario con modificación realizada.
Inicialmente se tiene un diccionario con tres elementos, del cual se quiere eliminar
el elemento que tiene como clave la cadena “verde”. Únicamente pasamos este elemen-
to como argumento a la función del y listo. Imprimimos el diccionario y observamos
que el elemento ya no se encuentra.
1 diccionario ={ " alejandro " :{ " edad " :22 , " estatura " :1.73} , " jose "
:[21 ,1.75] , " maria " :[22 ,1.67]}
2
3 print ( diccionario . get ( " Luis " ," No existe esa persona " ) )
Programa 6.62: Acceso a un elemento que no existe en el diccionario 2
La salida del programa 6.62 es:
No existe esa persona
Como podemos ver en el ejemplo, se opera con in indicándole la clave que que-
remos buscar en el diccionario. Si dicha clave se encuentra, esta expresión devuelve
True, en caso contrario, devuelve False.
Primero se crea el diccionario con algunos datos de frutas (ver línea 1 de código
6.67). En seguida, se almacenan las claves del diccionario en la variable frutas (llevar
a cabo este almacenamiento es posible gracias al método keys). Finalmente, mediante
el bucle for se van mostrando una por una las claves del diccionario.
Otra forma de iterar en un diccionario es a través de sus valores. El código 6.68
muestra como realizar dicha iteración.
1 diccionario = { ’ plátano ’: ’ amarillo ’ , ’ fresa ’: ’ roja ’ , ’ manzana ’: ’
verde ’}
2
3 frutas = diccionario . values ()
4
5 for fruta in frutas :
6 print ( fruta )
Programa 6.68: Recorrido a través de los valores
La salida del programa 6.68 es:
amarillo
roja
verde
Como puedes notar los dos últimos códigos son similares, lo único que cambia es
que para iterar a través de los valores del diccionario se emplea el método values.
Finalmente, si necesitamos iterar sobre las claves y sus correspondientes valores
simultáneamente utilizamos el método items:
1 diccionario = { ’ plátano ’: ’ amarillo ’ , ’ fresa ’: ’ roja ’ , ’ manzana ’: ’
verde ’}
2
6.6. Conjuntos
Los conjuntos son grupos de elementos desordenados, donde su principal caracte-
rística es que no puede haber elemento duplicados.
conjunto=set()
Al igual que en los diccionarios, los conjuntos utilizan las llaves “{}’’ para contener
elementos; sin embargo, para poder diferenciarlos de los diccionarios es necesario
utilizar la función set al momento de crearlos.
Como ya habíamos mencionado, se crea con set un conjunto vacío. Sin embargo, si
al conjunto le agregas elementos desde su creación, ya no es necesario usar la función
set.
A continuación, veremos cómo crear un conjunto vacío:
1 conjunto = set ()
2
3 conjunto ={}
4
5 print ( conjunto )
Programa 6.70: Conjunto vacío
Ahora bien, para vaciar el conjunto, es decir, eliminar todos los elementos, Python
ofrece el método clear, sin argumentos. Veamos el ejemplo:
1 conjunto ={1 ,2 ,3 , " Hola " ,345.5}
2
3 conjunto . clear ()
4
5 print ( conjunto )
Programa 6.75: Método clear
La salida del programa 6.75 es:
set ()
3 print (3 in conjunto )
Programa 6.76: Operador in en conjuntos
La salida del programa 6.76 es:
True
Se tienen dos conjuntos (a y b), con el mismo número de elementos pero con
elementos diferentes. Al aplicar el operador ==, éste devuelve False, ya que son
conjuntos diferentes.
5 print ( len ( a ) )
Programa 6.79: Función len en conjuntos
En este ejemplo, se tienen inicialmente dos conjuntos con tres elementos cada uno
(a y b), luego se crea el conjunto c, al cual se le asigna la unión de a y b. Finalmente,
se muestra el conjunto c con los elementos correspondientes.
7 print ( c )
Programa 6.82: Diferencia de conjuntos
La salida del programa 6.82 es:
{1 , 2}
5 c ={1 ,2 ,3 ,4 ,5}
6
7 print ( a . issubset ( c ) )
Programa 6.84: Método issubset
Cadenas y colecciones 133
oso
reconocer
anita lava la tina
134 Capítulo 6
4. Hacer un programa donde se cuente cada una de las vocales en una cadena,
mostrar el conteo de las apariciones de cada vocal.
5. Escribe un programa donde tenga una lista y que, a continuación, elimine los
elementos repetidos, por último, mostrar la lista.
6. Escribe un programa que tenga dos listas y que, a continuación, cree las siguien-
tes listas (en las que no debe haber repeticiones):
Funciones
Una función es un bloque de código que se puede usar varias veces en varios puntos
distintos de nuestro programa. Nos evita tener que repetir código y facilita la lectura
y el mantenimiento del programa.
Para declarar una función usamos la palabra reservada def seguida del nombre de
la función, un paréntesis para pasarle datos a la función (no en todos los casos requiere
datos) y dos puntos. A continuación de esto se encuentra el código de la función (es
importante dejar un espaciado donde inicia el código, ya que de esta manera Python
identifica que dicho código pertenece a la función).
Los nombres de las funciones siguen las mismas reglas que los nombres de las
variables. Es decir, deben comenzar por una letra o un guion bajo, no pueden contener
espacios ni pueden comenzar por un número, pero sí contener números. Se recomienda
usar nombres en minúsculas y, si constan de más de una palabra, éstas deberán estar
separadas por guiones bajos.
Una función debe ser invocada para que se ejecute. Para invocar a la función se
usa su nombre seguido de un paréntesis. Cada vez que se llama de este modo a la
función, se ejecuta su código:
1 def saludo () :
2 print ( " Hola mundo ... " )
3 print ( " Esta es mi primera función ... " )
4
5 saludo ()
Programa 7.1: Función saludo
135
136 Capítulo 7
Algunas funciones que no retornan un valor también pueden recibir datos de en-
trada como argumentos. Estos datos de entrada son procesados en el interior de la
función. Veamos el siguiente ejemplo:
1 def saludar ( nombre ) :
2 print ( f " Hola { nombre } " )
3
4 saludar ( " Carlos " )
Programa 7.3: Ejemplo función sin retorno de valor con argumento
La función saludar recibe como argumento una cadena, la cual es mostrada junto
con la palabra “Hola”. En este caso, la cadena que se pasa como argumento es la
palabra “Carlos”, que combinada con la palabra que se encuentra en la función genera
la salida siguiente:
Hola Carlos
Otro ejemplo más práctico del uso de funciones sin retorno de valor y con argu-
mento de entrada, lo visualizamos en la siguiente función, la cual tiene como finalidad
mostrar la tabla de multiplicar de un número pasado como argumento.
1 def tab la_multi plicar ( i ) :
2 for j in range (1 ,11) :
3 print ( f " { i } X { j } = { i * j } " )
4
5 tabla _multipl icar (8)
Programa 7.4: Tabla de multiplicar
Cuando ejecutamos el programa, tenemos como salida:
Funciones 137
8 X 1 = 8
8 X 2 = 16
8 X 3 = 24
8 X 4 = 32
8 X 5 = 40
8 X 6 = 48
8 X 7 = 56
8 X 8 = 64
8 X 9 = 72
8 X 10 = 80
Se debe notar que la función es invocada dentro de un print, con los valores 3 y
4. Lo que genera que se imprima un 12. Es importante hacer notar que también el
valor devuelto por la función pudo haber sido almacenado en una variable en lugar
de mostrarlo directamente con print.
Una función también puede retornar más de un valor (de diferentes tipos, por
ejemplo, cadenas, enteros, listas, etc.), los cuales son separados por comas al momen-
to de realizar el retorno (return). Ademas, al realizar dicha separación con comas,
aunque no se utilicen los paréntesis, automáticamente los valores se integran en una
tupla. Veamos el siguiente ejemplo:
1 def funcion () :
2 return " Hola " , 45 , [1 ,2 ,3]
3
4 print ( funcion () )
Programa 7.6: Función retorna varios valores
parte, el prototipo de la función resta recibe como datos de entrada num1 y num2. A
estos datos se les denomina parámetros.
Es importante hacer notar que tanto argumentos como parámetros tienen un or-
den. En el ejemplo anterior, num1 toma el valor de 4 y num2 toma el valor de 3. En
dicho ejemplo, si se hubiera querido restar 4 de 3, se hubiera invocado la función se
la siguiente manera:
restar(3,4)
7.5. Ejercicios
1. Se desea calcular independientemente la suma de los números pares compren-
didos entre n y m para m>n.
La estructura de la función es:
def suma_pares(n,m):
def cuadrado(N):
Devuelve el cuadrado de N
3. Crear una función que reciba como parámetro un número y diga si el número
es primo o no es primo.
* * * * * * *
* * * * * * *
* * * * * * *
Capítulo 8
Introducción a la complejidad
computacional
3 def suma_P1 ( n ) :
4 return ( n *( n +1) ) /2
5
6 def suma_P2 ( n ) :
7 con =1
8 suma =0
9
10 while ( con <= n ) :
11 suma = suma + con
12 con +=1
13
14 return suma
15
16 n =20000000
17 comienzo = time . time ()
18 suma_P1 ( n )
143
144 Capítulo 8
(5 ∗ 6)/2 t ms
Total 1 t ms
con=1 t ms
suma=0 t ms
1<=5 t ms
suma=suma+con t ms
con+=1 t ms
2<=5 t ms
suma=suma+con t ms
con+=1 t ms
3<=5 t ms
suma=suma+con t ms
con+=1 t ms
4<=5 t ms
suma=suma+con t ms
con+=1 t ms
5<=5 t ms
suma=suma+con t ms
con+=1 t ms
Total 17 t ms
A partir de este análisis podemos decir que para P1 T(n)=1 y para P2 T(n)=3n+2
Aunque se conozca el tamaño de los datos de entrada, es imposible para muchos
problemas determinar el tiempo de ejecución para cada una de las posibles entradas.
Por esta razón se debe trabajar con el tiempo utilizado por el algoritmo en el peor de
los casos. Con este antecedente se redefine T(n).
T(n) = Tiempo que se demora el algoritmo en el peor de los casos, para encontrar
una solución a un problema de tamaño n.
8.2. Complejidad
La idea detrás del concepto de complejidad es tratar de encontrar una función
f (n), fácil de calcular y conocida, que acote el crecimiento de la función de tiempo,
para poder decir: “T (n) crece aproximadamente como f ” o más exacto “En ningún
caso T (n) se comportará peor que f al aumentar el tamaño del problema”.
146 Capítulo 8
Ciclos: Se pueden expresar como la sumatoria, con los límites del ciclo.
Condicionales: Estudiar lo que puede ocurrir, mejor caso y peor caso según la
condición.
función f (n) = n2 está representada por la línea verde. Finalmente, la línea que se
encuentra casi pegada al eje y de color azul turquesa representa la función f (n) = 2n .
El eje x representa los valores que toma n, y el eje y f(n).
Esta representación gráfica de las funciones da la pauta para saber cómo “trans-
curre el tiempo” conforme el valor de n aumenta. Evidentemente un algoritmo que
implemente una solución exponencial no es adecuado para valores de n grandes.
Un problema se denomina Tratable si existe un algoritmo de complejidad poli-
nomial para resolverlo. En caso contrario se denomina Intratable.
Esta clasificación es importante porque, cuando el tamaño del problema aumenta,
los algoritmos de complejidad polinomial dejan de ser utilizables de manera gradual.
Regla de la suma:
1 def f ( n ) :
2 for i in range ( n ) :
3 print ( i )
4
5 for i in range ( n ) :
6 print ( i )
Programa 8.2: Ejemplo regla de la suma
En el programa 8.2 podemos ver que existe una función f que recibe como argu-
mento a n. Dentro de esta función hay dos ciclos independientes, el primero va de 0
hasta n-1 y el segundo ciclo también. La complejidad tanto del primer ciclo como del
segundo es O(n). Pero al estar independientes ambos ciclos podemos utilizar la regla
de la suma, es decir:
Podemos decir entonces que la complejidad del código 8.2 es O(n), la cual es lineal.
Consideremos el siguiente fragmento de código:
1 def f ( n ) :
2 for i in range ( n ) :
3 print ( i )
4
5 for i in range ( n * n ) :
6 print ( i )
Programa 8.3: Ejemplo regla de la suma 2
Podemos ver que la función f que recibe como argumento a n. En esta función
existen dos ciclos independientes, el primero va desde 0 hasta n − 1, el segundo va
desde 0 hasta n2 − 1. Aplicando la regla de la suma tenemos que:
Podemos decir entonces que la complejidad del código 7.3, es O(n2 ), la cual es
polinomial.
La función f recibe como argumento un valor n. Dentro de esta función hay dos
ciclos, de los cuales uno está anidado (es decir, el ciclo interno). Ambos van desde 0
hasta n − 1; sin embargo, el ciclo interno repite este proceso n veces.
Aplicando la regla de la multiplicación tenemos que:
8.3. Bonus
Siempre que sea posible, se debe buscar la solución más rápida para resolver un
problema. Para este fin, te puedes guiar por la complejidad de los algoritmos.
Veamos cómo podemos pasar de una complejidad lineal a una complejidad cons-
tante mediante el siguiente ejercicio, el cual consiste en sumar los primeros n números
pares, empezando del 2.
Como primera aproximación para resolver este ejercicio se nos puede ocurrir una
implementación como la siguiente:
150 Capítulo 8
1 def suma_pares ( n ) :
2 con =2
3 c =1
4 suma =0
5
6 while c <= n :
7 suma += con
8 con +=2
9 c +=1
10
11 return suma
12
13 n =100
14 print ( suma_pares ( n ) )
Programa 8.6: Suma pares 1
Este algoritmo tiene una complejidad lineal, la cual convertiremos en una comple-
jidad constante.
Partamos que la suma de los primeros n números naturales está definida por la
fórmula bien conocida (n ∗ (n + 1))/2.
Tomemos un valor de n pequeño, por ejemplo 3. Entonces la suma de los pares
sería de:
2 + 4 + 6 = 12
También podemos ver la expresión anterior como:
2(1 + 2 + 3) ⇒ 2(n(n + 1)/2) = n(n + 1)
Podemos decir que la suma de los pares está definida por la fórmula:
n(n + 1)
Entonces, la implementación queda de la siguiente manera:
1 def su m a _p a re s _ me j or a do ( n ) :
2 return n *( n +1)
3
4 n =100
5 print ( suma_pares ( n ) )
Programa 8.7: Suma pares 2
8.4. Ejercicios
1. Implementa una solución con complejidad constante para calcular la suma de n
números impares, partiendo de 1.
2. Implementa una solución con complejidad constante para calcular la suma de
los primeros n múltiplos de 4, partiendo de 4.
3. Investigar la complejidad del algoritmo de búsqueda binaria e implementarlo.
Capítulo 9
Ejercicios de programación
competitiva
9.1. Introducción
La palabra competitiva se lleva a un concepto de concurso, entonces, la programa-
ción competitiva es un deporte mental en donde los participantes deben de resolver
la mayor cantidad de problemas con ciertas especificaciones en un lapso determina-
do. Ganará aquel equipo que resuelva más problemas en menos tiempo. También se
evalúa, basándose en límites, el uso de la memoria y el tiempo de ejecución de un
programa.
¿Para qué me sirve la programación competitiva? Esta pregunta continúa sien-
do un debate abierto, pero entre las principales ventajas de realizar programación
competitiva están:
151
152 Capítulo 9
Pistas o notas al pie. En algunos casos, los autores del problema pueden incluir
pistas o notas al pie, para facilitar la comprensión del problema.
9.2. Dólares
Dentro de poco será Semana Santa y como vives en Coyoacán, sabes que habrá
muchos turistas pidiendo tu ayuda para ubicarse y para manejar dinero mexicano.
Como consideras que siempre es bueno practicar tu francés o inglés y eres buena
persona, decides ayudarlos y crear una aplicación que convierta dólares en pesos para
que no vayan a pagar de más –o de menos— en los museos y establecimientos.
Entrada
Un entero N que representa la cantidad en dólares y un entero K que representa el
tipo de cambio de dólares por pesos.
Salida
La equivalencia en pesos de los N dólares introducidos.
Ejemplos entrada
Caso 1
1
1
https://omegaup.com/
Ejercicios de programación competitiva 153
13
Caso 2
54
12
Ejemplos salida
Caso 1
13
Caso 2
648
Restricciones
0 ≤ N ≤ 10000
0 ≤ K ≤ 100
Solución
Basta con multiplicar N ∗ K y esa será la solución.
1 N = int ( input () )
2 K = int ( input () )
3
4 equivalencia = N * K
5
6 print ( equivalencia )
Programa 9.1: Dólares
Entrada
cadena
Salida
cadena desplegada al revés
Ejemplo entrada
Pedro
Ejemplo salida
ordeP
154 Capítulo 9
Solución
1 cadena = input ()
2
3 cad = cadena [ -1:: -1]
4 print ( cad )
Programa 9.2: Escribir al revés
Entrada
Preguntar cuántos van a ir de excursión y la edad de cada uno.
Salida
Mostrar solo la edad más grande.
Ejemplo entrada
5
15 16 5 13 12
Ejemplo salida
16
Límites
No especificado
Solución
Para esta solución se leen las edades, luego mediante un for, estas edades se
guardan como enteros en una lista llamada aux. Al salir del for, se utiliza la función
max para determinar el valor mayor de la lista aux.
1 n = int ( input () )
2 edades = input () . split ()
3
4 aux =[]
5 for edad in edades :
6 aux . append ( int ( edad ) )
7
8 print ( max ( aux ) )
Programa 9.3: El excursionista mayor
Ejercicios de programación competitiva 155
Entrada
Primero hay que pedir la cantidad de alumnos y después las calificaciones
Salida
Mostrar las calificaciones ordenadas del mayor al menor
Ejemplo entrada
4
75 82 100 50
Ejemplo salida
100 82 75 50
Solución
Se leen las calificaciones de los alumnos, posteriormente mediante un for, estas
calificaciones se guardan como enteros en una lista llamada aux. En seguida, dicha
lista invoca al método sort (para ordenar los elementos de la lista) con el argumento
reverse=True, para ordenar los elementos de mayor a menor. Finalmente, en un
último for se imprimen los valores (ya ordenados de mayor a menor) de la lista aux.
1 cantidad_alumnos = int ( input () )
2 calificaciones = input () . split ()
3
4 aux =[]
5 for cal in calificaciones :
6 aux . append ( int ( cal ) )
7
8 aux . sort ( reverse = True )
9
10 for i in aux :
11 print (i , end = " " )
Programa 9.4: Ordena a los alumnos
9.6. 888
Directo al grano, tu trabajo es encontrar el N − esimo número cuyo cubo termina
en los dígitos 888.
156 Capítulo 9
Entrada
Primero una línea con un número T la cantidad de casos de prueba. Las siguientes T
líneas contienen un entero N .
Salida
Para cada línea de entrada, una línea con el N − esimo número cuyo cubo termina
en 888.
Ejemplo entrada
1
1
Ejemplo salida
192
Límites
1 ≤ N ≤ 106
Solución
En primera instancia podemos pensar en hacer una búsqueda exhaustiva para
cada caso de prueba, desde 1 hasta el N − esimo número, el cual su cubo tiene una
terminación en 888. Sin embargo, dados los límites de N en este ejercicio esta solución
propuesta no es la adecuada.
Mediante una hoja de cálculo se puede ir visualizando aquellos números que cum-
plen con el requisito propuesto en el ejercicio. Posteriormente, analizar los patrones
que hay entre números elevados al cubo con terminación 888. A partir de este análisis
se puede llegar a un patrón o fórmula. En particular una fórmula encontrada para
resolver este ejercicio está definida de la siguiente manera:
formula=192+250*(N-1)
Se observó que cada 250 números a partir de 192 existe un número cuyo cubo
termina en 888.
Entonces el programa 9.5 resuelve el ejercicio de la siguiente forma:
Se lee el número T de casos de prueba, seguidamente en un while que va desde
1 hasta T se lee el valor de N , el cual se procesa en la fórmula y se guarda en una
lista. Al terminar el proceso en el while, en un for se van imprimiendo los valores
que hay almacenados en la lista.
1 T = int ( input () )
2
3 con =1
4 lista =[]
5 while con <= T :
6 N = int ( input () )
Ejercicios de programación competitiva 157
Entrada
La primera línea contendrá un n número de amigos (2 ≤ n ≤ 50).
Salida
Dos enteros en una línea, la distancia menor y mayor.
Ejemplo entrada
5
4 2 6 10 3
Ejemplo salida
2 10
Solución
Primero se procede a leer las distancias, luego en la lista distancia_plumas me-
diante un for se almacenan convirtiendo a enteros dichas distancias. En seguida,
mediante las funciones max y min se obtiene la mayor y la menor distancia almace-
nada en la lista distancia_plumas. Finalmente, se imprimen la mayor y la menor
158 Capítulo 9
distancia.
1 n = int ( input () )
2 lista = input () . split ()
3
4 distancia_plumas =[]
5 for i in lista :
6 distancia_plumas . append ( int ( i ) )
7
8 mayor = max ( distancia_plumas )
9 menor = min ( distancia_plumas )
10
11 print ( f " { menor } { mayor } " )
Programa 9.6: La panza lanzadora
9.8. Edades
En un salón de clases la maestra quiere saber cuántos alumnos hay con la misma
edad. Ayuda a la maestra a calcular la cantidad.
Entrada:
La primera línea contendrá un número n número de alumnos (1 ≤ n ≤ 50). Las
siguiente n entradas serán números enteros a1 , a2 , a3 , ..., an (1 ≤ ai ≤ 40), las edades
de los alumnos.
Salida
Imprime en orden ascendente por la edad y después la cantidad de alumnos corres-
pondiente.
Ejemplo entrada
6
12 12 8 6 9 8
Ejemplo salida
61
82
91
12 2
Solución
En este ejercicio se utiliza una lista y un diccionario para poder darle solución.
Primero se leen las edades de los alumnos. A continuación, se crea una lista y un
diccionario vacíos. Posteriormente, mediante un for se van analizando las edades una
por una, si una edad ya se encuentra en la lista claves entonces el diccionario (las
claves en el diccionario son las edades y los valores son las apariciones de cada edad)
Ejercicios de programación competitiva 159
se incrementa en una unidad en la posición que tenga como clave dicha edad; en caso
contrario, la edad se agrega como clave al diccionario y se inicializa en 1, también se
agrega dicha edad en la lista claves. En seguida, se ordena la lista claves mediante
el método sort y finalmente, mediante un for se imprime la información contenida
en el diccionario (es decir, edad:apariciones) ordenadamente.
1 n = int ( input () )
2 lista = input () . split ()
3
4 claves =[]
5 diccionario ={}
6
7 for i in lista :
8 valor = int ( i )
9 if valor in claves :
10 diccionario [ valor ]= diccionario [ valor ]+1
11 else :
12 diccionario [ valor ]=1
13 claves . append ( valor )
14
15 claves . sort ()
16
17 for i in claves :
18 print ( f " { i } { diccionario [ i ]} " )
Programa 9.7: Edades
Entrada
Una cadena de caracteres del alfabeto en minúsculas, si acentos, sin espacios, sin la
“ñ” y entre 0 y 1000 caracteres.
Salida
La salida imprimirá, en la primera línea, una lista de números que indican el número
de veces que aparecen todas y cada una la letra del alfabeto (por orden alfabético).
Después se imprimirá una línea por cada una de las letras que sí aparecen en la cadena
(también por orden alfabético), de la siguiente forma: La letra x aparece n veces
Ejemplo entrada
Caso 1
programacion
160 Capítulo 9
Caso 2
aaaaacccceeegghxxzzz
Ejemplo salida
Caso 1
20100010100011210200000000
La letra a aparece 2 veces
La letra c aparece 1 veces
La letra g aparece 1 veces
La letra i aparece 1 veces
La letra m aparece 1 veces
La letra n aparece 1 veces
La letra o aparece 2 veces
La letra p aparece 1 veces
La letra r aparece 2 veces
Caso 2
50403021000000000000000203
La letra a aparece 5 veces
La letra c aparece 4 veces
La letra e aparece 3 veces
La letra g aparece 2 veces
La letra h aparece 1 veces
La letra x aparece 2 veces
La letra z aparece 3 veces
Solución
Para resolver este ejercicio se necesita hacer uso de un diccionario, el cual tendrá
como clave las letras del abecedario y como valor inicial 0. Posteriormente, se procede
a leer la cadena que se quiere analizar.
En un primer for (que va desde el primer hasta el último carácter de la cadena
leída), se va contando mediante el método count las veces que aparece cada carácter
en la cadena; a su vez, este conteo se almacena en el diccionario en su correspondiente
clave. En seguida, en otro for se imprimen los valores del diccionario, que son las
veces que apareció cada letra del abecedario en la cadena leída. Finalmente, en un
último for se van imprimiendo solo las letras del abecedario que tuvieron por lo
menos una ocurrencia en la cadena introducida al inicio.
1 diccionario ={ ’a ’:0 , ’b ’:0 , ’c ’:0 , ’d ’:0 , ’e ’:0 , ’f ’:0 ,
2 ’g ’:0 , ’h ’:0 , ’i ’:0 , ’j ’:0 , ’k ’:0 , ’l ’:0 ,
3 ’m ’:0 , ’n ’:0 , ’o ’:0 , ’p ’:0 , ’q ’:0 , ’r ’:0 ,
4 ’s ’:0 , ’t ’:0 , ’u ’:0 , ’v ’:0 , ’w ’:0 , ’x ’:0 ,
5 ’y ’:0 , ’z ’ :0}
6
7 cadena = input ()
Ejercicios de programación competitiva 161
8
9 for i in cadena :
10 diccionario [ i ]= cadena . count ( i )
11
12 for i in diccionario :
13 print ( diccionario [ i ] , end = " " )
14
15 print ()
16
17 for i in diccionario :
18 if diccionario [ i ]!=0:
19 print ( f " La letra { i } aparece { diccionario [ i ]} veces " )
Programa 9.8: Cuenta letras vector
Problema:
Realiza un programa que dadas la cantidad de zapatillas que tenía y un identificador
de cada zapatilla, diga de cuántas zapatillas se puede deshacer Ayla, es decir, todas
las que han perdido su par. Dos zapatillas son del mismo par si tienen el mismo iden-
tificador.
Entrada
En la primera línea, un número N con la cantidad de zapatillas que tiene Ayla. En la
segunda línea, K números, el identificador de cada una de las zapatillas.
Salida
En la primera línea los identificadores de las zapatillas que puede tirar, en la segunda
línea la cantidad de zapatillas que puede tirar y en la tercera línea la cantidad de
zapatillas que Ayla se quedará. En caso de que Ayla haya encontrado todos los pares
de las zapatillas debes imprimir :D en lugar de los identificadores.
Ejemplo entrada
Caso 1
10
2 4 3 2 2 3 5 5 8 10
Caso 2
8
162 Capítulo 9
44 33 12 44 33 12 20 20
Ejemplo salida
Caso 1
2 4 8 10
4
6
Caso 2
:D
0
8
Límites
Ninguna zapatilla tendrá un identificador mayor a 106
Todas las zapatillas para Ayla son iguales tanto la izquierda como la derecha
Ayla no tiene más de 1000 zapatillas
Solución
Una vez leídos los identificadores de las zapatillas, se crea un diccionario y una
lista vacíos. Posteriormente, mediante un for se va verificando si cada identificador
de zapatilla se encuentra en el diccionario (dichos identificadores son las claves del
diccionario y los valores son contadores que van contabilizando las apariciones de
cada identificador), en caso de que se encuentre un identificador de zapatilla en el
diccionario entonces se incrementa su contador (su valor en el diccionario); si no
se encuentra, entonces se agrega el identificador al diccionario y a una lista llamada
lista2. En seguida, se ordena la lista2 mediante el método sort. A continuación, en
un for que recorre la lista2 se va verificando si el valor de cada clave (el identificador
de zapatilla) del diccionario es impar, lo cual significa que la zapatilla no tiene su
pareja; por lo que se imprime dicho identificador y se contabiliza. Finalmente, se
imprime el contador con (representa la cantidad de zapatillas que no tienen pareja)
y el número de zapatillas que tienen su par.
1 n = int ( input () )
2 lista = input () . split ()
3
4 diccionario ={}
5 lista2 =[]
6 for i in lista :
7 valor = int ( i )
8 if valor in diccionario . keys () :
9 diccionario [ valor ]= diccionario [ valor ]+1
10 else :
11 diccionario [ valor ]=1
12 lista2 . append ( valor )
Ejercicios de programación competitiva 163
13
14 lista2 . sort ()
15 con =0
16 for i in lista2 :
17 if diccionario [ i ] %2!=0:
18 print (i , end = " " )
19 con +=1
20
21 if con ==0:
22 print ( " : D " )
23 else :
24 print ()
25 print ( con )
26 print (n - con )
Programa 9.9: Acomodando zapatillas
Entrada
La primera línea de entrada contendrá la primera palabra (solo minúsculas, del alfa-
beto inglés (sin ñ) y a lo mucho contendrá 1000 letras). La segunda línea contendrá la
segunda palabra (solo minúsculas, del alfabeto inglés (sin ñ) y a lo mucho contendrá
1000 letras).
Ejemplos entrada
Caso 1
imperdonablemente
imponderablemente
Caso 2
bulliciosamente
escabullimiento
Caso 3
roca
coro
164 Capítulo 9
Caso 4
enfriamiento
refinamientos
Ejemplos salida
Caso 1
SI es un ANAGRAMA!
Caso 2
SI es un ANAGRAMA!
Caso 3
NO es un Anagrama!
Caso 4
Las cadenas tienen longitud diferente.
Operacion Cancelada!
Solución
Se leen las dos cadenas por analizar y se compara la longitud de ambas (función
len), si las cadenas no tienen la misma longitud, entonces se manda el mensaje
“Operación cancelada”. De lo contrario, si las cadenas tienen la misma longitud, se
procede a analizarlas. Primero se crea una variable llamada ban (bandera) con el
valor de 0. Posteriormente, mediante un for que recorre cada carácter de la primera
cadena (cadena1) se va contando mediante el método count, el número de veces
que aparece el carácter en ambas cadenas. Si el número de apariciones del carácter
es diferente en ambas cadenas entonces, se establece ban=1 y se sale del ciclo con
el break. Finalmente, fuera del for se valida si la variable ban es igual a 0, lo que
significa que se recorrieron todos los caracteres de la cadena sin ningún problema,
y por lo tanto sí es un anagrama; por el contrario, si la variable ban es igual a 1,
entonces se concluye que no es un anagrama.
1 cadena1 = input ()
2 cadena2 = input ()
3
13 break
14
15 if ban ==0:
16 print ( " SI es un ANAGRAMA ! " )
17 else :
18 print ( " NO es un Anagrama ! " )
Programa 9.10: Anagrama sencillo
Entrada
Una palabra.
Salida
En una primer línea el número de caracteres mayúsculas. En otra línea el número de
caracteres minúsculas.
Ejemplos entrada
Caso 1
Juan
Caso 2
CucHillo
Ejemplos salida
Caso 1
1
3
Caso 2
2
6
Límites
Podrías limitar las palabras a 30 caracteres
166 Capítulo 9
Entrada
En la primera línea N amigos que asisten a la fiesta seguido de número de regalos
que estos le han llevado.
Salida
En caso de que la cantidad de regalos sea equivalente a la suma del resto de números
de todos los regalos se deberá visualizar por pantalla un 1, en caso contrario mostrar
-1.
Ejemplos entrada
Caso 1
5
1 2 3 4 10
Caso 2
5
4 1 2 3 11
Ejemplos salida
Caso 1
1
Caso 2
-1
9.12.3. Crucigrama
Por semanas has estado resolviendo crucigramas. Ahora quieres ganar un poco de
dinero vendiéndole crucigramas a los periódicos diarios de la región. Como no quieres
perder tiempo haciéndolos a mano, vas a escribir un programa que los genere. Al
programa le das 2 palabras: palabra A y palabra B. La palabra A la debe escribir
horizontalmente, y la palabra B la debe escribir verticalmente; de tal manera que las
palabras se puedan cruzar; esto es deben compartir exactamente una letra. La letra
compartida debe ser la primera letra en A que aparece en B, mas preciso: debe ser la
primera ocurrencia de la letra, en ambas palabras. Por ejemplo: dadas las palabras A
= “ABBA” y B = “CCBBD”, el programa debe generar, en este caso, las 5 líneas que
Ejercicios de programación competitiva 167
Entrada
La primera y única línea de entrada contiene dos palabras: A y B; de no mas de 30
letras cada una, separadas por un solo espacio. Ambas palabras están escritas con
letras mayúsculas del alfabeto español. En todos los casos habrá, al menos, una letra
común en ambas palabras.
Salida
Si la longitud de la palabra A es N, y la longitud de la palabra B es M. La salida deben
ser M líneas con N caracteres cada linea. La figura que se forme con la salida debe
contener a las 2 palabras cruzadas, como se describe en la explicación del problema
(por eso se llama crucigrama). El resto de los caracteres, en cada línea, deben ser
puntos (el carácter punto).
Ejemplo entrada
ABBA CCBBD
Ejemplo salida
.C..
.C..
ABBA
.B..
.D..
Límites
1 ≤ longituddeA ≤ 30
1 ≤ longituddeB ≤ 30
Entrada
Un entero N seguido de los números anotados en las N cartas. Puedes suponer que
168 Capítulo 9
Salida
El nombre del jugador ganador (en mayúsculas) o la cadena EMPATE! en caso de
empate.
Ejemplos entrada
Caso 1
5
10 4 8 1 9
Caso 2
5
10 4 2 3 9
Caso 3
3
15 10 5
Ejemplos salida
Caso 1
APARICIO
Caso 2
NONILA
Caso 3
EMPATE!
Entrada
Siempre sera una solo matriz de 3*3, debes revisar si su diagonal principal y secun-
daria son iguales.
Ejemplos entrada
Caso 1
123
245
678
Caso 2
111
111
111
Caso 3
323
739
363
Ejemplos salida
Caso 1
Sigue buscando
Caso 2
Tesoro encontrado
Caso 3
Tesoro encontrado
Límites
0 ≤ x ≤ 1000
170 Capítulo 9
Bibliografía
[1] J. S. Caula. Los 100 mejores juegos de ingenio. Paidós, 1 edition, 2015.
[3] O.D.C. Villagómez, D.B. López, A.A. Silva, and E.C. Juárez. Python con aplica-
ciones a las matemáticas, ingeniería y finanzas. Alfaomega, 1 edition, 2017.
[5] S. Halim and Halim F. Programación competitiva Manual para concursantes del
ICPC y la IOI. OJBooks, 1 edition, 2019.
171
Índice alfabético
172
ÍNDICE ALFABÉTICO 173
iguales, 23 int, 64
conjuntos, 124 intersección, 128
constante, 42 Intratable, 143
constantes, 42, 61
conteo de figuras, 17 Jerarquía de operadores, 57
cos, 66 keywords, 58
def, 131 len, 110, 118, 123, 127
Desde, hasta que, 85 lenguaje multiplataforma, 46
Diagramas de Venn, 21 letras en desorden, 18
diccionarios, 119 list, 118
diferencia, 128 listas, 108
diferencia simétrica, 128 Los números enteros, 30
división, 27 Los números naturales, 27
Lógica, 5
editor de texto, 47
lógica proposicional, 6
Elemento, 22
Elementos de la lógica proposicional math, 66, 68
Auxiliares, 6 Mientras que, 85
Conectores, 6 multiplicación, 27
Variables, 6 máximo común divisor, 38
Enunciado, 5 Método
estructuras secuenciales, 62 add, 125
estructuras selectivas, 73 append, 111
clear, 114, 126
Falso, 43
count, 105, 113, 118
Fibonacci, 94, 145
discard, 125
float, 66
endswith, 107
for, 87
extend, 111
funciones recursivas, 136
find, 105
función, 131
get, 122
habilidad index, 112
lógico matemática, 14 insert, 111
pensamiento, 5 islower, 106
join, 108
identificadores, 42 lower, 104
if, 74 pop, 113
if-elif-else, 79 remove, 114
if-else, 75 replace, 108
in, 112, 117, 123, 126 reverse, 115
Inferencia, 5, 6 sort, 115
input, 54, 63 split, 107
Instalar Python, 48 startswith, 106
InstalarPyCharm, 49 upper, 104
174 ÍNDICE ALFABÉTICO
bool, 54
float, 54
int, 54
str, 54
Verdadero, 43
while, 86
zen de Python, 46