64ejerciciosdeprogramación

May 1, 2018 | Author: Leonel Mejia | Category: Prime Number, Programming Language, Triangle, Computer Program, Integer
Share Embed Donate


Short Description

Download 64ejerciciosdeprogramación...

Description

64 ejercicios de programación

Francisco Javier Zaragoza Martínez Departamento de Sistemas División Divisi ón de Cienci Ciencias as Básic Básicas as e Ingeni Ingeniería ería Universidad Autónoma Metropolitana—Unidad Azcapotzalco

Este documento es una colección de ejercicios de programación que el autor considera adecua ade cuados dos par paraa la UEA Pro Progra gramac mación ión Est Estruct ructura urada da del Tron ronco co Gen Genera erall de Asig Asignat natura urass de los planes de licenciatura lic enciatura en ingeniería de la UAM Azcapotzalco. Azcapotzalco. Todos estos ejercicios han sido utilizados, con muy buenos resultados, por el autor y  también por otros colegas suyos del Departamento de Sistemas cuando han impartido UEA UE A sim simila ilare res. s. Por lo ta tant nto o, es esta tamo moss con conve venc ncid idos os de qu quee esta esta co cole lecci cción ón se será rá de ut util ilid idad ad a otros profesores y alumnos en el futuro.

Este documento es una colección de ejercicios de programación que el autor considera adecua ade cuados dos par paraa la UEA Pro Progra gramac mación ión Est Estruct ructura urada da del Tron ronco co Gen Genera erall de Asig Asignat natura urass de los planes de licenciatura lic enciatura en ingeniería de la UAM Azcapotzalco. Azcapotzalco. Todos estos ejercicios han sido utilizados, con muy buenos resultados, por el autor y  también por otros colegas suyos del Departamento de Sistemas cuando han impartido UEA UE A sim simila ilare res. s. Por lo ta tant nto o, es esta tamo moss con conve venc ncid idos os de qu quee esta esta co cole lecci cción ón se será rá de ut util ilid idad ad a otros profesores y alumnos en el futuro.

64 ejercicios de programación

64 ejercicios de programación 

Este material fue dictaminado y aprobado para su publicación por el Consejo Editorial de la División de Ciencias Básicas e Ingeniería de la Universidad Autónoma Metropolitana Unidad Azcapotzalco, en su sesión del día 26 de octubre de 2010.

64 ejercicios de programación Francisco Javier Zaragoza Martínez

Departamento de Sistemas División de Ciencias Básicas e Ingeniería Universidad Autónoma Metropolitana—Unidad Azcapotzalco 2011

UNIVERSIDAD AUTÓNOMA METROPOLITANA  Dr. Enrique Fernández Fassnacht R ECTOR G ENERAL Mtra. Iris Santacruz Fabila S ECRETARIA  G ENERAL UNIDAD AZCAPOTZALCO Mtra. Paloma Gabriela Ibáñez Villalobos R ECTORA  Ing. Darío Eduardo Guaycochea Guglielmi S ECRETARIO A C ADÉMICO Dr. Emilio Sordo Zabay  D IRECTOR DE LA  D IVISIÓN DE C IENCIAS B ÁS IC AS E I NGENIERÍA  C. P. Rosa María Benítez Mendoza J EFA DE LA  O FICINA DE P RODUCCIÓN E DITORIAL Y D IFUSIÓN D. C. G. Juan Manuel Galindo Medina D ISEÑO G RÁFICO Mtra. en Ed. Concepción Asuar C ORRECCIÓN DE E STILO Y  E DITORIAL 64 ejercicios de programación 

Primera edición, 2011 D. R. © 2011 Universidad Autónoma Metropolitana—Unidad Azcapotzalco  Av. San Pablo 180, Col. Reynosa Tamaulipas Del. Azcapotzalco, C.P. 02200, México, D.F. Oficina de Producción Editorial y Difusión de la DCBI Tel. 53189580 [email protected]  D. R. © 2011 Dr. Francisco Javier Zaragoza Martínez  Av. San Pablo 180, Col. Reynosa Tamaulipas Del. Azcapotzalco, C.P. 02200, México, D.F. ISBN xxx-xx-xxxx-x  Impreso en México/Printed in Mexico 

Índice general Introducción

1

1. Operadores

3

1.1. 1.2. 1.3. 1.4. 1.5. 1.6.

La medida del tiempo . . . . . . Unidades británicas de longitud Unidades británicas de volumen El calendario de la cuenta larga . Conversión de temperaturas . . Agua fría y caliente . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

2. Decisiones

2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7.

9

Un algoritmo de Gauss poco conocido El caracol . . . . . . . . . . . . . . . . . . Intersección de segmentos . . . . . . . Rectángulos dentro de rectángulos . . . Día de la semana . . . . . . . . . . . . . Tipo de triángulo . . . . . . . . . . . . . Mayor y menor . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

3. Ciclos

3.1. 3.2. 3.3. 3.4. 3.5. 3.6.

Divisores . . . . . . . . . . El problema de Collatz . . El problema de Pitágoras Los triángulos . . . . . . . Triángulos isósceles . . . . Triángulos acutángulos .

3 4 5 6 7 8 9 11 12 13 14 15 16 17

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

17 18 19 20 21 22

VI I

Índice general

VIII

3.7. Placas de bicicletas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.8. Tablas de múltiplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4. Funciones

4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8.

25

Factorizando factoriales . Suma de primos . . . . . . Primos gemelos . . . . . . Suma de muchos primos . Parejas disparejas . . . . . Primos escondidos . . . . Sucesiones de primos . . Suma de potencias . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

5. Vectores

5.1. 5.2. 5.3. 5.4. 5.5. 5.6. 5.7. 5.8. 5.9.

Hidrocarburos lineales . Fracciones continuas . . Secuencias saltarinas . . Producto circular . . . . Mezcla de números . . . Centro de un vector . . . Alrededor de la mediana Polinomio al cuadrado . Girando un vector . . . .

33

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

6. Matrices

6.1. 6.2. 6.3. 6.4. 6.5. 6.6. 6.7. 6.8.

Matriz serpentina . . . . Matriz en diagonal . . . Matrices giradas . . . . . Matrices estocásticas . . Peones atorados . . . . . Buscaminas . . . . . . . Torres al ataque . . . . . Cuadrado mágico impar

25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43

. . . . . . . .

. . . . . . . .

7. Cadenas

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

43 44 45 46 47 48 49 50 51

7.1. Consonantes y vocales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.2. Inversiones e intercalaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Francisco Javier Zaragoza Martínez

Índice general

IX

7.3. Palabras similares . . . . . . . . 7.4. Código telefónico . . . . . . . . 7.5. Sopa de letras . . . . . . . . . . 7.6. Máquina descompuesta . . . . 7.7. Genes dominantes y recesivos 7.8. Letras en el espejo . . . . . . . 7.9. Clave de usuario . . . . . . . . . 7.10.Código del César . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

8. Archivos

8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. 8.8.

Eligiendo representantes Identificadores . . . . . . Calificación de tareas . . . Corrección de espacios . . Varias claves de usuario . Código de Vigenère . . . . Buscando números . . . . Jurado de clavados . . . .

Bibliografía

53 54 55 56 57 58 59 60 61

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

61 63 64 65 67 68 69 70 71

64 ejercicios de programación

X

Francisco Javier Zaragoza Martínez

Índice general

Introducción Este documento es una colección de ejercicios de programación que el autor considera adecuados para la UEA Programación Estructurada del Tronco General de Asignaturas de los planes de licenciatura en ingeniería de la UAM Azcapotzalco. Todos estos ejercicios han sido utilizados, con muy buenos resultados, por el autor y  también por otros colegas suyos del Departamento de Sistemas cuando han impartido UEA similares. Por lo tanto, estamos convencidos de que esta colección será de utilidad a otros profesores y alumnos en el futuro. Los ejercicios están agrupados en ocho temas generales y cada uno de ellos forma un capítulo del presente volumen. Éstos son: 1. Operadores: para realizar estos ejercicios, es preciso contar con el conocimiento de los operadores elementales de números enteros y de punto flotante y de las instrucciones básicas de lectura y escritura. 2. Decisiones: para este otro conjunto, se requiere del conocimiento adicional de las estructuras básicas de toma de decisiones. 3. Ciclos: para lo cual, se requiere además de la comprensión de las estructuras básicas de repetición. 4. Funciones: estos ejercicios sirven para fomentar el uso de funciones. 5. Vectores: para este capítulo, se requiere de la lectura, el procesamiento y la escritura de información almacenada en arreglos numéricos de una dimensión. 6. Matrices: en esta parte, es preciso dominar la lectura, el procesamiento y la escritura de información almacenada en arreglos numéricos de dos dimensiones.

1

Índice general

2

7. Cadenas: en estos ejercicios se requiere de la lectura, el procesamiento y la escritura de información almacenada en arreglos alfanuméricos de una dimensión. 8. Archivos: capítulo final que requiere de la lectura, el procesamiento y la escritura de información almacenada en archivos. Por supuesto, la UEA Programación Estructurada incluye algunos otros temas, pero ellos están más allá del alcance de esta colección de ejercicios.  Aunque los capítulos van suponiendo la adquisición de conceptos nuevos, además de los que se hayan usado anteriormente, los ejercicios dentro de cada capítulo no están organizados necesariamente de forma temática ni por nivel aparente de dificultad. Es indudable que, lo que a un alumno o profesor le puede parecer fácil, a otro le puede parecer difícil y viceversa. Incluso hay ejercicios que, aunque en la descripción son muy  parecidos entre sí, el método de solución puede ser muy distinto para cada uno de ellos. Cada ejercicio consta de una descripción general del problema por resolver (generalmente acompañada de la descripción de un ejemplo), seguida de una breve descripción técnica que indica cómo debe esperar la entrada el programa escrito y cómo debe entregar su salida (detalle que, cuando el alumno lo sigue fielmente, ha sido muy útil al autor para implementar un tipo rudimentario de evaluación automática) y finalmente inclu ye al menos un ejemplo de cómo se verá la entrada y la salida en una ejecución real del programa escrito por el alumno. El lector notará que no se hace mención de ningún lenguaje de programación en particular. El programa de la UEA Programación Estructurada indica que se debe enseñar el lenguaje de programación C. Sin embargo, el autor cree que el lenguaje específico que se utilice para llevar a cabo estos ejercicios no cambia el objetivo: que el alumno practique la programación, es decir, que piense cómo resolver un problema de forma algorítmica  y que sea capaz de describir su solución sin ambigüedad mediante un programa. Opina además que si se viera obligado a escoger un lenguaje de programación que sirva para introducir a un alumno al tema, entonces escogería en definitiva un lenguaje imperativo, casi con toda seguridad C o alguno de sus descendientes más modernos (compilados como C++ o interpretados como PHP o Python). En cualquier caso, el lector encontrará al final una bibliografía relativa a ejercicios y lenguajes de programación. El autor desea agradecer a Concepción Asuar, Tonatihu Díaz Alegría, Óscar Herrera  Alcántara, Sergio Luis Pérez Pérez y Germán Téllez Castillo, quienes pacientemente revisaron versiones preliminares de este documento. Este documento fue escrito en L A TE X 2ε usando únicamente software  libre.

