








































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Ejercicios practicos de python
Tipo: Ejercicios
1 / 48
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!









































©c 2003 Andr´es Marzal e Isabel Gracia
· 1 ¿Cu´al es el m´aximo valor que puede representarse con 16 bits y un sistema de representaci´on posicional como el descrito? ¿Qu´e secuencia de bits le corresponde?
· 2 ¿Cu´antos bits se necesitan para representar los n´umeros del 0 al 18, ambos inclusive?
· 3 Calcula las siguientes sumas de n´umeros codificados con 8 bits en el sistema posicional:
a) 01111111 + 00000001 b) 01010101 + 10101010 c) 00000011 + 00000001
· 4 Codifica en complemento a dos de 8 bits los siguientes valores:
a) 4 b) − 4 c) 0 d) 127 e) 1 f) − 1
· 5 Efect´ua las siguientes sumas y restas en complemento a dos de 8 bits:
a) 4 + 4 b) −4 + 3 c) 127 − 128 d) 128 − 127 e) 1 − 1 f) 1 − 2
· 6 Ejecuta paso a paso el mismo programa con los valores 2, −2 y 0 en las posiciones de memoria 10, 11 y 12, respecti- vamente.
· 7 Dise˜na un programa que calcule la media de cinco n´umeros depositados en las posiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´on de memoria 15. Recuerda que la media ¯x de cinco n´umeros x 1 , x 2 , x 3 , x 4 y x 5 es
x¯ =
i=1 xi 5
x 1 + x 2 + x 3 + x 4 + x 5 5
· 8 Dise˜na un programa que calcule la varianza de cinco n´umeros depositados en las posiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´on de memoria 15. La varianza, que se denota con σ^2 , es
σ^2 =
i=1(xi^ −^ x¯) 2 5
donde ¯x es la media de los cinco valores. Sup´on que existe una instrucci´on ((Multiplicar el contenido de direcci´on a por el contenido de direcci´on b y dejar el resultado en direcci´on c)).
· 9 Dise˜na un algoritmo para calcular el ´area de un c´ırculo dado su radio. (Recuerda que el ´area de un c´ırculo es π veces el cuadrado del radio.)
· 10 Dise˜na un algoritmo que calcule el IVA (16%) de un producto dado su precio de venta sin IVA.
· 11 ¿Podemos llamar algoritmo a un procedimiento que escriba en una cinta de papel todos los n´umeros decimales de π?
· 12 ¿Qu´e expresiones Python permiten, utilizando el menor n´umero posible de par´entesis, efectuar en el mismo orden los c´alculos representados con estos ´arboles sint´acticos?
a) b) c)
· 13 Dibuja los ´arboles sint´acticos correspondientes a las siguientes expresiones aritm´eticas:
a) 1 + 2 + 3 + 4 b) 1 - 2 - 3 - 4 c) 1 - ( 2 - ( 3 - 4 ) + 1 )
· 14 ¿Qu´e resultados se obtendr´an al evaluar las siguientes expresiones Python? Dibuja el ´arbol sint´actico de cada una de ellas, calcula a mano el valor resultante de cada expresi´on y comprueba, con la ayuda del ordenador, si tu resultado es correcto.
a) 2 + 3 + 1 + 2
b) 2 + 3 * 1 + 2
c) ( 2 + 3 ) * 1 + 2
d) ( 2 + 3 ) * ( 1 + 2 )
e) +--- 6
f) -+-+ 6
· 15 Traduce las siguientes expresiones matem´aticas a Python y eval´ualas. Trata de utilizar el menor n´umero de par´entesis posible.
a) 2 + (3 · (6/2))
b)
c) (4/2)^5
d) (4/2)5+
e) (−3)^2
f) −(3^2 )
(Nota: El resultado de evaluar cada expresi´on es: a) 11; b) 2; c) 32; d) 64; e) 9; f) −9.) · 16 ¿Qu´e resultar´a de evaluar las siguientes expresiones? Presta especial atenci´on al tipo de datos que resulta de cada operaci´on individual. Haz los c´alculos a mano ayud´andote con ´arboles sint´acticos y comprueba el resultado con el ordenador.
a) 1 / 2 / 4.
b) 1 / 2.0 / 4.
c) 1 / 2.0 / 4
d) 1.0 / 2 / 4
e) 4 **. 5
f) 4.0 ** ( 1 / 2 )
g) 4.0 ** ( 1 / 2 ) + 1 / 2
h) 4.0 ** (1.0 / 2 ) + 1 / 2.
i) 3e3 / 10
j) 10 / 5e- 3
k) 10 / 5e- 3 + 1
l) 3 / 2 + 1
· 17 ¿Qu´e resultados se muestran al evaluar estas expresiones?
True == True != False
1 < 2 < 3 < 4 < 5
( 1 < 2 < 3 ) and ( 4 < 5 )
1 < 2 < 4 < 3 < 5
( 1 < 2 < 4 ) and ( 3 < 5 )
· 18 ¿Son v´alidos los siguientes identificadores?
a) Identificador
b) Indice\dos
c) Dos palabras
d) __
e) 12horas
f) hora 12
g) desviaci´on
h) a˜no
i) from
j) var!
k) ’var’
l) import_from
m) UnaVariable
n) a(b)
˜n) 12
o) uno.dos
p) x
q) π
r) ´area
s) area-rect
t) x_______ 1
u) ________ 1
v) x
w) x_x
· 19 ¿Qu´e resulta de ejecutar estas tres l´ıneas?
x = 10
x = x * 10
x
· 20 Eval´ua el polinomio x^4 + x^3 + 2x^2 − x en x = 1.1. Utiliza variables para evitar teclear varias veces el valor de x. (El resultado es 4.1151.) · 21 Eval´ua el polinomio x^4 + x^3 + 12 x^2 − x en x = 10. Aseg´urate de que el resultado sea un n´umero flotante. (El resultado es 11040.0.) · 22 ¿Qu´e resultar´a de ejecutar las siguientes sentencias?
z = 2
z += 2
z += 2 - 2
z *= 2
· 30 ¿Qu´e resultados se obtendr´an al evaluar las siguientes expresiones Python? Calcula primero a mano el valor resultante de cada expresi´on y comprueba, con la ayuda del ordenador, si tu resultado es correcto.
a) int(exp( 2 * log( 3 )))
b) round ( 4 *sin( 3 * pi / 2 ))
c) abs(log 10 (. 01 ) * sqrt( 25 ))
d) round (3.21123 * log 10 ( 1000 ), 3 )
· 31 Dise˜na un programa que, a partir del valor del lado de un cuadrado (3 metros), muestre el valor de su per´ımetro (en metros) y el de su ´area (en metros cuadrados). (El per´ımetro debe darte 12 metros y el ´area 9 metros cuadrados.) · 32 Dise˜na un programa que, a partir del valor de la base y de la altura de un tri´angulo (3 y 5 metros, respectivamente), muestre el valor de su ´area (en metros cuadrados). Recuerda que el ´area A de un tri´angulo se puede calcular a partir de la base b y la altura h como A = 12 bh.
b
h
(El resultado es 7.5 metros cuadrados.) · 33 Dise˜na un programa que, a partir del valor de los dos lados de un rect´angulo (4 y 6 metros, respectivamente), muestre el valor de su per´ımetro (en metros) y el de su ´area (en metros cuadrados). (El per´ımetro debe darte 20 metros y el ´area 24 metros cuadrados.) · 34 Dise˜na un programa que pida el valor del lado de un cuadrado y muestre el valor de su per´ımetro y el de su ´area. (Prueba que tu programa funciona correctamente con este ejemplo: si el lado vale 1.1, el per´ımetro ser´a 4.4, y el ´area 1.21.) · 35 Dise˜na un programa que pida el valor de los dos lados de un rect´angulo y muestre el valor de su per´ımetro y el de su ´area. (Prueba que tu programa funciona correctamente con este ejemplo: si un lado mide 1 y el otro 5, el per´ımetro ser´a 12.0, y el ´area 5.0.) · 36 Dise˜na un programa que pida el valor de la base y la altura de un tri´angulo y muestre el valor de su ´area. (Prueba que tu programa funciona correctamente con este ejemplo: si la base es 10 y la altura 100, el ´area ser´a 500.0.) · 37 Dise˜na un programa que pida el valor de los tres lados de un tri´angulo y calcule el valor de su ´area y per´ımetro. Recuerda que el ´area A de un tri´angulo puede calcularse a partir de sus tres lados, a, b y c, as´ı: A =
s(s − a)(s − b)(s − c), donde s = (a + b + c)/2. (Prueba que tu programa funciona correctamente con este ejemplo: si los lados miden 3, 5 y 7, el per´ımetro ser´a 15.0 y el ´area 6.49519052838.) · 38 El ´area A de un tri´angulo se puede calcular a partir del valor de dos de sus lados, a y b, y del ´angulo θ que ´estos forman entre s´ı con la f´ormula A = 12 ab sin(θ). Dise˜na un programa que pida al usuario el valor de los dos lados (en metros), el ´angulo que estos forman (en grados), y muestre el valor del ´area.
a
b θ
(Ten en cuenta que la funci´on sin de Python trabaja en radianes, as´ı que el ´angulo que leas en grados deber´as pasarlo a radianes sabiendo que π radianes son 180 grados. Prueba que has hecho bien el programa introduciendo los siguientes datos: a = 1, b = 2, θ = 30; el resultado es 0.5.) · 39 Haz un programa que pida al usuario una cantidad de euros, una tasa de inter´es y un n´umero de a˜nos. Muestra por pantalla en cu´anto se habr´a convertido el capital inicial transcurridos esos a˜nos si cada a˜no se aplica la tasa de inter´es introducida. Recuerda que un capital de C euros a un inter´es del x por cien durante n a˜nos se convierten en C · (1 + x/100)n^ euros. (Prueba tu programa sabiendo que una cantidad de 10 000 ¤ al 4.5% de inter´es anual se convierte en 24 117.14 ¤ al cabo de 20 a˜nos.)
©c 2003 Andr´es Marzal e Isabel Gracia
· 40 Haz un programa que pida el nombre de una persona y lo muestre en pantalla repetido 1000 veces, pero dejando un espacio de separaci´on entre aparici´on y aparici´on del nombre. (Utiliza los operadores de concatenaci´on y repetici´on.)
· 41 ¿Qu´e mostrar´a por pantalla este programa?
1 print ’%d’ % 1 2 print ’%d %d’ % ( 1 , 2 ) 3 print ’%d%d’ % ( 1 , 2 ) 4 print ’%d, %d’ % ( 1 , 2 ) 5 print 1 , 2 6 print ’%d 2’ % 1
· 42 Un alumno inquieto ha experimentado con las marcas de formato y el m´etodo upper y ha obtenido un resultado sorprendente:
print (’n´umero %d y n´umero %d’ % ( 1 , 2 )).upper ()
N´UMERO 1 Y N´UMERO 2
print ’n´umero %d y n´umero %d’.upper () % ( 1 , 2 )
Traceback (most recent call last): File "
¿Qu´e crees que ha pasado? (Nota: Aunque experimentar conlleva el riesgo de equivocarse, no podemos enfatizar suficientemente cu´an importante es para que asimiles las explicaciones. Probarlo todo, cometer errores, reflexionar sobre ellos y corregirlos es uno de los mejores ejercicios imaginables.)
· 43 ¿Qu´e peque˜na diferencia hay entre el programa saluda.py y este otro cuando los ejecutamos?
saluda2.py 1 nombre = raw_input(’Tu nombre: ’) 2 print ’Hola,’, nombre, ’.’
· 44 La marca %s puede representar cadenas con un n´umero fijo de casillas. A la vista de c´omo se pod´ıa expresar esta caracter´ıstica en la marca de enteros %d, ¿sabr´ıas como indicar que deseamos representar una cadena que ocupa 10 casillas?
· 45 Dise˜na un programa que solicite el radio de una circunferencia y muestre su ´area y per´ımetro con s´olo 2 decimales.
· 46 Dibuja esta figura. (Te indicamos las coordenadas de las esquinas inferior izquierda y superior derecha.)
(100, 100)
(900, 900)
· 47 Dibuja esta figura.
Los tres c´ırculos conc´entricos tienen radios 100, 200 y 300, respectivamente.
· 48 Dibuja esta figura.
a b c
d
Los tres c´ırculos conc´entricos tienen radios 100, 200 y 300, respectivamente.
©c 2003 Andr´es Marzal e Isabel Gracia
· 56 Un programador primerizo cree que la l´ınea 7 de la ´ultima versi´on de primer grado.py es innecesaria, as´ı que propone esta otra versi´on como soluci´on v´alida:
primer grado 4.py E primer grado.py E 1 a = float(raw_input(’Valor de a: ’)) 2 b = float(raw_input(’Valor de b: ’)) 3 4 if a != 0 : 5 x = -b/a 6 print ’Soluci´on: ’, x 7 8 print ’La ecuaci´on no tiene soluci´on.’
Haz una traza del programa para a = 2 y b = 2. ¿Son correctos todos los mensajes que muestra por pantalla el programa? · 57 Indica qu´e l´ıneas del ´ultimo programa (y en qu´e orden) se ejecutar´an para cada uno de los siguientes casos:
a) a = 2 y b = 6. b) a = 0 y b = 3. c) a = 0 y b = −3. d) a = 0 y b = 0.
· 58 Dise˜na un programa que lea un n´umero flotante por teclado y muestre por pantalla el mensaje ((El n´umero es negativo.)) s´olo si el n´umero es menor que cero. · 59 Dise˜na un programa que lea un n´umero flotante por teclado y muestre por pantalla el mensaje ((El n´umero es positivo.)) s´olo si el n´umero es mayor o igual que cero. · 60 Dise˜na un programa que lea la edad de dos personas y diga qui´en es m´as joven, la primera o la segunda. Ten en cuenta que ambas pueden tener la misma edad. En tal caso, hazlo saber con un mensaje adecuado. · 61 Dise˜na un programa que lea un car´acter de teclado y muestre por pantalla el mensaje ((Es par´entesis)) s´olo si el car´acter le´ıdo es un par´entesis abierto o cerrado. · 62 Indica en cada uno de los siguientes programas qu´e valores en las respectivas entradas provocan la aparici´on de los distintos mensajes. Piensa primero la soluci´on y comprueba luego que es correcta ayud´andote con el ordenador.
a) misterio 3.py misterio.py 1 letra = raw_input(’Dame una letra min´uscula: ’) 2 3 if letra <= ’k’: 4 print ’Es de las primeras del alfabeto’ 5 if letra >= ’l’: 6 print ’Es de las ´ultimas del alfabeto’
b) misterio 4.py misterio.py 1 from math import ceil # ceil redondea al alza. 2 3 grados = float(raw_input(’Dame un ´angulo (en grados): ’)) 4 5 cuadrante = int(ceil (grados) % 360 ) / 90 6 if cuadrante == 0 : 7 print ’primer cuadrante’ 8 if cuadrante == 1 : 9 print ’segundo cuadrante’ 10 if cuadrante == 2 : 11 print ’tercer cuadrante’ 12 if cuadrante == 3 : 13 print ’cuarto cuadrante’
· 63 ¿Qu´e mostrar´a por pantalla el siguiente programa?
comparaciones.py comparaciones.py 1 if 14 < 120 : 2 print ’Primer saludo’ 3 if ’14’ < ’120’: 4 print ’Segundo saludo’
· 64 Dise˜na un programa que, dado un n´umero entero, muestre por pantalla el mensaje ((El n´umero es par.)) cuando el n´umero sea par y el mensaje ((El n´umero es impar.)) cuando sea impar. (Una pista: un n´umero es par si el resto de dividirlo por 2 es 0, e impar en caso contrario.)
· 65 Dise˜na un programa que, dado un n´umero entero, determine si ´este es el doble de un n´umero impar. (Ejemplo: 14 es el doble de 7, que es impar.)
· 66 Dise˜na un programa que, dados dos n´umeros enteros, muestre por pantalla uno de estos mensajes: ((El segundo es el cuadrado exacto del primero.)), ((El segundo es menor que el cuadrado del primero.)) o ((El segundo es mayor que el cuadrado del primero.)), dependiendo de la verificaci´on de la condici´on correspondiente al significado de cada mensaje.
· 67 Un capital de C euros a un inter´es del x por cien anual durante n a˜nos se convierte en C · (1 + x/100)n^ euros. Dise˜na un programa Python que solicite la cantidad C y el inter´es x y calcule el capital final s´olo si x es una cantidad positiva.
· 68 Realiza un programa que calcule el desglose en billetes y monedas de una cantidad exacta de euros. Hay billetes de 500, 200, 100, 50, 20, 10 y 5 ¤ y monedas de 2 y 1 ¤. Por ejemplo, si deseamos conocer el desglose de 434 ¤, el programa mostrar´a por pantalla el siguiente resultado:
2 billetes de 200 euros. 1 billete de 20 euros. 1 billete de 10 euros. 2 monedas de 2 euros.
(¿Que c´omo se efect´ua el desglose? Muy f´acil. Empieza por calcular la divisi´on entera entre la cantidad y 500 (el valor de la mayor moneda): 434 entre 500 da 0, as´ı que no hay billetes de 500 ¤ en el desglose; divide a continuaci´on la cantidad 434 entre 200, cabe a 2 y sobran 34, as´ı que en el desglose hay 2 billetes de 200 ¤; dividimos a continuaci´on 34 entre 100 y vemos que no hay ning´un billete de 100 ¤ en el desglose (cabe a 0); como el resto de la ´ultima divisi´on es 34, pasamos a dividir 34 entre 20 y vemos que el desglose incluye un billete de 20 ¤ y a´un nos faltan 14 ¤ por desglosar... )
· 69 ¿Hay alguna diferencia entre el programa anterior y este otro cuando los ejecutamos?
segundo grado 3.py segundo grado.py 1 from math import sqrt 2 3 a = float(raw_input(’Valor de a: ’)) 4 b = float(raw_input(’Valor de b: ’)) 5 c = float(raw_input(’Valor de c: ’)) 6 7 if a == 0 : 8 if b == 0 : 9 if c == 0 : 10 print ’La ecuaci´on tiene infinitas soluciones.’ 11 else: 12 print ’La ecuaci´on no tiene soluci´on.’ 13 else: 14 x = -c / b 15 print ’Soluci´on de la ecuaci´on: x=%4.3f’ % x 16 else: 17 x 1 = (-b + sqrt(b** 2 - 4 ac)) / ( 2 * a) 18 x 2 = (-b - sqrt(b** 2 - 4 ac)) / ( 2 * a) 19 print ’Soluciones de la ecuaci´on: x1=%4.3f y x2=%4.3f’ % (x 1 , x 2 )
· 70 ¿Hay alguna diferencia entre el programa anterior y este otro cuando los ejecutamos?
segundo grado 4.py segundo grado.py 1 from math import sqrt 2 3 a = float(raw_input(’Valor de a: ’)) 4 b = float(raw_input(’Valor de b: ’)) 5 c = float(raw_input(’Valor de c: ’)) 6 7 if a == 0 and b == 0 and c == 0 : 8 print ’La ecuaci´on tiene infinitas soluciones.’ 9 else: 10 if a == 0 and b == 0 : 11 print ’La ecuaci´on no tiene soluci´on.’ 12 else: 13 if a == 0 : 14 x = -c / b 15 print ’Soluci´on de la ecuaci´on: x=%4.3f’ % x
· 81 Dise˜na un programa que calcule la menor de cinco palabras dadas; es decir, la primera palabra de las cinco en orden alfab´etico. Aceptaremos que las may´usculas son ((alfab´eticamente)) menores que las min´usculas, de acuerdo con la tabla ASCII. · 82 Dise˜na un programa que calcule la menor de cinco palabras dadas; es decir, la primera palabra de las cinco en orden alfab´etico. No aceptaremos que las may´usculas sean ((alfab´eticamente)) menores que las min´usculas. O sea, ’pepita’ es menor que ’Pepito’. · 83 Dise˜na un programa que, dados cinco n´umeros enteros, determine cu´al de los cuatro ´ultimos n´umeros es m´as cercano al primero. (Por ejemplo, si el usuario introduce los n´umeros 2, 6, 4, 1 y 10, el programa responder´a que el n´umero m´as cercano al 2 es el 1.) · 84 Dise˜na un programa que, dados cinco puntos en el plano, determine cu´al de los cuatro ´ultimos puntos es m´as cercano al primero. Un punto se representar´a con dos variables: una para la abcisa y otra para la ordenada. La distancia entre dos puntos (x 1 , y 1 ) y (x 2 , y2) es
(x 1 − x 2 )^2 + (y 1 − y 2 )^2. · 85 Indica en cada uno de los siguientes programas qu´e valores o rangos de valores provocan la aparici´on de los distintos mensajes:
a) aparcar.py aparcar.py 1 dia = int(raw_input(’Dime qu´e d´ıa es hoy: ’)) 2 3 if 0 < dia <= 15 : 4 print ’Puedes aparcar en el lado izquierdo de la calle’ 5 else: 6 if 15 < dia < 32 : 7 print ’Puedes aparcar en el lado derecho de la calle’ 8 else: 9 print ’Ning´un mes tiene %d d´ıas.’ % dia
b) estaciones.py estaciones.py 1 mes = int(raw_input(’Dame un mes: ’)) 2 3 if 1 <= mes <= 3 : 4 print ’Invierno.’ 5 else: 6 if mes == 4 or mes == 5 or mes == 6 : 7 print ’Primavera.’ 8 else: 9 if not (mes < 7 or 9 < mes): 10 print ’Verano.’ 11 else: 12 if not (mes != 10 and mes != 11 and mes != 12 ): 13 print ’Oto~no.’ 14 else: 15 print ’Ning´un a~no tiene %d meses.’ % mes
c) identificador.py identificador.py 1 car = raw_input(’Dame un car´acter: ’) 2 3 if ’a’ <= car.lower () <= ’z’ or car == ’ ’: 4 print ’Este car´acter es v´alido en un identificador en Python.’ 5 else: 6 if not (car < ’0’ or ’9’ < car ): 7 print ’Un d´ıgito es v´alido en un identificador en Python,’, 8 print ’siempre que no sea el primer car´acter.’ 9 else: 10 print ’Car´acter no v´alido para formar un identificador en Python.’
d) bisiesto.py bisiesto.py 1 anyo = int(raw_input(’Dame un a~no: ’)) 2 3 if anyo % 4 == 0 and (anyo % 100 != 0 or anyo % 400 == 0 ): 4 print ’El a~no %d es bisiesto.’ % anyo 5 else: 6 print ’El a~no %d no es bisiesto.’ % anyo
©c 2003 Andr´es Marzal e Isabel Gracia
· 86 La f´ormula C′^ = C · (1 + x/100)n^ nos permite obtener el capital final que lograremos a partir de un capital inicial (C), una tasa de inter´es anual (x) en tanto por cien y un n´umero de a˜nos (n). Si lo que nos interesa conocer es el n´umero de a˜nos n que tardaremos en lograr un capital final C′^ partiendo de un capital inicial C a una tasa de inter´es anual x, podemos despejar n en la f´ormula del ejercicio 67 de la siguiente manera:
n =
log(C′) − log(C) log(1 + x/100)
Dise˜na un programa Python que obtenga el n´umero de a˜nos que se tarda en conseguir un capital final dado a partir de un capital inicial y una tasa de inter´es anual tambi´en dados. El programa debe tener en cuenta cu´ando se puede realizar el c´alculo y cu´ando no en funci´on del valor de la tasa de inter´es (para evitar una divisi´on por cero, el c´alculo de logaritmos de valores negativos, etc)... con una excepci´on: si C y C′^ son iguales, el n´umero de a˜nos es 0 independientemente de la tasa de inter´es (incluso de la que provocar´ıa un error de divisi´on por cero). (Ejemplos: Para obtener 11 000 ¤ por una inversi´on de 10 000 ¤ al 5% anual es necesario esperar 1.9535 a˜nos. Obtener 11 000 ¤ por una inversi´on de 10 000 ¤ al 0% anual es imposible. Para obtener 10 000 ¤ con una inversi´on de 10 000 ¤ no hay que esperar nada, sea cual sea el inter´es.)
· 87 Dise˜na un programa que, dado un n´umero real que debe representar la calificaci´on num´erica de un examen, proporcione la calificaci´on cualitativa correspondiente al n´umero dado. La calificaci´on cualitativa ser´a una de las siguientes: ((Suspenso)) (nota menor que 5), ((Aprobado)) (nota mayor o igual que 5, pero menor que 7), ((Notable)) (nota mayor o igual que 7, pero menor que 8.5), ((Sobresaliente)) (nota mayor o igual que 8.5, pero menor que 10), ((Matr´ıcula de Honor)) (nota 10).
· 88 Dise˜na un programa que, dado un car´acter cualquiera, lo identifique como vocal min´uscula, vocal may´uscula, conso- nante min´uscula, consonante may´uscula u otro tipo de car´acter.
· 89 ¿Por qu´e obtenemos un error en esta sesi´on de trabajo con el int´erprete interactivo?
a = 0
if 1 /a > 1 and a != 0 :
... print a
...
Traceback (most recent call last): File "
· 90 Nuestro aprendiz de programador ha tecleado en su ordenador el ´ultimo programa, pero se ha despistado y ha escrito esto:
circulo 3.py circulo.py 1 from math import pi 2 3 radio = float(raw_input(’Dame el radio de un c´ırculo: ’)) 4 5 print ’Escoge una opci´on: ’ 6 print ’a) Calcular el di´ametro.’ 7 print ’b) Calcular el per´ımetro.’ 8 print ’c) Calcular el ´area.’ 9 opcion = raw_input(’Teclea a, b o c y pulsa el retorno de carro: ’) 10 11 if opcion == a: 12 diametro = 2 * radio 13 print ’El di´ametro es’, diametro 14 else: 15 if opcion == b: 16 perimetro = 2 * pi * radio 17 print ’El per´ımetro es’, perimetro 18 else: 19 if opcion == c: 20 area = pi * radio ** 2 21 print ’El ´area es’, area
Las l´ıneas sombreadas son diferentes de sus equivalentes del programa original. ¿Funcionar´a el programa del aprendiz? Si no es as´ı, ¿por qu´e motivo?.
· 91 Haz una traza del programa suponiendo que el usuario teclea la letra d cuando se le solicita una opci´on. ¿Qu´e l´ıneas del programa se ejecutan?
©c 2003 Andr´es Marzal e Isabel Gracia
ejercicio bucle 16.py ejercicio bucle.py 1 i = int(raw_input(’Valor inicial: ’)) 2 limite = int(raw_input(’L´ımite: ’)) 3 incremento = int(raw_input(’Incremento: ’)) 4 while i < limite: 5 print i 6 i += incremento
· 103 Implementa un programa que muestre todos los m´ultiplos de 6 entre 6 y 150, ambos inclusive.
· 104 Implementa un programa que muestre todos los m´ultiplos de n entre n y m · n, ambos inclusive, donde n y m son n´umeros introducidos por el usuario.
· 105 Implementa un programa que muestre todos los n´umeros potencia de 2 entre 2^0 y 2^30 , ambos inclusive.
· 106 Estudia las diferencias entre el siguiente programa y el ´ultimo que hemos estudiado. ¿Producen ambos el mismo resultado?
sumatorio 2.py sumatorio.py 1 sumatorio = 0 2 i = 0 3 while i < 1000 : 4 i += 1 5 sumatorio += i 6 print sumatorio
· 107 Dise˜na un programa que calcule ∑m
i=n
i,
donde n y m son n´umeros enteros que deber´a introducir el usuario por teclado.
· 108 Modifica el programa anterior para que si n > m, el programa no efect´ue ning´un c´alculo y muestre por pantalla un mensaje que diga que n debe ser menor o igual que m.
· 109 Queremos hacer un programa que calcule el factorial de un n´umero entero positivo. El factorial de n se denota con n!, pero no existe ning´un operador Python que permita efectuar este c´alculo directamente. Sabiendo que
n! = 1 · 2 · 3 ·... · (n − 1) · n
y que 0! = 1, haz un programa que pida el valor de n y muestre por pantalla el resultado de calcular n!.
· 110 El n´umero de combinaciones que podemos formar tomando m elementos de un conjunto con n elementos es:
Cmn =
n m
n! (n − m)! m!
Dise˜na un programa que pida el valor de n y m y calcule Cnm. (Ten en cuenta que n ha de ser mayor o igual que m.) (Puedes comprobar la validez de tu programa introduciendo los valores n = 15 y m = 10: el resultado es 3003.)
· 111 ¿Qu´e te parece esta otra versi´on del mismo programa?
raiz 2.py raiz.py 1 from math import sqrt 2 3 x = float(raw_input(’Introduce un n´umero positivo: ’)) 4 while x < 0 : 5 x = float(raw_input(’Introduce un n´umero positivo: ’)) 6 7 print ’La ra´ız cuadrada de %f es %f’ % (x, sqrt(x))
· 112 Dise˜na un programa que solicite la lectura de un n´umero entre 0 y 10 (ambos inclusive). Si el usuario teclea un n´umero fuera del rango v´alido, el programa solicitar´a nuevamente la introducci´on del valor cuantas veces sea menester.
· 113 Dise˜na un programa que solicite la lectura de un texto que no contenga letras may´usculas. Si el usuario teclea una letra may´uscula, el programa solicitar´a nuevamente la introducci´on del texto cuantas veces sea preciso.
· 114 ¿Es correcto este otro programa? ¿En qu´e se diferencia del anterior? ¿Cu´al te parece mejor (si es que alguno de ellos te parece mejor)?
circulo 4.py circulo.py 1 from math import pi 2 3 radio = float(raw_input(’Dame el radio de un c´ırculo: ’)) 4 5 opcion = ’’ 6 while opcion < ’a’ or opcion > ’c’: 7 print ’Escoge una opci´on: ’ 8 print ’a) Calcular el di´ametro.’ 9 print ’b) Calcular el per´ımetro.’ 10 print ’c) Calcular el ´area.’ 11 opcion = raw_input(’Teclea a, b o c y pulsa el retorno de carro: ’) 12 if opcion < ’a’ or opcion > ’c’: 13 print ’S´olo hay tres opciones: a, b o c. T´u has tecleado’, opcion 14 15 if opcion == ’a’: 16 diametro = 2 * radio 17 print ’El di´ametro es’, diametro 18 elif opcion == ’b’: 19 perimetro = 2 * pi * radio 20 print ’El per´ımetro es’, perimetro 21 elif opcion == ’c’: 22 area = pi * radio ** 2 23 print ’El ´area es’, area
· 115 El programa anterior pide el valor del radio al principio y, despu´es, permite seleccionar uno o m´as c´alculos con ese valor del radio. Modifica el programa para que pida el valor del radio cada vez que se solicita efectuar un nuevo c´alculo.
· 116 Un vector en un espacio tridimensional es una tripleta de valores reales (x, y, z). Deseamos confeccionar un programa que permita operar con dos vectores. El usuario ver´a en pantalla un men´u con las siguientes opciones:
Puede que necesites que te refresquemos la memoria sobre los c´alculos a realizar. Si es as´ı, la tabla 1 te ser´a de ayuda:
Operaci´on C´alculo Suma: (x 1 , y 1 , z 1 ) + (x 2 , y 2 , z 2 ) (x 1 + x 2 , y 1 + y 2 , z 1 + z 2 ) Diferencia: (x 1 , y 1 , z 1 ) − (x 2 , y 2 , z 2 ) (x 1 − x 2 , y 1 − y 2 , z 1 − z 2 ) Producto escalar: (x 1 , y 1 , z 1 ) · (x 2 , y 2 , z 2 ) x 1 x 2 + y 1 y 2 + z 1 z 2 Producto vectorial: (x 1 , y 1 , z 1 ) × (x 2 , y 2 , z 2 ) (y 1 z 2 − z 1 y 2 , z 1 x 2 − x 1 z 2 , x 1 y 2 − y 1 x 2 )
Angulo entre (´ x 1 , y 1 , z 1 ) y (x 2 , y 2 , z 2 ) 180 π · arccos
x 1 x 2 + y 1 y 2 + z 1 z 2 √ x^21 + y^21 + z^21
x^22 + y^22 + z 22
Longitud de (x, y, z)
x^2 + y^2 + z^2
Tabla 1: Recordatorio de operaciones b´asicas sobre vectores.
Tras la ejecuci´on de cada una de las acciones del men´u ´este reaparecer´a en pantalla, a menos que la opci´on escogida sea la n´umero 9. Si el usuario escoge una opci´on diferente, el programa advertir´a al usuario de su error y el men´u reaparecer´a. Las opciones 4 y 6 del men´u pueden proporcionar resultados distintos en funci´on del orden de los operandos, as´ı que, si se escoge cualquiera de ellas, deber´a mostrarse un nuevo men´u que permita seleccionar el orden de los operandos. Por ejemplo, la opci´on 4 mostrar´a el siguiente men´u:
· 130 Haz un programa que calcule el m´aximo com´un divisor (mcd) de tres enteros positivos. El mcd de tres n´umeros es el n´umero m´as grande que divide exactamente a los tres. · 131 Haz una traza del programa para el valor 125. · 132 En realidad no hace falta explorar todo el rango de n´umeros entre 2 y n − 1 para saber si un n´umero n es o no es primo. Basta con explorar el rango de n´umeros entre 2 y la parte entera de n/2. Piensa por qu´e. Modifica el programa para que s´olo exploremos ese rango. · 133 Ni siquiera hace falta explorar todo el rango de n´umeros entre 2 y n/2 para saber si un n´umero n es o no es primo. Basta con explorar el rango de n´umeros entre 2 y la parte entera de
n. (Cr´eetelo.) Modifica el programa para que s´olo exploremos ese rango. · 134 Haz un programa que vaya leyendo n´umeros y mostr´andolos por pantalla hasta que el usuario introduzca un n´umero negativo. En ese momento, el programa mostrar´a un mensaje de despedida y finalizar´a su ejecuci´on. · 135 Haz un programa que vaya leyendo n´umeros hasta que el usuario introduzca un n´umero negativo. En ese momento, el programa mostrar´a por pantalla el n´umero mayor de cuantos ha visto. · 136 ¿Qu´e resultar´a de ejecutar estos programas?
a) ejercicio for 7.py ejercicio for.py 1 for i in range( 0 , 5 ): 2 for j in range( 0 , 3 ): 3 print i, j
b) ejercicio for 8.py ejercicio for.py 1 for i in range( 0 , 5 ): 2 for j in range(i, 5 ): 3 print i, j
c) ejercicio for 9.py ejercicio for.py 1 for i in range( 0 , 5 ): 2 for j in range( 0 , i): 3 print i, j
d) ejercicio for 10.py ejercicio for.py 1 for i in range( 0 , 4 ): 2 for j in range( 0 , 4 ): 3 for k in range( 0 , 2 ): 4 print i, j, k
e) ejercicio for 11.py ejercicio for.py 1 for i in range( 0 , 4 ): 2 for j in range( 0 , 4 ): 3 for k in range(i, j): 4 print i, j, k
f) ejercicio for 12.py ejercicio for.py 1 for i in range( 1 , 5 ): 2 for j in range( 0 , 10 , i): 3 print i, j
· 137 Haz un programa que muestre la funci´on coseno en el intervalo que te indique el usuario. · 138 Modifica el programa anterior para que se muestren dos funciones a la vez: la funci´on seno y la funci´on coseno, pero cada una en un color distinto. · 139 Haz un programa que muestre la funci´on 1/(x + 1) en el intervalo [− 2 , 2] con 100 puntos azules. Ten en cuenta que la funci´on es ((problem´atica)) en x = −1, por lo que dibujaremos un punto rojo en las coordenadas (− 1 , 0). · 140 Haz un programa que, dados tres valores a, b y c, muestre la funci´on f (x) = ax^2 + bx + c en el intervalo [z 1 , z 2 ], donde z 1 y z 2 son valores proporcionados por el usuario. El programa de dibujo debe calcular el valor m´aximo y m´ınimo de f (x) en el intervalo indicado para ajustar el valor de window_coordinates de modo que la funci´on se muestre sin recorte alguno. · 141 A˜nade a la gr´afica del ejercicio anterior una representaci´on de los ejes coordenados en color azul. Dibuja con c´ırculos rojos los puntos en los que la par´abola f (x) corta el eje horizontal. Recuerda que la par´abola corta al eje horizontal en los puntos x 1 y x 2 que son soluci´on de la ecuaci´on de segundo grado ax^2 + bx + c = 0.
©c 2003 Andr´es Marzal e Isabel Gracia
· 142 ¿Qu´e pasar´ıa si los dos cuerpos ocuparan exactamente la misma posici´on en el plano? Modifica el programa para que, si se da el caso, no se produzca error alguno y finalice inmediatamente la ejecuci´on del bucle.
· 143 Modifica el programa para que la simulaci´on no finalice nunca (bueno, s´olo cuando el usuario interrumpa la ejecuci´on del programa).
· 144 ¿Ser´ıas capaz de extender el programa para que muestre la interacci´on entre tres cuerpos? Repasa la formulaci´on f´ısica del problema antes de empezar a programar.
· 145 Modifica el juego para que la barra que indica el combustible disponible se ponga de color rojo cuando quede menos del 25%.
· 146 Modifica el juego para que el usuario pueda escoger, con un men´u, un nivel de dificultad. Ofrece al menos tres niveles: f´acil, normal y dif´ıcil. Puedes modificar la dificultad del juego a voluntad alterando par´ametros como el fuel disponible, el consumo, la fuerza de la gravedad, la velocidad de desplazamiento de la plataforma, etc.
· 147 Modifica el juego para que la plataforma no est´e en el suelo, sino flotando. El usuario debe aterrizar en la plataforma desde arriba, claro est´a. Si se golpea a la plataforma desde abajo, la nave se destruir´a y el jugador habr´a fracasado.
· 148 A˜nade efectos especiales al juego. Por ejemplo, cambia el color del fondo para que sea negro y a˜nade unas estrellas. Tambi´en puedes mostrar una l´ıneas amarillas saliendo de la nave cuando se activa alg´un propulsor. Si se acciona el propulsor inferior, la l´ıneas saldr´an de debajo de la nave, y si se activa un propulsor lateral, las l´ıneas saldr´an del lado correspondiente.
· 149 Modifica el juego para que aparezca un n´umero determinado de meteoritos en pantalla (tres, por ejemplo). Cada meteorito se representar´a con un c´ırculo de color rojo y se ir´a desplazando por la pantalla. Si la nave toca un meteorito, ´esta se destruir´a.
· 150 Programa un juego de front´on electr´onico. El usuario controlar´a una raqueta en el lado inferior de la pantalla. Con la raqueta podr´a golpear una pelota que rebotar´a en las paredes. Si la pelota se sale por el borde inferior de la pantalla, el juego finaliza.
· 151 Modifica el juego del front´on para convertirlo en un teletenis. El ordenador controlar´a una raqueta en el lado superior de la imagen. No permitas que el ordenador haga trampas, es decir, la velocidad de desplazamiento de la raqueta ha de ser (como mucho) la misma que la del usuario.
· 152 ¿Qu´e se mostrar´a en pantalla al ejecutar estas sentencias?
print ’\n’
print ’\157\143\164\141\154’
print ’\t\tuna\bo’
(Te recomendamos que resuelvas este ejercicio a mano y compruebes la validez de tus respuestas con ayuda del ordenador.)
· 153 ¿C´omo crees que se pueden representar dos barras invertidas seguidas en una cadena?
· 154 La secuencia de escape \a emite un aviso sonoro (la ((campana))). ¿Qu´e hace exactamente cuando se imprime en pantalla? Ejecuta print ’\a’ y lo averiguar´as.
· 155 Averigua el c´odigo ASCII de los 10 primeros caracteres de la tabla ??.
· 156 La ´ultima letra del DNI puede calcularse a partir de sus n´umeros. Para ello s´olo tienes que dividir el n´umero por 23 y quedarte con el resto. El resto es un n´umero entre 0 y 22. La letra que corresponde a cada n´umero la tienes en esta tabla:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 T R W A G M Y F P D X B N J Z S Q V H L C K E
Dise˜na un programa que lea de teclado un n´umero de DNI y muestre en pantalla la letra que le corresponde. (Nota: una implementaci´on basada en tomar una decisi´on con if - elif conduce a un programa muy largo. Si usas el operador de indexaci´on de cadenas de forma inteligente, el programa apenas ocupa tres l´ıneas. Piensa c´omo.)
· 157 Intentamos mostrar los caracteres de la cadena en orden inverso as´ı:
a = "mi cadena"
for i in range(len(a), - 1 ):
... print a[i]
...
¿Funciona?
©c 2003 Andr´es Marzal e Isabel Gracia
· 175 Dise˜na un programa que indique si una cadena le´ıda de teclado est´a bien formada como n´umero entero. El programa escribir´a ((Es entero)) en caso afirmativo y ((No es entero)) en caso contrario. Por ejemplo, para ’12’ mostrar´a ((Es entero)), pero para ’1 2’ o ’a’ mostrar´a ((No es entero)).
· 176 Dise˜na un programa que indique si una cadena introducida por el usuario est´a bien formada como identificador de variable. Si lo est´a, mostrar´a el texto ((Identificador v´alido)) y si no, ((Identificador inv´alido)).
· 177 Dise˜na un programa que indique si una cadena le´ıda por teclado est´a bien formada como n´umero flotante. Prueba el programa con estas cadenas: ’3.1’, ’3.’, ’.1’, ’1e+5’, ’-10.2E3’, ’3.1e-2’, ’.1e01’. En todos los casos deber´a indicar que se trata de n´umeros flotantes correctamente formados.
· 178 Un texto est´a bien parentizado si por cada par´entesis abierto hay otro m´as adelante que lo cierra. Por ejemplo, la cadena
’Esto (es (un) (ejemplo (de) ((cadena) bien)) parentizada).’
est´a bien parentizada, pero no lo est´an estas otras:
’una cadena)’ ’(una cadena’ ’(una (cadena)’ ’)una( cadena’
Dise˜na un programa que lea una cadena y nos diga si la cadena est´a bien o mal parentizada.
· 179 Implementa un programa que lea de teclado una cadena que representa un n´umero binario. Si alg´un car´acter de la cadena es distinto de ’0’ o ’1’, el programa advertir´a al usuario de que la cadena introducida no representa un n´umero binario y pedir´a de nuevo la lectura de la cadena.
· 180 Haz una traza para las cadenas ’1101’ y ’010’.
· 181 Una vez m´as, nuestro aprendiz ha dise˜nado un programa diferente:
decimal 4.py decimal.py 1 bits = raw_input(’Dame un n´umero binario: ’) 2 3 valor = 0 4 for bit in bits: 5 if bit == ’1’: 6 valor = 2 * valor + 1 7 else: 8 valor = 2 * valor 9 10 print ’Su valor decimal es’, valor
¿Es correcto? Haz trazas para las cadenas ’1101’ y ’010’.
· 182 ¿Y esta otra versi´on? ¿Es correcta?
decimal 5.py decimal.py 1 bits = raw_input(’Dame un n´umero binario: ’) 2 3 valor = 0 4 for bit in bits: 5 if bit == ’1’: 6 valor += valor + 1 7 else: 8 valor += valor 9 10 print ’Su valor decimal es’, valor
Haz trazas para las cadenas ’1101’ y ’010’.
· 183 ¿Y esta otra? ¿Es correcta?
decimal 6.py decimal.py 1 bits = raw_input(’Dame un n´umero binario: ’) 2 3 valor = 0 4 for bit in bits: 5 valor += valor + int(bit) 6 7 print ’Su valor decimal es’, valor
Haz trazas para las cadenas ’1101’ y ’010’.
· 184 ¿Qu´e pasa si introducimos una cadena con caracteres que no pertenecen al conjunto de d´ıgitos binarios como, por ejemplo, ’101a2’? Modifica el programa para que, en tal caso, muestre en pantalla el mensaje ((N´umero binario mal formado)) y solicite nuevamente la introducci´on de la cadena.
· 185 Dise˜na un programa que convierta una cadena de d´ıgitos entre el (( 0 )) y el (( 7 )) al valor correspondiente a una interpretaci´on de dicha cadena como n´umero en base octal.
· 186 Dise˜na un programa que convierta una cadena de d´ıgitos o letras entre la ((a)) y la ((f)) al valor correspondiente a una interpretaci´on de dicha cadena como n´umero en base hexadecimal.
· 187 Dise˜na un programa que reciba una cadena que codifica un n´umero en octal, decimal o hexadecimal y muestre el valor de dicho n´umero. Si la cadena empieza por ((0x)) o ((0X)) se interpretar´a como un n´umero hexadecimal (ejemplo: ’0xff’ es 255); si no, si el primer car´acter es (( 0 )), la cadena se interpretar´a como un n´umero octal (ejemplo: ’017’ es 15); y si no, se interpretar´a como un n´umero decimal (ejemplo: ’99’ es 99).
· 188 Dise˜na un programa que lea un n´umero entero y muestre una cadena con su representaci´on octal.
· 189 Dise˜na un programa que lea una cadena que representa un n´umero codificado en base 8 y muestre por pantalla su representaci´on en base 2.
· 190 Una palabra es ((alfab´etica)) si todas sus letras est´an ordenadas alfab´eticamente. Por ejemplo, ((amor)), ((chino)) e ((himno)) son palabras ((alfab´eticas)). Dise˜na un programa que lea una palabra y nos diga si es alfab´etica o no.
· 191 Dise˜na un programa que nos diga si una cadena es pal´ındromo o no. Una cadena es pal´ındromo si se lee igual de izquierda a derecha que de derecha a izquierda. Por ejemplo, ’ana’ es un pal´ındromo.
· 192 Una frase es pal´ındromo si se lee igual de derecha a izquierda que de izquierda a derecha, pero obviando los espacios en blanco y los signos de puntuaci´on. Por ejemplo, las cadenas ’s´e verla al rev´es’, ’anita lava la tina’, ’luz azul’ y ’la ruta natural’ contienen frases pal´ındromas. Dise˜na un programa que diga si una frase es o no es pal´ındroma.
· 193 Probablemente el programa que has dise˜nado para el ejercicio anterior falle ante frases pal´ındromas como ´estas: ((D´abale arroz a la zorra el abad)), ((Salta Len´ın el atlas)), ((Amigo, no gima)), (( Atale, demon´´ ıaco Ca´ın, o me delata)), ((An´as us´o tu auto, Susana)), ((A Mercedes, ´ese de crema)), ((A mam´a Roma le aviva el amor a pap´a, y a pap´a Roma le aviva el amor a mam´a)) y ((¡arriba la birra!)), pues hemos de comparar ciertas letras con sus versiones acentuadas, o may´usculas o la apertura de exclamaci´on con su cierre. Modifica tu programa para que identifique correctamente frases pal´ındromas en las que pueden aparecer letras may´usculas, vocales acentuadas y la vocal ((u)) con di´eresis.
· 194 Hay un tipo de pasatiempos que propone descifrar un texto del que se han suprimido las vocales. Por ejemplo, el texto ((.n .j.mpl. d. p.s.t..mp.s)), se descifra sustituyendo cada punto con una vocal del texto. La soluci´on es ((un ejemplo de pasatiempos)). Dise˜na un programa que ayude al creador de pasatiempos. El programa recibir´a una cadena y mostrar´a otra en la que cada vocal ha sido reemplazada por un punto.
· 195 El nombre de un fichero es una cadena que puede tener lo que denominamos una extensi´on. La extensi´on de un nombre de fichero es la serie de caracteres que suceden al ´ultimo punto presente en la cadena. Si el nombre no tiene ning´un punto, asumiremos que su extensi´on es la cadena vac´ıa. Haz un programa que solicite el nombre de un fichero y muestre por pantalla los caracteres que forman su extensi´on. Prueba la validez de tu programa pidiendo que muestre la extensi´on de los nombres de fichero documento.doc y tema.1.tex, que son doc y tex, respectivamente.
· 196 Haz un programa que lea dos cadenas que representen sendos n´umeros binarios. A continuaci´on, el programa mostrar´a el n´umero binario que resulta de sumar ambos (y que ser´a otra cadena). Si, por ejemplo, el usuario introduce las cadenas ’100’ y ’111’, el programa mostrar´a como resultado la cadena ’1011’. (Nota: El procedimiento de suma con acarreo que implementes deber´a trabajar directamente con la representaci´on binaria le´ıda.)
· 197 Una de las t´ecnicas de criptograf´ıa m´as rudimentarias consiste en sustituir cada uno de los caracteres por otro situado n posiciones m´as a la derecha. Si n = 2, por ejemplo, sustituiremos la ((a)) por la ((c)), la ((b)) por la ((e)), y as´ı sucesivamente. El problema que aparece en las ´ultimas n letras del alfabeto tiene f´acil soluci´on: en el ejemplo, la letra ((y)) se sustituir´a por la ((a)) y la letra ((z)) por la ((b)). La sustituci´on debe aplicarse a las letras min´usculas y may´usculas y a los d´ıgitos (el (( 0 )) se sustituye por el (( 2 )), el (( 1 )) por el (( 3 )) y as´ı hasta llegar al (( 9 )), que se sustituye por el (( 1 ))). Dise˜na un programa que lea un texto y el valor de n y muestre su versi´on criptografiada.
· 198 Dise˜na un programa que lea un texto criptografiado siguiendo la t´ecnica descrita en el apartado anterior y el valor de n utilizado al encriptar para mostrar ahora el texto decodificado.
· 199 ¿Y si se introduce un valor de i negativo? Corrige el programa para que detecte esa posibilidad e interprete un ´ındice inicial negativo como el ´ındice 0.
· 200 ¿No ser´a tambi´en problem´atico que introduzcamos un valor del ´ındice i mayor o igual que el de j? ¿Se producir´a entonces un error de ejecuci´on? ¿Por qu´e?