Este documento es una coleccin de ejercicios de programacin que el autor considera adecuados para la UEA Programacin Estructurada del Tronco General de Asignaturas de los planes de licenciatura en ingeniera de la UAM Azcapotzalco. Todos estos ejercicios han sido utilizados, con muy buenos resultados, por el autor y tambin por otros colegas suyos del Departamento de Sistemas cuando han impartido UEA similares. Por lo tanto, estamos convencidos de que esta coleccin ser de utilidad a otros profesores y alumnos en el futuro.
64 ejercicios de programacin
64 ejercicios de programacin Este material fue dictaminado y aprobado para su publicacin por el Consejo Editorial de la Divisin de Ciencias Bsicas e Ingeniera de la Universidad Autnoma Metropolitana Unidad Azcapotzalco, en su sesin del da 26 de octubre de 2010.
64 ejercicios de programacin
Francisco Javier Zaragoza Martnez
Departamento de Sistemas Divisin de Ciencias Bsicas e Ingeniera Universidad Autnoma MetropolitanaUnidad Azcapotzalco 2011
UNIVERSIDAD AUTNOMA METROPOLITANA Dr. Enrique Fernndez Fassnacht R ECTOR G ENERAL Mtra. Iris Santacruz Fabila S ECRETARIA G ENERAL UNIDAD AZCAPOTZALCO Mtra. Paloma Gabriela Ibez Villalobos R ECTORA Ing. Daro Eduardo Guaycochea Guglielmi S ECRETARIO A CADMICO Dr. Emilio Sordo Zabay D IRECTOR DE LA D IVISIN DE C IENCIAS B SICAS E I NGENIERA C. P. Rosa Mara Bentez Mendoza J EFA DE LA O FICINA DE P RODUCCIN E DITORIAL Y D IFUSIN D. C. G. Juan Manuel Galindo Medina D ISEO G RFICO Mtra. en Ed. Concepcin Asuar C ORRECCIN DE E STILO Y E DITORIAL 64 ejercicios de programacin Primera edicin, 2011 D. R. 2011 Universidad Autnoma MetropolitanaUnidad Azcapotzalco Av. San Pablo 180, Col. Reynosa Tamaulipas Del. Azcapotzalco, C.P. 02200, Mxico, D.F. Ocina de Produccin Editorial y Difusin de la DCBI Tel. 53189580 cbi-comunicacion@correo.azc.uam.mx D. R. 2011 Dr. Francisco Javier Zaragoza Martnez Av. San Pablo 180, Col. Reynosa Tamaulipas Del. Azcapotzalco, C.P. 02200, Mxico, D.F. ISBN xxx-xx-xxxx-x Impreso en Mxico/Printed in Mexico
ndice general
Introduccin 1. Operadores
1.1. 1.2. 1.3. 1.4. 1.5. 1.6. La medida del tiempo . . . . . . Unidades britnicas de longitud Unidades britnicas de volumen El calendario de la cuenta larga . Conversin de temperaturas . . Agua fra y caliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 3
3 4 5 6 7 8
2. Decisiones
2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7. Un algoritmo de Gauss poco conocido El caracol . . . . . . . . . . . . . . . . . . Interseccin de segmentos . . . . . . . Rectngulos dentro de rectngulos . . . Da de la semana . . . . . . . . . . . . . Tipo de tringulo . . . . . . . . . . . . . Mayor y menor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9 11 12 13 14 15 16
3. Ciclos
3.1. 3.2. 3.3. 3.4. 3.5. 3.6. Divisores . . . . . . . . . . El problema de Collatz . . El problema de Pitgoras Los tringulos . . . . . . . Tringulos issceles . . . . Tringulos acutngulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
17 18 19 20 21 22
VII
VIII
ndice general
23 24
4. Funciones
4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. 5.7. 5.8. 5.9. 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. 6.7. 6.8. Factorizando factoriales . Suma de primos . . . . . . Primos gemelos . . . . . . Suma de muchos primos . Parejas disparejas . . . . . Primos escondidos . . . . Sucesiones de primos . . Suma de potencias . . . . Hidrocarburos lineales . Fracciones continuas . . Secuencias saltarinas . . Producto circular . . . . Mezcla de nmeros . . . Centro de un vector . . . Alrededor de la mediana Polinomio al cuadrado . Girando un vector . . . . Matriz serpentina . . . . Matriz en diagonal . . . Matrices giradas . . . . . Matrices estocsticas . . Peones atorados . . . . . Buscaminas . . . . . . . Torres al ataque . . . . . Cuadrado mgico impar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
25 26 27 28 29 30 31 32
5. Vectores
33
33 35 36 37 38 39 40 41 42
6. Matrices
43
43 44 45 46 47 48 49 50
7. Cadenas
7.1. Consonantes y vocales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2. Inversiones e intercalaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
51 52
ndice general
7.3. Palabras similares . . . . . . . . 7.4. Cdigo telefnico . . . . . . . . 7.5. Sopa de letras . . . . . . . . . . 7.6. Mquina descompuesta . . . . 7.7. Genes dominantes y recesivos 7.8. Letras en el espejo . . . . . . . 7.9. Clave de usuario . . . . . . . . . 7.10.Cdigo del Csar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IX
53 54 55 56 57 58 59 60
8. Archivos
8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. 8.8. Eligiendo representantes Identicadores . . . . . . Calicacin de tareas . . . Correccin de espacios . . Varias claves de usuario . Cdigo de Vigenre . . . . Buscando nmeros . . . . Jurado de clavados . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
61 63 64 65 67 68 69 70
Bibliografa
71
64 ejercicios de programacin
ndice general
Introduccin
Este documento es una coleccin de ejercicios de programacin que el autor considera adecuados para la UEA Programacin Estructurada del Tronco General de Asignaturas de los planes de licenciatura en ingeniera de la UAM Azcapotzalco. Todos estos ejercicios han sido utilizados, con muy buenos resultados, por el autor y tambin por otros colegas suyos del Departamento de Sistemas cuando han impartido UEA similares. Por lo tanto, estamos convencidos de que esta coleccin ser de utilidad a otros profesores y alumnos en el futuro. Los ejercicios estn agrupados en ocho temas generales y cada uno de ellos forma un captulo del presente volumen. stos son: 1. Operadores: para realizar estos ejercicios, es preciso contar con el conocimiento de los operadores elementales de nmeros enteros y de punto otante y de las instrucciones bsicas de lectura y escritura. 2. Decisiones: para este otro conjunto, se requiere del conocimiento adicional de las estructuras bsicas de toma de decisiones. 3. Ciclos: para lo cual, se requiere adems de la comprensin de las estructuras bsicas de repeticin. 4. Funciones: estos ejercicios sirven para fomentar el uso de funciones. 5. Vectores: para este captulo, se requiere de la lectura, el procesamiento y la escritura de informacin almacenada en arreglos numricos de una dimensin. 6. Matrices: en esta parte, es preciso dominar la lectura, el procesamiento y la escritura de informacin almacenada en arreglos numricos de dos dimensiones.
ndice general
7. Cadenas: en estos ejercicios se requiere de la lectura, el procesamiento y la escritura de informacin almacenada en arreglos alfanumricos de una dimensin. 8. Archivos: captulo nal que requiere de la lectura, el procesamiento y la escritura de informacin almacenada en archivos.
Por supuesto, la UEA Programacin Estructurada incluye algunos otros temas, pero ellos estn ms all del alcance de esta coleccin de ejercicios. Aunque los captulos van suponiendo la adquisicin de conceptos nuevos, adems de los que se hayan usado anteriormente, los ejercicios dentro de cada captulo no estn organizados necesariamente de forma temtica ni por nivel aparente de dicultad. Es indudable que, lo que a un alumno o profesor le puede parecer fcil, a otro le puede parecer difcil y viceversa. Incluso hay ejercicios que, aunque en la descripcin son muy parecidos entre s, el mtodo de solucin puede ser muy distinto para cada uno de ellos. Cada ejercicio consta de una descripcin general del problema por resolver (generalmente acompaada de la descripcin de un ejemplo), seguida de una breve descripcin tcnica que indica cmo debe esperar la entrada el programa escrito y cmo debe entregar su salida (detalle que, cuando el alumno lo sigue elmente, ha sido muy til al autor para implementar un tipo rudimentario de evaluacin automtica) y nalmente incluye al menos un ejemplo de cmo se ver la entrada y la salida en una ejecucin real del programa escrito por el alumno. El lector notar que no se hace mencin de ningn lenguaje de programacin en particular. El programa de la UEA Programacin Estructurada indica que se debe ensear el lenguaje de programacin C. Sin embargo, el autor cree que el lenguaje especco que se utilice para llevar a cabo estos ejercicios no cambia el objetivo: que el alumno practique la programacin, es decir, que piense cmo resolver un problema de forma algortmica y que sea capaz de describir su solucin sin ambigedad mediante un programa. Opina adems que si se viera obligado a escoger un lenguaje de programacin que sirva para introducir a un alumno al tema, entonces escogera en denitiva un lenguaje imperativo, casi con toda seguridad C o alguno de sus descendientes ms modernos (compilados como C++ o interpretados como PHP o Python). En cualquier caso, el lector encontrar al nal una bibliografa relativa a ejercicios y lenguajes de programacin. El autor desea agradecer a Concepcin Asuar, Tonatihu Daz Alegra, scar Herrera Alcntara, Sergio Luis Prez Prez y Germn Tllez Castillo, quienes pacientemente revisaron versiones preliminares de este documento. A Este documento fue escrito en LTEX 2 usando nicamente software libre.
Captulo 1
Operadores
1.1. La medida del tiempo
Te has preguntado alguna vez cuntos segundos han pasado desde que naciste? Desde que aprendiste a contar? Desde que entraste a la universidad? O bien, te has preguntado cunto tiempo son un milln de segundos? Como todo el mundo sabe, un minuto tiene 60 segundos, una hora tiene 60 minutos, un da tiene 24 horas y un ao tiene 365 das. Bueno, eso no siempre es cierto, pero lo consideraremos as para este ejercicio. Dada una cantidad de segundos s, debers determinar cuntos aos a, das d , horas h y minutos m completos representan, adems de cuntos segundos q quedan. Por ejemplo, si s = 40 000 000, entonces a = 1, d = 97, h = 23, m = 6, q = 40.
Especicacin
La entrada consiste de un nmero entero s que tendr un valor entre 0 y 2 000 000 000. La salida consiste de cinco nmeros enteros, a, d , h, m, q, separados por espacios.
Operadores
1.2.
Con toda seguridad te has enfrentado a las unidades britnicas de longitud. Lo que no todo el mundo sabe es cmo se relacionan unas con las otras. Una milla son 8 furlongs, un furlong son 220 yardas, una yarda son 3 pies, un pie son 12 pulgadas y una pulgada son... bueno, mejor all lo dejamos (como vern, los britnicos se complicaron demasiado la vida y, no conformes, inventaron otras unidades de longitud extraas como el rod que mide 5.5 yardas y el fathom que mide 6 pies). Dada una cierta cantidad de pulgadas u, debers determinar cuntas millas m, furlongs f , yardas y, pies p y pulgadas q completas representan. Por ejemplo, si se tiene que u = 40 000 000, entonces m = 631, f = 2, y = 111, p = 0, q = 4.
Especicacin
La entrada consiste de un nmero entero u que tendr un valor entre 0 y 2 000 000 000. La salida consiste de cinco nmeros enteros, m, f , y, p, q, separados por espacios.
Especicacin
La entrada consiste de cinco nmeros enteros, g 1 , c 1 , p 1 , t 1 , o 1 , separados por espacios; cada uno tendr un valor entre 0 y 1 000. La salida consiste de cinco nmeros enteros, g 2 , c 2 , p 2 , t 2 , o 2 , separados por espacios.
64 ejercicios de programacin
Operadores
1.4.
Los mayas usaban tres calendarios, pero en este ejercicio nos concentraremos solamente en el calendario choltn, o calendario de la cuenta larga. En ste, un da se llama kin, 20 kines forman un uinal, 18 uinales forman un tun, 20 tunes forman un katn y 20 katunes forman un baktn (tambin existen periodos de tiempo ms grandes, pero no nos ocuparemos de ellos). Una fecha se especica como el nmero b de baktunes, seguido del nmero k de katunes, el nmero t de tunes, el nmero u de uinales y el nmero d de kines ocurridos a partir de una fecha inicial llamada 0.0.0.0.0 que corresponde al 11 de agosto del ao 3113 antes de nuestra era, segn el calendario gregoriano. Si sabemos el nmero n de das transcurridos a partir de esa fecha, se puede calcular fcilmente la fecha correspondiente del calendario choltn. Por ejemplo, si han transcurrido 314 159 265 das a partir de la fecha inicial, entonces la fecha correspondiente es 2181.13.4.11.5, es decir b = 2 181, k = 13, t = 4, u = 11, d = 5.
Especicacin
La entrada consiste de un nmero entero n que tendr un valor entre 0 y 2 000 000 000. La salida consiste de cinco nmeros enteros, b, k, t , u, d , separados por espacios.
Especicacin
La entrada consiste de un nmero entero C que tendr un valor entre 273 y 1 000. La salida consiste de tres nmeros enteros, K , F , R, separados por espacios.
64 ejercicios de programacin
Operadores
1.6.
Escribe un programa que lea una temperatura F en grados Fahrenheit y que escriba la temperatura equivalente C en grados centgrados. Recuerda que 9C = 5(F 32). Adems, tu programa debe decir si a esa temperatura el agua estara fra (si C 36) o caliente (si C > 36).
Especicacin
La entrada consiste de un nmero entero F que tendr un valor entre 450 y 1 000. La salida consiste de dos nmeros enteros, C , E , separados por un espacio, donde E = 0, si el agua est fra y E = 1, si est caliente.
Captulo 2
Decisiones
2.1. Un algoritmo de Gauss poco conocido
La Pascua cae en el primer domingo que sigue a la primera luna llena que ocurra el 21 de marzo o despus. El siguiente algoritmo, propuesto por Gauss, calcular, dado un ao A 1583, un nmero que representa la fecha de la Pascua de la siguiente forma: si J 31, entonces la Pascua ser el J de marzo; en otro caso la Pascua ser el J 31 de abril. 1. Haz B = A/100 + 1. 2. Haz C = 3B /4 12. 3. Haz E = (A mod 19) + 1. 4. Haz F = (8B + 5)/25 (5 +C ). 5. Haz G = 5A/4 (C + 10). 6. Haz H = (11E + 20 + F ) mod 30. 7. Si H no vale 25, entonces v al paso 9. 8. Si E es mayor que 11, entonces suma 1 a H . 9. Si H vale 24, entonces suma 1 a H . 10. Haz I = 44 H . 11. Si I es menor que 21, entonces suma 30 a I .
10
12. Haz J = I + 7 [(G + I ) mod 7].
Decisiones
En este algoritmo todas las divisiones son enteras y mod es el residuo de la divisin. Dado un ao A, debers calcular el da D y el mes M en el que cae la Pascua en el ao A.
Especicacin
La entrada consiste de un nmero entero A que tendr un valor entre 1 583 y 9 999. La salida consiste de dos nmeros enteros, D, M , separados por un espacio (M = 3 signica marzo y M = 4 signica abril).
2.2. El caracol
11
2.2. El caracol
Un caracol ha cado en un agujero de p metros de profundidad. En su intento de salir del agujero, el caracol sube s metros cada da, pero se resbala r metros cada noche. Si s es mayor que r , el caracol lograr salir nalmente del agujero. Por ejemplo, si el agujero tiene 10 metros de profundidad y el caracol sube 5 metros cada da y se resbala 2 metros cada noche, entonces el caracol lograr salir al tercer da. Dados los nmeros p, s, r , debers determinar el nmero d de das que tardar en salir el caracol.
Especicacin
La entrada consiste de tres nmeros enteros, p, s, r (con s > r ), separados por espacios, que tendrn un valor entre 1 y 1 000 000. La salida consiste de un nmero entero d .
64 ejercicios de programacin
12
Decisiones
2.3.
Interseccin de segmentos
Recordars que dos puntos distintos en el plano determinan una nica recta. Similarmente dos puntos en el plano determinan un segmento, el cual consiste nicamente de los puntos en la recta que los une y que se encuentran entre ellos (incluyndolos). Tambin recordars que dos rectas en el plano o bien son paralelas, o bien se intersectan en un nico punto. Con los segmentos ocurre algo distinto, pues es posible que no se intersecten aun sin ser paralelos. Considera por ejemplo tres segmentos: P determinado por los puntos extremos (2, 1) y (3, 2), Q determinado por los puntos extremos (1, 3) y (3, 4), as como R determinado por los puntos extremos (4, 1) y (1, 4). Observa que P y Q no se intersectan, 5 P y R se intersectan en (3, 2) y Q y R se intersectan en ( 3 , 10 ) = (1.666666..., 3.333333...). 3 Dados dos segmentos cualesquiera (que no sean paralelos y ninguno de los cuales sea horizontal ni vertical) determinados por sus puntos extremos, debers descubrir si stos se intersectan o no y, en su caso, debers calcular las coordenadas del punto de interseccin.
Especicacin
La entrada consiste de ocho nmeros positivos de punto otante, x 1 , y 1 , x 2 , y 2 , x 3 , y 3 , x 4 , y 4 , separados por espacios. Los extremos del segmento P son los puntos de coordenadas (x 1 , y 1 ) y (x 2 , y 2 ). Los extremos del segmento Q son los puntos de coordenadas (x 3 , y 3 ) y (x 4 , y 4 ). La salida consiste de dos nmeros x, y de punto otante separados por un espacio. Si P y Q se intersectan, entonces (x, y) son las coordenadas del punto de interseccin. En caso contrario, x = y = 1.
13
Especicacin
La entrada consiste de cuatro nmeros enteros, A, B , C , D, separados por espacios, que tendrn un valor cada uno entre 1 y 2 000 000 000. La salida consiste de dos nmeros enteros, S, G, separados por un espacio. El valor de S ser como sigue: 0 si ninguno de los dos rectngulos se puede meter dentro del otro, 1 si el primer rectngulo se puede meter dentro del segundo y 2 si el segundo rectngulo se puede meter dentro del primero (y no ocurre ninguno de los dos casos anteriores). El valor de G ser 1 solamente si para meter un rectngulo dentro del otro se debe hacer un giro de 90 grados y el valor ser 0 en cualquier otro caso.
64 ejercicios de programacin
14
Decisiones
2.5.
Da de la semana
Uno de los problemas que se tiene que resolver al escribir un programa que trabaje con fechas es el de decir qu da de la semana corresponde con una cierta fecha dada. Por ejemplo, el 23 de mayo de 2005 es lunes, el da anterior domingo y el siguiente martes. Dada una fecha como tres nmeros enteros, a, m, d (donde a es el ao, m el mes y d el da), el da de la semana se puede encontrar con el siguiente algoritmo: 1. Si m > 2, entonces v al paso 3. 2. Haz m = m + 10; a = a 1 y v al paso 4. 3. Haz m = m 2.
a 4. Haz c = 100 ; e = a mod 100. e c 5. Haz b = (13m1) + 4 + 4 . 5
6. Haz f = (b + e + d 2c) mod 7. En este algoritmo todas las divisiones son enteras, mod es el residuo de la divisin y f = 0 signica domingo, f = 1 signica lunes, etc. Dada una fecha, debers determinar qu da de la semana fue el da anterior ( f 1 ), ese da ( f 2 ) y el da siguiente ( f 3 ).
Especicacin
La entrada consiste de tres nmeros enteros, a, m, d , separados por espacios y donde 0 a 10 000, 1 m 12 y 1 d 31, adems de que a, m, d representan una fecha vlida. La salida consiste de tres nmeros enteros, f 1 , f 2 , f 3 , separados por espacios.
15
Especicacin
La entrada consiste de tres nmeros enteros, a, b, c, separados por espacios, que tendrn valores cada uno entre 1 000 000 000 y 1 000 000 000. La salida consiste de dos nmeros enteros, t , d , separados por un espacio. El valor de t ser 0 si no es tringulo, 1 si es equiltero, 2 si es issceles y 3 si es escaleno. El valor de d ser 0 (salvo que t = 0).
64 ejercicios de programacin
16
Decisiones
2.7.
Mayor y menor
Escribe un programa que lea cinco nmeros enteros A, B , C , D, E y que escriba al menor de ellos P seguido del mayor de ellos Q. Por ejemplo, si los cinco nmeros ledos son A = 3, B = 1, C = 4, D = 1, E = 5, entonces P = 1, Q = 5.
Especicacin
La entrada consiste de cinco nmeros enteros, A, B , C , D, E , separados por espacios, que tendrn un valor entre 1 000 y 1 000. La salida consiste de dos nmeros enteros, P , Q, separados por un espacio.
Captulo 3
Ciclos
3.1. Divisores
Escribe un programa que lea un nmero entero positivo N y que escriba la cantidad D de divisores positivos de N . Por ejemplo, el 6 tiene 4 divisores (que son 1, 2, 3 y 6).
Especicacin
La entrada consiste de un nmero entero N que tendr un valor entre 1 y 1 000 000. La salida consiste de un nmero entero D.
17
18
Ciclos
3.2.
El problema de Collatz
Considera el siguiente procedimiento: 1. Lee n. 2. Escribe n. 3. Si n = 1 termina. 4. Si n es impar, entonces haz n = 3n + 1. 5. Si no, entonces haz n = n . 2 6. V al paso 2. Si la entrada es n = 22, entonces se escribir la secuencia de nmeros 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. Muchos matemticos creen que el procedimiento anterior termina para cualquier dato de entrada que sea un entero positivo. A este enunciado se le llama la conjetura de Collatz. A pesar de la simpleza del procedimiento, no se sabe si la conjetura es cierta o no. Sin embargo, se ha vericado para todos los enteros entre 1 y 1 000 000. Dada una entrada n, tambin es posible determinar la cantidad de nmeros que se escriben, a la que se le denomina la longitud del ciclo de n. En el ejemplo anterior, la longitud del ciclo de n = 22 es = 16 y el nmero ms grande que aparece en el ciclo es m = 52. Dado un nmero n, debers determinar su longitud de ciclo y el nmero ms grande m que aparezca.
Especicacin
La entrada consiste de un nmero entero n que tendr un valor entre 1 y 1 000 000. La salida consiste de dos nmeros enteros, , m, separados por un espacio.
19
Especicacin
La entrada consiste de dos nmeros enteros, m, n, separados por un espacio, que tendrn un valor entre 1 y 1 000 000. La salida consiste de un nmero entero p, esto es, la cantidad de ternas pitagricas con las propiedades deseadas.
64 ejercicios de programacin
20
Ciclos
3.4.
Los tringulos
Para que tres nmeros naturales a, b, c sean las longitudes de los lados de un tringulo, deben cumplir ciertas condiciones llamadas las desigualdades del tringulo. Averigua cules son estas condiciones. Cuando a, b, c cumplan estas condiciones, diremos que (a, b, c) es una terna triangular. Dados dos nmeros enteros, m, n, podemos encontrar todas las ternas triangulares (a, b, c) tales que m a b c n. Por ejemplo, si m = 2, n = 5, entonces hay 17 ternas triangulares en ese intervalo, de hecho, las nicas que no cumplen son (2, 2, 4), (2, 2, 5) y (2, 3, 5).
Especicacin
La entrada consiste de dos nmeros enteros, m, n, separados por un espacio, que tendrn un valor entre 1 y 1 000. La salida consiste de un nmero entero t , esto es, la cantidad de ternas triangulares con las propiedades deseadas.
21
Especicacin
La entrada consiste de dos nmeros enteros, m, n, separados por un espacio, que tendrn un valor entre 1 y 1 000. La salida consiste de un nmero entero t , esto es, la cantidad de ternas con las propiedades deseadas.
64 ejercicios de programacin
22
Ciclos
3.6.
Tringulos acutngulos
Para que tres nmeros enteros a, b, c sean las longitudes de los lados de un tringulo deben satisfacer las tres desigualdades a +b > c, b +c > a, c + a > b. Para que un tringulo sea acutngulo debe satisfacer que cada uno de sus tres ngulos mida menos de 90 . Recuerda que cada ngulo de un tringulo se puede calcular usando la ley de cosenos: a 2 = b 2 + c 2 2bc cos . Dados dos nmeros enteros, m, n, podemos encontrar la cantidad t de ternas (a, b, c) tales que m a b c n y que a, b, c sean las longitudes de los lados de un tringulo acutngulo. Por ejemplo, si m = 3, n = 5, entonces hay t = 8 ternas como las descritas, que son (3, 3, 3), (3, 3, 4), (3, 4, 4), (3, 5, 5), (4, 4, 4), (4, 4, 5), (4, 5, 5) y (5, 5, 5).
Especicacin
La entrada consiste de dos nmeros enteros, m, n, separados por un espacio, con un valor entre 1 y 1 000. La salida consiste de un nmero entero t , es decir, la cantidad de ternas con las propiedades deseadas.
23
Especicacin
La entrada consiste de cuatro nmeros enteros, a, b, c, d , separados por espacios, donde 0 a b 9 y 1 c d 26. La salida consiste de un nmero entero n.
64 ejercicios de programacin
24
Ciclos
3.8.
Tablas de mltiplos
En la primaria habrs aprendido las tablas de multiplicar. Por ejemplo, la tabla del 7 comienza 7 1 = 7, 7 2 = 14, 7 3 = 21, etc. Los nmeros 7, 14, 21, etc. se llaman los mltiplos de 7. En general, los mltiplos de un nmero entero positivo A son los nmeros A, 2A, 3A, etc. Lo que seguramente no habrs aprendido en la primaria son las tablas de mltiplos de dos nmeros A, B , las cuales constan de todos los mltiplos distintos de A o de B hasta un cierto nmero N . Dados A, B , N se desea saber la cantidad T de nmeros de la que consta la tabla de mltiplos correspondiente y cul es el nmero M ms grande en esa tabla. Por ejemplo, la tabla de mltiplos de 2 y 3 hasta el 11 consta de los siete nmeros 2, 3, 4, 6, 8, 9 y 10 (es decir, T = 7, M = 10).
Especicacin
La entrada consiste de tres nmeros enteros, A, B , N , separados por espacios y donde 1 A B N 1 000 000. La salida consiste de dos nmeros enteros, T , M , separados por un espacio.
Captulo 4
Funciones
4.1. Factorizando factoriales
El factorial de un nmero natural N se dene como el producto de todos los naturales menores o iguales a l, es decir, N ! = 1 2 . . . N . Por ejemplo, el factorial de 6 es 6! = 1 2 3 4 5 6 = 720. Un nmero primo P es un nmero que tiene exactamente dos divisores, es decir, 1 y P . Los nmeros primos ms pequeos son 2, 3, 5, 7, 11, etc. Todo nmero natural se puede factorizar en nmeros primos. Por ejemplo, 720 se puede factorizar como 24 32 51 . Observa que para factorizar N ! no necesitas calcular su valor. Averigua cmo calcular la funcin factor(n, p) que regresa el mximo exponente a para el cual p a divide a N !
Especicacin
La entrada consiste de un nmero entero N que tendr un valor entre 1 y 1 000 000. La salida consiste de la factorizacin de N ! escrita de la forma A^a B ^b . . . Z ^z, donde A, B, . . . , Z son nmeros primos en orden ascendente y donde a, b, . . . , z son los exponentes correspondientes, todos mayores o iguales a 1. Los trminos deben estar separados por espacios.
Ejemplos Entrada 6 12 Salida 2^4 3^2 5^1 2^1 3^5 5^2 7^1 11^1
25
26
Funciones
4.2.
Suma de primos
Un nmero entero p es primo si es positivo y sus nicos dos divisores positivos son 1 y p. Los nmeros primos ms pequeos son 2, 3, 5, 7 y 11. Algunos nmeros enteros positivos no son primos, pero son la suma de dos nmeros primos. Por ejemplo: 4 = 2+2, 8 = 5+3 y 9 = 7+2. Advierte que algunos nmeros se pueden escribir como suma de dos nmeros primos de ms de una forma (por ejemplo el 10 que puede escribirse 7 + 3 o 5 + 5) pero nos basta con una de ellas. Dado un nmero entero n, podemos decidir si es primo o no y, en caso negativo, decidir si es la suma de dos primos o no.
Especicacin
La entrada consiste de un nmero entero n que tendr un valor entre 1 y 1 000 000. La salida consiste de dos nmeros enteros, p, q, separados por un espacio, tales que: si n es primo, entonces p = n, q = 0; si n es suma de dos primos p, q, entonces p q; en caso contrario p = 0, q = 0.
27
Especicacin
La entrada consiste de un nmero entero m que tendr un valor entre 1 y 1 000 000 000. La salida consiste de los dos nmeros enteros, p, q, separados por un espacio.
64 ejercicios de programacin
28
Funciones
4.4.
Se dice que un nmero entero positivo es primo si tiene exactamente dos divisores positivos distintos. Los nmeros primos ms pequeos son 2, 3, 5, 7 y 11. Adems, y slo para este ejercicio, consideraremos que el nmero 1 tambin es primo. Dado un nmero entero m, podemos escribirlo como suma de primos tan grandes como sea posible. Por ejemplo, si m = 10, lo podemos escribir como 7 + 3 (porque 7 es el primo ms grande menor o igual a 10 y 3 es primo); y si m = 27, lo podemos escribir como 23 +3 +1 (porque 23 es el primo ms grande menor o igual a 27, 3 es el primo ms grande menor o igual al sobrante y nalmente sobra 1).
Especicacin
La entrada consiste de un nmero entero m que tendr un valor entre 1 y 2 000 000 000. La salida consiste de una lista de nmeros primos escritos en orden descendiente, que sumen m y estn separados por espacios.
29
Tipo 0: Si s(m) = n, s(n) = m, decimos que (m, n) es una pareja perfecta. Tipo 1: Si s(m) n, s(n) m, decimos que (m, n) es una pareja defectuosa. Tipo 2: Si s(m) n, s(n) m, decimos que (m, n) es una pareja afectuosa. Tipo 3: De lo contrario, decimos que (m, n) es una pareja dispareja.
Dados dos nmeros m, n debes decidir qu tipos de parejas son (m, n), (m, m), (n, n). Por ejemplo, si m = 6, n = 12, entonces (6, 12) es una pareja dispareja, (6, 6) es una pareja perfecta y (12, 12) es una pareja afectuosa.
Especicacin
La entrada consiste de dos nmeros enteros positivos, m, n, separados por un espacio, donde m, n < 1 000 000. La salida consiste de tres nmeros enteros, p, q, r , separados por espacios, representando cada uno de ellos el tipo de las parejas (m, n), (m, m), (n, n), respectivamente.
64 ejercicios de programacin
30
Funciones
4.6.
Primos escondidos
Un nmero entero es primo si es positivo y si tiene exactamente dos divisores positivos distintos. Los nmeros primos ms pequeos son 2, 3, 5, 7, 11, etc. Considera un nmero entero N , todos los nmeros que se forman al quitarle dgitos por la derecha y todos los nmeros que se forman al quitarle dgitos por la izquierda. Algunos de estos nmeros, que estaban escondidos originalmente, son nmeros primos. Por ejemplo, si N = 211, entonces los nmeros que se forman al quitarle dgitos por la derecha son 21 y 2 (de los cuales uno es primo) y los nmeros que se forman al quitarle dgitos por la izquierda son 11 y 1 (de los cuales uno es primo). Se desea saber si N es primo o no, cuntos primos D tiene por la derecha y cuntos primos I tiene por la izquierda.
Especicacin
La entrada consiste de un nmero entero N con 0 N 999, 999, 999. La salida consiste de tres nmeros enteros, P , D, I , separados por espacios, donde P = 1, si N es primo; P = 0, si N no es primo.
31
Especicacin
La entrada consiste de dos nmeros enteros, A, B , separados por un espacio, tales que 1 A B 1 000 000. La salida consiste de un nmero entero S.
64 ejercicios de programacin
32
Funciones
4.8.
Suma de potencias
En tus cursos de clculo (o en cualquier otro curso donde te hayan hablado de la induccin matemtica) te habrs enfrentado a la necesidad de sumar las potencias de varios nmeros consecutivos. Por ejemplo, la suma de los cubos de los nmeros del 5 al 9 es igual a 53 + 63 + 73 + 83 + 93 = 125 + 216 + 343 + 512 + 729 = 1 925. Dados dos nmeros enteros a, b (con a < b) y un nmero entero positivo n, debes calcular la suma s de las potencias n-simas de los nmeros a, a + 1, . . . , b, es decir: s = a n + (a + 1)n + + b n .
Especicacin
La entrada consiste de tres nmeros enteros, a, b, n, separados por espacios, que cumplen 100 a < b 100 y 0 < n < 10. La salida consiste de un nmero entero s cuyo valor absoluto siempre ser menor que 2 000 000 000.
Captulo 5
Vectores
5.1. Hidrocarburos lineales
Un hidrocarburo lineal es una cadena de tomos de carbono (C) unidos entre s con enlaces sencillos, dobles o triples. Es posible que un cierto tomo de carbono no use todos sus enlaces posibles (un total de 4) para unirse a otros tomos de carbono. En este caso, los enlaces restantes se hacen con tomos de hidrgeno (H). Un hidrocarburo lineal se puede especicar por la secuencia de enlaces. Por ejemplo, si un hidrocarburo tiene secuencia de enlaces (simple, simple, doble, simple, triple, simple, doble), entonces su frmula semidesarrollada es: CH3 CH2 CH = CH C C CH = CH2 . Observa que se escribe H3 , H2 , H o nada, segn el carbono correspondiente est enlazado con tres, dos, uno o ningn hidrgeno. Por supuesto, si solamente damos una secuencia de enlaces, es posible que no corresponda con un hidrocarburo lineal. Por ejemplo, la secuencia (simple, doble, triple, simple, doble, triple) no corresponde con un hidrocarburo lineal, pues el tercer y sexto carbonos necesitaran tener al menos 5 enlaces. Finalmente, las frmulas semidesarrolladas de hidrocarburos se escriben al revs si eso hace que un enlace de mayor multiplicidad quede ms cerca del principio. En nuestro primer ejemplo, debimos haber escrito la frmula semidesarrollada como: CH2 = CH C C CH = CH CH2 CH3 , pues as queda un enlace doble entre los primeros dos carbonos, a diferencia de uno simple.
33
34 Especicacin
Vectores
La entrada consiste de un nmero entero N que tendr un valor entre 1 y 1 000, seguido de N enteros, separados por espacios, en el conjunto {1, 2, 3}. La salida consiste de la frmula semidesarrollada del hidrocarburo correspondiente (ordenada apropiadamente) o del mensaje ERROR EN seguido de la lista de todas las posiciones donde un carbono tiene ms enlaces de los posibles, ordenadas y separadas por espacios. En la salida del programa, usaremos el smbolo # en sustitucin de para indicar un enlace triple.
35
A esta expresin se le llama la fraccin continua de 3.15. Nosotros consideraremos el proceso inverso, es decir, comenzando con la sucesin de nmeros enteros que dene a una fraccin continua, queremos calcular el nmero original. Para ser ms precisos, dado un nmero entero positivo n y una sucesin z 1 , z 2 , . . . , z n de n enteros, calcula el valor del nmero x cuya fraccin continua est representada por: z1 + 1 z2 +
z3 + 1 1 + z n 1
Especicacin
La entrada consiste de un nmero entero n, que tendr un valor entre 1 y 1 000, seguido de n nmeros enteros, z 1 , z 2 , . . . , z n , separados por espacios, cada uno con valor entre 0 y 999. La salida consiste del nmero x de punto otante.
64 ejercicios de programacin
36
Vectores
5.3.
Secuencias saltarinas
Una secuencia de N enteros se llama una secuencia saltarina si el valor absoluto de las diferencias entre elementos consecutivos toman todos los posibles valores desde 1 hasta N 1. Por ejemplo, la secuencia de 4 enteros 1, 4, 2, 3 es una secuencia saltarina porque las diferencias absolutas son 3, 2 y 1, respectivamente. Por otro lado, la secuencia de 5 enteros 3, 1, 5, 1, 2 no es una secuencia saltarina porque las diferencias absolutas son 2, 4, 4 y 1, respectivamente, es decir, falta el nmero 3. Dado un nmero N y una secuencia de N nmeros X 1 , X 2 , . . . , X N , podemos decidir si esta secuencia es saltarina o, si no lo es, podemos encontrar el nmero ms pequeo que no aparece en las diferencias.
Especicacin
La entrada consiste de un nmero entero N , que tendr un valor entre 2 y 1 000, seguido de N nmeros enteros, X 1 , X 2 , . . . , X N , separados por espacios, cada uno con valor entre 999 y 999. La salida consiste de un nmero entero M denido como sigue: M = 0 si la secuencia es saltarina; en otro caso, M debe ser el nmero ms pequeo que no aparece en las diferencias.
37
Especicacin
La entrada consiste de un nmero entero n (con 1 n 1 000) seguido de 2n nmeros enteros, a 1 , a 2 , . . . , a n , b 1 , b 2 , . . . , b n (con valores entre 100 y 100), separados por espacios. La salida consiste de dos nmeros enteros, p mn , p m x , separados por un espacio. a
64 ejercicios de programacin
38
Vectores
5.5.
Mezcla de nmeros
Imagina que tienes dos pilas de exmenes ordenados por nmero de lista y que quieres obtener una sola pila con todos los exmenes ordenados por nmero de lista. Por ejemplo, una pila podra consistir de los cuatro exmenes con nmeros 1, 5, 6, 9 y la otra pila podra consistir de los tres exmenes con nmeros 2, 7, 11. Entonces, al mezclar los nmeros de lista de las dos pilas, obtendras una pila con los siete exmenes con nmeros 1, 2, 5, 6, 7, 9, 11. Se da una lista de N nmeros ordenados a 1 < a 2 < < a N y otra lista de M nmeros ordenados b 1 < b 2 < < b M y se desea obtener una lista con N + M nmeros ordenados c 1 < c 2 < < c N +M que contenga a los N + M nmeros dados.
Especicacin
La entrada consiste de dos nmeros enteros, N , M con 1 N , M 1 000, separados por un espacio, seguidos de una lista de N nmeros enteros 0 < a 1 < a 2 < < a N < 10 000, separados por espacios, y otra lista de M nmeros enteros 0 < b 1 < b 2 < < b M < 10 000, tambin separados por espacios. La salida consiste de una lista de N +M nmeros enteros c 1 < c 2 < < c N +M , separados por espacios.
39
Especicacin
La entrada consiste de un nmero entero n que tendr un valor entre 1 y 1 000 seguido de n + 1 nmeros enteros, x 0 , x 1 , . . . , x n , separados por espacios, cada uno con valor entre 1 y 1 000. La salida consiste de dos nmeros enteros, c, s, separados por un espacio. El primero es el centro de x y el segundo es el valor de la suma. Si x no tiene centro, entonces c = 1, s = 0.
64 ejercicios de programacin
40
Vectores
5.7.
Alrededor de la mediana
Escribe un programa que lea un nmero entero positivo impar N y un vector X de N componentes enteras y que escriba los dos nmeros A y B alrededor de la mediana M de ese vector, es decir, el nmero que quedara justo a la mitad del vector si se ordenaran sus componentes. Por ejemplo, si N = 5, X = (3, 1, 4, 1, 5), entonces A = 1, M = 3, B = 4, porque al ordenar X queda (1, 1, 3, 4, 5).
Especicacin
La entrada consiste de un nmero entero impar N que tendr un valor entre 3 y 999, seguido de N nmeros enteros, separados por espacios, cada uno con valor entre 0 y 999. La salida consiste de dos nmeros enteros, A, B con A B , separados por un espacio.
41
Especicacin
La entrada consiste de un nmero entero N (con 1 N 99) seguido de una lista de N + 1 nmeros enteros, a 0 , a 1 , . . . , a N , separados por espacios, que denen el polinomio p(x) = a 0 + a 1 x + + a N x N . La salida consiste de una lista de 2N + 1 nmeros enteros, b 0 , b 1 , . . . , b 2N , separados por espacios, que denen el polinomio q(x) = p(x)2 = b 0 + b 1 x + + b 2N x 2N .
64 ejercicios de programacin
42
Vectores
5.9.
Girando un vector
Escribe un programa que lea dos nmeros enteros positivos N , G y un vector X de N componentes enteras y que escriba el vector Y de N componentes formado al girar G veces el vector X hacia la derecha. Al hacer esto, la componente ms a la derecha de X se debe colocar en la componente ms a la izquierda de Y . Por ejemplo, si N = 5, X = (3, 1, 4, 1, 5), al girarlo una vez (G = 1), se obtiene el vector Y = (5, 3, 1, 4, 1); y si se girara una vez ms (G = 2), se obtendra el vector Y = (1, 5, 3, 1, 4), etctera.
Especicacin
La entrada consiste de dos nmeros enteros, N , G, separados por un espacio, con valores entre 1 y 100, seguidos de N nmeros enteros, separados por espacios, cada uno con valor entre 0 y 9 (las componentes de X ). La salida consiste de N nmeros enteros separados por espacios (las componentes de Y ).
Captulo 6
Matrices
6.1. Matriz serpentina
Escribe un programa que, dados dos nmeros enteros M , N , construya una matriz con M renglones y N columnas cuyas entradas sean los nmeros 1, 2, . . . , M N acomodados como una serpentina, comenzando con el 1 en la entrada (1, 1), siguiendo hacia la derecha, luego una posicin hacia abajo, siguiendo hacia la izquierda, luego una posicin hacia abajo y as sucesivamente.
Especicacin
La entrada consiste de dos nmeros enteros positivos, M , N (ambos menores que 20), separados por un espacio. La salida debe ser la matriz requerida, debiendo haber M renglones cada uno con N nmeros enteros separados por espacios.
43
44
Matrices
6.2.
Matriz en diagonal
Escribe un programa que, dados dos nmeros enteros, M , N , construya una matriz con M renglones y N columnas cuyas entradas sean los nmeros 1, 2, . . . , M N acomodados en diagonales, comenzando con el 1 en la entrada (1, 1), siguiendo hacia la derecha, luego una posicin hacia abajo y a la izquierda y as sucesivamente.
Especicacin
La entrada consiste de dos nmeros enteros positivos, M , N (ambos menores que 20), separados por un espacio. La salida debe ser la matriz requerida, debiendo haber M renglones cada uno con N nmeros enteros separados por espacios.
45
Especicacin
La entrada consiste de un nmero entero N con 1 N 20, seguido de N renglones, cada uno de los cuales contiene N nmeros enteros entre 0 y 9, separados por espacios, describiendo a la matriz A. La salida consiste de N renglones, cada uno de los cuales contiene N nmeros enteros separados por espacios describiendo a la matriz A .
64 ejercicios de programacin
46
Matrices
6.4.
Matrices estocsticas
Una matriz cuadrada se dice estocstica si las sumas de todos los elementos de cada rengln y las sumas de todos los elementos de cada columna son iguales. Normalmente, todas esas sumas deben ser iguales a 1, pero en este ejercicio supondremos que todas las sumas deben ser iguales a 100. Por ejemplo, la matriz A de 2 2 A= 31 41 59 26
no es estocstica, pero la siguiente matriz B de 3 3 s es estocstica: 31 41 28 B = 59 26 15 . 10 22 57 Ms an, observa que la matriz B se obtuvo de la matriz A completando cada rengln por la derecha y cada columna por abajo de modo que todas las sumas fueran iguales a 100. Dado un entero n y una matriz de n n, escribe un programa que obtenga una matriz de (n + 1) (n + 1) que sea estocstica.
Especicacin
La entrada consiste de un nmero entero n, que tendr un valor entre 1 y 100, seguido de n renglones, cada uno de ellos con n nmeros enteros entre 0 y 100, separados por espacios. Todas las sumas de renglones y columnas de esta matriz sern menores o iguales a 100. La salida consiste de dos renglones, cada uno de ellos con n + 1 nmeros enteros separados por espacios. El primer rengln de la salida debe ser la columna que se agreg a la derecha de la matriz y el segundo rengln de la salida debe ser el rengln que se agreg abajo de la matriz.
47
Especicacin
La entrada consiste de un nmero entero N , que tendr un valor entre 2 y 100, seguido de una matriz de N por N nmeros enteros en el conjunto {0, 1, 2}. Un 0 signica que no hay ninguna pieza en esa posicin, un 1 signica que hay un pen negro y un 2 signica que hay un pen blanco. La salida consiste de dos nmeros enteros, P , Q, separados por un espacio, donde P es el nmero de peones negros que no pueden avanzar y Q es el nmero de peones blancos que no pueden avanzar.
64 ejercicios de programacin
48
Matrices
6.6.
Buscaminas
Has jugado alguna vez al buscaminas? ste es un juego que viene con cierto sistema operativo cuyo nombre no puedo recordar. El objetivo del juego es el de encontrar dnde estn localizadas todas las minas en un campo de M N . El siguiente campo de 4 4 contiene 2 minas:
El juego muestra un nmero en un cuadro que te dice cuntas minas hay adyacentes a ese cuadro. Cada cuadro tiene cuando mucho ocho cuadros adyacentes, por lo que usaremos el nmero 9 para indicar la presencia de una mina. 9 2 1 1 1 2 9 1 0 1 1 1 0 0 0 0
Especicacin
La entrada consiste de dos nmeros enteros, M , N , separados por un espacio y cada uno con un valor entre 1 y 20, seguidos de M lneas cada una con N enteros, 0 o 1, separados por espacios (un 1 indica la presencia de una mina en esa posicin, un 0 indica que no hay mina). La salida consiste de M lneas cada una con N enteros, del 0 al 9, separados por espacios.
49
Especicacin
La entrada consiste de un nmero entero N (con 1 N 10) seguido de una matriz de N por N de unos y ceros, separados por espacios, donde un 1 indica una torre y un 0 indica que la posicin est vaca. La salida consiste de dos nmeros enteros, T , A, separados por un espacio.
1 1
64 ejercicios de programacin
50
Matrices
6.8.
Un cuadrado mgico es una matriz cuadrada que tiene la peculiaridad de que la suma de sus las, columnas y diagonales es la misma. A continuacin se presenta un cuadrado mgico de tres por tres cuya suma de las, columnas y diagonales es 15. 8 3 4 1 5 9 6 7 2
Para construir un cuadrado mgico de nn, en donde n es un nmero impar, se siguen los siguientes pasos: el nmero 1 se coloca en la casilla central de la primera la. Las casillas en que se colocan los nmeros 2, 3, ... se determinan de la siguiente manera: en primera instancia se elige la casilla que se encuentra arriba a la derecha (la la anterior y la columna siguiente). Cuando nos salimos de la matriz por la parte superior, nos regresamos a la ltima la (como si la misma matriz se encontrara repetida como un mosaico). En el ejemplo, el 1 se coloc en la casilla (0, 1); para colocar el 2 tenemos que ir arriba a la derecha, o sea a la casilla (1, 2), con lo que nos salimos de la matriz por la parte superior y nos vamos a la ltima la o sea a la casilla (2, 2), que es donde le toca al 2. Cuando nos pasamos de la ltima columna, nos regresamos a la primera columna. Si la casilla se encuentra libre, all colocamos el siguiente nmero, pero si est ya ocupada, entonces lo colocamos en la casilla que se encuentra por debajo. En el ejemplo, el 3 se encuentra en la casilla (1, 0) por lo que al siguiente nmero le corresponde la casilla (0, 1) que se encuentra ocupada por el 1; entonces el nmero 4 se coloca en la casilla inmediata inferior (2, 0).
Especicacin
La entrada consiste de un entero positivo impar n (con n 21) y la salida debe ser la matriz descrita, con n renglones cada uno con n enteros separados por espacios.
Captulo 7
Cadenas
7.1. Consonantes y vocales
Escribe un programa que lea una palabra S formada exclusivamente por letras maysculas y que escriba el nmero C de consonantes y el nmero V de vocales que contiene. Por ejemplo, la palabra CONSONANTES contiene 7 consonantes y 4 vocales.
Especicacin
La entrada consiste de una cadena S formada por un mximo de 80 letras maysculas. La salida consiste de dos nmeros enteros, C , V , separados por un espacio.
51
52
Cadenas
7.2.
Inversiones e intercalaciones
Existen una gran cantidad de operaciones con cadenas. El propsito de este ejercicio es que implementes dos de ellas. La primera operacin se llama inversin y consiste en intercambiar el primer carcter de una cadena con el ltimo, el segundo con el penltimo, y as sucesivamente, hasta que la cadena original quede invertida. Por ejemplo, la inversin de la cadena trimestre es la cadena ertsemirt. La segunda operacin se llama intercalacin y consiste en tomar dos cadenas e intercalar sus caracteres. Es ms fcil explicar esta operacin con algunos ejemplos: La intercalacin de adios y hola es la cadena ahdoiloas. La intercalacin de hola y adios es la cadena haodliaos. Observa que la cadena intercalada comienza con un carcter de la primera cadena, contina con un carcter de la segunda, y as sucesivamente, hasta que una de las dos cadenas se acaba y simplemente se pegan al nal los caracteres restantes de la otra. Sugerencia: escribe una funcin inversion(s, t) que ponga la inversin de s en t, y una funcin intercalacion(r, s, t) que ponga la intercalacin de r y s en t.
Especicacin
La entrada consiste de dos cadenas A, B , una en cada rengln y con un mximo de 100 caracteres cada una. La salida consiste de la inversin de A, la inversin de B , la intercalacin de A y B , la intercalacin de B y A, la intercalacin de A con la inversin de A, y la intercalacin de B con la inversin de B , cada una en un rengln.
Ejemplo Entrada hola adios Salida aloh soida haodliaos ahdoiloas haolloah asdoiiodsa
53
Especicacin
La entrada consiste de dos cadenas distintas S, T (formadas por entre 1 y 100 letras maysculas) cada una en un rengln. La salida consiste de un nmero entero N , donde N = 0 si S y T no son similares, N = 1 si S y T tienen una letra alterada, N = 2 si T se obtiene de S agregando una letra y N = 3 si T se obtiene de S borrando una letra.
Ejemplos Entrada ROMA MORA SAL SOL PERA PERSA REY RE Salida
1 2 3
64 ejercicios de programacin
54
Cadenas
7.4.
Cdigo telefnico
Alguna vez habrs visto un telfono como el 1-8 -IFE-2 , el cual en realidad se debe marcar como 1-8 -433-2 . Muchas instituciones, empresas y personas quisieran disponer de un nmero telefnico que, al hacerlo corresponder con las letras que aparecen en los teclados telefnicos, se pueda hacer corresponder con su nombre. Si no tienes un telfono a la mano, al nmero 2 le corresponden las letras A, B, C; al 3 las letras D, E, F; al 4 las letras G, H, I; al 5 las letras J, K, L; al 6 las letras M, N, O; al 7 las letras P, Q, R, S; al 8 las letras T, U, V y al 9 las letras W, X, Y, Z. Observa que ni al 0 ni al 1 les corresponde ninguna letra. Algo que por supuesto puede ocurrir es que a dos compaas les corresponda el mismo nmero telefnico aun cuando tengan nombres distintos. Por ejemplo, a las empresas TODO-CABE y UNE-O-ABAD les correspondera el mismo nmero: 86-36-22-23. Escribe un programa que, dados dos nombres, decida si les tocan nmeros distintos. En ese caso, tu programa deber escribir los telfonos que corresponden a cada empresa.
Especicacin
La entrada consiste de dos cadenas de caracteres s y t de la misma longitud (mximo de 100 caracteres), cada una en un rengln y formada exclusivamente por letras maysculas (sin espacios, guiones, etc.). La salida consiste de dos cadenas p y q (ambas de la misma longitud que las de entrada), cada una en un rengln y formada exclusivamente por dgitos (sin espacios, guiones, etc.). En caso de que a s y a t les correspondan nmeros distintos, entonces p debe ser el nmero de s y q debe ser el nmero de t . En caso contrario, p debe ser una cadena de ceros y q debe ser una cadena de unos.
Ejemplos Entrada TODOCABE UNEOABAD MARIA PEREZ Salida 11111111 62742 73739
55
Especicacin
La entrada consiste de dos cadenas P y S, cada una en un rengln y formadas por entre 1 y 100 letras maysculas (de la A a la Z sin incluir los acentos ni la ). La salida consiste de dos nmeros enteros, D, R, separados por un espacio, donde D = 1 si P aparece al derecho en S, donde D = 0 en caso contrario, donde R = 1 si P aparece al revs en S y donde R = 0 en caso contrario.
64 ejercicios de programacin
56
Cadenas
7.6.
Mquina descompuesta
En algn rincn de tu casa debe haber una mquina de escribir. Si la llegaras a usar, tal vez notaras que est descompuesta. En este caso, tenemos una mquina de escribir que cambia entre maysculas y minsculas de manera arbitraria. Por ejemplo, podras obtener el siguiente resultado:
Especicacin
La entrada consiste de una cadena S de longitud entre 1 y 80. Los caracteres de esa cadena podrn ser letras (sin acentos), dgitos, puntos y espacios. La salida consiste de una cadena T en la cual se han arreglado las maysculas y las minsculas de acuerdo a la regla simplicada.
57
Especicacin
La entrada consiste de dos cadenas madre y padre (cada una en una lnea) cuyas longitudes estn entre 1 y 1 000. La salida consiste de dos cadenas hija e hijo (cada una en una lnea). Cada una de las cadenas corresponde con el cdigo gentico de uno de los individuos y todas tendrn la misma longitud.
Ejemplos Entrada JosEFIna fiLOMeNo TEre JuAn Salida JoLEFINa JiLOMINo TEAe JEAn
64 ejercicios de programacin
58
Cadenas
7.8.
Letras en el espejo
Leonardo da Vinci es famoso, entre muchas otras cosas, por su estilo peculiar de escritura: para que nadie le entendiera, l escriba de modo que los textos slo se pudieran leer con la ayuda de un espejo. En este ejercicio haremos algo similar. Observa que algunas letras se ven casi idnticas al reejarse en el espejo (A, H, I, i, l, M, m, n, O, o, T, t, U, u, V, v, W, w, X, x, Y), otras forman parejas al reejarse en el espejo (b con d, p con q, S con Z, s con z) y las dems no parecen letras al reejarse en el espejo. Dada una palabra, se puede obtener la palabra reejada en el espejo marcando las letras que no se reejan bien. Por ejemplo, la palabra prOgRAMAciOn se debe convertir en nOi*AMA**O*q al reejarse, donde los asteriscos signican que esas letras no se reejan bien.
Especicacin
La entrada consiste de una cadena S formada exclusivamente por letras y con una longitud mxima de 80 caracteres. La salida consiste de una cadena T que sea la imagen de espejo de S.
59
Especicacin
La entrada consiste de una cadena que puede contener letras minsculas, letras maysculas y espacios. Por supuesto, los espacios separan nombres y la primera letra de cada nombre es la inicial. La salida consiste de una cadena formada por las iniciales en minsculas en el mismo orden en el que aparecen.
64 ejercicios de programacin
60
Cadenas
Especicacin
La entrada consiste de una cadena (de 1 a 1 000 caracteres) que slo contiene letras maysculas y caracteres @. El primer carcter de esa cadena ser la llave y los dems caracteres formarn el mensaje. La salida consiste de una cadena: el mensaje codicado con la llave. Observa que la cadena de salida tiene un carcter menos que la cadena de entrada.
Captulo 8
Archivos
8.1. Eligiendo representantes
En determinadas fechas, como habrs notado por la cantidad de propaganda pegada a lo largo y ancho de la universidad, se eligen los representantes universitarios. Para evitar problemas a la hora del conteo, se te pidi que escribieras un programa que calcule cuntos votos recibi cada candidato y cuntos votos nulos hubo. Para ello, te dieron un archivo que contena la siguiente informacin: El nmero de candidatos y sus nombres. El nmero de votos y los nombres por los que se vot. Se ha decidido que un voto contar por un candidato solamente si su nombre est escrito correctamente, aunque se permite que las maysculas y las minsculas estn cambiadas. En caso contrario, se considerar un voto nulo. No hay candidatos con el mismo nombre y los nombres constan nicamente de letras (es decir, no contienen espacios, etc.). T debers entregar un archivo que contenga los nombres de los candidatos junto con el nmero de votos que recibieron, adems del nmero de votos nulos.
Especicacin
La entrada consiste del archivo de texto eleccion.txt que contiene en su primer rengln dos nmeros enteros, M , N (con 0 < M < 100, 0 < N < 1 000), separados por un espacio; en los siguientes M renglones los nombres de los M candidatos (uno en cada rengln) y en los siguientes N renglones los N votos registrados. Los nombres pueden constar de 1 a 10 letras maysculas o minsculas. La salida estar en el archivo de texto votos.txt y
61
62
Archivos
consiste de M lneas cada una con el nombre (en maysculas) y nmero de votos de cada candidato (separados por un espacio y en el mismo orden que aparecen en la entrada) seguida de una lnea indicando el nmero de votos nulos.
Ejemplo eleccion.txt 3 7 huGo PaCo LUis Hugo Luisa PACO juanito paco luIS Ninguno votos.txt HUGO 1 PACO 2 LUIS 1 NULOS 3
8.2. Identicadores
63
8.2. Identicadores
Una de las primeras cosas que aprendiste en el curso de programacin fue la denicin de lo que es un identicador. Una palabra es una cadena de caracteres formada exclusivamente por letras maysculas, minsculas, dgitos y el carcter de subrayado (guin bajo). Para simplicar las cosas, puedes suponer que las palabras estn separadas por cualquier carcter que no est en el conjunto anterior. Un identicador es una palabra que no comienza con un dgito. Como ejemplo, abc123, 1__a, a__1 y Dic2 4 son todas palabras, pero la segunda no es un identicador. Escribe un programa que, dado un archivo de texto, encuentre cuntas palabras y cuntos identicadores contiene.
Especicacin
La entrada consiste del archivo de texto programa.txt que consiste nicamente de caracteres ASCII. La salida estar en el archivo de texto analisis.txt y consiste de dos nmeros enteros, p, n, separados por un espacio, donde p es el nmero de palabras y n es el nmero de identicadores.
Ejemplo programa.txt Est e5 1 PrUeBa+de 1 progRAMA en C hecho el 7de diciembre de=2 4 analisis.txt 15 11
64 ejercicios de programacin
64
Archivos
8.3.
Calicacin de tareas
Un profesor muy cuidadoso elabora una lista de todos sus alumnos y las calicaciones de las tareas que le entregan. Cada uno de los alumnos puede entregar una misma tarea tantas veces como quiera y el profesor le asignar una calicacin a cada una. La lista del profesor contiene estos datos exactamente en el orden en el que los alumnos entregan sus tareas. La calicacin denitiva de cada tarea entregada por el alumno es la calicacin de la ltima vez que la entregue, o bien cero si no la entrega. La calicacin nal del alumno es simplemente la suma de las calicaciones denitivas de cada una de las tareas. Ayuda al profesor y escribe un programa que calcule las calicaciones de sus alumnos.
Especicacin
La entrada consiste del archivo de texto tareas.ent que contiene en su primer rengln tres nmeros enteros, M , N , T , separados por espacios, donde 1 M 50 es el nmero de alumnos en el curso, 1 N 10 es el nmero de tareas que el profesor encarg a los alumnos y 1 T 1 000 es el nmero de tareas entregadas por todos los alumnos. Cada uno de los siguientes T renglones contiene tres nmeros enteros, A, B , C , separados por espacios, donde 1 A M es el nmero del alumno, 1 B N es el nmero de tarea y 0 C 10 es la calicacin obtenida por el alumno A en esta entrega de la tarea B . La salida estar en el archivo de texto tareas.sal que contiene en su primer rengln dos nmeros enteros, M , N , separados por un espacio, seguido de M renglones; cada uno de ellos con N + 1 nmeros enteros separados por espacios: las calicaciones denitivas de las tareas 1, 2, . . . , N , seguidas de la calicacin nal del alumno. El primero de estos renglones corresponder al alumno 1, el segundo al 2, ..., y el ltimo al M .
65
Especicacin
La entrada consiste del archivo de texto correc.ent que contiene letras maysculas y minsculas sin acentos, nuevas lneas, espacios y signos de puntuacin. La salida deber quedar en el archivo de texto correc.sal el cual contendr las mismas letras, nuevas lneas y signos de puntuacin, pero con los espacios arreglados.
Ejemplo
correc.ent En un lugar de la Mancha , de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivia un hidalgo de los de lanza en astillero, adarga antigua, rocin flaco y galgo corredor . Una olla de algo mas vaca que carnero, salpicon las mas noches , duelos y quebrantos los sabados, lantejas los viernes, algun palomino de anadidura los domingos, consumian las tres partes de su hacienda. El resto della concluian sayo de velarte, calzas de velludo para las fiestas, con sus pantuflos de lo mesmo, y los dias de entresemana se honraba con su vellori de lo mas fino. Tenia en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que asi ensillaba el rocin como tomaba la podadera.Frisaba la edad de nuestro hidalgo con los cincuenta anos; era de complexion recia, seco de carnes,enjuto de rostro, gran madrugador y amigo de la caza. Quieren decir que tenia el sobrenombre de Quijada.
64 ejercicios de programacin
66
Archivos
correc.sal En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivia un hidalgo de los de lanza en astillero, adarga antigua, rocin flaco y galgo corredor. Una olla de algo mas vaca que carnero, salpicon las mas noches, duelos y quebrantos los sabados, lantejas los viernes, algun palomino de anadidura los domingos, consumian las tres partes de su hacienda. El resto della concluian sayo de velarte, calzas de velludo para las fiestas, con sus pantuflos de lo mesmo, y los dias de entresemana se honraba con su vellori de lo mas fino. Tenia en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que asi ensillaba el rocin como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los cincuenta anos; era de complexion recia, seco de carnes, enjuto de rostro, gran madrugador y amigo de la caza. Quieren decir que tenia el sobrenombre de Quijada.
67
Especicacin
La entrada estar contenida en un archivo llamado nombres.txt, el cual consistir de un nmero entero N seguido de N cadenas que pueden contener letras minsculas, letras maysculas y espacios (cada dato en un rengln). Por supuesto, los espacios separan nombres y la primera letra de cada nombre es la inicial. Ms an, cada nombre estar escrito completamente en minsculas o completamente en maysculas (en cuyo caso ser un apellido). La salida se deber escribir en un archivo llamado inicial.txt consistente del nmero entero N seguido de N cadenas formada por las iniciales en minsculas, poniendo primero todas las iniciales de nombres en el orden en que aparecen, seguidas de todas las iniciales de apellidos en el orden en que aparecen (de nuevo, cada dato en un rengln).
Ejemplo nombres.txt 5 GONZALEZ MARTINEZ jorge emilio SAHAGUN marta JIMENEZ carlos AHUMADA KURTZ ROBLES BERLANGA rosario LOPEZ andres OBRADOR manuel inicial.txt 5 jegm msj cak rrb amlo
64 ejercicios de programacin
68
Archivos
8.6.
Cdigo de Vigenre
En algunas aplicaciones es importante poder enviar un mensaje de una persona a otra sin que ningn tercero se pueda enterar del mensaje. En este caso se recurre a estrategias llamadas tcnicas de codicacin. Algunas de las tcnicas ms simples consisten en la simple sustitucin de un carcter por otro. Por ejemplo, uno podra pensar en sustituir todas las letras F del mensaje original por letras J en el mensaje codicado, todas las letras J del mensaje original por letras Z en el mensaje codicado, etc. En este ejercicio describiremos una de tales tcnicas: el cdigo de Vigenre. Consideraremos que el mensaje consiste nicamente de los caracteres @, A, B, ..., Z y que a estos se les asocian los valores 0, 1, 2, ..., 26, respectivamente. Recuerda que los cdigos ASCII de estos caracteres son 64, 65, 66, ..., 90, respectivamente. En este caso, se escoge una palabra formada con los caracteres @, A, B, ..., Z (a la que llamaremos llave) y los caracteres de la misma se le suman a cada uno de los caracteres del mensaje: se suma el primer carcter de la llave con el primero del mensaje, el segundo carcter de la llave con el segundo del mensaje, y as sucesivamente hasta que se terminan los caracteres de la llave y se vuelve a comenzar con el primero. Por ejemplo, si escogemos EVA como llave y el mensaje original es TAREA@DE@PROGRAMACION, entonces el mensaje codicado ser YWSJWAI@AUMPLMBRWDNJO ya que E + T = Y, V + A = W, A + R = S, E + E = J, etctera.
Especicacin
La entrada estar contenida en un archivo llamado vigenere.txt, el cual consistir de dos cadenas que slo contienen letras maysculas y caracteres @, cada una de 1 a 1 000 caracteres y en un rengln. La primera cadena ser la llave y la segunda el mensaje. La salida se deber escribir en un archivo llamado mensaje.txt consistente de una cadena: el mensaje codicado con la llave.
69
Especicacin
La entrada estar en el archivo nume.ent y consistir de dgitos y otros caracteres. La salida deber estar en el archivo nume.sal y consistir de un nmero entero N , la cantidad de nmeros en el archivo de entrada.
Ejemplo nume.ent nume.sal Hoy 24 de marzo de 2 6 es 9 el ultimo dia de clases del trimestre 2 6i. Abajo hay numeros en diversas formas: 12+34=46, , 1 y 12345.
64 ejercicios de programacin
70
Archivos
8.8.
Jurado de clavados
En una competencia de clavados hay J jueces y C clavadistas. Cada uno de los clavadistas se tira un clavado y cada uno de los jueces le otorga una calicacin de 0 a 10. La calicacin nal que se le otorga al clavadista es simplemente la suma de las calicaciones otorgadas por todos los jueces, excepto por la calicacin ms alta y la calicacin ms baja. Ayuda a los jueces a determinar las calicaciones nales de todos los clavadistas.
Especicacin
La entrada estar en el archivo de texto jurado.ent que contiene en su primer rengln dos nmeros enteros, J , C , separados por un espacio, con 3 J 9; 1 C 99. Cada uno de los siguientes C renglones contiene las J calicaciones enteras, separadas por espacios, otorgadas por los jueces a cada uno de los clavadistas. La salida deber estar en el archivo jurado.sal y deber consistir de C renglones, cada uno de los cuales contendr tres nmeros enteros, F , A, B , separados por espacios, correspondientes a la calicacin nal del clavadista, as como a la calicacin ms alta y a la calicacin ms baja (que fueron eliminadas).
Bibliografa
[1] A RNOLD, K., G OSLING , J. Y H OLMES , D. El lenguaje de programacin Java, tercera ed. Pearson Educacin, Madrid, 2001. [2] B ENTLEY, J. Programming Pearls, segunda ed. Addison Wesley, Nueva York, 2000. [3] C HAPMAN , S. J. Fortran 95/2003 for Scientists and Engineers, tercera ed. McGrawHill, Boston, 2008. [4] D AHL , O.-J., D IJKSTRA , E. W. Y H OARE , C. A. R. Programacin estructurada. Tiempo Contemporneo, Buenos Aires, 1976. [5] F LANAGAN , D. Y M ATSUMOTO, Y. The Ruby Programming Language. OReilly, Sebastopol, 2008. [6] G REGORIO R ODRGUEZ , C., L LANA D AZ , L. F., M ARTNEZ U NANUE , R., PALAO G OS TANZA , P. Y PAREJA F LORES , C. Ejercicios de programacin creativos y recreativos en C++. Prentice Hall, Madrid, 2002. [7] G ROGONO, P. Programacin en Pascal. Addison-Wesley, Mxico, 1986. [8] K ERNIGHAN , B. W. Y P IKE , R. La prctica de la programacin. Prentice Hall, Mxico, 2000. [9] K ERNIGHAN , B. W. Y R ITCHIE , D. M. El lenguaje de programacin C, segunda ed. Prentice Hall, Mxico, 1991. [10] M AURER , H. A. Y W ILLIAMS , M. R. A Collection of Programming Problems and Techniques. Prentice Hall, Englewood Cliffs, 1972.
71
72
Bibliografa
[11] O LSON , P., Ed. PHP Manual. PHP Documentation Group, 2009. Disponible en www.php.net/manual/en/. [12] PARBERRY, I. Problems on Algorithms. Prentice Hall, Englewood Cliffs, 1995. [13] S KIENA , S. S. Y R EVILLA , M. A. Concursos internacionales de informtica y programacin: Manual de entrenamiento por Internet. Universidad de Valladolid, Valladolid, 2006. [14] S TROUSTRUP, B. El lenguaje de programacin C++. Addison Wesley, Madrid, 2002. [15] VAN R OSSUM , G. Y D RAKE , J R ., F. L. The Python Language Reference Manual. Network Theory Ltd, Bristol, 2006. [16] WALL , L., C HRISTIANSEN , T. Y O RWANT, J. Programming Perl, tercera ed. OReilly, Sebastopol, 2000. [17] W IRTH , N. Algoritmos + estructuras de datos = programas. Ediciones del Castillo, Madrid, 1988.