Francisco Javier Zaragoza Martínez

Capítulo 1

Operadores 1.1.

La medida del tiempo

¿Te has preguntado alguna vez cuántos segundos han pasado desde que naciste? ¿Desde que aprendiste a contar? ¿Desde que entraste a la universidad? O bien, ¿te has preguntado cuánto tiempo son un millón de segundos? Como todo el mundo sabe, un minuto tiene 60 segundos, una hora tiene 60 minutos, un día tiene 24 horas y un año tiene 365 días. Bueno, eso no siempre es cierto, pero lo consideraremos así para este ejercicio. Dada unacantidad de segundos s , deberás determinar cuántos años a , días d , horas h y  minutos m  completos representan, además de cuántos segundos q  quedan. Por ejemplo, si s  = 40 000 000, entonces a  = 1, d  = 97, h = 23, m = 6, q  = 40. Especificación

La entrada consiste de un número entero s  que tendrá un valor entre 0 y 2 000 000 000. La salida consiste de cinco números enteros, a , d , h , m , q , separados por espacios. Ejemplo Entrada 4

Salida 1 97 23 6 4

3

Operadores

4

1.2.

Unidades británicas de longitud

Con toda seguridad te has enfrentado a las unidades británicas de longitud. Lo que no todo el mundo sabe es cómo 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 verán, los británicos se complicaron demasiado la vida y, no conformes, inventaron otras unidades de longitud extrañas como el rod  que mide 5.5 yardas  y el fathom que mide 6 pies ). Dada una cierta cantidad de pulgadas u , deberás determinar cuántas 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. Especificación

La entrada consiste de un número entero u  que tendrá un valor entre 0 y 2 000 000 000. La salida consiste de cinco números enteros, m , f  , y , p , q , separados por espacios. Ejemplo Entrada 4

Salida 631 2 111  4

Francisco Javier Zaragoza Martínez

1.3. Unidades británicas de volumen

1.3.

5

Unidades británicas de volumen

Con toda seguridad te has enfrentado a las unidades británicas de volumen. Lo que no todo el mundo sabe es cómo se relacionan unas con otras. Un galón es igual a 4 cuartas , una cuarta es igual a 2 pintas , una pinta es igual a 2 tazas y una taza es igual a 8 onzas . Dada una cierta cantidad g 1 de galones, c 1 de cuartas, p 1 de pintas, t 1 de tazas y  o 1 de onzas, deberás determinar cuántos galones g 2 , cuartas c 2 , pintas p 2 , tazas t 2 y onzas o 2 completas representan. Por ejemplo, si g 1 = 31, c 1 = 41, p 1 = 59, t 1 = 26, o 1 = 57, entonces g 2 = 50, c 2 = 2, p 2 = 1, t 2 = 1, o 2 = 1. Especificación

La entrada consiste de cinco números 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 números enteros, g 2 , c 2, p 2 , t 2 , o 2 , separados por espacios. Ejemplo Entrada 31 41 59 26 57

Salida 5 2 1 1 1

64 ejercicios de programación

Operadores

6

1.4.

El calendario de la cuenta larga

Los mayas usaban tres calendarios, pero en este ejercicio nos concentraremos solamente en el calendario choltún , o calendario de la cuenta larga. En éste, un día se llama kin , 20 kines forman un uinal , 18 uinales forman un tun , 20 tunes forman un katún y 20 katunes  forman un baktún  (también existen periodos de tiempo más grandes, pero no nos ocuparemos de ellos). Una fecha se especifica como el número b  de baktunes, seguido del número k  de katunes, el número t  de tunes, el número u  de uinales y el número d  de kines ocurridos a partir de una fecha inicial llamada 0.0.0.0.0 que corresponde al 11 de agosto del año 3113 antes de nuestra era, según el calendario gregoriano. Si sabemos el número n  de días transcurridos a partir de esa fecha, se puede calcular fácilmente la fecha correspondiente del calendario choltún. Por ejemplo, si han transcurrido 314 159 265 días a partir de la fecha inicial, entonces la fecha correspondiente es 2181.13.4.11.5, es decir b  = 2181, k  = 13, t  = 4, u  = 11, d  = 5. Especificación

La entrada consiste de un número entero n  que tendrá un valor entre 0 y 2 000 000 000. La salida consiste de cinco números enteros, b , k , t , u , d , separados por espacios. Ejemplo Entrada 314159265

Salida 2181 13 4 11 5

Francisco Javier Zaragoza Martínez

1.5. Conversión de temperaturas

1.5.

7

Conversión de temperaturas

 A pesar de que México utiliza el sistema internacional de unidades (SI), así como los símbolos internacionales de ese sistema, seguimos indicando la temperatura en grados centígrados ( C). Además de los Kelvin (K), en algunas partes del mundo se indica la temperatura en grados Fahrenheit ( F) o en grados Réaumur ( R). Como existen fórmulas de conversión para todos estos tipos de grados, si sabemos la temperatura C  en grados centígrados, entonces podemos calcular la temperatura aproximada K  en Kelvin, F  en grados Fahrenheit y  R  en grados Réaumur. Por ejemplo, si la temperatura es de 0 C, entonces es aproximadamente de 273 K, 32 F y 0 R (redondeadas al entero más cercano). ◦











Especificación

La entrada consiste de un número entero C  que tendrá un valor entre −273 y 1 000. La salida consiste de tres números enteros, K , F , R , separados por espacios. Ejemplo Entrada 

Salida 273 32 

64 ejercicios de programación

Operadores

8

1.6.

Agua fría y caliente

Escribe un programa que lea una temperatura F  en grados Fahrenheit y que escriba la temperatura equivalente C  en grados centígrados. Recuerda que 9 C  = 5(F  − 32). Además, tu programa debe decir si a esa temperatura el agua estaría fría (si C  ≤ 36) o caliente (si C  > 36). Especificación

La entrada consiste de un número entero F  que tendrá un valor entre −450 y 1 000. La salida consiste de dos números enteros, C , E , separados por un espacio, donde E  = 0, si el agua está fría y  E  = 1, si está caliente. Ejemplo Entrada 41

Salida 5 

Francisco Javier Zaragoza Martínez

Capítulo 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 después. El siguiente algoritmo, propuesto por Gauss, calculará, dado un año  A  ≥ 1583, un número 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  = 5 A /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 .

9

Decisiones

10

12. Haz J  = I  + 7 − [(G + I ) mod 7]. En este algoritmo todas las divisiones son enteras y mod es el residuo de la división. Dado un año A , deberás calcular el día D  y el mes M  en el que cae la Pascua en el año A . Especificación

La entrada consiste de un número entero A  que tendrá un valor entre 1 583 y 9 999. La salida consiste de dos números enteros, D , M , separados por un espacio ( M  = 3 significa marzo y M  = 4 significa abril). Ejemplo Entrada 26

Salida 16 4

Francisco Javier Zaragoza Martínez

2.2. El caracol

2.2.

11

El caracol

Un caracol ha caído en un agujero de p  metros de profundidad. En su intento de salir del agujero, el caracol sube s  metros cada día, pero se resbala r  metros cada noche. Si s  es mayor que r , el caracollogrará salirfinalmente del agujero. Por ejemplo, si el agujero tiene 10 metros de profundidad y el caracol sube 5 metros cada día y se resbala 2 metros cada noche, entonces el caracol logrará salir al tercer día. Dados los números p , s , r , deberás determinar el número d  de días que tardará en salir el caracol. Especificación

La entrada consiste de tres números enteros, p , s , r  (con s  > r ), separados por espacios, que tendrán un valor entre 1 y 1 000 000. La salida consiste de un número entero d . Ejemplo Entrada 1 5 2

Salida 3

64 ejercicios de programación

Decisiones

12

2.3.

Intersección de segmentos

Recordarás 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 (incluyéndolos). También recordarás 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, P  y R  se intersectan en (3,2) y Q  y R  se intersectan en ( 53 , 10 3 ) = (1.666666...,3.333333...). Dados dos segmentos cualesquiera (que no sean paralelos y ninguno de los cuales sea horizontal ni vertical) determinados por sus puntos extremos, deberás descubrir si éstos se intersectan o no y, en su caso, deberás calcular las coordenadas del punto de intersección. Especificación

La entrada consiste de ocho números positivos de punto flotante, 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 números x , y  de punto flotante separados por un espacio. Si P  y Q  se intersectan, entonces (x , y ) son las coordenadas del punto de intersección. En caso contrario, x  = y  = −1. Ejemplos Entrada 2 1 3 2 1 3 3 4 2 1 3 2 4 1 1 4 4 1 1 4 1 3 3 4

Salida -1 -1 3. 2. 1.666667 3.333333

Francisco Javier Zaragoza Martínez

2.4. Rectángulos dentro de rectángulos

2.4.

13

Rectángulos dentro de rectángulos

Un niño tiene un juego que consta de diferentes piezas rectangulares, algunas de las cuales se pueden meter dentro de otras (tal vez girándolas 90 grados). Por ejemplo, si el niño tiene en sus manos un rectángulo que mide 2 por 3 unidades (donde la primera medida es la base y la segunda es la altura) y otro que mide 4 por 1 unidades, entonces no puede meter ninguno dentro del otro; pero si el niño tiene en sus manos un rectángulo que mide 5 por 3 unidades y otro que mide 1 por 4 unidades, entonces sí puede meter el segundo dentro del primero, aunque antes deberá girarlo 90 grados. Finalmente, si el niño tiene un rectángulo que mide 2 por 3 unidades y otro que mide 5 por 3 unidades, entonces puede meter el primero dentro del segundo sin girarlo. Dadas las medidas de dos rectángulos, A  por B  unidades las del primero y  C  por D  unidades las del segundo, deberás determinar si alguno de ellos se puede meter dentro del otro y, en este caso, si es necesario girarlos. Especificación

