0 Intro Ada Ejercicios
0 Intro Ada Ejercicios
11 de septiembre de 2014
NOTA: Al lado de cada ejercicio aparecen una o más cruces, en función de su dificultad y de la cantidad de tiempo
que requiere. Cuantas más cruces tenga un ejercicio más difı́cil es o más tiempo requiere.
Ejercicio 1 +
¿Deberı́a representarse el valor de e (2.71828) en un programa Ada como una constante o como una variable? ¿Por
qué?
Ejercicio 2 +
¿Cuáles de los siguientes identificadores pueden utilizarse para nombrar una variable en Ada?:
MiPrograma, programa2, prog#2, 2Programa, procedure, end, "Puntuaciones", Puntuaciones
Ejercicio 3 +
¿Cuáles de las siguientes expresiones son sentencias de asignación válidas en Ada? ¿Por qué?
X = Y;
A := B - C;
P + Q := R;
G := G;
H := 3 + 4;
H := 3 + K;
T := S * T;
1
Ejercicio 4 +
Corrige los errores sintácticos del siguiente programa y reescrı́belo de acuerdo a las recomendaciones de estilo vistas
en clase. Explica qué hace cada sentencia del programa una vez que los hayas corregido. ¿Qué se muestra en la salida
estándar?
PROCEDURE SMALL;
X:Float;
Y:Foat;
x:Float;
BEGIN
15.0=Y;
Z=-Y + 3.5;
Y+z=x;
PUT(X,y,Z)
end small;
Ejercicio 5 ++
Escribe un programa que convierta un conjunto de monedas en la cantidad de euros y céntimos de euro equivalente.
Se supondrá que las monedas pueden ser de 5, 10, 20 y 50 céntimos, y de 1 o 2 euros. El programa almacenará en
una variable distinta la cantidad de monedas de cada tipo. La cantidad de monedas de cada tipo es siempre mayor
o igual a 0.
Asegúrate de probar tu programa con diferentes valores.
Ejemplo:
Monedas de 1 céntimo: 1
Monedas de 2 céntimos: 2
Monedas de 5 céntimos: 0
Monedas de 10 céntimos: 10
Monedas de 20 céntimos: 0
Monedas de 50 céntimos: 5
Monedas de 1 euro: 100
Monedas de 2 euros: 0
2
Ejercicio 6 +
Evalúa las siguientes expresiones:
1. 22 / 7
2. 7 / 22
3. 22 rem 7
4. 7 rem 22
5. 15 / 16
6. 16 / 15
7. 15 rem 16
8. 16 rem 15
9. 3 / 23
10. 23 / 3
11. 3 rem 23
12. 23 rem 3
13. 4 / 16
14. 16 / 4
15. 4 rem 16
16. 16 rem 4
Ejercicio 7 +
Dadas las siguientes definiciones:
X : Float;
Y : Float := -1.0;
A : Integer := 3;
B : Integer := 4;
I : Integer;
Indica si las siguientes asignaciones son válidas, y en caso afirmativo cuál es el resultado.
1. I := A rem B;
2. I := (990 - Max_I) / A
3. I := A rem Y;
4. X := Pi * Y;
3
5. I := A / B;
6. X := A / B;
7. X := A rem (A / B);
8. I := B / 0;
9. I := A rem (990 - Max_I);
13. X := Pi ** Y;
14. X := A / B;
15. I := (Max_I - 990) rem A;
16. I := A rem 0;
Ejercicio 8 +
Dadas las siguientes definiciones:
X : Float;
Y : Float := 2.0;
A : Integer := 5;
B : Integer := 2;
I : Integer;
Indica si las siguientes asignaciones son válidas, y en caso afirmativo cuál es el resultado.
1. I := A rem B;
2. I := (990 - Max_I) / A
3. I := A rem Y;
4. X := Pi * Y;
5. I := A / B;
6. X := A / B;
7. X := A rem (A / B);
8. I := B / 0;
9. I := A rem (990 - Max_I);
4
10. I := (Max_I - 990) / A;
11. X := A / Y;
12. X := Pi ** 2;
13. X := Pi ** Y;
14. X := A / B;
Ejercicio 9 +
Dadas las siguientes lı́neas de código:
5
Ejercicio 10 +
Dadas las siguientes definiciones de variables:
I, J, K : Integer;
A, B, C, X : Float;
1. X := 4.0 A * C;
2. A := AC;
3. I := 2 * -J;
4. K := 3(I + J);
5. X := 5A / BC;
6. I := 5J3;
Ejercicio 11 +
Escribe un programa que lea tres enteros y los almacene en las variables X, Y y Z, calculando luego su producto y su
suma.
6
Ejercicio 12 +
Escribe un programa que lea un peso (en libras) de un objeto y que calcule y muestre el peso en kilogramos y gramos.
Nota: 1libra = 0,453592kg
Ejercicio 13 +
Escribe un programa que calcule la velocidad a la que corre un corredor medida en pies por segundo y km por
segundo. Como entrada el programa dispondrá de los tiempos que tarda en recorrer el corredor 1 milla, medidos en
minutos y segundos.
Nota: 1milla = 5280pies. 1km = 3282pies.
Ejercicio 14 +
Suponiendo que el corazón de un humano late una media de una vez al segundo durante 78 años, haz un programa
que calcule cuántas veces late el corazón durante la vida de un humano. Supón que un año tiene 365.25 dı́as.
Ejercicio 15 +
Escribe un programa que muestre en la salida estándar el área y la circunferencia de un cı́rculo. La entrada del
programa será el radio del cı́rculo, leı́do de la entrada estándar.
Ejercicio 16 +
Escribe un programa que muestre el precio de Pizza por metro cuadrado. La entrada del programa deberá ser el
precio de la Pizza y su diámetro.
Ejercicio 17 +
Dadas las siguientes definiciones:
1. Day’Pos(Monday)
2. Day’Pos(Today)
3. Day’Val(6)
4. Today < Tuesday
5. Day’Succ(Sunday)
6. Day’Pred(Monday)
7. Day’Val(0)
8. Today >= Thursday
7
Ejercicio 18 ++
Escribe un programa que muestre la fecha actual en el formato dd/mm/yyyy. Por ejemplo, si hoy es 11 de febrero de
2001, el programa mostrará 11/02/2001.
Nota: la fecha actual se puede obtener utilizando el paquete Ada.Calendar
Ejercicio 19 ++
Escribe un programa que muestre la fecha actual en el formato dd de MES de yyyy, siendo MES el nombre del mes.
Por ejemplo, si hoy es 11/02/2001, el programa mostrará 11 de febrero de 2001.
Nota: la fecha actual se puede obtener utilizando el paquete Ada.Calendar
Ejercicio 20 +
Escribe un programa que reciba como entrada el dı́a de la semana y muestre como salida el dı́a siguiente y el dı́a
anterior al introducido en la entrada.
El programa deberá usar el siguiente tipo:
Ejemplo de ejecución:
Ejercicio 21 +
Suponiendo que X es 15,0 y que Y es 25,0, ¿cuál es el valor de las siguientes expresiones booleanas?:
1. X /= Y
2. X < X
3. X >= (Y - X)
4. X = (Y + X - Y)
Ejercicio 22 +
Indica si cada uno de los siguientes fragmentos de código es válido o no. Indica respectivamente lo que aparecerı́a
en la pantalla o la razón por la que no es válido:
1. if 12 < 12 then
Ada.Text_IO.Put("Never");
else
Ada.Text_IO.Put("Always");
end if;
8
2. if 12 < 15.0 then
Ada.Text_IO.Put("Never");
else
Ada.Text_IO.Put("Always");
end if;
3. Var_1 := 15.0;
Var_2 := 25.12;
if (2*Var_1) > Var_2 then
Ada.Text_IO.Put("OK);
else
Ada.Text_IO.Put("Not OK");
end if;
4. Var_1 := 15.0;
Var_2 := 25.12;
if (2*Var_1) > Var_2 then
Ada.Text_IO.Put("OK");
end if;
Ada.Text_IO.Put("Not OK");
Ejercicio 23 +
¿Qué valor se le asigna a X en cada uno de los siguientes fragmentos de código, suponiendo que Y es 15,0?:
1. X := 25.0;
if Y /= (X - 10.0) then
X := X - 10.0;
else
X := X / 2.0;
end if;
9
Ejercicio 24 +
Escribe un fragmento de código Ada que:
Si Item no es cero, multiplique Product por Item y guarde el resultado en Product. Que muestre el valor de
Product.
Almacene en Z el valor absoluto de la diferencia entre X e Y, siendo el valor absoluto (X - Y) si este valor es
positivo, y si no (Y - X).
Ejercicio 25 +
Escribe un fragmento de código Ada que intercambie los valores de las variables X e Y en caso de que Y > X
Ejercicio 26 ++
Escribe un programa que calcule el sueldo neto mensual de un empleado de una compañı́a. El sueldo bruto mensual
se calcula como el número de horas trabajadas al mes multiplicado por el coste en euros por hora. El sueldo neto
mensual se calcula restando al sueldo bruto la cotización a la Seguridad Social (20 % del sueldo bruto) y el IRPF
(15 % de la parte del sueldo bruto que supere 600 euros mensuales).
El programa recibirá como entrada el número de horas trabajadas en un mes y el coste en euros por hora.
Ejemplo de ejecución:
Ejercicio 27 ++
Escribe un programa que calcule el sueldo neto mensual de un empleado de una compañı́a según el Ejercicio 26,
pero pagando las horas que excedan las 160 mensuales un 50 % más que las normales.
Ejercicio 28 +
Escribe una única sentencia if que muestre en pantalla la nota a partir de la nota numérica según la siguiente tabla:
10
Ejercicio 29 ++
Escribe un programa que muestre en la salida estándar el mayor y el menor de tres números enteros que son
introducidos en el teclado por el usuario.
Ejemplo de ejecución:
Ejercicio 30 ++
Escribe un programa que lea cuatro letras y que muestre la que aparece primero en el alfabeto.
Ejemplo de ejecución:
Ejercicio 31 ++
Escribe un programa que lea cuatro letras y que muestre la última que aparece en el alfabeto.
Ejemplo de ejecución:
Ejercicio 32 ++
La compañı́a Telefonge tiene las siguientes tarifas de telefonı́a móvil:
Las llamadas realizadas entre las 6:00PM y las 8:00AM tienen un descuento de 50 %
Las llamadas entre las 8:00AM y las 6:00PM se cobran a la tarifa normal
Todas las llamadas tienen un impuesto de 4 %
La tarifa normal es de 0.15 céntimos de euro por minuto
Las llamadas de más de 60 minutos tienen un descuento adicional de 15 % (antes de añadir el impuesto)
Escribe un programa que permita que un usuario introduzca la hora de comienzo y la duración de una llamada y
que muestre el coste bruto (antes de aplicar descuentos y el impuesto), y el coste neto (tras aplicar descuentos e
impuesto).
11
Ejercicio 33 ++
Escribe un paquete Trafico que exporte la siguiente función:
function Clasifica (Velocidad: Rango_Velocidad) return Clases;
Esta función devuelve la clase de velocidad que se le pasa como parámetro de acuerdo a la siguiente tabla:
Realiza un programa principal que permita al usuario introducir una velocidad y que muestre la clase de tráfico
haciendo uso de la función Trafico.Clasifica
Ejercicio 34 +
Escribe un programa que muestre la suma de los enteros de 1 a N . La entrada del programa es el número Positive
N.
Ejemplo de ejecución:
12
Ejercicio 35 +
Para cada uno de los siguientes programas indica si es legal o no, y caso afirmativo qué muestra.
with Ada.Text_IO;
procedure Loop_Test is
begin
for Count in 1..10 loop
Ada.Text_IO.Put(Integer’Image(Count));
end loop;
Ada.Text_IO.New_Line;
Ada.Text_IO.Put(Integer’Image(Count));
Ada.Text_IO.New_Line;
end Loop_Test;
procedure Loop_Test is
Count: Positive;
begin
Count := 537;
for Count in 1..10 loop
Ada.Text_IO.Put(Integer’Image(Count));
end loop;
Ada.Text_IO.New_Line;
Ada.Text_IO.Put(Integer’Image(Count));
Ada.Text_IO.New_Line;
end Loop_Test;
Ejercicio 36 +
Escribe un fragmento de código que calcule la suma de los cuadrados de los enteros del 1 al 10.
Ejercicio 37 +
Ejercicio 38 ++
Escribe un programa que sume un conjunto indeterminado de números enteros.
Como entrada se proporcionará el número de enteros que se desean sumar y la lista de los mismos.
Ejemplo de ejecución:
13
¿Cuántos números vas a sumar (al menos 1)?: 3
Introduce el número 1: 23
Introduce el número 2: 12
Introduce el número 3: -3
Ejercicio 39 ++
Escribe un programa que muestre el mı́nimo, máximo y la media de una lista de tamaño indeterminado de números.
Como entrada se proporcionará el número de enteros y la lista de los mismos.
Ejemplo de ejecución:
El más peque~
no es: -3
El mayor es: 23
La media es: 10
Ejercicio 40 ++
Modifica el programa del Ejercicio 27 para que calcule el sueldo bruto y neto de un conjunto de empleados.
Ejercicio 41 +++
Escribe un programa que muestre un triángulo isósceles. Como entrada se proporcionará la altura del mismo medida
en lı́neas de texto.
Ejemplo de ejecución:
14
Ejercicio 42 +
¿Qué muestran en pantalla los siguientes fragmentos de código, suponiendo que M es 3 y N es 5?:
Ejercicio 43 +
¿Cuál es la salida que muestra el siguiente fragmento de código?:
15
Ejercicio 44 +
Escribe un programa que muestre la siguiente salida:
Ejercicio 45 ++
Escribe un programa que muestre una tabla de sumas para números entre 0 y 9:
16
Ejercicio 46 ++
Escribe un programa que pida al usuario un número N y a continuación muestre una tabla con la suma de 1..N y
el factorial de N .
Ejemplo de ejecución:
Ejercicio 47 ++
Añade un manejador de excepciones al programa 46.
Si se introduce un número que no esté en el rango 1..10 el manejador mostrará el siguiente mensaje: número fuera del rango 1..1
Si se introduce un valor no entero el manejador mostrará el siguiente mensaje: el valor introducido no es un entero
Ejercicio 48 +
Para cada uno de los siguientes fragmentos de código indica cuántas veces se ejecuta cada sentencia Put y cuál es el
último valor mostrado:
17
Ejercicio 49 +
Escribe una sentencia for que recorra los valores de ’Z’ a ’A’ y muestre sólo las consonantes.
Nota: el operador in sirve para comprobar si un valor pertenece a un subtipo. Ejemplo: if Variable in Subtipo then ...
Ejercicio 50 ++
Escribe dos bucles for anidados que muestren las primeras seis letras del alfabeto en una lı́nea, las siguientes 5 letras
en una nueva lı́nea, las siguientes 4 en la siguiente,... hasta llegar a una lı́nea en la que sólo se muestre una letra.
Ejercicio 51 +
Escribe un programa que muestre una tabla con las primeras 15 potencias de 2, empezando por 20
Ejercicio 52 ++
Escribe un programa que lea 20 números enteros y muestre la cantidad de valores que son positivos (>= 0) y la canti-
dad de valores que son negativos. En función del resultado, el programa mostrará al final el texto "más positivos",
"más negativos" o "igual número de positivos que de negativos".
Ejercicio 53 ++
Modifica el programa 16 para que permita calcular el precio por metro cuadrado de un número de pizzas. El número
se leerá al comenzar el programa.
Ejercicio 54 ++
Escribe un programa que pida al usuario un mes y año inicial y un mes y año final. El programa escribirá en un
fichero de texto una lı́nea para cada dı́a de ese periodo. Cada lı́nea del fichero mostrará el dı́a, mes y año.
Ejercicio 55 +
Escribe un programa que muestre los números impares comprendidos entre 1 y 39, ambos incluı́dos.
Escribe primero el programa usando un bucle loop y luego usando un bucle while.
18
Ejercicio 56 ++
Escribe un programa que muestre la tabla de equivalencia entre grados Celsius y grados Kelvin, de 10 en 10, para
el rango comprendido entre 100 grados Celsius y -20 grados Celsius, en orden descendente.
Nota: F ahrenheit = (10 8 ∗ Celsius) + 32
Ejemplo de ejecución:
Celsius Fahrenheit
100.0 212.0
90.0 194.0
80.0 176.0
... ...
-10.0 14.0
-20.0 -4.0
Escribe primero el programa usando un bucle loop y luego usando un bucle while.
Ejercicio 57 ++
Escribe un programa que muestre la distancia a la que se va encontrando un objeto de la pared. Cada vez que el
objeto se mueve lo hace en una cantidad igual a su tamaño.
El tamaño del objeto es de 8.5 cm. La distancia inicial la introduce el usuario.
Ejemplo de ejecución:
La distancia es 27.00
La distancia es 18.50
La distancia es 10.00
...
Distancia final entre el objeto y la pared: 1.50
Escribe primero el programa usando un bucle loop y luego usando un bucle while.
19
Ejercicio 58 +
¿Cuántas veces se ejecuta el cuerpo del siguiente bucle? ¿Qué se muestra en cada vuelta del bucle?
X := 3;
Count := 0;
loop
X := X * X;
Ada.Text_IO.Put(Integer’Image(X));
Count := Count + 1;
exit when Count >= 3;
end loop;
Ejercicio 59 +
¿Cuántas veces se ejecuta el cuerpo del siguiente bucle? ¿Qué se muestra en cada vuelta del bucle?
X := 3;
Count := 0;
loop
X := X * X;
Ada.Text_IO.Put(Integer’Image(X));
Count := Count + 2;
exit when Count >= 3;
end loop;
Ejercicio 60 +
¿Cuántas veces se ejecuta el cuerpo del siguiente bucle? ¿Qué se muestra en cada vuelta del bucle?
X := 3;
Count := 0;
loop
X := X * X;
Ada.Text_IO.Put(Integer’Image(X));
exit when Count >= 3;
end loop;
Ejercicio 61 ++
En un momento dado viven en una ciudad 9870 personas. Suponiendo que la población crece un 10 % anual, escribe
un bucle que calcule cuántos años se necesitan para que la población supere los 30000 habitantes.
Ejercicio 62 +
Escribe un bucle que muestre una tabla con n y 2n mientras que 2n sea menor de 10000.
20
Ejercicio 63 ++
Escribe un programa que calcule la suma de los números naturales introducidos por el teclado. En cada iteración se
preguntará si se quiere seguir introduciendo valores o no.
Ejemplo de ejecución:
Ejercicio 64 ++
Escribe un programa que calcule la suma de los números naturales introducidos por el teclado hasta que se introduzca
el número -1.
Ejemplo de ejecución:
Ejercicio 65 ++
Escribe un programa que calcule el producto de una colección de valores enteros no nulos. Si hay varias ocurrencias
consecutivas de un mismo número sólo se incluirá en el producto una ocurrencia. Por ejemplo, el producto de los
números 10, 5, 5, 5 y 10 debe calcularse como 10 ∗ 5 ∗ 10 = 500
Se irán leyendo números enteros hasta que se introduzca el valor 0.
Ejemplo de ejecución:
El producto es 500
Escribe primero el programa usando un bucle loop y luego usando un bucle while.
21
Ejercicio 66 +
Indica qué valores muestra el siguiente fragmento de código cuando se introduce por el teclado el valor 5:
Ejercicio 67 +
Indica qué valores muestra el siguiente fragmento de código cuando se introduce por el teclado el valor 5:
Ejercicio 68 +
Escribe un programa que calcule 1 + 2 + 3 + ... + (N − 1) + N , siendo N un valor leı́do del teclado.
22
Ejercicio 69 ++
Reescribe el siguiente código añadiéndole un manejador de excepciones para que cuando en el bucle no se introduzca
un valor válido el bucle siga ejecutándose sin que pare el programa.
with Ada.Text_IO;
procedure Exception_Loop is
Min_Val : constant Integer := -10;
Max_Val : constant Integer := 10;
subtype Small_Int is Integer range Min_Val .. Max_Val;
Input_Value : Small_Int;
Sum : Integer;
begin
Sum := 0;
Ejemplo de ejecución:
23
Ejercicio 70 ++
Escribe un programa que muestre un menú de mandatos en pantalla y tras leer el mandato seleccionado por el
usuario imprima un mensaje explicando la opción del menú elegida.
Ejemplo de ejecución:
Menú de mandatos
+ : Subir el volumen
- : Bajar el volumen
s : Silenciar
Introduzca un mandato: +
Subiendo el volumen
Introduzca un mandago: *
Mandato no reconocido
Introduzca un mandato: -
Bajando el volumen
Ejercicio 71 ++
Modifica el programa 70 para que el usuario sólo tenga tres intentos para introducir un mandato correcto. Si introduce
3 mandatos seguidos incorrectos el programa deberá terminar. Ejemplo de ejecución:
Menú de mandatos
+ : Subir el volumen
- : Bajar el volumen
s : Silenciar
Introduzca un mandato: +
Subiendo el volumen
Introduzca un mandago: a
Mandato no reconocido
Introduzca un mandago: b
Mandato no reconocido
Introduzca un mandago: c
Mandato no reconocido
Ejercicio 72 +
Escribe un subprograma que tenga dos parámetros formales de tipo entero. El subprograma deberá devolver orde-
nados los dos parámetros, el menor en el primer parámetro formal y el mayor en el segundo.
24
Ejercicio 73 +
Usando el subprograma del Ejercicio 72 escribe un programa que lea 3 valores enteros y los escriba ordenados de
mayor a menor.
Ejemplo de ejecución:
Ejercicio 74 ++
Escribe un programa que calcule el producto de una colección de valores enteros. El programa debe terminar cuando
se lea el valor 0.
Ejercicio 75 ++
Escribe un programa que lea un entero N y calcule Slow = 1 + 2 + 3 + ... + N. Luego calculará Fast = (N*(N+1))/2
y comparará los valores de Slow y Fast. El programa mostrará en pantalla los dos valores e indicará si son o no
iguales.
Ejercicio 76 ++
Escribe un programa que lea una lista de valores enteros hasta que se introduzca el valor 0, y que muestre en pantalla
la posición que ocupa la primera y última ocurrencias del valor 12. El programa debe mostrar el valor 0 si el número
12 no estaba en la colección de valores leı́dos. Si el número 12 sólo aparece una vez, la primera y última ocurrencias
serán iguales.
Ejercicio 77 ++
Escribe un programa que lea una colección de notas de examen entre 0 y 10. El programa debe contar y mostrar el
número de sobresalientes (>= 9 y <= 10), el número de notables (>= 7 y <= 9), el número de aprobados (>= 5
y < 7) y el número de suspensos (< 5).
El programa leerá notas hasta que la nota introducida esté fuera del rango. Para cada nota mostrará al lado su
calificación (suspenso, aprobado, notable, sobresaliente). Al final mostrará el número de notas de cada calificación y
la media de todas las notas.
25
Ejercicio 78 +++
Escribe un programa que permita gestionar el inventario de un distribuidor de bebidas.
Existen 4 tipos de bebidas: Cocacola (1), Pepsi (2), Trinaranjus (3), KongaCola (4) y sus precios respectivamente
son 10, 20, 30 y 40 céntimos de euro.
El programa deberá mostrar el siguiente menú:
La cantidad inicial de botellas de cada marca y la cantidad de dinero inicial se leerán de un fichero de texto.
Al terminar el programa se actualizará el fichero con el inventario y la cantidad de dinero existentes en el momento
de terminar el programa.
Ejercicio 79 +++
La raı́z cuadrada de un número N puede calcularse por aproximaciones sucesivas con la siguiente fórmula:
Estimación_Nueva = 0.5 (Estimación_Anterior + (N / Estimación_Anterior))
Escribe una función Sqrt que calcule por aproximaciones sucesivas la raı́z cuadrada de un número Float positivo.
La función deberá devolver un valor cuando la diferencia entre los dos últimos valores estimados sea manor de 0,005
Para el valor estimado inicial utiliza el valor 1,0
Ejercicio 80 ++
Escribe un programa que lea una fecha en el formato dı́a, mes, año de forma robusta. Utiliza un tipo enumerado
para los nombres de los meses.
La fecha introducida ha de ser una fecha válida (p.ej. no existe el 31 de febrero de ningún año). Para comprobar la
validez de las fechas consulta el paquete Ada.Calendar.
Ejercicio 81 +++
Escribe un programa que muestre los dı́gitos de un número Positive en orden inverso.
Ejemplo de ejecución:
Ejercicio 82 +++
Escribe un programa que muestre la hora actual en el formato hh:mm:ss.
Ejemplo de ejecución:
26
Ejercicio 83 +++
Escribe un programa que compruebe si un entero positivo es un número primo. El programa mostrará un mensaje
diciendo si el número es primo, o mostrará su divisor más pequeño si no es primo.
Ejercicio 84 ++
Escribe un programa que lea una colección de caracteres hasta que se introduzca un punto. El programa mostrará el
número de espacios en blanco introducidos.
Ejemplo de ejecución:
Ejercicio 85 ++
Escribe una función que reciba como argumento un carácter y devuelva un carácter. Si el argumento es una letra
minúscula deberá devolver la misma letra pero en mayúscula. Si el argumento ya es una letra mayúscula deberá de-
volverla sin modificar.
Nota: todas las letras minúsculas están juntas, ası́ como las mayúsculas. Utiliza los atributos ’Pos y ’Val del tipo
Character.
Ejercicio 86 +
Evalúa las siguientes expresiones teniendo en cuenta que todas las letras minúsculas están juntas en el tipo Character,
ası́ como las mayúsculas.
1. Character’Pos(’D’) - Character’Pos(’A’)
2. Character’Pos(’d’) - Character’Pos(’a’)
3. Character’Succ(Character’Pred(’a’))
4. Character’Val(Character’Pos(’C’))
5. Character’Val(Character’Pos(’C’) - Character’Pos(’A’)+Character’Pos(’a’))
6. Character’Pos(’7’) - Character’Pos(’6’)
7. Character’Pos(’9’) - Character’Pos(’0’)
8. Character’Succ(Character’Succ(Character’Succ(’d’)))
9. Character’Val(Character’Pos(’A’) + 5)
27
Ejercicio 87 +
Dadas las siguientes declaraciones:
type Mes is (Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto,
Septiembre, Octubre, Noviembre, Diciembre);
Y las variables Este_A~no, con valores en el rango 1901..2099, Dias_En_Mes de tipo Positive y Este_Mes de tipo
Mes, escribe una sentencia case que almacene en Dias_En_Mes el número de dı́as en Este_Mes teniendo en cuenta
el año Este_A~
no. Ten en cuenta los años bisiestos.
Ejercicio 88 +
Escribe una sentencia if que sea equivalente a la siguiente sentencia case:
case X > Y is
when True =>
Ada.Text_IO.Put(Item => "X mayor");
when False =>
Ada.Text_IO.Put(Item => "Y mayor o igual");
end case;
Ejercicio 89 +
Dada esta definición de tipo:
escribe una sentencia case que asigne un valor a la variable Eyes, de tipo Color, suponiendo que las dos primeras
letras del color están almacenadas en dos variables de tipo Character, Letra_1, Letra_2.
Ejercicio 90 ++
Escribe una sentencia case que muestre un mensaje indicando si Next_Character, de tipo Character es uno de los
siguientes caracteres: un operador (+, -, *, =, <, >, /), un signo de puntuación (punto, dos puntos, coma, punto
y coma, paréntesis, llave, corchete) o un dı́gito. El código debe mostrar la categorı́a (operador, signo de puntuación
o dı́gito).
Reescrı́belo con un if.
Ejercicio 91 +
Evalúa la siguiente expresión:
28
Ejercicio 92 +
Evalúa la siguiente expresión:
Ejercicio 93 +
Evalúa las siguientes expresiones:
Character’Val(Character’Pos(’a’))
Character’Val(Character’Pos(’a’) + 3)
Character’Val(Character’Pos(’z’) - 26)
Character’Val(Character’Pos(’z’) - 32)
Ejercicio 94 +++
Un entero N es divisible por 9 si la suma de sus dı́gitos es divisible por 9. Escribe un programa que compruebe
utilizando este algoritmo si un número introducido por el usuario es divisible por 9 o no.
Ejercicio 95 +++
El valor de ex puede calcularse utilizando la siguiente serie:
1 + x + x2 /2! + x3 /3! + ... + xn /n! + ...
Escribe un subprograma My_Exp para calcular e imprimir el valor de esta serie para cualquier x y n.
Escribe un programa que permita al usuario introducir un valor x y que calcule utilizando el subprograma anterior
el valor de ex . El programa deberá comprobar si el resultado es correcto comparándolo con el resultado de la función
Ada.Numerics.Generic_Elementary_Functions.Exp. Será correcto cuando la diferencia entre el valor calculado
por My_Exp y el devuelto por Exp sea menor de 0.001.
29
Ejercicio 96 ++
Dada la siguiente definición:
Ejercicio 97 ++
Escribe un programa que lea una colección de 8 valores Float del terminal, calcule la media de los valores, y muestre
la tabla de diferencias entre los valores leı́dos y la media.
Ejemplo de ejecución:
30
Ejercicio 98 +
I := 3;
Ejercicio 99 +
31
Ejercicio 100 +
Dadas las siguientes declaraciones:
1. A := B;
2. C := D;
3. E := F;
4. G := H;
Ejercicio 101 +
Declara tipos array que sirvan para almacenar la información que se especifica a continuación. Define subtipos
adecuados para representar los ı́ndices de los arrays.
Ejemplo: Array para almacenar el nombre de una persona, con un máximo de 10 caracteres:
2. Array para almacenar el número de veces que aparece cada letra mayúscula en un texto.
3. Array para almacenar flags (valores booleanos) que indiquen si una letra (mayúscula o minúscula) aparece o
no en un texto.
4. Array para almacenar si las respuestas a las preguntas de un examen son correctas o no, con un máximo de
100 preguntas.
5. Las áreas de cada habitación de una casa (comedor, cocina,...)
6. El número de estudiantes en cada curso de un colegio (desde educación primaria hasta bachillerato)
32
Escribe funciones que reciban 2 argumentos de tipo Mantisa_Exponente y devuelvan un valor de ese mismo tipo
para sumar, y multiplicar valores números en notación cientı́fica.
Escribe un paquete que exporte estos subprogramas y un programa principal que permita comprobar su correcto
funcionamiento.
Letra Contador
A 3
B 15
C 32
...
Z 12
33
El nombre del fichero y el tamaño máximo de la lı́nea se introducirán como argumentos del programa (usar
Ada.Command_Line para obtenerlos).
Al terminar se mostrará el tamaño de la lı́nea más larga del fichero.
Nota: La función Ada.Text_IO.End_Of_File (Fichero) devuelve True si no hay más caracteres que leer en el
fichero de texto.
Ejercicio 109 ++
Escribe una función que encuentre el máximo de un array de Float que se le pase como parámetro. Deberá podérsele
pasar un array de Float de cualquier tamaño y devolverá el valor Float del máximo.
Haz un programa que pruebe la función con diferentes arrays. Este programa no recibe su entrada interactivamente
ni de un fichero, sino que los arrays de prueba pueden estar declarados como variables del programa.
Ejercicio 110 +
34
Ejercicio 112 +++
Utilizando el subprograma del Ejercicio 111 escribe un programa interactivo que permita a un jugador competir con
tu programa para jugar a las 3 en raya. El programa deberá detectar quién ha ganado.
Ejercicio 114 ++
Escribe un programa que lea interactivamente 5 cartas de póker y las almacene en un array de dos dimensiones
(colores y figuras).
El programa deberá mostrar la jugada correspondiente a las 5 cartas. Nota: ver http://www.poquer.com.es/ranking.html
Ejercicio 115 ++
Escribe un programa que lea interactivamente 5 cartas de póker y almacene cada una en un registro con dos campos,
color y figura. Las 5 cartas se almacenarán en un array de 5 registros.
El programa deberá mostrar la jugada correspondiente a las 5 cartas. Nota: ver http://www.poquer.com.es/ranking.html
F ib1 = 1
F ib2 = 1
F ibn = F ibn−2 + F ibn−1 , para n > 2
35
Ejercicio 118 +++
El máximo común divisor (MCD) de dos enteros positivos es el mayor número entero que es un divisor de ambos.
El algoritmo de Euclides para encontrar el MCD se define recursivamente:
M0 = 1
M N = M ∗ M N −1 , paraN > 0
Ejercicio 120 +
¿Cuál es la salida del siguiente programa? ¿Qué calcula la función Strange?
with Ada.Text_IO;
procedure Test_Strange is
function Strange (N : Integer) return Integer is
begin
if N = 1 then
Result := 0;
else
Result := 1 + Strange (N / 2);
end if;
end Strange;
begin
Ada.Text_IO.Put(Integer’Image(Strange (8)));
Ada.Text_IO.New_Line;
end Test_Strange;
Ejercicio 121 ++
Escribe una función recursiva, Find_Sum que calcule la suma de los enteros que comienzan en 1 y acaban en N.
36
Ejercicio 122 ++
Escribe un procedimiento que muestre el contenido del array que se le pasa como argumento. Deberá implementarse
el procedimiento de manera recursiva, no pudiéndose recorrer con un bucle.
Se supondrá que las variables de tipo Access ocupan 6 bytes en memoria, las de tipo Integer 4 bytes, las de tipo
Float 4 bytes, las de tipo Character 1 byte. Además se supondrá que los campos de un registro están almacenados
contiguamente en memoria, sin dejar huecos entre ellos.
4. Escribe un bucle que muestre el valor del campo ID de todos los estudiantes de la lista.
5. Escribe un bucle en el que para cada estudiante se sume su campo Current_Hours al valor de su campo
Total_Hours, y se inicialice a cero Current_Hours
37
Ejercicio 125 ++
Dadas las siguientes declaraciones:
A : Frequency_Ptr;
B : Frequency_Ptr;
C : Frequency_Ptr;
1. Escribe una sentencia que cree espacio en memoria dinámica para un array de tipo Frequency_Array con un
ı́ndice de rango ’a’..’g’ y almacene su dirección en la variable A.
2. Escribe una sentencia que cree espacio en memoria dinámica para un array de tipo Frequency_Array con un
ı́ndice de rango ’h’..’n’ y almacene su dirección en la variable B. Cada elemento del array deberı́a tener
como valor inicial cero.
3. Escribe un bucle que asigne el valor 100 a todos los elementos del array apuntado por B.
4. Escribe una sentencia que cree espacio en memoria dinámica para un array de tipo Frequency_Array con un
ı́ndice de rango ’a’..’n’ y almacene su dirección en la variable C. Cada elemento del array deberı́a tener
como valor inicial el que tenga la posición correspondiente en los arrays apuntados por A y B.
5. Escribe el código necesario para instanciar un procedimiento llamado Free que sirva para liberar la memoria
de un objeto apuntado por una variable de tipo Frequency_Ptr.
6. Usa el procedimiento Free del apartado anterior para liberar la memoria que ocupa el array apuntado por la
variable C.
7. Suponiendo que A, B y C apuntan a tres arrays distintos, describe qué ocurrirı́a cuando se ejecutase cada uno
de los siguientes fragmentos de código. Realiza gráficos que representen la memoria ocupada por las variable
A, B, C y por los arrays apuntados por ellas, antes y después de que se ejecute cada sentencia.
a) Free(A);
Free(A);
b) Free(A);
A.all(’c’) := 52;
c) A := null;
d) A := null;
A.all(’c’) := 52;
e) A := B;
B.all(’f’) := 96;
f) A := B;
Free(B);
A := null;
g) A.all := C.all(’a’..’g’);
h) A.all := C.all;
i) A := null;
B := A;
38
Ejercicio 126 +++
Dadas las siguientes declaraciones:
1. Haz un gráfico en el que se muestre la memoria ocupada por las variables W, X, Y, Z y por las zonas de
memoria apuntadas por ellas.
2. ¿Qué ocurrirı́a si se ejecutase la siguiente sentencia?: W := X;. Realiza un gráfico que ilustre el estado de la
memoria antes y después de ejecutar la sentencia.
3. ¿Qué ocurrirı́a si se ejecutasen las siguientes sentencias?:
Free (W);
W := new String’(X.all);
Realiza un gráfico que ilustre el estado de la memoria antes y después de ejecutar cada una de las sentencias.
4. ¿Qué ocurrirı́a si se ejecutase la siguiente sentencia?:
X := X & " Jaime";
Realiza un gráfico que ilustre el estado de la memoria antes y después de ejecutar cada una de las sentencias.
39
5. ¿Qué ocurrirı́a si se ejecutasen las siguientes sentencias?:
Free (W);
W := X;
X := X & " Jaime";
Free (W);
Realiza un gráfico que ilustre el estado de la memoria antes y después de ejecutar cada una de las sentencias.
40
Ejercicio 128 +++
Sea la siguiente declaración de una lista enlazada:
with Ada.Strings.Unbounded;
...
package ASU renames Ada.Strings.Unbounded;
type Cell;
type Cell_A is access Cell;
P_First : Cell_A;
P_Elem : Cell_A;
P_First 3#*1(
4#%51(
3160(
with Ada.Strings.Unbounded;
...
package ASU renames Ada.Strings.Unbounded;
type Cell;
type Cell_A is access Cell;
P_First : Cell_A;
P_Elem : Cell_A;
41
Supón que en un instante dado el contenido de la lista es el que se muestra en la figura 2, y que el puntero P_Elem
apunta al tercer elemento de la misma.
Escribe el código que eliminarı́a de la lista ese elemento apuntado por P_Elem.
Entrada
La entrada consiste en una serie de parejas de enteros, i y j, una pareja de números por lı́nea. Todos los enteros
serán menores que 1,000,000 y mayores que 0.
Salida
Para cada pareja de enteros de la entrada, i y j, la salida será i y j, en el mismo orden en el que aparecieron en la
entrada, y después, en la misma lı́nea, la máxima longitud de ciclo para los enteros entre i y j, incluyendo ambos
valores. Estos tres números deben separarse por un espacio, con los tres números en la misma lı́nea, y una lı́nea por
cada lı́nea de la entrada.
42
Ejemplos
*... *100
.... 2210
.*.. 1*10
.... 1110
Entrada
La entrada consta de un número arbitrario de campos de minas. La primera lı́nea de cada campo de minas contiene
dos enteros n y m (0 < n, m ≤ 100) que son el número de filas y columnas del campo de minas respectivamente.
Cada una de las siguientes n lı́neas contiene exactamente m caracteres, representando el campo de minas.
Las posiciones seguras se representan con el carácter "." y las posiciones en las que hay minas con el carácter "*",
ambos sin las comillas. Una primera lı́nea de un campo de minas en la que n = m = 0 indica el final de la entrada,
no debiéndose procesar esta lı́nea.
Salida
Para cada campo de minas se mostrará el mensaje Campo #x: en una lı́nea, en la que x es el número de campo de
minas, empezando por 1. Las siguientes n lı́neas deben contener el campo de minas con los caracteres "." substituidos
por el número de minas adyacentes a esa posición. Debe haber una lı́nea en blanco sseparando la salida de los campos
de minas.
43
Ejemplos
-
| |
-
| |
-
El resto de dı́gitos se representa con un subconjunto de estos 7 segmentos utilizados para representar el dı́gito 8.
Entrada
El fichero de entrada contiene varias lı́neas, una para cada número que se quiere mostrar. Cada lı́nea contiene dos
enteros s y n, siendo n el número a mostrar (0 ≤ n ≤ 99,999,999) y s el tamaño de cada segmento que se debe
utilizar para representar los números (1 ≤ s ≤ 10). La entrada terminará con una lı́nea que contiene dos ceros, que
no deben ser procesados.
Salida
Se muestran los números especificados en el fichero de entrada representados con s caracteres "-" para los segmentos
horizontales y s caracteres "|" para los segmentos verticales. Cada dı́gito ocupa exactamente s + 2 columnas y 2s + 3
filas. Asegúrate de llenar con espacios el espacio en blanco de cada dı́gito, incluyendo el último dı́gito. Debe haber
exactamente una columna de espacios en blanco entre cada dos dı́gitos.
Deja una lı́nea en blanco detrás de cada dı́gito.
44
Ejemplos
-- -- --
| | | | | |
| | | | | |
-- -- -- --
| | | | |
| | | | |
-- -- --
45
Ejercicio 133 +++
Jaque (Problema utilizado en el concurso de Programación San Teleco 2012).
Escribe un programa que lea la configuración de un tablero de ajedrez e identifique si la casilla de alguno de los
reyes está amenazada (si les están dando jaque).
Se está dando jaque a un rey cuando la casilla en la que está puede ser ocupada por el oponente en su próximo
movimiento.
Las piezas blancas se representarán con letras mayúsculas, y las negras con letras minúsculas. El lado de las piezas
blancas será siempre la parte inferior del tablero según aparece en pantalla.
Para los que no conozcan las reglas del ajedrez, estos son los movimientos de cada pieza:
Peón (p o P): sólo puede moverse hacia adelante una casilla en cada movimiento. Sin embargo, puede come piezas
del contrario que estén a una casilla de distancia en las diagonales, avanzando hacia el lado del contrario, y
eso es lo que importa en este problema.
Caballo (c o C): se mueve en L tal como se muestra más abajo. Es la única pieza que puede saltar por encima de otras
piezas.
Alfil (a o A): puede moverse cualquier número de casillas diagonalmente, hacia adelante o hacia atrás.
Torre (t o T): puede moverse cualquier número de casillas verticalmente u horizontalmente, hacia adelante o hacia
atrás.
Dama (d o D): puede moverse cualquier número de casillas en cualquier direción (diagonal, horizontal o verticalmente),
hacia adelante o hacia atrás.
Rey (r o R): sólo puede moverse una casilla en cada movimiento, en cualquier dirección (diagonal, horizontal o
verticalmente), hacia adelante o hacia atrás.
Debajo se muestran ejemplos de cómo se pueden mover las piezas, donde "*" indica las posiciones a en las que una
pieza puede capturar a otra:
Recuerda que el caballo es la única pieza que puede saltar por encima de otras piezas. El movimiento del peón
depende del lado en el que esté. Si es un peón blanco, sólo puede moverse una casilla en diagonal hacia capturar a
otra pieza. Si es un peón blanco, sólo puede moverse una casilla en diagonal hacia arriba para capturar otra pieza.
El ejemplo de peón que se muestra más arriba corresponde a un peón negro (letra "p" minúscula). En este desafı́o
utilizamos la palabra movimiento para referirnos a las casillas a las que puede moverse una pieza para capturar otra.
Entrada
Habrá un número de configuraciones de tableros en la entrada, constando cada uno de ellos de ocho lı́neas de
ocho caracteres cada una. Un "." representa una casilla vacı́a, siendo las letras minúsculas y mayúsculas las piezas
tal como se definieron antes. No pueden aparecer otros caracteres. No puede haber configuraciones en las que se
46
esté dando jaque a ambos reyes. Debe leerse la entrada hasta encontrar un tablero vacı́o (compuesto únicamente por
caracteres "."), que no debe ser procesado. Habrá una lı́nea en blanco entre cada par de configuraciones de tableros.
Todos los tableros, excepto el vacı́o, contendrán exactamente un rey blanco y uno negro.
Salida
Para cada configuración de tablero que se lea debe mostrarse en la salida una de las siguientes salidas:
Ejemplos
tcadr.ct
ppp..ppp
....p...
...p....
.aPP....
.....C..
PP..PPPP
TCADRA.T
........
........
........
........
........
........
........
........
47
Ejercicio 134 +++
Democracia australiana (Problema utilizado en el concurso de Programación San Teleco 2012).
¿Sabı́as que en 1856 se votó por primera vez en el mundo de manera secreta en los estados de Victoria y Tasmania
de Australia?
En este paı́s los votantes tienen que ordenar a todos los candidatos en orden de preferencia. En un primer recuento
de las papeletas, si uno de los candidatos aparece como preferido en más del 50 % de los votos, éste resulta elegido.
Si por el contrario ningún candidato aparece como preferido en más del 50 % de los votos:
1. Se elimina el candidato que haya recibido el menor número de votos. Si hay varios candidatos empatados en
el menor número de votos, se eliminan todos ellos.
2. A continuación se rehace el recuento: para cada papeleta, se le suma el voto de cada candidato eliminado al
candidato preferido no eliminado de esa papeleta.
Este proceso de eliminación de los candidatos menos votados y de recuento de sus votos en favor del candidato
preferido continúa hasta que un candidato recibe más del 50 % de los votos, o hasta que todos los candidatos aún
no eliminados están empatados.
Entrada
La entrada comienza con una lı́nea en la que hay un entero positivo que indica el número de procesos electorales
distintos que se van a procesar. Después de esta primera lı́nea viene una lı́nea en blanco. También hay una lı́nea en
blanco entre cada dos procesos electorales distintos.
La primera lı́nea de cada proceso electoral es un entero n ≤ 20 que indica el número de candidatos. Las siguientes n
lı́neas contienen los nombres de los n candidatos, cada uno de los cuales puede tener un máximo de 80 caracteres.
En las siguientes lı́neas, hasta un máximo de 1000, aparecen las papeletas. Cada papeleta contiene los números de
los candidatos, de 1 a n, ordenados según la preferencia de cada votante: el primer número es el candidato preferido,
el segundo número es su segunda opción, etc.
Salida
La salida muestra el/los candidatos elegidos para cada una de las votaciones. Después de cada proceso electoral se
debe generar una lı́nea en blanco.
Los resultados de cada votación constan de una lı́nea con el nombre del candidato elegido, o de varias lı́neas con los
nombres de los candidatos que han empatado.
Ejemplos
3
Groucho Marx
Charles Chaplin
Gila
1 2 3
2 1 3
2 3 1
1 2 3
3 1 2
48
Ejercicio 135 +++
Descifrado con texto en claro conocido (Problema utilizado en el concurso de Programación San Teleco 2012).
Un método sencillo e inseguro de cifrar texto es permutar las letras del alfabeto: cada letra del alfabeto se substituye
siempre que aparece en el texto por otra letra del alfabeto. Para que el proceso sea reversible, cada letra ha de ser
substituida por una letra distinta.
Si se posee un texto en claro no cifrado, y su correspondiente texto cifrado, se puede averiguar qué substituciones
se hicieron para cifrar los mensajes. A este ataque se le denomina descifrado con texto en claro conocido.
Tu tarea consiste en descifrar varias lı́neas de texto cifradas, suponiendo que cada una de ellas utiliza el mismo
conjunto de substituciones, y que una de las lı́neas es el mensaje cifrado del siguiente texto en claro conocido:
the quick brown fox jumps over the lazy dog
Entrada
La entrada comienza con una lı́nea en la que únicamente hay un entero positivo que indica el número de casos a
tratar, seguido de una lı́nea en blanco. También hay una lı́nea en blanco entre cada dos casos consecutivos.
Salida
Para cada caso hay que descifrar cada lı́nea e imprimirla en la salida. Si no se puede descifrar una frase se mostrará la
siguiente salida:
No hay solución
Ejemplos
Ejemplo de entrada
vtz ud xnm xugm itr pyy jttk gmv xt otgm xt xnm puk ti xnm fprxq
xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
frtjrpgguvj otvxmdxd prm iev prmvx xnmq
Ejemplo de salida
now is the time for all good men to come to the aid of the party
the quick brown fox jumps over the lazy dog
programming contests are fun arent they
49
Ejercicio 136 +++
Descifrado con diccionario (Problema utilizado en el concurso de Programación San Teleco 2012).
Un método sencillo e inseguro de cifrar texto es permutar las letras del alfabeto: cada letra del alfabeto se substituye
siempre que aparece en el texto por otra letra del alfabeto. Para que el proceso sea reversible, cada letra ha de ser
substituida por una letra distinta.
Tu tarea es descifrar varias lı́neas de texto cifradas, suponiendo que cada lı́nea usa un conjunto de substituciones
distinto, y que todas las palabras del texto descifrado pertenecen a un diccionario de palabras conocidas.
Entrada
La entrada consta de una lı́nea con un número entero n, seguido de n palabras escritas con letras minúsculas, una
por lı́nea, en orden alfabético. Estas n palabras componen el diccionario de palabras que pueden aparecer en el texto
descifrado. Después del diccionario apareen varias lı́neas de mensajes cifrados según lo explicado más arriba.
No puede haber más de 1000 palabras en el diccionario. Las palabras tienen 16 caracteres como máximo. Las lı́neas
con los mensajes cifrados contienen sólo letras minúsculas y espacios, y tienen una longitud máxima de 80 caracteres.
Salida
En la salida aparecen los mensajes descifrados, uno por lı́nea. Si hay varias soluciones se puede imprimir una
cualquiera. Si no hay solución se imprime una lı́nea en la que cada carácter se substituye por un asterisco.
Ejemplo de entrada
6
llora
jaime
la
vota
juan
pelota
kbjnf mmpsb kvb~
n wpub mb qfmpub mmpsb kvb~
n qfmpub
xxxxx yyyyy aaaa eeee zz pppppp cassn pppe pixxxx
Ejemplo de salida
50
Ejercicio 137 +++
Piedra, papel, o tijera (Problema utilizado en el concurso de Programación San Teleco 2012).
Piedra, papel o tijera es un juego infantil conocido también como cachipún, jankenpón, yan ken po, chis bun papas,
hakembó, chin-chan-pu o kokepon. Es un juego de manos en el cual existen tres elementos:
Este juego es muy utilizado para decidir quien de dos personas hará algo, tal y como a veces se hace usando una
moneda, o para dirimir algún asunto. http://es.wikipedia.org/wiki/Piedra,_papel_o_tijera
Escribe un programa que determine los ganadores de una serie de juegos de piedra, papel o tijera. En cada juego
pueden participar dos jugadores.
Entrada
En la entrada habrá una serie de juegos, separados por una lı́nea en blanco. Cada juego consta de dos lı́neas, en
cada una de las cuáles figura el nombre propio del jugador y su elección: "R" para piedRa, "P" para Papel y "T"
para tiJera. El nombre es una sóla palabra.
Salida
En la salida aparecerá una lı́nea con el nombre del ganador de cada juego.
Ejemplos
Juan T
Carlos R
51
Ejercicio 138 +++
Anagramas (Problema utilizado en el concurso de Programación San Teleco 2012).
Un anagrama es una palabra formada por la trasposición de las letras de otra palabra. Por ejemplo "carpa" es un
anagrama de "parca".
Escribe un programa que dado un conjunto de palabras las agrupe por anagramas.
Entrada
Cada conjunto de palabras a agrupar aparecerá en una serie de lı́neas, una palabra por lı́nea. Para separar conjuntos
diferentes de palabras a clasificar se utilizará una lı́nea en blanco.
Salida
Cada grupo de anagramas distinto aparecerá en una lı́nea. Para separar los grupos de diferentes conjuntos se
usará una lı́nea en blanco.
Ejemplos
monja
lamina
esponja
jamon
animal
japones
mojan
52