La entrada consiste de cuatro números enteros, A , B , C , D , separados por espacios, que tendrán un valor cada uno entre 1 y 2 000 000 000. La salida consiste de dos números enteros, S , G , separados por un espacio. El valor de S  será como sigue: 0 si ninguno de los dos rectángulos se puede meter dentro del otro, 1 si el primer rectángulo se puede meter dentro del segundo y 2 si el segundo rectángulo 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 rectángulo dentro del otro se debe hacer un giro de 90 grados y el valor será 0 en cualquier otro caso. Ejemplos Entrada 2 3 4 1 5 3 1 4 2 3 5 3

Salida   2 1 1 

64 ejercicios de programación

Decisiones

14

2.5.

Día 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é día de la semana corresponde con una cierta fecha dada. Por ejemplo, el 23 de mayo de 2005 es lunes, el día anterior domingo y el siguiente martes. Dada una fecha como tres números enteros, a , m , d  (donde a  es el año, m  el mes y  d  el día), el día 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.

5. Haz b = (13m  5

1)



+





4 + 4.

6. Haz f  = (b + e + d − 2c ) mod 7. En este algoritmo todas las divisiones son enteras, mod es el residuo de la división y f  = 0 significa domingo, f   = 1 significa lunes, etc. Dada una fecha, deberás determinar qué día de la semana fue el día anterior ( f  1 ), ese día ( f  2 ) y el día siguiente ( f  3 ). Especificación

La entrada consiste de tres números enteros, a , m , d , separados por espacios y donde 0 ≤ a  ≤ 10 000, 1 ≤ m  ≤ 12 y 1 ≤ d  ≤ 31, además de que a , m , d  representan una fecha válida. La salida consiste de tres números enteros, f  1 , f  2 , f  3 , separados por espacios. Ejemplo Entrada 25 5 23

Salida  1 2

Francisco Javier Zaragoza Martínez

2.6. Tipo de triángulo

2.6.

15

Tipo de triángulo

Tres números enteros a , b , c  son las longitudes de los lados de un triángulo si son positivos y satisfacen las tres desigualdades del triángulo: a  + b  > c ; b + c  > a ; c  + a  > b . En este ejercicio nos interesan tres tipos de triángulos: los equiláteros, los isósceles y los escalenos. Dados tres números enteros, a , b , c , se desea saber si ellos son las longitudes de los lados de un triángulo. Si lo son, se desea saber de qué tipo es el triángulo. Si no lo son, se desea calcular el mínimo número entero d  tal que a + d , b + d , c + d  sean las longitudes de los lados de un triángulo. Por ejemplo, si a  = 3, b  = 4, c  = 5, entonces estamos hablando de un triángulo escaleno; pero si a  = 3, b  = 1, c  = 2, entonces no tenemos un triángulo y  necesitamos sumar d  = 1 para obtener un triángulo de lados a + d  = 4, b + d  = 2, c + d  = 3. Especificación

La entrada consiste de tres números enteros, a , b , c , separados por espacios, que tendrán valores cada uno entre −1 000 000 000 y 1 000 000 000. La salida consiste de dos números enteros, t , d , separados por un espacio. El valor de t  será 0 si no es triángulo, 1 si es equilátero, 2 si es isósceles y 3 si es escaleno. El valor de d  será 0 (salvo que t  = 0). Ejemplos Entrada 3 4 5 3 1 2

Salida 3   1

64 ejercicios de programación

Decisiones

16

2.7.

Mayor y menor

Escribe un programa que lea cinco números 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 números leídos son  A  = 3, B  = 1, C  = 4, D  = 1, E  = 5, entonces P  = 1, Q  = 5. Especificación

La entrada consiste de cinco números enteros, A , B , C , D , E , separados por espacios, que tendrán un valor entre −1 000 y 1 000. La salida consiste de dos números enteros, P , Q , separados por un espacio. Ejemplo Entrada 3 1 4 1 5

Salida 1 5

Francisco Javier Zaragoza Martínez

Capítulo 3

Ciclos 3.1.

Divisores

Escribe un programa que lea un número 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). Especificación

La entrada consiste de un número entero N  que tendrá un valor entre 1 y 1 000 000. La salida consiste de un número entero D . Ejemplo Entrada 6

Salida 4

17

Ciclos

18

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 números 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. Muchos matemáticos 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 verificado para todos los enteros entre 1 y  1 000 000. Dada una entrada n , también es posible determinar la cantidad ℓ de números 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  = 22es ℓ = 16 y el número más grande que aparece en el ciclo es m  = 52. Dado un número n , deberás determinar su longitud de ciclo ℓ y el número más grande m  que aparezca. Especificación

La entrada consiste de un número entero n  que tendrá un valor entre 1 y 1 000 000. La salida consiste de dos números enteros, ℓ, m , separados por un espacio. Ejemplo Entrada 22

Salida 16 52

Francisco Javier Zaragoza Martínez

3.3. El problema de Pitágoras

3.3.

19

El problema de Pitágoras

El más famoso teorema de Pitágoras dice que si los catetos de un triángulo rectángulo miden a , b  unidades, y la hipotenusa del triángulo rectángulo mide c  unidades, entonces se cumple que a 2 + b 2 = c 2 . Se dice que tres números naturales a , b , c  forman una terna pitagórica si cumplen la relación a 2 + b 2 = c 2 . La más famosa es tal vez 3 2 + 42 = 52 . Antes de los griegos, los egipcios ya conocían varias ternas pitagóricas, aunque sólo para valores pequeños de a , b , c . Dados dos números enteros, m , n , podríamos encontrar todas las ternas pitagóricas (a , b , c ) tales que m  ≤ a  ≤ b  ≤ c  ≤ n . Por ejemplo, si m  = 6, n  = 20, entonces hay 4 ternas pitagóricas en ese intervalo, que son (6,8,10), (8,15,17), (9,12,15) y (12,16,20). Especificación

La entrada consiste de dos números enteros, m , n , separados por un espacio, que tendrán un valor entre 1 y 1 000 000. La salida consiste de un número entero p , esto es, la cantidad de ternas pitagóricas con las propiedades deseadas. Ejemplos Entrada 6 2 1 2

Salida 4 158

64 ejercicios de programación

Ciclos

20

3.4.

Los triángulos

Para que tres números naturales a , b , c  sean las longitudes de los lados de un triángulo, deben cumplir ciertas condiciones llamadas las desigualdades del triángulo . Averigua cuáles son estas condiciones. Cuando a , b , c  cumplan estas condiciones, diremos que (a , b , c ) es una terna triangular . Dados dos números 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). Especificación

La entrada consiste de dos números enteros, m , n , separados por un espacio, que tendrán un valor entre 1 y 1 000. La salida consiste de un número entero t , esto es, la cantidad de ternas triangulares con las propiedades deseadas. Ejemplo Entrada 2 5

Salida 17

Francisco Javier Zaragoza Martínez

3.5. Triángulos isósceles

3.5.

21

Triángulos isósceles

Para que tres números naturales a , b , c  sean las longitudes de los lados de un triángulo, deben satisfacer las tres desigualdades a + b  > c , b + c  > a , c + a  > b . Para que un triángulo sea isósceles debe satisfacer que exactamente dos de sus lados tengan la misma longitud (pero el tercero debe ser distinto, si no sería un triángulo equilátero). Dados dos números enteros, m , n , podemos encontrar todas las ternas de números naturales ( a , b , c ) tales que m  ≤ a  ≤ b  ≤ c  ≤ n  y que a , b , c  sean las longitudes de los lados de un triángulo isósceles. Por ejemplo, si m = 2, n  = 5, entonces hay 10 ternas como las que esperamos hallar, que son (2,2,3), (2,3,3), (2,4,4), (2, 5,5), (3, 3,4), (3, 3,5), (3,4,4), (3,5,5), (4,4,5) y (4,5,5). Especificación

La entrada consiste de dos números enteros, m , n , separados por un espacio, que tendrán un valor entre 1 y 1 000. La salida consiste de un número entero t , esto es, la cantidad de ternas con las propiedades deseadas. Ejemplo Entrada 2 5

Salida 1

64 ejercicios de programación

Ciclos

22

3.6.

Triángulos acutángulos

Para que tres números enteros a , b , c  sean las longitudes de los lados de un triángulo deben satisfacer las tres desigualdades a + b > c , b + c  > a , c + a  > b . Para que un triángulo sea acutángulo debe satisfacer que cada uno de sus tres ángulos mida menos de 90 . Recuerda que cada ángulo α de un triángulo se puede calcular usando la ley de cosenos: ◦

a 2 = b 2 + c 2 − 2bc cos α.

Dados dos números 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 triángulo acutángulo. 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). Especificación

La entrada consiste de dos números enteros, m , n , separados por un espacio, conun valor entre 1 y 1 000. La salida consiste de un número entero t , es decir, la cantidad de ternas con las propiedades deseadas. Ejemplos Entrada 3 5 9 99

Salida 8 22

Francisco Javier Zaragoza Martínez

3.7. Placas de bicicletas

3.7.

23

Placas de bicicletas

En nuestra ciudad no mucha gente usa bicicletas, pero con tal de cobrar impuestos, se le ha ocurrido al gobierno obligar a los ciclistas a comprar una placa para su bicicleta. Las placas constan de tres dígitos (del 0 al 9) seguidos de dos letras (de la A a la Z sin contar la Ñ ni las letras con acento). Para facilitar la lectura de las placas, se ha decidido que ninguna placa puede tener números ni letras repetidas. Por ejemplo, la placa 123AB es legal, pero no lo son las placas 121AB ni 123AA. Además, se escogerá un dígito mínimo a  y un dígito máximo b , así como una letra mínima c  y una letra máxima d  que pueden aparecer en las placas (las letras se numerarán A = 1,..., Z  = 26). Se desea saber cuántas placas se pueden generar cumpliendo todas estas condiciones. Por ejemplo, si sólo se permiten los números del a  = 0 al b  = 2 y las letras de la B a la C (c  = 2, d  = 3), entonces las placas válidas tendrán los números 012, 021, 102, 120, 201, 210  y las letras BC o CB, de modo que habrá un total de n  = 12 placas distintas. Especificación

La entrada consiste de cuatro números enteros, a , b , c , d , separados por espacios, donde 0 ≤ a  ≤ b ≤ 9 y 1 ≤ c  ≤ d  ≤ 26. La salida consiste de un número entero n . Ejemplo Entrada  2 2 3

Salida 12

64 ejercicios de programación

Ciclos

24

3.8.

Tablas de múltiplos

En la primaria habrás aprendido las tablas de multiplicar. Por ejemplo, la tabla del 7 comienza 7 · 1 = 7, 7 · 2 = 14, 7 · 3 = 21, etc. Los números 7, 14, 21, etc. se llaman los múltiplos  de 7. En general, los múltiplos de un número entero positivo A  son los números A , 2 A , 3 A , etc. Lo que seguramente no habrás aprendido en la primaria son las tablas de múltiplos de dos números A , B , las cuales constan de todos los múltiplos distintos de A  o de B  hasta un cierto número N . Dados A , B , N  se desea saber la cantidad T  de números de la que consta la tabla de múltiplos correspondiente y cuál es el número M  más grande en esa tabla. Por ejemplo, la tabla de múltiplos de 2 y 3 hasta el 11 consta de los siete números 2, 3, 4, 6, 8, 9 y 10 (es decir, T  = 7, M  = 10). Especificación

La entrada consiste de tres números enteros, A , B , N , separados por espacios y donde 1 ≤ A  ≤ B  ≤ N  ≤ 1 000 000. La salida consiste de dos números enteros, T , M , separados por un espacio. Ejemplo Entrada 2 3 11

Salida 7 1

Francisco Javier Zaragoza Martínez

Capítulo 4

Funciones 4.1.

Factorizando factoriales

El factorial de un número natural N  se define 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 número primo P  es un número que tiene exactamente dos divisores, es decir, 1 y  P . Los números primos más pequeños son 2, 3, 5, 7, 11, etc. Todo número natural se puede factorizar en números primos. Por ejemplo, 720 se puede factorizar como 24 · 32 · 51 . Observa que para factorizar N ! no necesitas calcular su valor. Averigua cómo calcular la función factor(n, p) que regresa el máximo exponente a  para el cual p a  divide a N ! Especificación

La entrada consiste de un número entero N  que tendrá un valor entre 1 y 1 000 000. La salida consiste de la factorización de N ! escrita de la forma A ^a B ^b  ... Z ^z , donde  A , B , ..., Z  son números primos en orden ascendente y donde a , b , ..., z  son los exponentes correspondientes, todos mayores o iguales a 1. Los términos 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

Funciones

26

4.2.

Suma de primos

Un número entero p  es primo si es positivo y sus únicos dos divisores positivos son 1 y p . Los números primos más pequeños son 2, 3, 5, 7 y 11. Algunos números enteros positivos no son primos, pero son la suma de dos números primos. Por ejemplo: 4 = 2 + 2, 8 = 5 + 3 y  9 = 7 + 2. Advierte que algunos números se pueden escribir —como suma de dos números primos— de más de una forma (por ejemplo el 10 que puede escribirse 7 + 3 o 5 + 5) pero nos basta con una de ellas. Dado un número entero n , podemosdecidirsiesprimoonoy,encasonegativo,decidir si es la suma de dos primos o no. Especificación

La entrada consiste de un número entero n  que tendrá un valor entre 1 y 1 000 000. La salida consiste de dos números 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. Ejemplos Entrada 1 17 27

Salida 7 3 17   

Francisco Javier Zaragoza Martínez

4.3. Primos gemelos

4.3.

27

Primos gemelos

Se dice que un número entero positivo es primo si tiene exactamente dos divisores positivos distintos. Los números primos más pequeños son 2, 3, 5, 7 y 11. Dos números primos se dicen gemelos si difieren en 2. Las parejas de números primos gemelos más pequeñas son (3,5), (5,7), (11,13) y (17,19). Dado un número entero m  podemos encontrar la pareja ( p , q ) de números primos gemelos tal que m  ≤ p  < q  y que p  sea tan pequeño como sea posible. Por ejemplo, si m  = 10, entonces p  = 11, q  = 13. Especificación

La entrada consiste de un número entero m  que tendrá un valor entre 1 y 1 000 000 000. La salida consiste de los dos números enteros, p , q , separados por un espacio. Ejemplo Entrada 1

Salida 11 13

64 ejercicios de programación

Funciones

28

4.4.

Suma de muchos primos

Se dice que un número entero positivo es primo si tiene exactamente dos divisores positivos distintos. Los números primos más pequeños son 2, 3, 5, 7 y 11. Además, y sólo para este ejercicio, consideraremos que el número 1 también es primo. Dado un número 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 primomásgrandemenoroiguala10y3esprimo);ysi m = 27, lo podemos escribir como 23 + 3 + 1 (porque 23 es el primo más grande menor o igual a 27, 3 es el primo más grande menor o igual al sobrante y finalmente sobra 1). Especificación

La entrada consiste de un número entero m  que tendrá un valor entre 1 y 2 000 000 000. La salida consiste de una lista de números primos escritos en orden descendiente, que sumen m  y estén separados por espacios. Ejemplos Entrada 1 27

Salida 7 3 23 3 1

Francisco Javier Zaragoza Martínez

4.5. Parejas disparejas

4.5.

29

Parejas disparejas

Si m , n  son dos números enteros positivos, decimos que m  divide a n  si n  es un múltiplo de m . Por ejemplo, 1, 2, 3 y 6 dividen a 6, pero ni 4, ni 5, ni tampoco 7 dividen a 6. Definamos la función s (n ) como la suma de todos los divisores de n  (excepto n ) . Por ejemplo, s (6) = 1 + 2 + 3 = 6, s (9) = 1 + 3 = 4 y s (12) = 1 + 2 + 3 + 4 + 6 = 16. Sean m , n  dos números enteros positivos. Definimos cuatro tipos de parejas ( m , n ): 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 números 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. Especificación

La entrada consiste de dos números enteros positivos, m , n , separados por un espacio, donde m , n  < 1 000 000. La salida consiste de tres números enteros, p , q , r , separados por espacios, representando cada uno de ellos el tipo de las parejas (m , n ), (m , m ), (n , n ), respectivamente. Ejemplo Entrada 6 12

Salida 3  2

64 ejercicios de programación

Funciones

30

4.6.

Primos escondidos

Un número entero es primo si es positivo y si tiene exactamente dos divisores positivos distintos. Los números primos más pequeños son 2, 3, 5, 7, 11, etc. Considera un número entero N , todos los números que se forman al quitarle dígitos por la derecha y todos los números que se forman al quitarle dígitos por la izquierda. Algunos de estos números, que estaban escondidos originalmente, son números primos. Por ejemplo, si N  = 211, entonces los números que se forman al quitarle dígitos por la derecha son 21 y 2 (de los cuales uno es primo) y los números que se forman al quitarle dígitos por la izquierda son 11 y 1 (de los cuales uno es primo). Se desea saber si N  es primo o no, cuántos primos D  tiene por la derecha y cuántos primos I  tiene por la izquierda. Especificación

La entrada consiste de un número entero N  con 0 ≤ N  ≤ 999,999,999. La salida consiste de tres números enteros, P , D , I , separados por espacios, donde P  = 1, si N  es primo; P  = 0, si N  no es primo. Ejemplo Entrada 211

Salida 1 1 1

Francisco Javier Zaragoza Martínez

4.7. Sucesiones de primos

4.7.

31

Sucesiones de primos

Un número entero positivo P  es primo si sus únicos divisores enteros positivos son 1 y  P . Los números primos más pequeños son 2, 3, 5, 7, 11, 13, etc. Una sucesión aritmética de tres términos está formada por los tres números ( N , N  + D , N  + 2D ) donde N , D  son números enteros positivos. Algunos números primos forman sucesiones aritméticas de tres términos, como por ejemplo (3,5,7) y (3,7, 11). Dados dos números enteros, A , B , se quiere saber la cantidad S  de sucesiones aritméticas de tres términos que están formadas por tres números primos, P , Q , R , tales que  A  ≤ P  < Q  < R  ≤ B . Por ejemplo, si A  = 2, B  = 12, solamente existen S  = 2 sucesiones con esas propiedades. Especificación

La entrada consiste de dos números enteros, A , B , separados por un espacio, tales que 1 ≤  A ≤ B  ≤ 1 000 000. La salida consiste de un número entero S . Ejemplo Entrada 2 12

Salida 2

64 ejercicios de programación

Funciones

32

4.8.

Suma de potencias

En tus cursos de cálculo (o en cualquier otro curso donde te hayan hablado de la inducción matemática) te habrás enfrentado a la necesidad de sumar las potencias de varios números consecutivos. Por ejemplo, la suma de los cubos de los números del 5 al 9 es igual a 53 + 63 + 73 + 83 + 93 = 125 + 216 + 343 + 512 + 729 = 1925. Dados dos números enteros a , b  (con a  < b ) y un número entero positivo n , debes calcular la suma s  de las potencias n -ésimas de los números a , a + 1,..., b , es decir: s  = a n  + (a + 1)n  + · · · + b n .

Especificación

La entrada consiste de tres números enteros, a , b , n , separados por espacios, que cumplen −100 ≤ a  < b  ≤ 100 y 0 < n  < 10. La salida consiste de un número entero s  cuyo valor absoluto siempre será menor que 2 000 000 000. Ejemplo Entrada 5 9 3

Salida 1925

Francisco Javier Zaragoza Martínez

Capítulo 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 hidrógeno (H). Un hidrocarburo lineal se puede especificar por la secuencia de enlaces. Por ejemplo, si un hidrocarburo tiene secuencia de enlaces (simple, simple, doble, simple, triple, simple, doble), entonces su fórmula semidesarrollada es: CH3 − CH2 − CH = CH − C ≡ C − CH = CH2 . ObservaqueseescribeH 3 , H2 , H o nada, según el carbono correspondiente esté enlazado con tres, dos, uno o ningún hidrógeno. Por supuesto, si solamente damos una secuencia de enlaces, es posible q ue 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 necesitarían tener al menos 5 enlaces. Finalmente, las fórmulas semidesarrolladas de hidrocarburos se escriben al revés si eso hace que un enlace de mayor multiplicidad quede más cerca del principio. En nuestro primer ejemplo, debimos haber escrito la fórmula 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

Vectores

34 Especificación

La entrada consiste de un número 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 fórmula semidesarrollada del hidrocarburo correspondiente (ordenada apropiadamente) o del mensaje ERROR EN seguido de la lista de todas las posiciones donde un carbono tiene más enlaces de los posibles, ordenadas y separadas por espacios. En la salida del programa, usaremos el símbolo # en sustitución de ≡ para indicar un enlace triple. Ejemplos Entrada 7 1 1 2 1 3 1 2 4 1 3 1 1 6 1 2 3 1 2 3

Salida CH2=CH-C#C-CH=CH-CH2-CH3 CH3-C#C-CH2-CH3 ERROR EN 3 6

Francisco Javier Zaragoza Martínez

5.2. Fracciones continuas

5.2.. 5.2

35

Fracc Fr accione ioness con continu tinuas as

Considera Consid era el sigu siguien iente te pro proceso ceso:: com comien ienza za con un núm número ero x  que no sea neg negati ativo vo.. Mie Mientr ntras as seaa di dife fere rent ntee de ce cero ro,, ca calcu lcula la su pa part rtee en ente tera ra z , ré rést stas asel elaa a x  yasígnalea x  su inv inverso erso.. Po Porr x  se ejempl eje mplo, o, si com comien ienzas zas con x  = 3. 3.15 15 el an ante terio riorr pr proc oces eso o pr prod oduc ucirá irá,, en or orde den, n, lo loss sig sigui uien ente tess valores de z : 3,6,1,2. Ahora observa que: 3.15 = 3 +

1 6+ 1 11 +

.

2

 A esta expresión se le llama l lama la fracción continua  de 3.15. Nosotros consideraremos el proceso inverso, es decir, comenzando con la sucesión de números enteros que define a una fra fracció cción n con contin tinua, ua, que querem remos os calc calcula ularr el núm número ero orig origina inal.l. Pa Para ra ser más pre preciso cisos, s, dad dado o un núm número ero ent entero ero pos positi itivo vo n  y un unaa su suce cesió sión n z 1 , z 2 ,..., z n  entero eros, s, cal calcula cula el val valor or del n  de n  ent número x  cuya fracción continua está representada por: z 1 +

1 z 2 +

1 z 3 +

. 1

···+

1

z n  n 

Especificación

La entrada consiste de un número entero n , que tendrá un valor valor entre entre 1 y 1 000, seguido seguido de n  números enteros, z 1 , z 2 ,..., z n  n , separados por espacios, cada uno con valor entre 0 y  999. La salida consiste del número x  de punto flotante. Ejemplo Entrada Entrad a 4 3 6 1 2

Salida Salid a 3.15

64 ejercicios de programación

Vectores

36

5.3.. 5.3

Secuen Sec uencia ciass sal saltar tarinas inas

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 número 3. Dado un número N  y una secuencia de N  números X 1 , X 2 ,..., X N  N , podemos decidir si esta es ta se secu cuen enci ciaa es sa salt ltar arin inaa o, si no lo es es,, po pode demo moss en enco cont ntra rarr el nú núme mero ro má máss pe pequ queñ eño o qu quee no aparece en las diferencias. Especificación

La entrada consiste de un número entero N , que tendrá un valor entre entre 2 y 1 000, seguido de N  números enteros, X 1 , X 2 ,..., X N  N , separados por espacios, cada uno con valor entre −999 y 999. La salida consiste de un número entero M  definido como sigue: M  = 0 si la secuencia es saltarina; en otro caso, M  debe ser el número más pequeño que no aparece en las diferencias. Ejemplos Entrada 4 1 4 2 3 5 3 1 5 1 2

Salida  3

Francisco Javier Zaragoza Martínez

5.4. Producto circular

5.4. 5. 4.

37

Prod Pr oduc uctto ci circ rcul ular ar

Como habrás aprendido en algún curso de física, existen varios tipos de productos de vectores. Por ejemplo, existe el producto punto y el producto cruz. En este ejercicio trabajarás con un tipo de producto nuevo llamado el producto circular  de dos vectores. Sea n  un entero positivo, sean a  = (a 1 , a 2 ,..., a n  n ), b  = (b 1 , b 2 ,..., b n  n ) dos vectores de dimensión n  y sea k  un entero positivo menor o igual a n . El producto circular p k k  de los vectores a , b  es igual a: a 1 b k  n  + a n  n b k  k +1 + a 2 b k  k +2 + · · · + a n  n −k b n  n −k +1 b 1 + a n  n −k +2 b 2 + · · · + a n  k .

Por ejemplo, si n  = 4, k  = 2, a  = (3,1,4,1), b  = (2,7,1,8), entonces el producto circular p 2 es igual a: a 1 b 3 + a 2 b 4 + a 3 b 1 + a 4 b 2 = 3 · 1 + 1 · 8 + 4 · 2 + 1 · 7 = 26. Observa que el producto circular depende del valor de k : en nuestro ejemplo p 1 = 56, p 2 = 26, p 3 = 55, p 4 = 25. Deberás determinar el menor valor p m´ın ın y el mayor valor p max  a´ x  del producto p k k  (donde 1 ≤ k  ≤ n ). ). En nuestro ejemplo, esos valores son 25 y 56, respectivamente. Especificación

La entrada consiste de un número entero n  (con 1 ≤ n  ≤ 1 000) seguido de 2n  números enteros, a 1 , a 2 ,..., a n  valore oress ent entre re −10 1000 y 10 100), 0), se sepa para rado doss po porr es espa pacio cios. s. n , b 1 , b 2 ,..., b n  n  (con val La salida consiste de dos números enteros, p m´ın ın , p max  a´ x , separados por un espacio. Ejemplo Entrada Entrad a 4 3 1 4 1 2 7 1 8

Salida Salid a 25 56

64 ejercicios de programación

Vectores

38

5.5. 5. 5.

Mezc Me zcla la de núm númer eros os

Imagina que tienes dos pilas de exámenes ordenados por número de lista y que quieres obtener una sola pila con todos los exámenes ordenados por número de lista. Por ejemplo, una pila podría consistir de los cuatro exámenes con números 1, 5, 6, 9 y la otra pila podría consistir de los tres exámenes con números 2, 7, 11. Entonces, al mezclar los números de lista de las dos pilas, obtendrías una pila con los siete exámenes con números 1, 2, 5, 6, 7, 9, 11. Se da una lista de N  números ordenados a 1 < a 2 < · · · < a N  N  y otra lista de M  números ordenados b 1 < b 2 < · · · < b M  M  y se desea obtener una lista con N  + M  números ordenados c 1 < c 2 < · · · < c N  N  M  que contenga a los N  + M  números dados. +

Especificación

La entrada consiste de dos números enteros, N , M  con 1 ≤ N , M  ≤ 1 000, separados por un espacio, seguidos de una lista de N  números enteros 0 < a 1 < a 2 < · · · < a N  N  < 10 000, sepa se para rado doss po porr esp espac acios ios,, y ot otra ra lis lista ta de M  núm número eross ent entero eross 0 < b 1 < b 2 < · · · < b M  000, 0, M  < 10 00 tamb ta mbié ién n se sepa para rado doss po porr esp espac acios ios.. La sa salid lidaa co cons nsist istee de un unaa lis lista ta de N +M  númer números os enter enteros os c 1 < c 2 < · · · < c N  N  M , separados por espacios. +

Ejemplo Entrada Entra da 4 3 1 5 6 9 2 7 11

Salida Salid a 1 2 5 6 7 9 11

Francisco Javier Zaragoza Martínez

5.6. Centro de un vector

5.6.

39

Centro de un vector

Considera un vector x  cuyas coordenadas van de la 0 a la n  y contienen valores enteros.  A una coordenada c  (entre 0 y  n ) se le dice el centro  de x  si cumple que la suma desde i  = 0 hasta i  = c − 1 de (c − i ) · x i  es igual a la suma desde i  = c + 1 hasta n  de ( i  − c ) · x i . Observa que la entrada en la coordenada c  no participa en ninguna de las dos sumas. Por ejemplo, si x  es el vector (6,2,3,0, 1), entonces c  = 1 es un centro de x , pues la primera suma (1 − 0) · 6 es igual a la segunda suma (2 − 1) · 3 + (3 − 1) · 0 + (4 − 1) · 1 (ambas valen 6). No todos los vectores tienen centro. Por ejemplo, el vector (1,2,1,1) no tiene centro porque ninguna de sus coordenadas cumple que las dos sumas son iguales. Advierte que el centro de un vector tiene interpretación física: si se considera a los valores contenidos en el vector como pesos, entonces un centro del vector (si acaso existe) corresponde con el centro de gravedad. Especificación

La entrada consiste de un número entero n  que tendrá un valor entre 1 y 1 000 seguido de n + 1 números enteros, x 0 , x 1,..., x n , separados por espacios, cada uno con valor entre 1 y 1 000. La salida consiste de dos números enteros, c , s , separados por un espacio. El primero es el centro de x  yelsegundoeselvalordelasuma.Si x  no tiene centro, entonces c  = −1, s  = 0. Ejemplos Entrada 4 6 2 3  1 3 1 2 1 1

Salida 1 6 -1 

64 ejercicios de programación

Vectores

40

5.7.

Alrededor de la mediana

Escribe un programa que lea un número entero positivo impar N  y un vector X  de N  componentes enteras y que escriba los dos números A  y  B  alrededor de la mediana M  de ese vector, es decir, el número que quedaría 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). Especificación

La entrada consiste de un número entero impar N  que tendrá un valor entre 3 y 999, seguido de N  números enteros, separados por espacios, cada uno con valor entre 0 y 999. La salida consiste de dos números enteros, A , B  con A ≤ B , separados por un espacio. Ejemplo Entrada 5 3 1 4 1 5

Salida 1 4

Francisco Javier Zaragoza Martínez

5.8. Polinomio al cuadrado

5.8.

41

Polinomio al cuadrado

En la secundaria aprendiste a elevar un binomio (es decir, un polinomio de grado 2) al cuadrado: (ax + b )2 = a 2 x 2 + 2ab x + b 2 . En general, uno puede tomar cualquier polinomio p (x ) de grado n  y calcular el polinomio q (x ) = p (x )2, que resulta ser un polinomio de grado 2n . Si recordamos que el polinomio p (x ) queda definido por su grado n  y una lista de n + 1 coeficientes, entonces el polinomio q (x ) queda definido por su grado 2 n  y una lista de 2n + 1 coeficientes. Por ejemplo, si p (x ) = 1 − 2x + 3x 2 , entonces p (x ) tiene grado 2 y además q (x ) = (1 − 2x + 3x 2 )2 = 1 − 4x + 10x 2 − 12x 3 + 9x 4 tiene grado 4. Especificación

La entrada consiste de un número entero N  (con 1 ≤ N  ≤ 99) seguido de una lista de N  + 1 números enteros, a 0 , a 1 ,..., a N , separados por espacios, que definen el polinomio p (x ) = a 0 + a 1 x + · · · + a N x N . La salida consiste de una lista de 2N  + 1 números enteros, b 0 , b 1,..., b 2N , separados por espacios, que definen el polinomio q (x ) = p (x )2 = b 0 + b 1 x + · · · + b 2N x 2N .

Ejemplo Entrada 2 1 -2 3

Salida 1 -4 1 -12 9

64 ejercicios de programación

Vectores

42

5.9.

Girando un vector

Escribe un programa que lea dos números 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 más a la derecha de X  se debe colocar en la componente más 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 más (G  = 2), se obtendría el vector Y  = (1,5, 3,1, 4), etcétera. Especificación

La entrada consiste de dos números enteros, N , G , separados por un espacio, con valores entre1y100,seguidosde N  números enteros, separados por espacios, cada uno con valor entre 0 y 9 (las componentes de X ). La salida consiste de N  números enteros separados por espacios (las componentes de Y ). Ejemplo Entrada 5 2 3 1 4 1 5

Salida 1 5 3 1 4

Francisco Javier Zaragoza Martínez

Capítulo 6

Matrices 6.1.

Matriz serpentina

Escribe un programa que, dados dos números enteros M , N , construya una matriz con M  renglones y  N  columnas cuyas entradas sean los números 1,2,..., M  · N  acomodados como una serpentina, comenzando con el 1 en la entrada (1,1), siguiendo hacia la derecha, luego una posición hacia abajo, siguiendo hacia la izquierda, luego una posición hacia abajo y así sucesivamente. Especificación

La entrada consiste de dos números 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  números enteros separados por espacios. Ejemplo Entrada 4 5

Salida 1 2 3 4 5 1 9 8 7 6 11 12 13 14 15 2 19 18 17 16

43

Matrices

44

6.2.

Matriz en diagonal

Escribe un programa que, dados dos números enteros, M , N , construya una matriz con M  renglones y  N  columnas cuyas entradas sean los números 1,2,..., M  · N  acomodados en diagonales, comenzando con el 1 en la entrada (1,1), siguiendo hacia la derecha, luego una posición hacia abajo y a la izquierda y así sucesivamente. Especificación

La entrada consiste de dos números 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  números enteros separados por espacios. Ejemplo Entrada 4 5

Salida 1 2 4 7 11 3 5 8 12 15 6 9 13 16 18 1 14 17 19 2

Francisco Javier Zaragoza Martínez

6.3. Matrices giradas

6.3.

45

Matrices giradas

Dada una matriz cuadrada A  de N  × N , se puede definir la operación de giro a la derecha de A  como sigue: el primer renglón de la matriz A  se convierte en la última columna de la matriz girada, el segundo renglón de la matriz A  se convierte en la penúltima columna de la matriz girada, y así sucesivamente hasta que el último renglón de la matriz A  se convierte en la primera columna de la matriz girada. Por ejemplo, si N  = 3 y  A  eslamatriz  A  =

3 1

1 4 5 9 2 6 5

 ;

entonces al girar A  a la derecha obtenemos la matriz  A ′ =

2 6

1 3 5 1 5 9 4

 .

Especificación

La entrada consiste de un número entero N  con1 ≤ N  ≤ 20, seguido de N  renglones, cada uno de los cuales contiene N  números 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  números enteros separados por espacios describiendo a la matriz A  . ′

Ejemplo Entrada 3 3 1 4 1 5 9 2 6 5

Salida 2 1 3 6 5 1 5 9 4

64 ejercicios de programación

Matrices

46

6.4.

Matrices estocásticas

Una matriz cuadrada se dice estocástica si las sumas de todos los elementos de cada renglón 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 estocástica, pero la siguiente matriz B  de 3 × 3 sí es estocástica: B  =

 31  59

41 28 26 15 10 22 57

 .

Más aún, observa que la matriz B  se obtuvo de la matriz A  completando cada renglón 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 estocástica. Especificación

La entrada consiste de un número entero n , que tendrá un valor entre 1 y 100, seguido de n  renglones, cada uno de ellos con n  números enteros entre 0 y 100, separados por espacios. Todas las sumas de renglones y columnas de esta matriz serán menores o iguales a 100. La salida consiste de dos renglones, cada uno de ellos con n + 1 números enteros separados por espacios. El primer renglón de la salida debe ser la columna que se agregó a la derecha de la matriz y el segundo renglón de la salida debe ser el renglón que se agregó abajo de la matriz. Ejemplo Entrada 2 31 41 59 26

Salida 28 15 57 1 33 57

Francisco Javier Zaragoza Martínez

6.5. Peones atorados

6.5.

47

Peones atorados

En un tablero de ajedrez los peones avanzan de un lado del tablero al lado contrario. Más aún, sólo pueden avanzar una casilla hacia adelante si no tienen a ninguna pieza en la casilla inmediata, o pueden avanzar una casilla en diagonal si en ésta se encuentra una pieza del contrincante. Por supuesto, ningún peón puede moverse hacia afuera del tablero. Dado un tablero cuadrado de N  × N , en el cual solamente hay peones negros y blancos (los negros avanzando hacia arriba y los blancos avanzando hacia abajo), podemos determinar la cantidad de cada uno de ellos que no pueden avanzar. Por ejemplo, en el tablero que vemos en la siguiente figura ni los peones negros N 1 , N 2 , N 4 , ni los peones blancos B 1 , B 2 pueden avanzar. B 1 N 1

N 2 B 2 N 3 N 4

B 3

Especificación

La entrada consiste de un número entero N , que tendrá un valor entre 2 y 100, seguido de una matriz de N  por N  números enteros en el conjunto {0,1,2}. Un 0 significa que no hay ninguna pieza en esa posición, un 1 significa que hay un peón negro y un 2 significa que hay un peón blanco. La salida consiste de dos números enteros, P , Q , separados por un espacio, donde P  es el número de peones negros que no pueden avanzar y  Q  es el número de peones blancos que no pueden avanzar. Ejemplo Entrada 4 2 1   1  2 2   1    1 

Salida 3 2

64 ejercicios de programación

Matrices

48

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 dónde están localizadas todas las minas en un campo de M  × N . El siguiente campo de 4 × 4 contiene 2 minas: ×

– – –

– – ×



– – – –

– – – –

El juego muestra un número en un cuadro que te dice cuántas minas hay adyacentes a ese cuadro. Cada cuadro tiene cuando mucho ocho cuadros adyacentes, por lo que usaremos el número 9 para indicar la presencia de una mina. 9 2 1 1

1 2 9 1

0 1 1 1

0 0 0 0

Especificación

La entrada consiste de dos números enteros, M , N , separados por un espacio y cada uno con un valor entre 1 y 20, seguidos de M  líneas cada una con N  enteros, 0 o 1, separados por espacios (un 1 indica la presencia de una mina en esa posición, un 0 indica que no hay mina). La salida consiste de M  líneas cada una con N  enteros, del 0 al 9, separados por espacios. Ejemplo Entrada 4 4 1         1      

Salida 9 1   2 2 1  1 9 1  1 1 1 

Francisco Javier Zaragoza Martínez

6.7. Torres al ataque

6.7.

49

Torres al ataque

El juego del ajedrez se juega en un tablero cuadriculado de 8 por 8. En él, una torre (T) ataca todas las posiciones (A) en su mismo renglón o en su misma columna (incluyendo la posición en donde está colocada). Dado un tablero de ajedrez de N  por N  con algunas torres en él, nos interesa saber cuántas posiciones son atacadas por las torres. Por ejemplo, las T  = 3 torres del tablero de 4 por 4 de la izquierda atacan las A  = 12 posiciones indicadas en el tablero de la derecha. – – – –

– – – –

– – – T

T – – T

 A A A A  – – A A  – – A A   A A A A 

Especificación

La entrada consiste de un número 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 posición está vacía. La salida consiste de dos números enteros, T , A , separados por un espacio. Ejemplo Entrada 4    1           1 1

Salida 3 12

64 ejercicios de programación

Matrices

50

6.8.

Cuadrado mágico impar

Un cuadrado mágico es una matriz cuadrada que tiene la peculiaridad de que la suma de sus filas, columnas y diagonales es la misma. A continuación se presenta un cuadrado mágico de tres por tres cuya suma de filas, columnas y diagonales es 15. 8 1 6 3 5 7 4 9 2 Para construir un cuadrado mágico de n × n , endonde n  es un número impar, se siguen los siguientes pasos: el número 1 se coloca en la casilla central de la primera fila. Las casillas en que se colocan los números 2, 3, ... se determinan de la siguiente manera: en primera instancia se elige la casilla que se encuentra arriba a la derecha (la fila anterior y la columna siguiente). Cuando nos salimos de la matriz por la parte superior, nos regresamos a la última fila (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 fila 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 número, 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 número le corresponde la casilla (0,1) que se encuentra ocupada por el 1; entonces el número 4 se coloca en la casilla inmediata inferior (2,0). Especificación

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. Ejemplo Entrada 3

Salida 8 1 6 3 5 7 4 9 2

Francisco Javier Zaragoza Martínez

Capítulo 7

Cadenas 7.1.

Consonantes y vocales

Escribe un programa que lea una palabra S  formada exclusivamente por letras mayúsculas y que escriba el número C  de consonantes y el número V  de vocales que contiene. Por ejemplo, la palabra CONSONANTES contiene 7 consonantes y 4 vocales. Especificación

La entrada consiste de una cadena S  formada por un máximo de 80 letras mayúsculas. La salida consiste de dos números enteros, C , V , separados por un espacio. Ejemplo Entrada CONSONANTES

Salida 7 4

51

Cadenas

52

7.2.

Inversiones e intercalaciones

Existen una gran cantidad de operaciones con cadenas. El propósito de este ejercicio es que implementes dos de ellas. La primera operación se llama inversión y consiste en intercambiar el primer carácter de una cadena con el último, el segundo con el penúltimo, y así sucesivamente, hasta que la cadena original quede invertida. Por ejemplo, la inversión de la cadena trimestre es la cadena ertsemirt. La segunda operación se llama intercalación y consiste en tomar dos cadenas e intercalar sus caracteres. Es más fácil explicar esta operación con algunos ejemplos: La intercalación de adios y hola es la cadena ahdoiloas. La intercalación de hola y adios es la cadena haodliaos. Observa que la cadena intercalada comienza con un carácter de la primera cadena, continúa con un carácter de la segunda, y así sucesivamente, hasta que una de las dos cadenas se acaba y simplemente se pegan al final los caracteres restantes de la otra. Sugerencia: escribe una función inversion(s, t) que ponga la inversión de s en t, y  una función intercalacion(r, s, t) que ponga la intercalación de r y s en t. Especificación

La entrada consiste de dos cadenas A , B , una en cada renglón y con un máximo de 100 caracteres cada una. La salida consiste de la inversión de A , la inversión de B , la intercalación de A  y B , la intercalación de B  y  A , la intercalación de A  con la inversión de A , y la intercalación de B  con la inversión de B , cada una en un renglón. Ejemplo Entrada hola adios

Salida aloh soida haodliaos ahdoiloas haolloah asdoiiodsa

Francisco Javier Zaragoza Martínez

7.3. Palabras similares

7.3.

53

Palabras similares

Una compañía te ha encargado un pequeño programa de revisión de ortografía para incorporar a su procesador de textos. Una parte fundamental de este programa es que cuando detecte que una palabra está escrita incorrectamente, debe proporcionar una lista de palabras similares tomadas de un diccionario. Para ello, el programa debe tomar la palabra escrita incorrectamente y debe compararla con otras palabras que estén escritas de forma correcta. Te han solicitado que tu programa sólo sugiera palabras que sean muy  similares, es decir, que solamente difieran en una letra (ya sea que la letra fue alterada, agregada o borrada). Por ejemplo, la palabra SEL es similar a las palabras SAL, SEUL, SE y  EL pero no es similar a ninguna de las palabras PELO, SUELO, E ni REY. Especificación

La entrada consiste de dos cadenas distintas S , T  (formadas por entre 1 y 100 letras ma yúsculas) cada una en un renglón. La salida consiste de un número 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 programación

Cadenas

54

7.4.

Código telefónico

 Alguna vez habrás visto un teléfono 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 número telefónico que, al hacerlo corresponder con las letras que aparecen en los teclados telefónicos, se pueda hacer corresponder con su nombre. Si no tienes un teléfono a la mano, al número 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 compañías les corresponda el mismo número telefónico aun cuando tengan nombres distintos. Por ejemplo, a las empresas TODO-CABE y UNE-O-ABAD les correspondería el mismo número: 86-36-22-23. Escribe un programa que, dados dos nombres, decida si les tocan números distintos. En ese caso, tu programa deberá escribir los teléfonos que corresponden a cada empresa. Especificación

La entrada consiste de dos cadenas de caracteres s  y  t  de la misma longitud (máximo de 100 caracteres), cada una en un renglón y formada exclusivamente por letras mayúsculas (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 renglón y formada exclusivamente por dígitos (sin espacios, guiones, etc.). En caso de que a s  y a t  les correspondan números distintos, entonces p  debe ser el número de s  y  q  debe ser el número 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

Francisco Javier Zaragoza Martínez

7.5. Sopa de letras

7.5.

55

Sopa de letras

 Aunque seas un fanático de resolver las sopas de letras, hay ocasiones en las que quisieras un poco de ayuda computacional para encontrar las palabras escondidas. Vamos a suponer que tienes una sola palabra P  que quieres encontrar en otra cadena S . Como sabes, la palabra P  puede aparecer escrita en S  tanto al derecho como al revés. Por ejemplo, si buscas la palabra AVE en la cadena AAVEEEVAVEVAEVEVAVEVVVEAVE, la podrás encontrar al derecho (aAVEeevAVEvaevevAVEvvveAVE) y al revés (aaveeEVAvEVAevEVAvevvveave). Tu labor consiste en escribir un programa que, dadas la palabra P  y la cadena S , determine si P  aparece al derecho y al revés en S . Especificación

La entrada consiste de dos cadenas P  y  S , cada una en un renglón y formadas por entre 1 y 100 letras mayúsculas (de la A a la Z sin incluir los acentos ni la Ñ). La salida consiste de dos números 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 revés en S  y  donde R  = 0 en caso contrario. Ejemplos Entrada AVE AAVEEEVAVEVAEVEVAVEVVVEAVE ERA TAREA CASA NO

Salida 1 1  1  

64 ejercicios de programación

Cadenas

56

7.6.

Máquina descompuesta

En algún rincón de tu casa debe haber una máquina de escribir. Si la llegaras a usar, tal vez notarías que está descompuesta. En este caso, tenemos una máquina de escribir que cambia entre mayúsculas y minúsculas de manera arbitraria. Por ejemplo, podrías obtener el siguiente resultado: hOLa. eStoY DesComPUEsta.

cuando en realidad deseabas teclear: Hola. Estoy descompuesta.

Por supuesto, un lector que domine la gramática podría saber cuáles letras deben ser ma yúsculas y cuáles minúsculas. Para este ejercicio consideraremos una regla simplificada de los casos de mayúscula inicial: la primera letra de cada enunciado (que terminaremos con punto) debe ser mayúscula, todas las demás letras deben ser minúsculas. Especificación

La entrada consiste de una cadena S  de longitud entre 1 y 80. Los caracteres de esa cadena podrán ser letras (sin acentos), dígitos, puntos y espacios. La salida consiste de una cadena T  en la cual se han arreglado las mayúsculas y las minúsculas de acuerdo a la regla simplificada. Ejemplo Entrada Salida

hOLa. eStoY DesComPUEsta. Hola. Estoy descompuesta.

Francisco Javier Zaragoza Martínez

7.7. Genes dominantes y recesivos

7.7.

57

Genes dominantes y recesivos

Supón que el patrón genético de cada individuo está codificado como una cadena de letras mayúsculas y minúsculas. Por ejemplo, el patrón genético de una madre podría estar codificado como la cadena JosEFIna y el de un padre como la cadena fiLOMeNo. Cada letra mayúscula representa un gen dominante  y cada letra minúscula representa un gen recesivo . Imaginemos que al combinar los patrones genéticos de la madre y del padre para obtener los de sus descendientes (una niña y un niño) ocurre lo siguiente: El primer gen de la madre se combina con el primer gen del padre para obtener el primer gen de los descendientes y así sucesivamente con el segundo, etcétera. Si, al combinarse dos genes, uno es dominante y el otro es recesivo, entonces los dos descendientes adquieren el gen dominante. En caso contrario, la niña adquiere el de la madre y el niño adquiere el del padre. Continuando nuestro ejemplo, los patrones genéticos resultantes de la niña y del niño serían JoLEFINa y JiLOMINo, respectivamente. Especificación

La entrada consiste de dos cadenas madre y padre (cada una en una línea) cuyas longitudes están entre 1 y 1 000. La salida consiste de dos cadenas hija e hijo (cada una en una línea). Cada una de las cadenas corresponde con el código genético de uno de los individuos y todas tendrán la misma longitud. Ejemplos Entrada JosEFIna fiLOMeNo TEre JuAn

Salida JoLEFINa JiLOMINo TEAe JEAn

64 ejercicios de programación

Cadenas

58

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 escribía de modo que los textos sólo se pudieran leer con la ayuda de un espejo. En este ejercicio haremos algo similar. Observa que algunas letras se ven casi idénticas al reflejarse 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 reflejarse en el espejo (b con d, p con q, S con Z, s con z) y las demás no parecen letras al reflejarse en el espejo. Dada una palabra, se puede obtener la palabra reflejada en el espejo marcando las letras que no se reflejan bien. Por ejemplo, la palabra prOgRAMAciOn se debe convertir en nOi*AMA**O*q al reflejarse, donde los asteriscos significan que esas letras no se reflejan bien. Especificación

La entrada consiste de una cadena S  formada exclusivamente por letras y con una longitud máxima de 80 caracteres. La salida consiste de una cadena T  que sea la imagen de espejo de S . Ejemplo Entrada prOgRAMAciOn

Salida nOi*AMA**O*q

Francisco Javier Zaragoza Martínez

7.9. Clave de usuario

7.9.

59

Clave de usuario

Como alumno de esta universidad, la coordinación de cómputo te puede otorgar una cuenta de correo electrónico cuya clave de usuario sería tu número de matrícula, y una cuentadeUnixcuyaclavedeusuarioesdelaforma ip-XX-NN.Puestoquenoeresunsimple número, un mejor sistema podría ser otorgarte una clave de usuario que se obtuviera directamente de tus iniciales. Por ejemplo, podríamos convenir que tu clave de usuario consistiera de las iniciales de todos tus nombres seguidas de las iniciales de todos tus apellidos. Entonces la clave de usuario de Francisco Javier Mina debería ser fjm. Especificación

La entrada consiste de una cadena que puede contener letras minúsculas, letras mayúsculas 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 minúsculas en el mismo orden en el que aparecen. Ejemplo Entrada frANCiscO JavieR mINa

Salida fjm

64 ejercicios de programación

Cadenas

60

7.10.

Código del César

En algunas aplicaciones es importante poder enviar un mensaje de una persona a otra sin que ningún tercero se pueda enterar del mensaje. En este caso se recurre a estrategias llamadas técnicas de codificación . Algunas de las técnicas más simples consisten en la simple sustitución de un carácter por otro. Por ejemplo, uno podría pensar en sustituir todas las letras F del mensaje original por letras J en el mensaje codificado, todas las letras J del mensaje original por letras Z en el mensaje codificado, etc. En este ejercicio describiremos una de tales técnicas: el código del César . Consideraremos que el mensaje consiste únicamente de los caracteres @, A, B, ..., Z y que a éstos se les asocian los valores 0, 1, 2, ..., 26, respectivamente. Recuerda que los códigos ASCII de estos caracteres son 64, 65, 66, ..., 90, respectivamente. En este caso, se escoge un carácter de @, A, B, ..., Z (al que llamaremos llave ) y este carácter se le suma a cada uno de los caracteres del mensaje (utilizando, claro está, el valor asociado a los caracteres). Si por alguna razón el valor de la suma es mayor que 26, entonces se vuelve a comenzar desde 0. Por ejemplo, si escogimos el carácter J como la llave y el mensaje original es TAREA@DE@PROGRAMACION, entonces el mensaje codificado será CKAOKJTOJZAYQAKWKMSYX ya que: J + T = 10 + 20 = 30 =⇒ 3 = C, J + A = 10 + 1 = 11 = K, J + R = 10 + 18 = 28 =⇒ 1 = A, etcétera. Especificación

La entrada consiste de una cadena (de 1 a 1 000 caracteres) que sólo contiene letras ma yúsculas y caracteres @. El primer carácter de esa cadena será la llave y los demás caracteres formarán el mensaje. La salida consiste de una cadena: el mensaje codificado con la llave. Observa que la cadena de salida tiene un carácter menos que la cadena de entrada. Ejemplo Entrada JTAREA@DE@PROGRAMACION

Salida CKAOKJNOJZAYQAKWKMSYX

Francisco Javier Zaragoza Martínez

Capítulo 8

 Archivos 8.1.

Eligiendo representantes

En determinadas fechas, como habrás 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 cuántos votos recibió cada candidato y cuántos votos nulos hubo. Para ello, te dieron un archivo que contenía la siguiente información: El número de candidatos y sus nombres. El número 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 mayúsculas y las minúsculas estén 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ú deberás entregar un archivo que contenga los nombres de los candidatos junto con el número de votos que recibieron, además del número de votos nulos. Especificación

La entrada consiste del archivo de texto eleccion.txt que contiene en su primer renglón dos números 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 renglón) y  en los siguientes N  renglones los N  votos registrados. Los nombres pueden constar de 1 a 10 letras mayúsculas o minúsculas. La salida estará en el archivo de texto votos.txt y 

61

Archivos

62

consiste de M  líneas cada una con el nombre (en mayúsculas) y número de votos de cada candidato (separados por un espacio y en el mismo orden que aparecen en la entrada) seguida de una línea indicando el número 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

Francisco Javier Zaragoza Martínez

8.2. Identificadores

8.2.

63

Identificadores

Una de las primeras cosas que aprendiste en el curso de programación fue la definición de lo que es un identificador. Una palabra  es una cadena de caracteres formada exclusivamente por letras mayúsculas, minúsculas, dígitos y el carácter de subrayado (guión bajo). Para simplificar las cosas, puedes suponer que las palabras están separadas por cualquier carácter que no esté en el conjunto anterior. Un identificador  es una palabra que no comienza con un dígito. Como ejemplo, abc123, 1__a, a__1 y  Dic24 son todas palabras, pero la segunda no es un identificador. Escribe un programa que, dado un archivo de texto, encuentre cuántas palabras y cuántos identificadores contiene. Especificación

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 números enteros, p , n , separados por un espacio, donde p  es el número de palabras y  n  es el número de identificadores. 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 programación

Archivos

64

8.3.

Calificación de tareas

Un profesor muy cuidadoso elabora una lista de todos sus alumnos y las calificaciones 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 calificación a cada una. La lista del profesor contiene estos datos exactamente en el orden en el que los alumnos entregan sus tareas. La calificación definitiva de cada tarea entregada por el alumno es la calificación de la última vez que la entregue, o bien cero si no la entrega. La calificación final  del alumno es simplemente la suma de las calificaciones definitivas de cada una de las tareas.  Ayuda al profesor y escribe un programa que calcule las calificaciones de sus alumnos. Especificación

La entrada consiste del archivo de texto tareas.ent que contiene en su primer renglón tres números enteros, M , N , T , separados por espacios, donde 1 ≤ M  ≤ 50 es el número de alumnos en el curso, 1 ≤ N  ≤ 10 es el número de tareas que el profesor encargó a los alumnos y 1 ≤ T  ≤ 1 000 es el número de tareas entregadas por todos los alumnos. Cada uno de los siguientes T  renglones contiene tres números enteros, A , B , C , separados por espacios, donde 1 ≤ A  ≤ M  es el número del alumno, 1 ≤ B  ≤ N  es el número de tarea y  0 ≤ C  ≤ 10 es la calificación 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 renglón dos números enteros, M , N , separados por un espacio, seguido de M  renglones; cada uno de ellos con N  + 1 números enteros separados por espacios: las calificaciones definitivas de las tareas 1,2,. .., N , seguidas de la calificación final del alumno. El primero de estos renglones corresponderá al alumno 1, el segundo al 2, ..., y el último al M . Ejemplo tareas.ent 2 3 5 1 2 7 1 1 9 2 3 6 1 2 5 2 2 5

tareas.sal 2 3 9 5  14  5 6 11

Francisco Javier Zaragoza Martínez

8.4. Corrección de espacios

8.4.

65

Corrección de espacios

Hoy en día hemos dejado las máquinas de escribir en el pasado y hemos empezado a usar procesadores de texto. El resultado es simple: como ya no estamos obligados a volver a escribir toda una página como cuando generábamos algunos errores en ella, ahora cada vez ponemos menos atención en lo que escribimos y cada vez tenemos muchos más errores.  Algunos de los errores más comunes (además de los ortográficos, gramaticales, de dedo, etc.) son el poner espacios antes de los signos de puntuación (que para este ejercicio son: el punto, la coma, el punto y coma y los dos puntos), el no poner espacios después de los signos de puntuación (cuando no termina un párrafo), el poner espacios al principio o final de una línea o párrafo y el usar más de un espacio para separar palabras. Tu labor es la de escribir un programa que lea un archivo de texto —que posiblemente contenga errores de espaciado— y que lo corrija. Especificación

La entrada consiste del archivo de texto correc.ent que contiene letras mayúsculas y  minúsculas sin acentos, nuevas líneas, espacios y signos de puntuación. La salida deberá quedar en el archivo de texto correc.sal el cual contendrá las mismas letras, nuevas líneas y signos de puntuación, 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 programación

Archivos

66

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.

Francisco Javier Zaragoza Martínez

8.5. Varias claves de usuario

8.5.

67

Varias claves de usuario

Como alumnos de esta universidad, la coordinación de cómputo les puede otorgar una cuenta de correo electrónico cuya clave de usuario sería su número de matrícula, y una cuenta de Unix cuya clave de usuario es de la forma ip-XX-NN. Puesto que ustedes no son un simple número, un mejor sistema podría ser otorgarles una clave de usuario que se obtuviera directamente de sus iniciales. Por ejemplo, podríamos convenir que una clave de usuario consistiera de las iniciales de todos los nombres seguidas de las iniciales de todos los apellidos del alumno de que se trate. Entonces, la clave de usuario de Francisco Javier Mina debería ser fjm. Especificación

La entrada estará contenida en un archivo llamado nombres.txt, el cual consistirá de un número entero N  seguido de N  cadenas que pueden contener letras minúsculas, letras mayúsculas y espacios (cada dato en un renglón). Por supuesto, los espacios separan nombres y la primera letra de cada nombre es la inicial. Más aún, cada nombre estará escrito completamente en minúsculas o completamente en mayúsculas (en cuyo caso será un apellido). La salida se deberá escribir en un archivo llamado inicial.txt consistente del número entero N  seguido de N  cadenas formada por las iniciales en minúsculas, 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 renglón). Ejemplo nombres.txt inicial.txt 5 5 GONZALEZ MARTINEZ jorge emilio jegm SAHAGUN marta JIMENEZ msj carlos AHUMADA KURTZ cak ROBLES BERLANGA rosario rrb LOPEZ andres OBRADOR manuel amlo

64 ejercicios de programación

Archivos

68

8.6.

Código de Vigenère

En algunas aplicaciones es importante poder enviar un mensaje de una persona a otra sin que ningún tercero se pueda enterar del mensaje. En este caso se recurre a estrategias llamadas técnicas de codificación . Algunas de las técnicas más simples consisten en la simple sustitución de un carácter por otro. Por ejemplo, uno podría pensar en sustituir todas las letras F del mensaje original por letras J en el mensaje codificado, todas las letras J del mensaje original por letras Z en el mensaje codificado, etc. En este ejercicio describiremos una de tales técnicas: el código de Vigenère . 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 códigos 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 carácter de la llave con el primero del mensaje, el segundo carácter 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 codificado será YWSJWAI@AUMPLMBRWDNJO ya que E + T = Y, V + A = W, A + R = S, E + E = J, etcétera. Especificación

La entrada estará contenida en un archivo llamado vigenere.txt, el cual consistirá de dos cadenas que sólo contienen letras mayúsculas y caracteres @, cada una de 1 a 1 000 caracteres y en un renglón. 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 codificado con la llave. Ejemplo vigenere.txt EVA TAREA@DE@PROGRAMACION

mensaje.txt YWSJWAI@AUMPLMBRWDNJO

Francisco Javier Zaragoza Martínez

8.7. Buscando números

8.7.

69

Buscando números

Escribe un programa que lea un archivo y que diga cuántos números contiene. Aquí, un número es una secuencia de caracteres consecutivos que comienza con un dígito y termina con un dígito. Ejemplos de números son el 000, el 1 y el 12 345. Recuerda que los dígitos son los caracteres del 0 al 9. En el ejemplo de abajo hay 9 números, los cuales aparecen en el orden 24, 2 006, 2 006, 12, 34, 46, 000, 1, 12 345. Especificación

La entrada estará en el archivo nume.ent y consistirá de dígitos y otros caracteres. La salida deberá estar en el archivo nume.sal y consistirá de un número entero N , la cantidad de números en el archivo de entrada. Ejemplo nume.ent Hoy 24 de marzo de 26 es el ultimo dia de clases del trimestre 26i. Abajo hay numeros en diversas formas: 12+34=46, , 1 y 12345.

nume.sal 9

64 ejercicios de programación

Archivos

70

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 calificación de 0 a 10. La calificación final que se le otorga al clavadista es simplemente la suma de las calificaciones otorgadas por todos los jueces, excepto por la calificación más alta y la calificación más baja. Ayuda a los jueces a determinar las calificaciones finales de todos los clavadistas. Especificación

La entrada estará en el archivo de texto jurado.ent que contiene en su primer renglón dos números enteros, J , C , separados por un espacio, con 3 ≤  J  ≤ 9; 1 ≤ C  ≤ 99. Cada uno de los siguientes C  renglones contiene las J  calificaciones 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 números enteros, F , A , B , separados por espacios, correspondientes a la calificación final del clavadista, así como a la calificación más alta y a la calificación más baja (que fueron eliminadas). Ejemplo jurado.ent 5 3 1 2 3 4 5 3 1 4 1 5 2 2 2 2 2

jurado.sal 9 5 1 8 5 1 6 2 2

Francisco Javier Zaragoza Martínez

Bibliografía  [1] A R NOLD, K., G OSLING , J. Y  H OLMES , D. El lenguaje de programación Java , terceraed. Pearson Educación, 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 AH L , O.-J., D IJKSTRA , E. W. Y  H OARE , C. A. R. Programación estructurada . Tiempo Contemporáneo, Buenos Aires, 1976. [5] F LANAGAN, D. Y  M ATS UM OTO, Y. The Ruby Programming Language . O’Reilly, Sebastopol, 2008. [6] G REGORIO RODRÍGUEZ , C., L LANA D ÍA Z , L. F., M ARTÍ NE Z U NANUE, R., P AL AO G OS TANZA , P. Y  P AR EJ A  F LORES , C. Ejercicios de programación creativos y recreativos en  C++ . Prentice Hall, Madrid, 2002. [7] G ROGONO, P. Programación en Pascal . Addison-Wesley, México, 1986. [8] K E RNIGHAN , B. W. Y  P IK E , R. La práctica de la programación . Prentice Hall, México, 2000. [9] K E RNIGHAN , B. W. Y  R ITCHIE , D. M. El lenguaje de programación C , segunda ed. Prentice Hall, México, 1991. [10] M AURE R , H. A. Y  W I LLIAMS, M. R. A Collection of Programming Problems and Techniques . Prentice Hall, Englewood Cliffs, 1972.

71

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF