P. 1
Ejercicios Python

Ejercicios Python

|Views: 2.099|Likes:
Publicado porjuhn01

More info:

Published by: juhn01 on Oct 05, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

04/29/2013

pdf

text

original

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 =
¸
5
i=1
x
i
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
=
¸
5
i=1
(x
i
− ¯ 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?
+
-
+
1 2
3
4 +
-
1 2
+
3 4
+
1 -
2 +
3 4
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.
Introducci´on a la Programaci´on con Python 1
2003/11/26-16:57
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)
4 + 6
2 + 3
c) (4/2)
5
d) (4/2)
5+1
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.0
b) 1 / 2.0 / 4.0
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.0
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) hora12
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
+
1
2
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

2 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
>>> z *= 1 + 1

>>> z /= 2

>>> z %= 3

>>> z /= 3 - 1

>>> z -= 2 + 1

>>> z -= 2

>>> z **= 3

>>> z

· 23 Eval´ ua estas expresiones y sentencias en el orden indicado:
a) a = ’b’
b) a + ’b’
c) a + ’a’
d) a * 2 + ’b’ * 3
e) 2 * (a + ’b’)
· 24 ¿Qu´e resultados se obtendr´an al evaluar las siguientes expresiones y asignaciones 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) ’a’ * 3 + ’/*’ * 5 + 2 * ’abc’ + ’+’
b) palindromo = ’abcba’
(4 * ’<’ + palindromo + ’>’ * 4) * 2
c) subcadena = ’=’ + ’-’ * 3 + ’=’
’10’ * 5 + 4 * subcadena
d) 2 * ’12’ + ’.’ + ’3’ * 3 + ’e-’ + 4 * ’76’
· 25 Identifica regularidades en las siguientes cadenas, y escribe expresiones que, partiendo de subcadenas m´as cortas y
utilizando los operadores de concatenaci´on y repetici´on, produzcan las cadenas que se muestran. Introduce variables para
formar las expresiones cuando lo consideres oportuno.
a) ’%%%%%./././<-><->’
b) ’(@)(@)(@)======(@)(@)(@)======’
c) ’asdfasdfasdf=-=-=-=-=-=-=-??????asdfasdf’
d) ’........*****---*****---........*****---*****---’
· 26 ¿Qu´e resultados se muestran al evaluar estas expresiones?
>>> ’abalorio’ < ’abecedario’

>>> ’abecedario’ < ’abecedario’

>>> ’abecedario’ <= ’abecedario’

>>> ’Abecedario’ < ’abecedario’

>>> ’Abecedario’ == ’abecedario’

>>> 124 < 13

>>> ’124’ < ’13’

>>> ’a’ < ’a’

· 27 Calcula con una ´ unica expresi´on el valor absoluto del redondeo de −3.2. (El resultado es 3.0.)
· 28 Convierte (en una ´ unica expresi´on) a una cadena el resultado de la divisi´on 5011/10000 redondeado con 3 decimales.
· 29 ¿Qu´e resulta de evaluar estas expresiones?
>>> str(2.1) + str(1.2)

>>> int(str(2) + str(3))

>>> str(int(12.3)) + ’0’

>>> int(’2’+’3’)

>>> str(2 + 3)

>>> str(int(2.1) + float(3))

Introducci´on a la Programaci´on con Python 3
2003/11/26-16:57
· 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(log10(.01) * sqrt(25))
d) round(3.21123 * log10(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 =
1
2
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 =
1
2
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.)
4 Introducci´on a la Programaci´on con Python
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 ’%d2’ % 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%dyn´umero%d’ % (1, 2)).upper()

N
´
UMERO 1 Y N
´
UMERO 2
>>> print ’n´umero%dyn´umero%d’.upper() % (1, 2)

Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: unsupported format character ’D’ (0x44) at index 8
¿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(’Tunombre:’)
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.
Introducci´on a la Programaci´on con Python 5
2003/11/26-16:57
· 49 Dibuja esta figura.
a
b
c
d
(Hemos usado los colores amarillo y magenta para las l´ıneas rectas, verde y azul para los c´ırculos y negro para las letras.)
· 50 Modifica el programa para que sea el usuario quien proporcione, mediante el teclado, el valor del porcentaje de
suspensos, aprobados, notables y sobresalientes.
· 51 Modifica el programa para que sea el usuario quien proporcione, mediante el teclado, el n´ umero de suspensos,
aprobados, notables y sobresalientes. (Antes de dibujar el gr´afico de pastel debes convertir esas cantidades en porcentajes.)
· 52 Queremos representar la informaci´on de forma diferente: mediante un gr´afico de barras. He aqu´ı c´omo:
Sus Apr Not Sob
10 %
20 %
40 %
30 %
Dise˜ na un programa que solicite por teclado el n´ umero de personas con cada una de las cuatro calificaciones y muestre el
resultado con un gr´afico de barras.
· 53 Un programador propone el siguiente programa para resolver la ecuaci´on de primer grado:
1 a = float(raw_input(’Valordea:’))
2 b = float(raw_input(’Valordeb:’))
3
4 a * x + b = 0
5
6 print ’Soluci´on:’, x
¿Es correcto este programa? Si no, explica qu´e est´a mal.
· 54 Otro programador propone este programa:
1 x = -b / a
2
3 a = float(raw_input(’Valordea:’))
4 b = float(raw_input(’Valordeb:’))
5
6 print ’Soluci´on:’, x
¿Es correcto? Si no lo es, explica qu´e est´a mal.
· 55 Un estudiante ha tecleado el ´ ultimo programa y, al ejecutarlo, obtiene este mensaje de error.
File "primer_grado4.py", line 7
if a = 0:
^
SyntaxError: invalid syntax
Aqu´ı tienes el contenido del fichero que ´el ha escrito:
primer grado 3.py E primer grado.py E
1 a = float(raw_input(’Valordea:’))
2 b = float(raw_input(’Valordeb:’))
3
4 if a != 0:
5 x = -b/a
6 print ’Soluci´on:’, x
7 if a = 0:
8 print ’Laecuaci´onnotienesoluci´on.’
Por m´as que el estudiante lee el programa, no encuentra fallo alguno.
´
El dice que la l´ınea 7, que es la marcada como err´onea,
se lee as´ı: ((si a es igual a cero. . . )) ¿Est´a en lo cierto? ¿Por qu´e se detecta un error?
6 Introducci´on a la Programaci´on con Python
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(’Valordea:’))
2 b = float(raw_input(’Valordeb:’))
3
4 if a != 0:
5 x = -b/a
6 print ’Soluci´on:’, x
7
8 print ’Laecuaci´onnotienesoluci´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(’Dameunaletramin´uscula:’)
2
3 if letra <= ’k’:
4 print ’Esdelasprimerasdelalfabeto’
5 if letra >= ’l’:
6 print ’Esdelas´ultimasdelalfabeto’
b) misterio 4.py misterio.py
1 from math import ceil # ceil redondea al alza.
2
3 grados = float(raw_input(’Dameun´angulo(engrados):’))
4
5 cuadrante = int(ceil (grados) % 360) / 90
6 if cuadrante == 0:
7 print ’primercuadrante’
8 if cuadrante == 1:
9 print ’segundocuadrante’
10 if cuadrante == 2:
11 print ’tercercuadrante’
12 if cuadrante == 3:
13 print ’cuartocuadrante’
· 63 ¿Qu´e mostrar´a por pantalla el siguiente programa?
comparaciones.py comparaciones.py
1 if 14 < 120:
2 print ’Primersaludo’
3 if ’14’ < ’120’:
4 print ’Segundosaludo’
· 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.)
Introducci´on a la Programaci´on con Python 7
2003/11/26-16:57
· 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(’Valordea:’))
4 b = float(raw_input(’Valordeb:’))
5 c = float(raw_input(’Valordec:’))
6
7 if a == 0:
8 if b == 0:
9 if c == 0:
10 print ’Laecuaci´ontieneinfinitassoluciones.’
11 else:
12 print ’Laecuaci´onnotienesoluci´on.’
13 else:
14 x = -c / b
15 print ’Soluci´ondelaecuaci´on:x=%4.3f’ % x
16 else:
17 x1 = (-b + sqrt(b**2 - 4*a*c)) / (2 * a)
18 x2 = (-b - sqrt(b**2 - 4*a*c)) / (2 * a)
19 print ’Solucionesdelaecuaci´on:x1=%4.3fyx2=%4.3f’ % (x1, x2)
· 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(’Valordea:’))
4 b = float(raw_input(’Valordeb:’))
5 c = float(raw_input(’Valordec:’))
6
7 if a == 0 and b == 0 and c == 0:
8 print ’Laecuaci´ontieneinfinitassoluciones.’
9 else:
10 if a == 0 and b == 0:
11 print ’Laecuaci´onnotienesoluci´on.’
12 else:
13 if a == 0:
14 x = -c / b
15 print ’Soluci´ondelaecuaci´on:x=%4.3f’ % x
8 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
16 else:
17 x1 = (-b + sqrt(b**2 - 4*a*c)) / (2 * a)
18 x2 = (-b - sqrt(b**2 - 4*a*c)) / (2 * a)
19 print ’Solucionesdelaecuaci´on:x1=%4.3fyx2=%4.3f’ % (x1, x2)
· 71 Ejecuta paso a paso, con ayuda del entorno de depuraci´on de PythonG, el programa del ejercicio anterior.
· 72 Dise˜ na un programa Python que lea un car´acter cualquiera desde el teclado, y muestre el mensaje ((Es una MAY
´
USCULA))
cuando el car´acter sea una letra may´ uscula y el mensaje ((Es una MIN
´
USCULA)) cuando sea una min´ uscula. En cualquier otro
caso, no mostrar´a mensaje alguno. (Considera ´ unicamente letras del alfabeto ingl´es.) Pista: aunque parezca una obviedad,
recuerda que una letra es min´ uscula si est´a entre la ’a’ y la ’z’, y may´ uscula si est´a entre la ’A’ y la ’Z’.
· 73 Ampl´ıa la soluci´on al ejercicio anterior para que cuando el car´acter introducido no sea una letra muestre el mensaje
((No es una letra)). (Nota: no te preocupes por las letras e˜ ne, ce cedilla, vocales acentuadas, etc.)
· 74 Ampl´ıa el programa del ejercicio anterior para que pueda identificar las letras e˜ ne min´ uscula y may´ uscula.
· 75 Modifica el programa que propusiste como soluci´on al ejercicio 66 sustituyendo todas las condiciones que sea posible
por cl´ausulas else de condiciones anteriores.
· 76 Un programador ha intentado solucionar el problema del discriminante negativo con un programa que empieza as´ı:
E segundo grado.py E
1 from math import sqrt
2
3 a = float(raw_input(’Valordea:’))
4 b = float(raw_input(’Valordeb:’))
5 c = float(raw_input(’Valordec:’))
6
7 if a != 0:
8 if sqrt(b**2 - 4*a*c) >= 0:
9 x1 = (-b + sqrt(b**2 - 4*a*c)) / (2 * a)
10 x2 = (-b - sqrt(b**2 - 4*a*c)) / (2 * a)
11 ...
Evidentemente, el programa es incorrecto y te sorprender´ a saber que algunos estudiantes proponen soluciones similares a
´esta. El problema estriba en el posible valor negativo del argumento de sqrt, as´ı que la comparaci´on es incorrecta, pues
pregunta por el signo de la ra´ız de dicho argumento. Pero el programa no llega siquiera a dar soluci´on alguna (bien o mal
calculada) cuando lo ejecutamos con, por ejemplo, a = 4, b = 2 y c = 4. ¿Qu´e sale por pantalla en ese caso? ¿Por qu´e?
· 77 ¿Qu´e l´ıneas del ´ ultimo programa se ejecutan y qu´e resultado aparece por pantalla en cada uno de estos casos?
a) a = 2 y b = 3. b) a = 3 y b = 2. c) a = −2 y b = 0. d) a = 1 y b = 1.
Analiza con cuidado el ´ ultimo caso. Observa que los dos n´ umeros son iguales. ¿Cu´al es, pues, el m´aximo? ¿Es correcto el
resultado del programa?
· 78 Un aprendiz de programador ha dise˜ nado este otro programa para calcular el m´aximo de dos n´ umeros:
maximo 2.py maximo.py
1 a = int(raw_input(’Dameelprimern´umero:’))
2 b = int(raw_input(’Dameelsegundon´umero:’))
3
4 if a > b:
5 maximo = a
6 if b > a:
7 maximo = b
8
9 print ’Elm´aximoes’, maximo
¿Es correcto? ¿Qu´e pasa si introducimos dos n´ umeros iguales?
· 79 ¿Qu´e secuencia de l´ıneas de este ´ ultimo programa se ejecutar´a en cada uno de estos casos?
a) a = 2, b = 3 y c = 4. b) a = 3, b = 2 y c = 4. c) a = 1, b = 1 y c = 1.
Ay´ udate con el modo de depuraci´on de PythonG.
· 80 Dise˜ na un programa que calcule el m´aximo de 5 n´ umeros enteros. Si sigues una estrategia similar a la de la primera
soluci´on propuesta para el problema del m´aximo de 3 n´ umeros, tendr´as problemas. Intenta resolverlo como en el ´ ultimo
programa de ejemplo, es decir con un ((candidato a valor m´aximo)) que se va actualizando al compararse con cada n´ umero.
Introducci´on a la Programaci´on con Python 9
2003/11/26-16:57
· 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(’Dimequ´ed´ıaeshoy:’))
2
3 if 0 < dia <= 15:
4 print ’Puedesaparcarenelladoizquierdodelacalle’
5 else:
6 if 15 < dia < 32:
7 print ’Puedesaparcarenelladoderechodelacalle’
8 else:
9 print ’Ning´unmestiene%dd´ıas.’ % dia
b) estaciones.py estaciones.py
1 mes = int(raw_input(’Dameunmes:’))
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´una~notiene%dmeses.’ % mes
c) identificador.py identificador.py
1 car = raw_input(’Dameuncar´acter:’)
2
3 if ’a’ <= car.lower() <= ’z’ or car == ’ ’:
4 print ’Estecar´acteresv´alidoenunidentificadorenPython.’
5 else:
6 if not (car < ’0’ or ’9’ < car):
7 print ’Und´ıgitoesv´alidoenunidentificadorenPython,’,
8 print ’siemprequenoseaelprimercar´acter.’
9 else:
10 print ’Car´acternov´alidoparaformarunidentificadorenPython.’
d) bisiesto.py bisiesto.py
1 anyo = int(raw_input(’Dameuna~no:’))
2
3 if anyo % 4 == 0 and (anyo % 100 != 0 or anyo % 400 == 0):
4 print ’Ela~no%desbisiesto.’ % anyo
5 else:
6 print ’Ela~no%dnoesbisiesto.’ % anyo
10 Introducci´on a la Programaci´on con Python
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 "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
· 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(’Dameelradiodeunc´ırculo:’))
4
5 print ’Escogeunaopci´on:’
6 print ’a)Calculareldi´ametro.’
7 print ’b)Calcularelper´ımetro.’
8 print ’c)Calcularel´area.’
9 opcion = raw_input(’Tecleaa,bocypulsaelretornodecarro:’)
10
11 if opcion == a:
12 diametro = 2 * radio
13 print ’Eldi´ametroes’, diametro
14 else:
15 if opcion == b:
16 perimetro = 2 * pi * radio
17 print ’Elper´ımetroes’, perimetro
18 else:
19 if opcion == c:
20 area = pi * radio ** 2
21 print ’El´areaes’, 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?
Introducci´on a la Programaci´on con Python 11
2003/11/26-16:57
· 92 El programa presenta un punto d´ebil: si el usuario escribe una letra may´ uscula en lugar de min´ uscula, no se selecciona
ninguna opci´on. Modifica el programa para que tambi´en acepte letras may´ usculas.
· 93 Modifica la soluci´on del ejercicio 87 usando ahora la estructura elif . ¿No te parece m´as legible la nueva soluci´on?
· 94 Ejecuta el ´ ultimo programa paso a paso con el entorno de depuraci´on de PythonG.
· 95 Haz una traza de este programa:
ejercicio bucle 9.py ejercicio bucle.py
1 i = 0
2 while i <= 3:
3 print i
4 i += 1
5 print ’Hecho’
· 96 Haz una traza de este programa:
ejercicio bucle 10.py ejercicio bucle.py
1 i = 0
2 while i < 10:
3 print i
4 i += 2
5 print ’Hecho’
· 97 Haz una traza de este programa:
ejercicio bucle 11.py ejercicio bucle.py
1 i = 3
2 while i < 10:
3 i += 2
4 print i
5 print ’Hecho’
· 98 Haz una traza de este programa:
ejercicio bucle 12.py ejercicio bucle.py
1 i = 1
2 while i < 100:
3 i *= 2
4 print i
· 99 Haz una traza de este programa:
ejercicio bucle 13.py ejercicio bucle.py
1 i = 10
2 while i < 2:
3 i *= 2
4 print i
· 100 Haz unas cuantas trazas de este programa para diferentes valores de i.
ejercicio bucle 14.py ejercicio bucle.py
1 i = int(raw_input(’Valorinicial:’))
2 while i < 10:
3 print i
4 i += 1
¿Qu´e ocurre si el valor de i es mayor o igual que 10? ¿Y si es negativo?
· 101 Haz unas cuantas trazas de este programa para diferentes valores de i y de limite.
ejercicio bucle 15.py ejercicio bucle.py
1 i = int(raw_input(’Valorinicial:’))
2 limite = int(raw_input(’L´ımite:’))
3 while i < limite:
4 print i
5 i += 1
· 102 Haz unas cuantas trazas de este programa para diferentes valores de i, de limite y de incremento.
12 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
ejercicio bucle 16.py ejercicio bucle.py
1 i = int(raw_input(’Valorinicial:’))
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:
C
m
n
=

n
m

=
n!
(n −m)! m!
.
Dise˜ na un programa que pida el valor de n y m y calcule C
m
n
. (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(’Introduceunn´umeropositivo:’))
4 while x < 0:
5 x = float(raw_input(’Introduceunn´umeropositivo:’))
6
7 print ’Lara´ızcuadradade%fes%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.
Introducci´on a la Programaci´on con Python 13
2003/11/26-16:57
· 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(’Dameelradiodeunc´ırculo:’))
4
5 opcion = ’’
6 while opcion < ’a’ or opcion > ’c’:
7 print ’Escogeunaopci´on:’
8 print ’a)Calculareldi´ametro.’
9 print ’b)Calcularelper´ımetro.’
10 print ’c)Calcularel´area.’
11 opcion = raw_input(’Tecleaa,bocypulsaelretornodecarro:’)
12 if opcion < ’a’ or opcion > ’c’:
13 print ’S´olohaytresopciones:a,boc.T´uhastecleado’, opcion
14
15 if opcion == ’a’:
16 diametro = 2 * radio
17 print ’Eldi´ametroes’, diametro
18 elif opcion == ’b’:
19 perimetro = 2 * pi * radio
20 print ’Elper´ımetroes’, perimetro
21 elif opcion == ’c’:
22 area = pi * radio ** 2
23 print ’El´areaes’, 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:
1) Introducir el primer vector
2) Introducir el segundo vector
3) Calcular la suma
4) Calcular la diferencia
5) Calcular el producto escalar
6) Calcular el producto vectorial
7) Calcular el ´angulo (en grados) entre ellos
8) Calcular la longitud
9) Finalizar
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
2
1
+ y
2
1
+ z
2
1

x
2
2
+ y
2
2
+ z
2
2

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:
14 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
1) Primer vector menos segundo vector
2) Segundo vector menos primer vector
Nuevamente, si el usuario se equivoca, se le advertir´a del error y se le permitir´a corregirlo.
La opci´on 8 del men´ u principal conducir´a tambi´en a un submen´ u para que el usuario decida sobre cu´al de los dos vectores
se aplica el c´alculo de longitud.
Ten en cuenta que tu programa debe contemplar y controlar toda posible situaci´on excepcional: divisiones por cero, ra´ıces
con argumento negativo, etc´etera. (Nota: La funci´on arcocoseno se encuentra disponible en el m´odulo math y su identificador
es acos.)
· 117 Haz un programa que muestre la tabla de multiplicar de un n´ umero introducido por teclado por el usuario. Aqu´ı
tienes un ejemplo de c´omo se debe comportar el programa:
Dame un n´umero: 5
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
· 118 Realiza un programa que proporcione el desglose en billetes y monedas de una cantidad entera de euros. Recuerda
que hay billetes de 500, 200, 100, 50, 20, 10 y 5 ¤ y monedas de 2 y 1 ¤. Debes ((recorrer)) los valores de billete y moneda
disponibles con uno o m´as bucles for-in.
· 119 Haz un programa que muestre la ra´ız n-´esima de un n´ umero le´ıdo por teclado, para n tomando valores entre 2 y
100.
· 120 Haz un programa que muestre, en l´ıneas independientes, todos los n´ umeros pares comprendidos entre 0 y 200 (ambos
inclusive).
· 121 Haz un programa que muestre, en l´ıneas independientes y en orden inverso, todos los n´ umeros pares comprendidos
entre 0 y 200 (ambos inclusive).
· 122 Escribe un programa que muestre los n´ umeros pares positivos entre 2 y un n´ umero cualquiera que introduzca el
usuario por teclado.
· 123 Haz un programa que pida el valor de dos enteros n y m y que muestre por pantalla el valor de
m
¸
i=n
i.
Debes usar un bucle for-in para el c´alculo del sumatorio.
· 124 Haz un programa que pida el valor de dos enteros n y m y que muestre por pantalla el valor de
m
¸
i=n
i
2
.
· 125 Haz un programa que pida el valor de dos enteros n y m y calcule el sumatorio de todos los n´ umeros pares
comprendidos entre ellos (incluy´endolos en el caso de que sean pares).
· 126 Haz un traza del programa para los siguientes n´ umeros:
a) 4 b) 13 c) 18 d) 2 (¡ojo con ´este!)
· 127 Haz una traza del ´ ultimo programa para el n´ umero 125.
· 128 Haz una traza del ´ ultimo programa para el n´ umero 125.
· 129 Haz un programa que calcule el m´aximo com´ un divisor (mcd) de dos enteros positivos. El mcd es el n´ umero m´as
grande que divide exactamente a ambos n´ umeros.
Introducci´on a la Programaci´on con Python 15
2003/11/26-16:57
· 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.
16 Introducci´on a la Programaci´on con Python
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 = "micadena"

>>> for i in range(len(a), -1):

... print a[i]

...

¿Funciona?
Introducci´on a la Programaci´on con Python 17
2003/11/26-16:57
· 158 Intentamos mostrar los caracteres de la cadena en orden inverso as´ı:
>>> a = "micadena"

>>> for i in range(len(a)-1, -1, -1):

... print a[i]

...

¿Funciona?
· 159 Dise˜ na un programa que lea una cadena y muestre el n´ umero de espacios en blanco que contiene.
· 160 Dise˜ na un programa que lea una cadena y muestre el n´ umero de letras may´ usculas que contiene.
· 161 Dise˜ na una programa que lea una cadena y muestra en pantalla el mensaje ((Contiene d´ıgito)) si contiene alg´ un
d´ıgito y ((No contiene d´ıgito)) en caso contrario.
· 162 Haz una traza del programa para la cadena ’ab’. ¿Qu´e l´ıneas se ejecutan y qu´e valores toman las variables cambios,
anterior y caracter tras la ejecuci´on de cada una de ellas?
· 163
´
Idem para la cadena ’ab’.
· 164 ¿Funciona el programa cuando introducimos una cadena formada s´olo por espacios en blanco? ¿Por qu´e? Si su
comportamiento no te parece normal, corr´ıgelo.
· 165 Modifica el programa para que base el c´omputo de palabras en el n´ umero de transiciones de blanco a no blanco en
lugar de en el n´ umero de transiciones de no blanco a blanco. Comprueba si tu programa funciona en toda circunstancia.
· 166 Nuestro aprendiz aventajado propone esta otra soluci´on al problema de contar palabras:
1 cadena = raw_input(’Escribeunafrase:’)
2 while cadena != ’’:
3 cambios = 0
4 for i in range(1, len(cadena)):
5 if cadena[i] == ’’ and cadena[i-1] != ’’:
6 cambios = cambios + 1
7
8 if cadena[-1] == ’’:
9 cambios = cambios - 1
10
11 palabras = cambios + 1
12 print ’Palabras:’, palabras
13
14 cadena = raw_input(’Escribeunafrase:’)
¿Es correcta?
· 167 Dise˜ na un programa que lea una cadena y un n´ umero entero k y nos diga cu´antas palabras tienen una longitud de
k caracteres.
· 168 Dise˜ na un programa que lea una cadena y un n´ umero entero k y nos diga si alguna de sus palabras tiene una longitud
de k caracteres.
· 169 Dise˜ na un programa que lea una cadena y un n´ umero entero k y nos diga si todas sus palabras tienen una longitud
de k caracteres.
· 170 Escribe un programa que lea una cadena y un n´ umero entero k y muestre el mensaje ((Hay palabras largas)) si
alguna de las palabras de la cadena es de longitud mayor o igual que k, y ((No hay palabras largas)) en caso contrario.
· 171 Escribe un programa que lea una cadena y un n´ umero entero k y muestre el mensaje ((Todas son cortas)) si todas
las palabras de la cadena son de longitud estrictamente menor que k, y ((Hay alguna palabra larga)) en caso contrario.
· 172 Escribe un programa que lea una cadena y un n´ umero entero k y muestre el mensaje ((Todas las palabras son
largas)) si todas las palabras de la cadena son de longitud mayor o igual que k, y ((Hay alguna palabra corta)) en caso
contrario.
· 173 Dise˜ na un programa que muestre la cantidad de d´ıgitos que aparecen en una cadena introducida por teclado. La
cadena ’un1yun20’, por ejemplo, tiene 3 d´ıgitos: un 1, un 2 y un 0.
· 174 Dise˜ na un programa que muestre la cantidad de n´ umeros que aparecen en una cadena le´ıda de teclado. ¡Ojo! Con
n´ umero no queremos decir d´ıgito, sino n´ umero propiamente dicho, es decir, secuencia de d´ıgitos. La cadena ’un1,un201y2unos’,
por ejemplo, tiene 3 n´ umeros: el 1, el 201 y el 2.
18 Introducci´on a la Programaci´on con Python
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 ’12’ 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:
’unacadena)’ ’(unacadena’ ’(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(’Dameunn´umerobinario:’)
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 ’Suvalordecimales’, 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(’Dameunn´umerobinario:’)
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 ’Suvalordecimales’, valor
Haz trazas para las cadenas ’1101’ y ’010’.
· 183 ¿Y esta otra? ¿Es correcta?
decimal 6.py decimal.py
1 bits = raw_input(’Dameunn´umerobinario:’)
2
3 valor = 0
4 for bit in bits:
5 valor += valor + int(bit)
6
7 print ’Suvalordecimales’, valor
Haz trazas para las cadenas ’1101’ y ’010’.
Introducci´on a la Programaci´on con Python 19
2003/11/26-16:57
· 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´everlaalrev´es’, ’anitalavalatina’, ’luzazul’
y ’larutanatural’ 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?
20 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 201 Dise˜ na un programa que, dados una cadena c, un ´ındice i y un n´ umero n, muestre la subcadena de c formada por
los n caracteres que empiezan en la posici´on de ´ındice i.
· 202 Si a vale ’Ejemplo’, ¿qu´e es el corte a[:]?
· 203 ¿Qu´e corte utilizar´ıas para obtener los n caracteres de una cadena a partir de la posici´on de ´ındice i?
· 204 Dise˜ na un programa que, dada una cadena, muestre por pantalla todos sus prefijos. Por ejemplo, dada la cadena
’UJI’, por pantalla debe aparecer:
U
UJ
UJI
· 205 Dise˜ na un programa que lea una cadena y muestre por pantalla todas sus subcadenas de longitud 3.
· 206 Dise˜ na un programa que lea una cadena y un entero k y muestre por pantalla todas sus subcadenas de longitud k.
· 207 Dise˜ na un programa que lea dos cadenas a y b y nos diga si b es un prefijo de a o no.
(Ejemplo: ’sub’ es un prefijo de ’subcadena’.)
· 208 Dise˜ na un programa que lea dos cadenas a y b y nos diga si b es una subcadena de a o no.
(Ejemplo: ’de’ es una subcadena de ’subcadena’.)
· 209 Dise˜ na un programa que lea dos cadenas y devuelva el prefijo com´ un m´as largo de ambas.
(Ejemplo: las cadenas ’polit´ecnico’ y ’polinizaci´on’ tienen como prefijo com´ un m´as largo a la cadena ’poli’.)
· 210 Dise˜ na un programa que lea tres cadenas y muestre el prefijo com´ un m´as largo de todas ellas.
(Ejemplo: las cadenas ’polit´ecnico’, ’polinizaci´on’ y ’poros’ tienen como prefijo com´ un m´as largo a la cadena
’po’.)
· 211 El programa no funcionar´a bien con cualquier carta. Por ejemplo, si la variable texto vale ’Hola=A.=’ el programa
falla. ¿Por qu´e? ¿Sabr´ıas corregir el programa?
· 212 Dibuja un diagrama con el estado de la memoria tras ejecutar estas sentencias:
>>> a = ’cadena’

>>> b = a[2:3]

>>> c = b + ’’

· 213 Dibuja diagramas que muestren el estado de la memoria paso a paso para esta secuencia de asignaciones.
>>> a = ’ab’

>>> a *= 3

>>> b = a

>>> c = a[:]

>>> c = c + b

¿Qu´e se mostrar´a por pantalla si imprimimos a, b y c al final?
· 214 ¿Qu´e aparecer´a por pantalla al evaluar la expresi´on [1][0]? ¿Y al evaluar la expresi´on [][0]?
· 215 Hemos asignado a x la lista [1, 2, 3] y ahora queremos asignar a y una copia. Podr´ıamos hacer y = x[:], pero
parece que y = x + [] tambi´en funciona. ¿Es as´ı? ¿Por qu´e?
· 216 ¿Qu´e aparecer´a por pantalla al ejecutar este programa?
1 print ’Principio’
2 for i in []:
3 print ’paso’, i
4 print ’yfin’
· 217 ¿Qu´e aparecer´a por pantalla al ejecutar este programa?
1 for i in [1] * 10:
2 print i
· 218 ¿Sabr´ıas decir que resultados se mostrar´an al ejecutar estas sentencias?
Introducci´on a la Programaci´on con Python 21
2003/11/26-16:57
>>> [1, 2] < [1, 2]

>>> [1, 2, 3] < [1, 2]

>>> [1, 1] < [1, 2]

>>> [1, 3] < [1, 2]

>>> [10, 20, 30] > [1, 2, 3]

>>> [10, 20, 3] > [1, 2, 3]

>>> [10, 2, 3] > [1, 2, 3]

>>> [1, 20, 30] > [1, 2, 3]

>>> [0, 2, 3] <= [1, 2, 3]

>>> [1] < [2, 3]

>>> [1] < [1, 2]

>>> [1, 2] < [0]

· 219 Dise˜ na un programa que tras asignar dos listas a sendas variables nos diga si la primera es menor que la segunda.
No puedes utilizar operadores de comparaci´on entre listas para implementar el programa.
· 220 ¿Qu´e ocurrir´a al ejecutar estas ´ordenes Python?
>>> a = [1, 2, 3]

>>> a is a

>>> a + [] is a

>>> a + [] == a

· 221 Explica, con la ayuda de un gr´afico que represente la memoria, los resultados de evaluar estas expresiones:
>>> a = [1, 2, 1]

>>> b = [1, 2, 1]

>>> (a[0] is b[0]) and (a[1] is b[1]) and (a[2] is b[2])

True
>>> a == b

True
>>> a is b

False
· 222 ¿Qu´e ocurrir´a al ejecutar estas ´ordenes Python?
>>> [1, 2] == [1, 2]

>>> [1, 2] is [1, 2]

>>> a = [1, 2, 3]

>>> b = [a[0], a[1], a[2]]

>>> a == b

>>> a is b

>>> a[0] == b[1]

>>> b is [b[0], b[1], b[2]]

· 223 Que se muestra por pantalla como respuesta a cada una de estas sentencias Python:
>>> a = [1, 2, 3, 4, 5]

>>> b = a[1:3]

>>> c = a

>>> d = a[:]

>>> a == c

>>> a == d

>>> c == d

>>> a == b

>>> a is c

>>> a is d

>>> c is d

>>> a is b

· 224 Haz un programa que almacene en una variable a la lista obtenida con range(1,4) y, a continuaci´on, la modifique
para que cada componente sea igual al cuadrado del componente original. El programa mostrar´a la lista resultante por
pantalla.
22 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 225 Haz un programa que almacene en a una lista obtenida con range(1,n), donde n es un entero que se pide al usuario
y modifique dicha lista para que cada componente sea igual al cuadrado del componente original. El programa mostrar´a la
lista resultante por pantalla.
· 226 Haz un programa que, dada una lista a cualquiera, sustituya cualquier elemento negativo por cero.
· 227 ¿Qu´e mostrar´a por pantalla el siguiente programa?
copias 2.py copias.py
1 a = range(0, 5)
2 b = range(0, 5)
3 c = a
4 d = b[:]
5 e = a + b
6 f = b[:1]
7 g = b[0]
8 c[0] = 100
9 d[0] = 200
10 e[0] = 300
11 print a, b, c, d, e, f, g
Comprueba con el ordenador la validez de tu respuesta.
· 228 Representa el estado de la memoria tras efectuar cada una de las siguientes asignaciones:
>>> a = [1, 2, 1]

>>> b = 1

>>> c = [2, 1, 2]

>>> d = c

>>> d[2] = 3

>>> e = d[:1]

>>> f = d[:]

>>> f[0] = a[1]

>>> f[1] = 1

· 229 Dise˜ na un programa que construya una lista con los n primeros n´ umeros primos (ojo: no los primos entre 1 y n, sino
los n primeros n´ umeros primos). ¿Necesitas usar append? ¿Puedes reservar en primer lugar un vector con n celdas nulas y
asignarle a cada una de ellas uno de los n´ umeros primos?
· 230 Dise˜ na un programa que lea una lista de 10 enteros, pero asegur´andose de que todos los n´ umeros introducidos por
el usuario son positivos. Cuando un n´ umero sea negativo, lo indicaremos con un mensaje y permitiremos al usuario repetir
el intento cuantas veces sea preciso.
· 231 Dise˜ na un programa que lea una cadena y muestre por pantalla una lista con todas sus palabras en min´ usculas. La
lista devuelta no debe contener palabras repetidas.
Por ejemplo: ante la cadena
’Unafraseformadaconpalabras.Otrafraseconotraspalabras.’,
el programa mostrar´a la lista
[’una’, ’frase’, ’formada’, ’con’, ’palabras’, ’otra’, ’otras’].
Observa que en la lista no aparece dos veces la palabra ((frase)), aunque s´ı aparec´ıa dos veces en la cadena le´ıda.
· 232 ¿Qu´e sale por pantalla al ejecutar este programa?:
1 a = range(0, 5)
2 del a[1]
3 del a[1]
4 print a
· 233 Dise˜ na un programa que elimine de una lista todos los elementos de ´ındice par y muestre por pantalla el resultado.
(Ejemplo: si trabaja con la lista [1, 2, 1, 5, 0, 3], ´esta pasar´a a ser [2, 5, 3].)
· 234 Dise˜ na un programa que elimine de una lista todos los elementos de valor par y muestre por pantalla el resultado.
(Ejemplo: si trabaja con la lista [1, -2, 1, -5, 0, 3], ´esta pasar´a a ser [1, 1, -5, 3].)
Introducci´on a la Programaci´on con Python 23
2003/11/26-16:57
· 235 A nuestro programador novato se le ha ocurrido esta otra forma de eliminar el elemento de ´ındice i de una lista a:
1 a = a[:i] + a[i+1:]
¿Funciona? Si no es as´ı, ¿por qu´e? Y si funciona correctamente, ¿qu´e diferencia hay con respecto a usar del a[i]?
· 236 ¿Por qu´e este otro programa es err´oneo?
pertenencia 2.py E pertenencia.py E
1 elemento = 5
2 lista = [1, 4, 5, 1, 3, 8]
3
4 for i in lista:
5 if elemento == i:
6 pertenece = True
7 else:
8 pertenece = False
9 break
10
11 if pertenece:
12 print ’Pertenece’
13 else:
14 print ’Nopertenece’
· 237 ¿Qu´e hace este programa?
1 letra = raw_input(’Dameunaletra:’)
2 if (len(letra) == 1 and ’a’<=letra <=’z’) or letra in [’´a’,’´e’,’´ı’,’´o’,’´u’,’¨u’,’~n’]:
3 print letra, ’esunaletramin´uscula’
· 238 ¿Qu´e hace este programa?
1 letra = raw_input(’Dameunaletra:’)
2 if len(letra) == 1 and (’a’<= letra <=’z’ or letra in ’´a´e´ı´o´u¨ u~n’):
3 print letra, ’esunaletramin´uscula’
· 239 ¿Qu´e ocurrir´a si sustituimos la primera l´ınea de burbuja.py por esta otra?:
1 lista = [’Pepe’, ’Juan’, ’Mar´ıa’, ’Ana’, ’Luis’, ’Pedro’]
· 240 En una cadena llamada texto disponemos de un texto formado por varias frases. ¿Con qu´e orden simple puedes
contar el n´ umero de frases?
· 241 En una cadena llamada texto disponemos de un texto formado por varias frases. Escribe un programa que determine
y muestre el n´ umero de palabras de cada frase.
· 242 ¿Qu´e resulta de ejecutar esta orden?
>>> print ’’.join([’uno’, ’dos’, ’tres’])

· 243 Disponemos de una cadena que contiene una frase cuyas palabras est´an separadas por un n´ umero arbitrario de
espacios en blanco. ¿Podr´ıas ((estandarizar)) la separaci´on de palabras en una sola l´ınea Python? Por estandarizar queremos
decir que la cadena no empiece ni acabe con espacios en blanco y que cada palabra se separe de la siguiente por un ´ unico
espacio en blanco.
· 244 Una matriz nula es aquella que s´olo contiene ceros. Construye una matriz nula de 5 filas y 5 columnas.
· 245 Una matriz identidad es aquella cuyos elementos en la diagonal principal, es decir, accesibles con una expresi´on de
la forma M[i][i], valen uno y el resto valen cero. Construye una matriz identidad de 4 filas y 4 columnas.
· 246 ¿Qu´e resulta de ejecutar este programa?
1 M = [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]
2 print M[-1][0]
3 print M[-1][-1]
4 print ’--’
5 for i in range(0, 3):
6 print M[i]
7 print ’--’
8 for i in range(0, 3):
9 for j in range(0, 3):
10 print M[i][j]
24 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 247 ¿Qu´e resulta de ejecutar este programa?
1 M = [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]
2 s = 0.0
3 for i in range(0, 3):
4 for j in range(0, 3):
5 s += M[i][j]
6 print s / 9.0
· 248 Crea la siguiente matriz utilizando la t´ecnica del bucle descrita anteriormente.

¸
¸
¸
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
¸

· 249 Haz un programa que pida un entero positivo n y almacene en una variable M la matriz identidad de n ×n (la que
tiene unos en la diagonal principal y ceros en el resto de celdas).
· 250 Dise˜ na un programa que lea dos matrices y calcule la diferencia entre la primera y la segunda.
· 251 Dise˜ na un programa que lea una matriz y un n´ umero y devuelva una nueva matriz: la que resulta de multiplicar la
matriz por el n´ umero. (El producto de un n´ umero por una matriz es la matriz que resulta de multiplicar cada elemento por
dicho n´ umero.)
· 252 La traspuesta de una matriz A de dimensi´on m×n es una matriz A
T
de dimensi´on n ×m tal que A
T
i,j
= A
j,i
. Por
ejemplo, si
A =

¸
¸
¸
1 2 3
2 12 6
1 0 −3
10 −1 0
¸

entonces:
A
T
=

¸
1 2 1 10
2 12 0 −1
3 6 −3 0
¸

Dise˜ na un programa que lea una matriz y muestre su traspuesta.
· 253 Dise˜ na un programa tal que lea una matriz A de dimensi´on m×n y muestre un vector v de talla n tal que
v
i
=
m
¸
j=1
A
i,j
,
para i entre 1 y n.
· 254 Dise˜ na un programa que lea una matriz A de dimensi´on m×n y muestre un vector v de talla min(n, m) tal que
v
i
=
i
¸
j=1
i
¸
k=1
A
j,k
,
para i entre 1 y min(n, m).
· 255 Dise˜ na un programa que determine si una matriz es prima o no. Una matriz A es prima si la suma de los elementos
de cualquiera de sus filas es igual a la suma de los elementos de cualquiera de sus columnas.
· 256 Una matriz es diagonal superior si todos los elementos por debajo de la diagonal principal son nulos. Por ejemplo,
esta matriz es diagonal superior:
A =

¸
¸
¸
1 2 3
0 12 6
0 0 −3
0 0 0
¸

Dise˜ na un programa que diga si una matriz es o no es diagonal superior.
· 257 ¿Funciona esta otra forma de contar los vecinos de la casilla de la fila y y columna x?
n = -tablero[y][x]
for i in [-1, 0, 1]:
for j in [-1, 0, 1]:
if y+i >= 0 and y+i < filas and x+j >= 0 and x+j <columnas:
n += tablero[y+i,x+j]
Introducci´on a la Programaci´on con Python 25
2003/11/26-16:57
· 258 El ((juego de la vida parametrizado)) es una generalizaci´on del juego de la vida. En ´el, el n´ umero de vecinos vivos
necesarios para activar las reglas de nacimiento, supervivencia, aislamiento y superpoblaci´on est´an parametrizados. Haz un
programa que solicite al usuario el n´ umero de c´elulas vecinas vivas necesarias para que se disparen las diferentes reglas y
muestre c´ omo evoluciona el tablero con ellas.
· 259 El juego de la vida toroidal se juega sobre un tablero de dimensi´on finita m × n con unas reglas de vecindad
diferentes. Una casilla de coordenadas (y, x) tiene siempre 8 vecinas, aunque est´e en un borde:
((y −1) mod m, (x −1) mod n) ((y −1) mod m, x) ((y −1) mod m, (x + 1) mod n)
(y, (x −1) mod n) (y, (x + 1) mod n)
((y + 1) mod m, (x −1) mod n) ((y + 1) mod m, x) ((y + 1) mod m, (x + 1) mod n)
donde mod es el operador m´odulo (en Python, %).
Implementa el juego de la vida toroidal en el entorno PythonG.
· 260 El juego de la vida es un tipo particular de aut´omata celular bidimensional . Hay aut´omatas celulares unidimensio-
nales. En ellos, una lista de valores (en su versi´on m´as simple, ceros y unos) evoluciona a lo largo del tiempo a partir del
estado de sus celdas vecinas (solo las celdas izquierda y derecha en su versi´on m´as simple) y de ella misma en el instante
anterior.
Por ejemplo, una regla 001 → 1 se lee como ((la c´elula est´a viva si en la iteraci´on anterior estaba muerta y ten´ıa una
c´elula muerta a la izquierda y una c´elula viva a la derecha)). Una especificaci´on completa tiene este aspecto:
000 →0 001 →1 010 →1 011 →0 100 →1 101 →1 110 →0 111 →0
Y aqu´ı tienes una representaci´on (usando asteriscos para los unos y puntos para los ceros) de la evoluci´on del sistema durante
sus primeros pulsos partiendo de una configuraci´on muy sencilla (un solo uno):
Pulso 0 : . . . . . . . . . . * . . . . . . . . . .
Pulso 1 : . . . . . . . . . * * * . . . . . . . . .
Pulso 2 : . . . . . . . . * . . . * . . . . . . . .
Pulso 3 : . . . . . . . * * * . * * * . . . . . . .
Pulso 4 : . . . . . . * . . . * . . . * . . . . . .
Pulso 5 : . . . . . * * * . * * * . * * * . . . . .
Pulso 6 : . . . . * . . . * . . . * . . . * . . . .
Implementa un programa para estudiar la evoluci´on de aut´omatas celulares unidimensionales. El programa leer´a un
conjunto de reglas por teclado y un n´ umero de pulsos. A continuaci´on, mostrar´a en el t´erminal de texto la evoluci´on del
aut´omata partiendo de una configuraci´on con s´olo una celda viva que ocupa la posici´on central del universo.
Cuando tengas el programa, explora las siguientes reglas:
000 →0 001 →1 010 →1 011 →1 100 →1 101 →0 110 →0 111 →0
000 →0 001 →0 010 →1 011 →1 100 →1 101 →0 110 →0 111 →0
000 →0 001 →1 010 →1 011 →1 100 →0 101 →1 110 →1 111 →0
000 →0 001 →1 010 →1 011 →1 100 →0 101 →1 110 →1 111 →0
000 →0 001 →1 010 →1 011 →0 100 →1 101 →1 110 →0 111 →1
· 261 Modifica el programa del ejercicio anterior para obtener una representaci´on gr´afica en PythonG. Tradicionalmente
se muestra en cada fila el estado del ((tablero unidimensional)) en cada pulso. As´ı se puede estudiar mejor la evoluci´on del
aut´omata.
Aqu´ı tienes lo que deber´ıa mostrar tu programa para el ´ ultimo juego de reglas del ejercicio anterior:
· 262 Define una funci´on llamada raiz_cubica que devuelva el valor de
3

x.
(Nota: recuerda que
3

x es x
1/3
y ´andate con ojo, no sea que utilices una divisi´on entera y eleves x a la potencia 0, que
es el resultado de calcular 1/3.)
26 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 263 Define una funci´on llamada area_circulo que, a partir del radio de un c´ırculo, devuelva el valor de su ´area. Utiliza
el valor 3.1416 como aproximaci´on de π o importa el valor de π que encontrar´as en el m´odulo math.
(Recuerda que el ´area de un c´ırculo es πr
2
.)
· 264 Define una funci´on que convierta grados Farenheit en grados cent´ıgrados.
(Para calcular los grados cent´ıgrados has de restar 32 a los grados Farenheit y multiplicar el resultado por cinco novenos.)
· 265 Define una funci´on que convierta grados cent´ıgrados en grados Farenheit.
· 266 Define una funci´on que convierta radianes en grados.
(Recuerda que 360 grados son 2π radianes.)
· 267 Define una funci´on que convierta grados en radianes.
· 268 ¿Es este programa equivalente al que acabamos de ver?
mayoria edad 3.py mayoria edad.py
1 def mayoria_de_edad(edad):
2 if edad < 18:
3 return False
4 return True
· 269 ¿Es este programa equivalente al que acabamos de ver?
mayoria edad 4.py mayoria edad.py
1 def mayoria_de_edad(edad):
2 return edad >= 18
· 270 La ´ ultima letra del DNI puede calcularse a partir del n´ umero. Para ello s´olo tienes que dividir el n´ umero por 23 y
quedarte con el resto, que 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
Define una funci´on que, dado un n´ umero de DNI, devuelva la letra que le corresponde.
· 271 Dise˜ na una funci´on que reciba una cadena y devuelva cierto si empieza por min´ uscula y falso en caso contrario.
· 272 Dise˜ na una funci´on llamada es_repeticion que reciba una cadena y nos diga si la cadena est´a formada mediante la
concatenaci´on de una cadena consigo misma. Por ejemplo, es_repeticion(’abab’) devolver´a True, pues la cadena ’abab’
est´a formada con la cadena ’ab’ repetida; por contra es_repeticion(’ababab’) devolver´a False.
· 273 ¿En qu´e se ha equivocado nuestro aprendiz de programador al escribir esta funci´on?
perfecto 2.py E perfecto.py E
1 def es_perfecto(n):
2 for i in range(1, n):
3 sumatorio = 0
4 if n % i == 0:
5 sumatorio += i
6 return sumatorio == n
· 274 Mejora la funci´on es_perfecto haci´endola m´as r´apida. ¿Es realmente necesario considerar todos los n´ umeros entre 1
y n-1?
· 275 Dise˜ na una funci´on que devuelva una lista con los n´ umeros perfectos comprendidos entre 1 y n, siendo n un entero
que nos proporciona el usuario.
· 276 Define una funci´on que devuelva el n´ umero de d´ıas que tiene un a˜ no determinado. Ten en cuenta que un a˜ no es
bisiesto si es divisible por 4 y no divisible por 100, excepto si es tambi´en divisible por 400, en cuyo caso es bisiesto.
(Ejemplos: El n´ umero de d´ıas de 2002 es 365: el n´ umero 2002 no es divisible por 4, as´ı que no es bisiesto. El a˜ no 2004 es
bisiesto y tiene 366 d´ıas: el n´ umero 2004 es divisible por 4, pero no por 100, as´ı que es bisiesto. El a˜ no 1900 es divisible por
4, pero no es bisiesto porque es divisible por 100 y no por 400. El a˜ no 2000 s´ı es bisiesto: el n´ umero 2000 es divisible por 4
y, aunque es divisible por 100, tambi´en lo es por 400.)
· 277 Dise˜ na una funci´on que calcule el sumatorio de la diferencia entre n´ umeros contiguos en una lista. Por ejemplo, para
la lista [1, 3, 6, 10] devolver´a 9, que es 2 + 3 + 4 (el 2 resulta de calcular 3 − 1, el 3 de calcular 6 − 3 y el 4 de calcular
10 −6).
¿Sabes efectuar el c´alculo de ese sumatorio sin utilizar bucles (ni la funci´on sum)?
· 278 Haz una traza de la llamada maximo([6, 2, 7, 1, 10, 1, 0]).
Introducci´on a la Programaci´on con Python 27
2003/11/26-16:57
· 279 Dise˜ na una funci´on que, dada una lista de n´ umeros enteros, devuelva el n´ umero de ((series)) que hay en ella. Llamamos
((serie)) a todo tramo de la lista con valores id´enticos.
Por ejemplo, la lista [1, 1, 8, 8, 8, 8, 0, 0, 0, 2, 10, 10] tiene 5 ((series)) (ten en cuenta que el 2 forma parte de una
((serie)) de un solo elemento).
· 280 Dise˜ na una funci´on que diga en qu´e posici´on empieza la ((serie)) m´as larga de una lista. En el ejemplo del ejercicio
anterior, la ((serie)) m´as larga empieza en la posici´on 2 (que es el ´ındice donde aparece el primer 8). (Nota: si hay dos ((series)) de
igual longitud y ´esta es la mayor, debes devolver la posici´on de la primera de las ((series)). Por ejemplo, para [8, 2, 2, 9, 9]
deber´as devolver la posici´on 1.)
· 281 Haz una funci´on que reciba una lista de n´ umeros y devuelva la media de dichos n´ umeros. Ten cuidado con la lista
vac´ıa (su media es cero).
· 282 Dise˜ na una funci´on que calcule el productorio de todos los n´ umeros que componen una lista.
· 283 Dise˜ na una funci´on que devuelva el valor absoluto de la m´axima diferencia entre dos elementos consecutivos de una
lista. Por ejemplo, el valor devuelto para la lista [1, 10, 2, 6, 2, 0] es 9, pues es la diferencia entre el valor 1 y el valor 10.
· 284 Dise˜ na una funci´on que devuelva el valor absoluto de la m´axima diferencia entre cualquier par de elementos de una
lista. Por ejemplo, el valor devuelto para la lista [1, 10, 2, 6, 8, 2 0] es 9, pues es la diferencia entre el valor 10 y el valor
0. (Pista: te puede convenir conocer el valor m´aximo y el valor m´ınimo de la lista.)
· 285 Modifica la funci´on del ejercicio anterior para que devuelva el valor 0 tan pronto encuentre un 0 en la lista.
· 286 Define una funci´on que, dada una cadena x, devuelva otra cuyo contenido sea el resultado de concatenar 6 veces x
consigo misma.
· 287 Dise˜ na una funci´on que, dada una lista de cadenas, devuelva la cadena m´as larga. Si dos o m´as cadenas miden lo
mismo y son las m´as largas, la funci´on devolver´a una cualquiera de ellas.
(Ejemplo: dada la lista [’Pepe’, ’Juan’, ’Mar´ıa’, ’Ana’], la funci´on devolver´a la cadena ’Mar´ıa’.)
· 288 Dise˜ na una funci´on que, dada una lista de cadenas, devuelva una lista con todas las cadenas m´as largas, es decir, si
dos o m´as cadenas miden lo mismo y son las m´as largas, la lista las contendr´a a todas.
(Ejemplo: dada la lista [’Pepe’, ’Ana’, ’Juan’, ’Paz’], la funci´on devolver´a la lista de dos elementos [’Pepe’, ’Juan’].)
· 289 Dise˜ na una funci´on que reciba una lista de cadenas y devuelva el prefijo com´ un m´as largo. Por ejemplo, la cadena
’pol’ es el prefijo com´ un m´as largo de esta lista:
[’poliedro’, ’polic´ıa’, ’pol´ıfona’, ’polinizar’, ’polaridad’, ’pol´ıtica’]
· 290 Define una funci´on que, dado el valor de los tres lados de un tri´angulo, devuelva la longitud de su per´ımetro.
· 291 Define una funci´on que, dados dos par´ametros b y x, devuelva el valor de log
b
(x), es decir, el logaritmo en base b de
x.
· 292 Dise˜ na una funci´on que devuelva la soluci´on de la ecuaci´on lineal ax+b = 0 dados a y b. Si la ecuaci´on tiene infinitas
soluciones o no tiene soluci´on alguna, la funci´on lo detectar´a y devolver´a el valor None.
· 293 Dise˜ na una funci´on que calcule
¸
b
i=a
i dados a y b. Si a es mayor que b, la funci´on devolver´a el valor 0.
· 294 Dise˜ na una funci´on que calcule
¸
b
i=a
i dados a y b. Si a es mayor que b, la funci´on devolver´a el valor 0. Si 0 se
encuentra entre a y b, la funci´on devolver´a tambi´en el valor cero, pero sin necesidad de iterar en un bucle.
· 295 Define una funci´on llamada raiz_n_esima que devuelva el valor de
n

x. (Nota: recuerda que
n

x es x
1/n
).
· 296 Haz una funci´on que reciba un n´ umero de DNI y una letra. La funci´on devolver´a True si la letra corresponde a ese
n´ umero de DNI, y False en caso contrario. La funci´on debe llamarse comprueba_letra_dni .
Si lo deseas, puedes llamar a la funci´on letra_dni , desarrollada en el ejercicio 270, desde esta nueva funci´on.
· 297 Dise˜ na una funci´on que diga (mediante la devoluci´on de True o False) si dos n´ umeros son amigos. Dos n´ umeros son
amigos si la suma de los divisores del primero (exclu´ıdo ´el) es igual al segundo y viceversa.
· 298 ¿Funciona esta otra versi´on de menu?
funcion menu 2.py funcion menu.py
1 def menu():
2 opcion = ’’
3 while len(opcion) != 1 or opcion not in ’abc’:
4 print ’Cajeroautom´atico.’
5 print ’a)Ingresardinero.’
6 print ’b)Sacardinero.’
28 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
7 print ’c)Consultarsaldo.’
8 opcion = raw_input(’Escojaunaopci´on:’)
9 if len(opcion) != 1 or opcion not in ’abc’:
10 print ’S´olopuedeescogerlasletrasa,boc.Int´entelodenuevo.’
11 return opcion
· 299 Dise˜ na una funci´on llamada menu_generico que reciba una lista con opciones. Cada opci´on se asociar´a a un n´ umero
entre 1 y la talla de la lista y la funci´on mostrar´a por pantalla el men´ u con el n´ umero asociado a cada opci´on. El usuario
deber´a introducir por teclado una opci´on. Si la opci´on es v´alida, se devolver´a su valor, y si no, se le advertir´a del error y se
solicitar´a nuevamente la introducci´on de un valor.
He aqu´ı un ejemplo de llamada a la funci´on:
menu_generico([’Saludar’, ’Despedirse’, ’Salir’])
Al ejecutarla, obtendremos en pantalla el siguiente texto:
1) Saludar
2) Despedirse
3) Salir
Escoja opci´on:
· 300 En un programa que estamos dise˜ nando preguntamos al usuario numerosas cuestiones que requieren una respuesta
afirmativa o negativa. Dise˜ na una funci´on llamada si_o_no que reciba una cadena (la pregunta). Dicha cadena se mostrar´a
por pantalla y se solicitar´a al usuario que responda. S´olo aceptaremos como respuestas v´alidas ’si’, ’s’, ’Si’, ’SI’, ’no’,
’n’, ’No’, ’NO’, las cuatro primeras para respuestas afirmativas y las cuatro ´ ultimas para respuestas negativas. Cada vez
que el usuario se equivoque, en pantalla aparecer´a un mensaje que le recuerde las respuestas aceptables. La funci´on devolver´a
True si la respuesta es afirmativa, y False en caso contrario.
· 301 Dise˜ na una funci´on sin argumentos que devuelva un n´ umero aleatorio mayor o igual que 0.0 y menor que 10.0.
Puedes llamar a la funci´on random desde tu funci´on.
· 302 Dise˜ na una funci´on sin argumentos que devuelva un n´ umero aleatorio mayor o igual que −10.0 y menor que 10.0.
· 303 Para dise˜ nar un juego de tablero nos vendr´a bien disponer de un ((dado electr´onico)). Escribe una funci´on Python
sin argumentos llamada dado que devuelva un n´ umero entero aleatorio entre 1 y 6.
· 304 Dise˜ na un programa que, dado un n´ umero n, muestre por pantalla todas las parejas de n´ umeros amigos menores
que n. La impresi´on de los resultados debe hacerse desde un procedimiento.
Dos n´ umeros amigos s´olo deber´an aparecer una vez por pantalla. Por ejemplo, 220 y 284 son amigos: si aparece el mensaje
((220 y 284 son amigos)), no podr´a aparecer el mensaje ((284 y 220 son amigos)), pues es redundante.
Debes dise˜ nar una funci´on que diga si dos n´ umeros son amigos y un procedimiento que muestre la tabla.
· 305 Implementa un procedimiento Python tal que, dado un n´ umero entero, muestre por pantalla sus cifras en orden
inverso. Por ejemplo, si el procedimiento recibe el n´ umero 324, mostrar´a por pantalla el 4, el 2 y el 3 (en l´ıneas diferentes).
· 306 Dise˜ na una funci´on es_primo que determine si un n´ umero es primo (devolviendo True) o no (devolviendo False).
Dise˜ na a continuaci´on un procedimiento muestra_primos que reciba un n´ umero y muestre por pantalla todos los n´ umeros
primos entre 1 y dicho n´ umero.
· 307 En el problema de los alumnos y las notas, se pide:
a) Dise˜ nar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes que aprobaron
el examen.
b) Dise˜ nar una funci´on que reciba la lista de notas y devuelva el n´ umero de aprobados.
c) Dise˜ nar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes que obtuvieron
la m´axima nota.
d) Dise˜ nar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes cuya
calificaci´on es igual o superior a la calificaci´on media.
e) Dise˜ nar una funci´on que reciba las dos listas y un nombre (una cadena); si el nombre est´a en la lista de estudiantes,
devolver´a su nota, si no, devolver´a None.
· 308 Tenemos los tiempos de cada ciclista y etapa participantes en la ´ ultima vuelta ciclista local. La lista ciclistas contiene
una serie de nombres. La matriz tiempos tiene una fila por cada ciclista, en el mismo orden con que aparecen en ciclistas.
Cada fila tiene el tiempo en segundos (un valor flotante) invertido en cada una de las 5 etapas de la carrera. ¿Complicado?
Este ejemplo te ayudar´a: te mostramos a continuaci´on un ejemplo de lista ciclistas y de matriz tiempos para 3 corredores.
Introducci´on a la Programaci´on con Python 29
2003/11/26-16:57
1 ciclistas = [’PerePorcar’, ’JoanBeltran’, ’Lled´oFabra’]
2 tiempo = [[10092.0, 12473.1, 13732.3, 10232.1, 10332.3],
3 [11726.2, 11161.2, 12272.1, 11292.0, 12534.0],
4 [10193.4, 10292.1, 11712.9, 10133.4, 11632.0]]
En el ejemplo, el ciclista Joan Beltran invirti´o 11161.2 segundos en la segunda etapa.
Se pide:
Una funci´on que reciba la lista y la matriz y devuelva el ganador de la vuelta (aquel cuya suma de tiempos en las 5
etapas es m´ınima).
Una funci´on que reciba la lista, la matriz y un n´ umero de etapa y devuelva el nombre del ganador de la etapa.
Un procedimiento que reciba la lista, la matriz y muestre por pantalla el ganador de cada una de las etapas.
· 309 ¿Qu´e aparecer´a por pantalla al ejecutar este programa?
1 a = 1
2 b = 2
3 [a, b] = [b, a]
4 print a, b
· 310 Dise˜ na una funci´on que reciba una lista de enteros y devuelva los n´ umeros m´ınimo y m´aximo de la lista si-
mult´aneamente.
· 311 Dise˜ na una funci´on que reciba los tres coeficientes de una ecuaci´on de segundo grado de la forma ax
2
+ bx + c = 0
y devuelva una lista con sus soluciones reales. Si la ecuaci´on s´olo tiene una soluci´on real, devuelve una lista con dos copias
de la misma. Si no tiene soluci´on real alguna o si tiene infinitas soluciones devuelve una lista con dos copias del valor None.
· 312 Dise˜ na una funci´on que reciba una lista de palabras (cadenas) y devuelva, simult´aneamente, la primera y la ´ ultima
palabras seg´ un el orden alfab´etico.
· 313 Modifica Memori´on para que se ofrezca al usuario jugar con tres niveles de dificultad:
F´acil: tablero de 3 ×4.
Normal: tablero de 4 ×6.
Dif´ıcil: tablero de 6 ×8.
· 314 Implementa Memori´on3, una variante de Memori´on en el que hay que emparejar grupos de 3 letras iguales. (Aseg´ urate
de que el n´ umero de casillas de la matriz sea m´ ultiplo de 3.)
· 315 Construye el programa del Buscaminas inspir´andote en la forma en que hemos desarrollado el juego Memori´on. Te
damos unas pistas para ayudarte en le implementaci´on:
Crea una matriz cuyas casillas contengan el valor True o False. El primer valor indica que hay una mina en esa casilla.
Ubica las minas al azar. El n´ umero de minas depender´a de la dificultad del juego.
Crea una matriz que contenga el n´ umero de minas que rodean a cada casilla. Calcula esos valores a partir de la matriz
de minas. Ojo con las casillas ((especiales)): el n´ umero de vecinos de las casillas de los bordes requiere un cuidado
especial.
Dibuja las minas y baldosas que las tapan. Define adecuadamente el sistema de coordenadas del lienzo.
Usa una rutina de control del rat´on similar a la desarrollada para Memori´on. Te interesa detectar dos pulsaciones de
rat´on distintas: la del bot´on 1, que asociamos a ((descubre casilla)), y la del bot´on 3, que asociamos a ((marcar posici´on)).
La marca de posici´on es una se˜ nal que dispone el usuario en una casilla para indicar que ´el cree que oculta una mina.
Necesitar´as una nueva matriz de marcas.
El programa principal es un bucle similar al de Memori´on. El bucle principal finaliza cuando hay una coincidencia total
entre la matriz de bombas y la matriz de marcas puestas por el usuario.
Cada vez que se pulse el bot´on 1, destruye la baldosa correspondiente. Si ´esta escond´ıa una mina, la partida ha acabado
y el jugador ha muerto. Si no, crea un objeto gr´afico (texto) que muestre el n´ umero de minas vecinas a esa casilla.
Cada vez que se pulse el bot´on 3, a˜ nade una marca a la casilla correspondiente si no la hab´ıa, y elimina la que hab´ıa
en caso contrario.
· 316 Modifica el Buscaminas para que cada vez que se pulse con el primer bot´on en una casilla con cero bombas vecinas,
se marquen todas las casillas alcanzables desde esta y que no tienen bomba. (Este ejercicio es dif´ıcil. Piensa bien en la
estrategia que has de seguir.)
30 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 317 Dise˜ na un programa que permita jugar a dos personas al tres en raya.
· 318 Dise˜ na un programa que permita jugar al tres en raya enfrentando a una persona al ordenador. Cuando el ordenador
empiece una partida, debe ganarla siempre. (Este ejercicio es dif´ıcil. Si no conoces la estrategia ganadora, b´ uscala en Internet.)
· 319 Dise˜ na un programa que permita que dos personas jueguen a las damas. El programa debe verificar que todos los
movimientos son v´alidos.
· 320 Dise˜ na un programa que permita que dos personas jueguen al ajedrez. El programa debe verificar que todos los
movimientos son v´alidos.
· 321 Haz una traza de area_y_angulo.py al solicitar el valor del ´angulo opuesto al lado de longitud 5 en un tri´angulo de
lados con longitudes 5, 4 y 3.
· 322 ¿Qu´e aparecer´a por pantalla al ejecutar el siguiente programa?
triangulo 2.py triangulo.py
1 from math import sqrt
2
3 def area_triangulo(a, b, c):
4 s = (a + b + c) / 2.0
5 return sqrt(s * (s-a) * (s-b) * (s-c))
6
7 s = 4
8 print area_triangulo(s-1, s, s+1)
9 print s
10 print a
· 323 La funci´on area_triangulo que hemos definido puede provocar un error en tiempo de ejecuci´on: si el argumento de la
ra´ız cuadrada calculada en su ´ ultima l´ınea es un n´ umero negativo, se producir´a un error de dominio. Haz que la funci´on s´olo
llame a sqrt si su argumento es mayor o igual que cero. Si el argumento es un n´ umero negativo, la funci´on debe devolver el
valor cero. Detecta tambi´en posibles problemas en angulo_alfa y modifica la funci´on para evitar posibles errores al ejecutar
el programa.
· 324 Vamos a adquirir una vivienda y para eso necesitaremos una hipoteca. La cuota mensual m que hemos de pagar
para amortizar una hipoteca de h euros a lo largo de n a˜ nos a un inter´es compuesto del i por cien anual se calcula con la
f´ormula:
m =
hr
1 −(1 + r)
−12n
,
donde r = i/(100 · 12). Define una funci´on que calcule la cuota (redondeada a dos decimales) dados h, n e i. Utiliza cuantas
variables locales consideres oportuno, pero al menos r debe aparecer en la expresi´on cuyo valor se devuelve y antes debe
calcularse y almacenarse en una variable local.
Nota: puedes comprobar la validez de tu funci´on sabiendo que hay que pagar la cantidad de 1 166.75 ¤ al mes para
amortizar una hipoteca de 150 000 ¤ en 15 a˜ nos a un inter´es del 4.75% anual.
· 325 Dise˜ na una funci´on que nos devuelva la cantidad de euros que habremos pagado finalmente al banco si abrimos una
hipoteca de h euros a un inter´es del i por cien en n a˜ nos. Si te conviene, puedes utilizar la funci´on que definiste en el ejercicio
anterior.
Nota: con los datos del ejemplo anterior, habremos pagado un total de 210 015 ¤.
· 326 Dise˜ na una funci´on que nos diga qu´e cantidad de intereses (en euros) habremos pagado finalmente al banco si
abrimos una hipoteca de h euros a un inter´es del i por cien en n a˜ nos. Si te conviene, puedes utilizar las funciones que
definiste en los ejercicios anteriores.
Nota: con los datos del ejemplo anterior, habremos pagado un total de 210 015 −150 000 = 60 015 ¤ en intereses.
· 327 Dise˜ na una funci´on que nos diga qu´e tanto por cien del capital inicial deberemos pagar en intereses al amortizar
completamente la hipoteca. Si te conviene, puedes utilizar las funciones que definiste en los ejercicios anteriores.
Nota: con los datos del ejemplo anterior, habremos pagado un inter´es total del 40.01% (60 015 ¤ es el 40.01% de 150 000
¤).
· 328 Dise˜ na un procedimiento que muestre por pantalla la cuota mensual que corresponde pagar por una hipoteca para
un capital de h euros al i% de inter´es anual durante 10, 15, 20 y 25 a˜ nos. (Si te conviene, rescata ahora las funciones que
dise˜ naste como soluci´on de los ejercicios anteriores.)
· 329 Dise˜ na un procedimiento que muestre por pantalla el capital total pagado al banco por una hipoteca de h euros al
i% de inter´es anual durante 10, 15, 20 y 25 a˜ nos. (Si te conviene, rescata ahora las funciones que dise˜ naste como soluci´on de
los ejercicios anteriores.)
Introducci´on a la Programaci´on con Python 31
2003/11/26-16:57
· 330 Dise˜ na una funci´on que reciba dos listas y devuelva los elementos comunes a ambas, sin repetir ninguno (intersecci´on
de conjuntos).
Ejemplo: si recibe las listas [1, 2, 1] y [2, 3, 2, 4], devolver´a la lista [2].
· 331 Dise˜ na una funci´on que reciba dos listas y devuelva los elementos que pertenecen a una o a otra, pero sin repetir
ninguno (uni´on de conjuntos).
Ejemplo: si recibe las listas [1, 2, 1] y [2, 3, 2, 4], devolver´a la lista [1, 2, 3, 4].
· 332 Dise˜ na una funci´on que reciba dos listas y devuelva los elementos que pertenecen a la primera pero no a la segunda,
sin repetir ninguno (diferencia de conjuntos).
Ejemplo: si recibe las listas [1, 2, 1] y [2, 3, 2, 4], devolver´a la lista [1].
· 333 Dise˜ na una funci´on que, dada una lista de n´ umeros, devuelva otra lista que s´olo incluya sus n´ umeros impares.
· 334 Dise˜ na una funci´on que, dada una lista de nombres y una letra, devuelva una lista con todos los nombres que
empiezan por dicha letra.
· 335 Dise˜ na una funci´on que, dada una lista de n´ umeros, devuelva otra lista con s´olo aquellos n´ umeros de la primera que
son primos.
· 336 Dise˜ na una funci´on que, dada una lista de n´ umeros, devuelva una lista con todos los pares de n´ umeros que podemos
formar con uno de la primera lista y otro de la segunda. Por ejemplo, si se suministran las listas [1, 3, 5] y [2, 5], la lista
resultante es
[[1, 2], [1, 5], [3, 2], [3, 5], [5, 2], [5, 5]].
· 337 Dise˜ na una funci´on que, dada una lista de n´ umeros, devuelva una lista con todos los pares de n´ umeros amigos que
podemos formar con uno de la primera lista y otro de la segunda.
· 338 ¿Qu´e aparecer´a por pantalla al ejecutar este programa?
parametros 2.py parametros.py
1 def incrementa(a):
2 a = a + 1
3 return a
4
5 a = 1
6 b = incrementa(a)
7
8 print ’a:’, a
9 print ’b:’, b
Hazte un dibujo del estado de la pila de llamadas paso a paso para entender bien qu´e est´a pasando al ejecutar cada sentencia.
· 339 ¿Qu´e mostrar´a por pantalla el siguiente programa al ejecutarse?
ejercicio parametros 4.py ejercicio parametros.py
1 def modifica(a, b):
2 for elemento in b:
3 a.append(elemento)
4 b = b + [4]
5 a[-1] = 100
6 del b[0]
7 return b[:]
8
9 lista1 = [1, 2, 3]
10 lista2 = [1, 2, 3]
11
12 lista3 = modifica(lista1, lista2)
13
14 print lista1
15 print lista2
16 print lista3
· 340 ¿Qu´e muestra por pantalla este programa al ser ejecutado?
ejercicio parametros 5.py ejercicio parametros.py
1 def modifica_parametros(x, y):
2 x = 1
3 y[0] = 1
4
32 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
5 a = 0
6 b = [0, 1, 2]
7 modifica_parametros(a, b)
8
9 print a
10 print b
· 341 ¿Qu´e muestra por pantalla este programa al ser ejecutado?
ejercicio parametros 6.py ejercicio parametros.py
1 def modifica_parametros(x, y):
2 x = 1
3 y.append(3)
4 y = y + [4]
5 y[0] = 10
6
7 a = 0
8 b = [0, 1, 2]
9 modifica_parametros(a, b)
10 print a
11 print b
· 342 Utiliza las funciones desarrolladas en el ejercicio 307 y dise˜ na nuevas funciones para construir un programa que
presente el siguiente men´ u y permita ejecutar las acciones correspondientes a cada opci´on:
1) A~nadir estudiante y calificaci´on
2) Mostrar lista de estudiantes con sus calificaciones
3) Calcular la media de las calificaciones
4) Calcular el n´umero de aprobados
5) Mostrar los estudiantes con mejor calificaci´on
6) Mostrar los estudiantes con calificaci´on superior a la media
7) Consultar la nota de un estudiante determinado
8) FINALIZAR EJECUCI
´
ON DEL PROGRAMA
· 343 ¿Qu´e ocurre con el elemento central de la lista cuando la lista tiene un n´ umero impar de elementos? ¿Nuestra funci´on
invierte correctamente la lista?
· 344 Un aprendiz sugiere esta otra soluci´on. ¿Funciona?
inversion 2.py inversion.py
1 def invierte(lista):
2 for i in range(len(lista)/2):
3 c = lista[i]
4 lista[i] = lista[-i-1]
5 lista[-i-1] = c
· 345 ¿Qu´e muestra por pantalla este programa al ser ejecutado?
abslista 2.py abslista.py
1 def abs_lista(lista):
2 for i in range(len(lista)):
3 lista[i] = abs(lista[i])
4
5 milista = [1, -1, 2, -3, -2, 0]
6 abs_lista(milista)
7 print milista
· 346 ¿Qu´e mostrar´a por pantalla el siguiente programa al ejecutarse?
intercambio 2.py intercambio.py
1 def intento_de_intercambio(a, b):
2 aux = a
3 a = b
4 b = aux
5
6 lista1 = [1, 2]
7 lista2 = [3, 4]
8
Introducci´on a la Programaci´on con Python 33
2003/11/26-16:57
9 intento_de_intercambio(lista1, lista2)
10
11 print lista1
12 print lista2
· 347 Dise˜ na un procedimiento que, dada una lista de n´ umeros, la modifique para que s´olo sobrevivan a la llamada aquellos
n´ umeros que son perfectos.
· 348 Dise˜ na una funci´on duplica que reciba una lista de n´ umeros y la modifique duplicando el valor de cada uno de sus
elementos. (Ejemplo: la lista [1, 2, 3] se convertir´a en [2, 4, 6].)
· 349 Dise˜ na una funci´on duplica_copia que reciba una lista de n´ umeros y devuelva otra lista en la que cada elemento
sea el doble del que tiene el mismo ´ındice en la lista original. La lista original no debe sufrir ninguna modificaci´on tras la
llamada a duplica_copia.
· 350 Dise˜ na una funci´on que reciba una lista y devuelva otra lista cuyo contenido sea el resultado de concatenar la lista
original consigo misma. La lista original no debe modificarse.
· 351 Dise˜ na una funci´on que reciba una lista y devuelva otra lista cuyo contenido sea la lista original, pero con sus
componentes en orden inverso. La lista original no debe modificarse.
· 352 Dise˜ na una funci´on que reciba una lista y devuelva una copia de la lista concatenada con una inversi´on de s´ı misma.
Puedes utilizar, si lo consideras conveniente, funciones que has desarrollado en ejercicios anteriores.
· 353 Dise˜ na una funci´on que reciba una lista y devuelva una lista cuyo contenido sea la lista original concatenada con
una versi´on invertida de ella misma. La lista original no debe modificarse.
· 354 Dise˜ na una funci´on que reciba una lista y devuelva una copia de la lista con sus elementos ordenados de menor a
mayor. La lista original no debe modificarse.
· 355 Dise˜ na un procedimiento que reciba una lista y ordene sus elementos de menor a mayor.
· 356 Dise˜ na una funci´on que reciba una matriz y, si es cuadrada (es decir, tiene igual n´ umero de filas que de columnas),
devuelva la suma de todos los componentes dispuestos en la diagonal principal (es decir, todos los elementos de la forma
A
i,i
). Si la matriz no es cuadrada, la funci´on devolver´a None.
· 357 Guardamos en una matriz de m×n elementos la calificaci´ on obtenida por m estudiantes (a los que conocemos por
su n´ umero de lista) en la evaluaci´on de n ejercicios entregados semanalmente (cuando un ejercicio no se ha entregado, la
calificaci´on es −1).
Dise˜ na funciones y procedimientos que efect´ uen los siguiente c´alculos:
Dado el n´ umero de un alumno, devolver el n´ umero de ejercicios entregados.
Dado el n´ umero de un alumno, devolver la media sobre los ejercicios entregados.
Dado el n´ umero de un alumno, devolver la media sobre los ejercicios entregados si los entreg´o todos; en caso contrario,
la media es 0.
Devolver el n´ umero de todos los alumnos que han entregado todos los ejercicios y tienen una media superior a 3.5
puntos.
Dado el n´ umero de un ejercicio, devolver la nota media obtenida por los estudiantes que lo presentaron.
Dado el n´ umero de un ejercicio, devolver la nota m´as alta obtenida.
Dado el n´ umero de un ejercicio, devolver la nota m´as baja obtenida.
Dado el n´ umero de un ejercicio, devolver el n´ umero de estudiantes que lo han presentado.
Devolver el n´ umero de abandonos en funci´on de la semana. Consideramos que un alumno abandon´o en la semana x
si no ha entregado ning´ un ejercicio desde entonces. Este procedimiento mostrar´a en pantalla el n´ umero de abandonos
para cada semana (si un alumno no ha entregado nunca ning´ un ejercicio, abandon´o en la ((semana cero))).
· 358 Hay dos ocasiones en las que se devuelve la lista [0, 0, 0]. ¿Puedes modificar el programa para que s´olo se devuelva
esa lista expl´ıcita desde un punto del programa?
· 359 ¿Y si a pudiera tomar valores enteros negativos? Dise˜ na una funci´on exponencial que trate tambi´en ese caso.
(Recuerda que e
−a
= 1/e
a
.)
34 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 360 ¿Es correcta esta otra versi´on? (Hemos destacado los cambios con respecto a la ´ ultima.)
exponencial 2.py exponencial.py
1 def elevado(a, k):
2 productorio = 1.0
3 for i in range(k):
4 productorio *= a
5 return productorio
6
7 def factorial (k):
8 productorio = 1.0
9 for i in range(2, k):
10 productorio *= i
11 return productorio
12
13 def exponencial (a, n):
14 sumatorio = 0.0
15 for k in range(n):
16 sumatorio += elevado(a, k) / factorial (k)
17 return sumatorio
· 361 Las funciones seno y coseno se pueden calcular as´ı
sin(x) = x −
x
3
3!
+
x
5
5!

x
7
7!
+· · · =

¸
n=0
(−1)
n
x
2n+1
(2n + 1)!
cos(x) = 1 −
x
2
2!
+
x
4
4!

x
6
6!
+· · · =

¸
n=0
(−1)
n
x
2n
(2n)!
Dise˜ na sendas funciones seno y coseno para aproximar, respectivamente, el seno y el coseno de x con n t´erminos del sumatorio
correspondiente.
· 362 Dise˜ na un programa similar que muestre el valor de factorial (n) para n entre 0 y 7.
· 363 Modifica las funciones que has propuesto como soluci´on al ejercicio 361 aprovechando las siguientes relaciones,
v´alidas para n mayor que 0:
(−1)
n
x
2n+1
(2n + 1)!
= −
x
2
(n + 1) · n
·
(−1)
n−1
x
2n−1
(2n −1)!
,
(−1)
n
x
2n
(2n)!
= −
x
2
n · (n −1)
·
(−1)
n−1
x
2n
(2n)!
.
Cuando n vale 0, tenemos:
(−1)
0
x
1
1!
= x,
(−1)
0
x
0
0!
= 1.
· 364 Modifica la funci´on exponencial 2 del programa anterior para que no se efect´ uen las ineficientes llamadas a elevado
y factorial .
· 365 La funci´on biseccion a´ un no est´a acabada del todo. ¿Qu´e ocurre si el usuario introduce un intervalo [a, b] tal que
f(a) y f(b) tienen el mismo signo? ¿Y si f(a) o f(b) valen 0? Modifica la funci´on para que s´olo inicie la b´ usqueda cuando
procede y, en caso contrario, devuelva el valor especial None. Si f(a) o f(b) valen cero, biseccion devolver´a el valor de a o b,
seg´ un proceda.
· 366 Modifica el programa para que solicite al usuario los valores a, b y . El programa s´olo aceptar´a valores de a y b
tales que a < b.
· 367 Haz una traza de la pila de llamadas a funci´on paso a paso para factorial (5).
· 368 Tambi´en podemos formular recursivamente la suma de los n primeros n´ umeros naturales:
n
¸
i=1
i =

1, si n = 1;
n +
¸
n−1
i=1
i, si n > 1.
Dise˜ na una funci´on Python recursiva que calcule el sumatorio de los n primeros n´ umeros naturales.
Introducci´on a la Programaci´on con Python 35
2003/11/26-16:57
· 369 Inspir´andote en el ejercicio anterior, dise˜ na una funci´on recursiva que, dados m y n, calcule
n
¸
i=m
i.
· 370 La siguiente funci´on implementa recursivamente una comparaci´on entre dos n´ umeros naturales. ¿Qu´e comparaci´on?
compara.py compara.py
1 def comparacion(a, b):
2 if b == 0:
3 return False
4 elif a == 0:
5 return True
6 else:
7 return comparacion(a-1, b-1)
· 371 Dibuja un ´arbol de llamadas que muestre paso a paso lo que ocurre cuando calculas bits(63).
· 372 Dise˜ na una funci´on recursiva que calcule el n´ umero de d´ıgitos que tiene un n´ umero entero (en base 10).
· 373 Calcula F
12
con ayuda de la funci´on que hemos definido.
· 374 Dibuja el ´arbol de llamadas para fibonacci (5).
· 375 Modifica la funci´on para que, cada vez que se la llame, muestre por pantalla un mensaje que diga ((Empieza c´alculo
de Fibonacci de n)), donde n es el valor del argumento, y para que, justo antes de acabar, muestre por pantalla ((Acaba
c´alculo de Fibonacci de n y devuelve el valor m)), donde m es el valor a devolver. A continuaci´on, llama a la funci´on
para calcular el cuarto n´ umero de Fibonacci y analiza el texto que aparece por pantalla. Haz lo mismo para el d´ecimo n´ umero
de Fibonacci.
· 376 Puedes calcular recursivamente los n´ umeros combinatorios sabiendo que, para n ≥ m,

n
m

=

n −1
m

+

n −1
m−1

y que

n
n

=

n
0

= 1.
Dise˜ na un programa que, a partir de un valor n le´ıdo de teclado, muestre

n
m

para m entre 0 y n. El programa llamar´a a
una funci´on combinaciones definida recursivamente.
· 377 El n´ umero de formas diferentes de dividir un conjunto de n n´ umeros en k subconjuntos se denota con
¸
n
k
¸
y se
puede definir recursivamente as´ı:

n
k
¸
=

n −1
k −1

+ k

n −1
k

El valor de
¸
n
1
¸
, al igual que el de
¸
n
n
¸
, es 1. Dise˜ na un programa que, a partir de un valor n le´ıdo de teclado, muestre
¸
n
m
¸
para m entre 0 y n. El programa llamar´a a una funci´on particiones definida recursivamente.
· 378 Haz una traza de las llamadas a mcd para los n´ umeros 1470 y 693.
· 379 Haz una traza de las llamadas a mcd para los n´ umeros 323 y 323.
· 380 En el apartado ?? presentamos el m´etodo de la bisecci´on. Observa que, en el fondo, se trata de un m´etodo recursivo.
Dise˜ na una funci´on que implemente el m´etodo de la bisecci´on recursivamente.
· 381 Es hora de echar una manita a los monjes. Ellos han de resolver el problema con 64 discos. ¿Por qu´e no pruebas a
ejecutar resuelve_hanoi (64, 1, 3, 2)?
· 382 ¿Cu´antos movimientos son necesarios para resolver el problema de las torres de Hanoi con 1 disco, y con 2, y con
3,. . . ? Dise˜ na una funci´on movimientos_hanoi que reciba un n´ umero y devuelva el n´ umero de movimientos necesarios para
resolver el problema de la torres de Hanoi con ese n´ umero de discos.
· 383 Implementa un programa en el entorno PythonG que muestre gr´aficamente la resoluci´on del problema de las torres
de Hanoi.
· 384 Dibuja el ´arbol de llamadas para resuelve_hanoi (4, 1, 3, 2).
36 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 385 Puedes jugar con los diferentes par´ametros que determinan la curva de von Kock para obtener infinidad de figuras
diferentes. Te mostramos algunas de ellas junto a las nuevas expresiones de c´alculo de los puntos (x
c
, y
c
), (x
d
, y
d
) y (x
e
, y
e
):
7 xc = xa + (xb - xa) / 3.0
8 yc = ya + (yb - ya) / 3.0
9 xd = xb + (xa - xb) / 3.0
10 yd = yb + (ya - yb) / 3.0
11 xe = (xc+xd)*cos(pi /4) - (yd-yc)*sin(pi /3)
12 ye = (yc+yd)*cos(pi /4) + (xd-xc)*sin(pi /3)
7 xc = xa + (xb - xa) / 3.0
8 yc = ya + (yb - ya) / 3.0
9 xd = xb + (xa - xb) / 3.0
10 yd = yb + (ya - yb) / 3.0
11 xe = (xc+xd)*cos(pi /3) - 2*(yd-yc)*sin(pi /3)
12 ye = (yc+yd)*cos(pi /3) + (xd-xc)*sin(pi /3)
7 xc = xa + (xb - xa) / 3.0
8 yc = ya + (yb - ya) / 3.0
9 xd = xb + (xa - xb) / 3.0
10 yd = yb + (ya - yb) / 3.0
11 xe = (xc+xd)*cos(pi /3) + (yd-yc)*sin(pi /3)
12 ye = (yc+yd)*cos(pi /3) - (xd-xc)*sin(pi /3)
7 xc = xa + (xb - xa) / 3.0
8 yc = ya + (yb - ya) / 4.0
9 xd = xb + (xa - xb) / 5.0
10 yd = yb + (ya - yb) / 3.0
11 xe = (xc+xd)*cos(pi /3) - (yd-yc)*sin(pi /3)
12 ye = (yc+yd)*cos(pi /3) + (xd-xc)*sin(pi /3)
Prueba a cambiar los diferentes par´ametros y trata de predecir la figura que obtendr´as en cada caso antes de ejecutar el
programa.
(Recuerda definir adecuadamente las coordenadas con window_coordinates para que te quepan las figuras.)
· 386 La curva drag´on se define de modo a´ un m´as sencillo que la curva de von Koch. La curva drag´on de nivel 0 que une los
puntos (x
a
, y
a
) y (x
b
, y
b
) es la l´ınea recta que las une. La curva drag´on de nivel 1 entre (x
a
, y
a
) y (x
b
, y
b
) se forma con dos curvas
drag´on de nivel 0: la que une (x
a
, y
a
) con

x
a
+x
b
+y
a
−y
b
2
,
x
b
−x
a
+y
a
+y
b
2

y la que une (x
b
, y
b
) con

x
a
+x
b
+y
a
−y
b
2
,
x
b
−x
a
+y
a
+y
b
2

.
He aqu´ı las curvas drag´on de niveles 0 y 1:
(x
a
, y
a
) (x
b
, y
b
) (x
a
, y
a
) (x
b
, y
b
)

x
a
+x
b
+y
a
−y
b
2
,
x
b
−x
a
+y
a
+y
b
2

Ya ves cu´al es el principio recursivo con el que se generan curvas drag´on. Aqu´ı tienes las curvas drag´on de niveles 2, 3, 4, 5
y 6.
El perfil de la curvas drag´on tiene una analog´ıa con las dobleces de una hoja de papel. La curva drag´on de nivel 0 es el
perfil de una hoja de papel que no ha sido doblada. La de nivel 1 ha sido doblada una vez y desdoblada hasta que las partes
dobladas forman ´angulos de 90 grados. La curva drag´on de nivel 1 es el perfil de una hoja doblada dos veces y desdoblada
de forma que cada parte forme un ´angulo de 90 grados con la siguiente.
Introducci´on a la Programaci´on con Python 37
2003/11/26-16:57
Dise˜ na un programa que dibuje, en el entorno PythonG, curvas drag´on entre dos puntos del nivel que se desee.
Por cierto, ¿de d´onde viene el nombre de ((curva drag´on))? Del aspecto que presenta en niveles ((grandes)). Aqu´ı tienes la
curva drag´on de nivel 11:
· 387 Otra figura recursiva que es todo un cl´asico es la criba o tri´ angulo de Sierpinski. En cada nivel de recursi´on se divide
cada uno de los tri´angulos del nivel anterior en tres nuevos tri´angulos. Esta figura muestra los tri´angulos de Sierpinski para
niveles de recursi´on de 0 a 4:
Dise˜ na un programa para PythonG que dibuje tri´angulos de Sierpinski para un nivel de recursi´on dado.
(Por cierto, ¿no te parecen los tri´angulos de Sierpinski sospechosamente similares a la figura del ejercicio 261?)
· 388 Otra curva fractal de inter´es es la denominada ((curva de relleno del espacio de Hilbert)). Esta figura te muestra
dicha curva con niveles de recursi´on 0, 1, 2, 3 y 4:
Dise˜ na un programa capaz de dibujar curvas de relleno del espacio de Hilbert en el entorno PythonG dado el nivel de recursi´on
deseado. Estas figuras te pueden ser de ayuda para descubrir el procedimiento de c´alculo que has de programar:
· 389 Un curiosa aplicaci´on de la recursi´on es la generaci´on de paisajes por ordenador. Las monta˜ nas, por ejemplo, se
dibujan con modelos recursivos: los denominados fractales (las curvas de von Koch, entre otras, son fractales). Los ´arboles
pueden generarse tambi´en con procedimientos recursivos. Estas im´agenes, por ejemplo, muestran ((esqueletos)) de ´arboles
generados en el entorno PythonG:
38 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
Todos han sido generados con una misma funci´on recursiva, pero usando diferentes argumentos. Te vamos a describir el
principio b´asico de generaci´on de estos ´arboles, pero has de ser t´ u mismo quien dise˜ ne una funci´on recursiva capaz de
efectuar este tipo de dibujos. Vamos con el m´etodo. El usuario nos proporciona los siguientes datos:
Los puntos en los que empieza y acaba el tronco.
El ´angulo α que forma la rama que parte a mano derecha del tronco con el propio tronco. La rama que parte a mano
izquierda lo hace con un ´angulo −α.
La proporci´on (en tanto por uno) del tama˜ no de las ramas con respecto al tronco.
El nivel de recursi´on deseado.
La recursi´on tiene lugar cuando consideramos que cada una de las dos ramas es un nuevo tronco.
Por cierto, los ´arboles ganan bastante si en primeros niveles de recursi´on usas un color anaranjado o marr´on y en los
´ ultimos usas un color verde.
· 390 Los ´arboles que hemos generado en el ejercicio anterior parecen un tanto artificiales por ser tan regulares y sim´etricos.
Introducir el azar en su dise˜ no los har´a parecer m´as naturales. Modifica la funci´on del ejercicio anterior para que tanto el
´angulo como la proporci´on rama/tronco se escojan aleatoriamente (dentro de ciertos m´argenes).
Aqu´ı tienes un par de ejemplos. El ´arbol de la izquierda s´ı parece bastante real y el de la derecha parece mecido por el
viento (bueno, ¡m´as bien por un hurac´an!).
· 391 Construye un m´odulo llamado dni que incluya las funciones propuestas en los ejercicios 270 y 296.
Usa el m´odulo desde un programa que pida al usuario su n´ umero de DNI y su letra. Si el usuario mete un n´ umero y letra
de DNI correctos, el programa emitir´a el mensaje ((Bienvenido)). En caso contrario dir´a ((Ha cometido ud. un error)).
· 392 Dise˜ na un m´odulo que agrupe las funciones relacionadas con hipotecas de los ejercicios 324–327. Documenta ade-
cuadamente el m´odulo.
· 393 Dise˜ na un m´odulo similar al anterior pero que permita efectuar c´alculos con vectores n-dimensionales, donde n es
un valor arbitrario. Las funciones que debes definir son:
v_lee_vector: Pide el valor de n y a continuaci´on lee los n componentes del vector. El resultado devuelto es la lista de
los componentes.
v_muestra_vector: Muestra por pantalla el vector en la notaci´on (v
1
, v
2
, . . . , v
n
).
v_longitud: devuelve la longitud del vector, que es

n
¸
i=1
v
2
i
v_suma: Devuelve la suma de dos vectores. Los dos vectores deben tener la misma dimensi´on. Si no la tienen, v_suma
devolver´a el valor None.
Introducci´on a la Programaci´on con Python 39
2003/11/26-16:57
v_producto_escalar: Devuelve el producto escalar de dos vectores. Los dos vectores deben tener la misma dimensi´on.
Si no la tienen, la funci´on devolver´a el valor None.
· 394 Dise˜ na un m´odulo que facilite el trabajo con conjuntos. Recuerda que un conjunto es una lista en la que no hay
elementos repetidos. Deber´as implementar las siguientes funciones:
lista_a_conjunto(lista): Devuelve un conjunto con los mismos elementos que hay en lista, pero sin repeticiones. (Ejem-
plo: lista_a_conjunto([1,1,3,2,3]) devolver´a la lista [1, 2, 3] (aunque tambi´en se acepta como equivalente cualquier
permutaci´on de esos mismos elementos, como [3,1,2] o [3,2,1]).
union(A, B): devuelve el conjunto resultante de unir los conjuntos A y B.
interseccion(A, B): devuelve el conjunto cuyos elementos pertenecen a A y a B.
diferencia(A, B): devuelve el conjunto de elementos que pertenecen a A y no a B.
iguales(A, B): devuelve cierto si ambos conjuntos tienen los mismos elementos, y falso en caso contrario. (Nota: ten
en cuenta que los conjuntos representados por las listas [1, 3, 2] y [2, 1, 3] son iguales.)
· 395 ¿Es correcta esta otra versi´on de la funci´on suma?
1 def suma(a, b):
2 c = []
3 m = minimo(len(a), len(b))
4 for i in range(m):
5 c.append(a[i] + b[i])
6 c = c + a[m:] + b[m:]
7 return c
· 396 Dise˜ na el siguiente programa que usa el m´odulo polinomios y, si te parece conveniente, enriquece dicho m´odulo con
nuevas funciones ´ utiles para el manejo de polinomios. El programa presentar´a al usuario este men´ u:
1) Leer polinomio a
2) Mostrar polinomio a
3) Leer polinomio b
4) Mostrar polinomio b
5) Sumar polinomios a y b
6) Restar a de b
7) Restar b de a
8) Multiplicar a por b
9) FIN DE PROGRAMA
· 397 ¿Funcionan bien las funciones que hemos definido cuando suministramos listas vac´ıas? Corrige las funciones para
que traten correctamente este caso particular.
· 398 Enriquece el m´odulo estadisticas a˜ nadiendo una funci´on que calcule el coeficiente de variaci´on (definido como σ/¯ a)
y el recorrido de la lista (que es la diferencia entre el mayor y el menor elemento de la lista).
· 399 Suponiendo que nos suministran una lista de enteros, dise˜ na una funci´on que calcule su moda. La moda es el elemento
m´as repetido en una serie de valores.
· 400 Dise˜ na una funci´on llamada es_cuadrada que devuelva True si la matriz es cuadrada (tiene igual n´ umero de filas
que columnas) y False en caso contrario. S´ırvete de la funci´on dimension para averiguar la dimensi´on de la matriz.
· 401 Enriquece el m´odulo matrices.py con una funci´on que devuelva el producto de dos matrices. Si las matrices no
son ((multiplicables)), la funci´on devolver´a None.
· 402 Modifica el programa del ejercicio anterior enriqueciendo el tipo de datos Persona con un nuevo campo: el sexo,
que codificaremos con una letra (’M’ para mujer y ’V’ para var´on). Modifica la funci´on mostrar_persona para que tambi´en
imprima el valor del nuevo campo.
· 403 Dise˜ na una funci´on que permita determinar si una persona es menor de edad y devuelva cierto si la edad es menor
que 18, y falso en caso contrario.
· 404 Dise˜ na una funci´on nombre_de_pila que devuelva el nombre de pila de una Persona. Supondremos que el nombre
de pila es la primera palabra del campo nombre (es decir, que no hay nombres compuestos).
· 405 Dise˜ na un programa que pida por teclado los datos de varias personas y los a˜ nada a una lista inicialmente vac´ıa.
Cada vez que se lean los datos de una persona el programa preguntar´a si se desea continuar introduciendo nuevas personas.
Cuando el usuario responda que no, el programa se detendr´a.
40 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 406 Modifica el programa del ejercicio anterior para que, a continuaci´on, muestre el nombre de la persona m´as vieja. Si
dos o m´as personas coinciden en tener la mayor edad, el programa mostrar´a el nombre de todas ellas.
· 407 ¿Qu´e mostrar´a por pantalla la ejecuci´on del siguiente programa?
ejercicio registros.py ejercicio registros.py
1 from record import record
2
3 class Persona(record):
4 nombre = ’’
5 dni = ’’
6 edad = 0
7
8 def copia(pers):
9 return Persona(nombre=pers.nombre[:], dni =pers.dni [:], edad=pers.edad)
10
11 def nada_util (persona1, persona2):
12 persona1.edad = persona1.edad + 1
13 persona3 = persona2
14 persona4 = copia(persona2)
15 persona3.edad = persona3.edad - 1
16 persona4.edad = persona4.edad - 2
17 return persona4
18
19 juan = Persona(nombre=’JuanPaz’, dni =’12345679Z’, edad=19)
20 pedro = Persona(nombre=’PedroL´opez’, dni =’23456789D’, edad=18)
21 otro = nada_util (juan, pedro)
22 print juan
23 print pedro
24 print otro
Haz un diagrama que muestre el estado de la memoria en los siguientes instantes:
1. justo antes de ejecutar la l´ınea 19,
2. justo antes de ejecutar la l´ınea 15 en la invocaci´on de nada_util desde la l´ınea 19,
3. al finalizar la ejecuci´on del programa.
· 408 Modifica las rutinas listado_completo y listado_de_nombres para que los estudiantes aparezcan por orden alfab´etico.
Quiz´a te convenga definir una funci´on auxiliar que recibe la lista de estudiantes y la ordena alfab´eticamente.
· 409 Modifica cuanto consideres necesario para que la lista de estudiantes est´e siempre ordenada alfab´eticamente.
· 410 Dise˜ na un procedimiento que, dada una lista de estudiantes y un grupo (la letra A, B o C), muestre por pantalla
un listado con el nombre de los estudiantes de dicho grupo.
· 411 Define una funci´on esta_aprobado que devuelva True si el alumno ha aprobado la asignatura y False en caso contrario.
· 412 Modifica muestra_acta para que, adem´as, muestre la calificaci´on num´erica (nota del examen) de los alumnos pre-
sentados. En los no presentados no debe figurar valor num´erico alguno.
· 413 Dise˜ na una funci´on que devuelva el porcentaje de aprobados sobre el total de estudiantes (y no sobre el total de
estudiantes que han entregado la pr´actica).
· 414 Dise˜ na un procedimiento que muestre en pantalla el nombre de todos los estudiantes cuya nota de examen es superior
a la media, hayan entregado la pr´actica o no.
· 415 Dise˜ na un procedimiento que muestre en pantalla el nombre de todos los estudiantes cuya nota de examen es superior
a la media y hayan entregado la pr´actica.
· 416 Dise˜ na una funci´on que reciba una lista de estudiantes y el c´odigo de un grupo (la letra A, B o C) y devuelva la
nota media en dicho grupo.
· 417 Dise˜ na una funci´on que ordene alfab´eticamente la lista de estudiantes por su nombre.
· 418 Dise˜ na una funci´on que ordene la lista de estudiantes por la calificaci´on obtenida en el examen.
· 419 Dise˜ na una funci´on que ordene la lista de estudiantes por la calificaci´on final obtenida. En primer lugar aparecer´an
las notas m´as altas y en ´ ultimo lugar los no presentados.
Introducci´on a la Programaci´on con Python 41
2003/11/26-16:57
· 420 Deseamos realizar un programa que nos ayude a gestionar nuestra colecci´on de ficheros MP3. Cada fichero MP3
contiene una canci´on y deseamos almacenar en nuestra base de datos la siguiente informaci´on de cada canci´on:
t´ıtulo,
int´erprete,
duraci´on en segundos,
estilo musical.
Empieza definiendo el tipo MP3. Cuando lo tengas, define dos procedimientos:
muestra_resumen_mp3 : muestra por pantalla s´olo el t´ıtulo y el int´erprete de una canci´on (en una sola l´ınea).
muestra_mp3 : muestra por pantalla todos los datos de un MP3, con una l´ınea por cada campo.
A continuaci´on, dise˜ na cuantos procedimientos y funciones consideres pertinentes para implementar un men´ u con las siguien-
tes acciones:
1. a˜ nadir una nueva canci´on a la base de datos (que ser´a una lista de registros MP3),
2. listar todos los estilos de los que tenemos alguna canci´on (cada estilo debe mostrarse una sola vez en pantalla),
3. listar todas las canciones de un int´erprete determinado (en formato resumido, es decir, usando el procedimiento mues-
tra_resumen_mp3),
4. listar todas las canciones de un estilo determinado (en formato resumido),
5. listar todas las canciones de la base de datos (en formato completo, es decir, llamando a muestra_mp3),
6. eliminar una canci´on de la base de datos dado el t´ıtulo y el int´erprete.
(Nota: Si quieres que el programa sea realmente ´ util, ser´ıa interesante que pudieras salvar la lista de canciones a disco duro;
de lo contrario, perder´as todos los datos cada vez que salgas del programa. En el pr´oximo tema aprenderemos a guardar
datos en disco y a recuperarlos, as´ı que este programa s´olo te resultar´a realmente ´ util cuando hayas estudiado ese tema.)
· 421 Define una funci´on llamada fecha_larga que devuelva la fecha en un formato m´as verboso. Por ejemplo, el 11/9/2001
aparecer´a como ((11 de septiembre de 2001)).
· 422 Dise˜ na una funci´on fecha_valida que devuelva True si la fecha es v´alida y False en caso contrario. Para comprobar
la validez de una fecha debes verificar que el mes est´e comprendido entre 1 y 12 y que el d´ıa lo est´e entre 1 y el n´ umero de
d´ıas que corresponde al mes. Por ejemplo, la fecha 31/4/2000 no es v´alida, ya que abril tiene 30 d´ıas.
Ten especial cuidado con el mes de febrero: recuerda que tiene 29 o 28 d´ıas seg´ un sea el a˜ no bisiesto o no. Usa, si te
conviene, la funci´on definida anteriormente.
· 423 Modifica la funci´on lee_fecha para que s´olo acepte fechas v´alidas, es decir, fechas cuyo d´ıa sea v´alido para el mes
le´ıdo. Puedes utilizar la funci´on fecha_valida desarrollada en el ejercicio anterior.
· 424 Haz un programa que use el m´odulo fecha y lea una lista de fechas v´alidas que mostrar´a despu´es ordenadas de m´as
antigua a m´as reciente.
· 425 Dise˜ na una funci´on que devuelva cierto si dos fechas son iguales y falso en caso contrario.
· 426 Dise˜ na una funci´on anyade_un_dia que a˜ nada un d´ıa a una fecha dada. La fecha 7/6/2001, por ejemplo, pasar´a a
ser 8/6/2001 tras invocar al m´etodo anyade_un_dia sobre ella.
Presta especial atenci´on al ´ ultimo d´ıa de cada mes, pues su siguiente d´ıa es el primero del mes siguiente. Similar atenci´on
requiere el ´ ultimo d´ıa del a˜ no. Debes tener en cuenta que el d´ıa que sigue al 28 de febrero es el 29 del mismo mes o el 1 de
marzo dependiendo de si el a˜ no es bisiesto o no.
· 427 Dise˜ na una funci´on que calcule el n´ umero de d´ıas transcurridos entre dos fechas que se proporcionan como par´ametro.
He aqu´ı un ejemplo de uso:
>>> from fecha import Fecha, dias_transcurridos

>>> ayer = Fecha(dia=1, mes=1, anyo=2002)

>>> hoy = Fecha(dia=2, mes=1, anyo=2002)

>>> print dias_transcurridos(hoy, ayer)

1
(No tengas en cuenta el salto de fechas producido como consecuencia de la reforma gregoriana del calendario. Si no sabes
de qu´e estamos hablando, consulta el cuadro ((¿Cu´antos d´ıas han pasado. . . d´onde?)).)
42 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 428 Usando la funci´on desarrollada en el ejercicio anterior, implementa un programa que calcule biorritmos. Los biorrit-
mos son una de tantas supercher´ıas populares, como el hor´oscopo o el tarot. Seg´ un sus ((estudiosos)), los ritmos vitales de
la persona son peri´odicos y se comportan como funciones senoidales (¿?). El ciclo f´ısico presenta un periodo de 23 d´ıas, el
ciclo emocional, un periodo de 28 d´ıas y el ciclo intelectual, de 33 d´ıas. Si calculas el seno del n´ umero de d´ıas transcurridos
desde la fecha de nacimiento de un individuo y lo normalizas con el per´ıodo de cada ciclo, obtendr´as un valor entre −1 (nivel
´optimo) y 1 (nivel p´esimo) que indica su estado en cada uno de los tres planos: f´ısico, emocional e intelectual. En el periodo
((alto)), la persona se encuentra mejor en cada uno de los diferentes aspectos:
En lo f´ısico: mayor fortaleza, confianza, valor y esp´ıritu positivo.
En lo emocional: mayor alegr´ıa y mejor estado de ´animo.
En lo intelectual: mejores momentos para tomar decisiones y d´ıas m´as aptos para el estudio.
Y en el periodo ((bajo)), el estado vital empeora:
En lo f´ısico: cansancio; conviene no someter el cuerpo a grandes excesos de ning´ un tipo.
En lo emocional: falta de ambici´on y mayores fricciones en nuestras relaciones personales.
En lo intelectual: mayor distracci´on, falta de atenci´on, poca creatividad y falta de capacidad de c´alculo.
Tu programa pedir´a una fecha de nacimiento y proporcionar´a el valor de cada ciclo a d´ıa de hoy, acompa˜ nado de un texto
que resuma su estado en cada uno de los tres planos.
(Te parecer´a rid´ıculo, pero hay infinidad de p´aginas web dedicadas a este asunto.)
· 429 Modifica la funci´on anterior para que s´ı tenga en cuenta los 10 d´ıas ((perdidos)) en la reforma gregoriana. . . en
Espa˜ na.
· 430 Dise˜ na una funci´on que devuelva el d´ıa de la semana (la cadena ’lunes’, o ’martes’, etc.) en que cae una fecha
cualquiera. (Si sabes en que d´ıa cay´o una fecha determinada, el n´ umero de d´ıas transcurridos entre esa y la nueva fecha
m´odulo 7 te permite conocer el d´ıa de la semana.)
· 431 Dise˜ na un nuevo tipo de registro: Fecha_con_hora. Adem´as del d´ıa, mes y a˜ no, una variable de tipo Fecha_con_hora
almacena la hora (un n´ umero entre 0 y 23) y los minutos (un n´ umero entre 0 y 59).
Dise˜ na a continuaci´on funciones que permitan:
Leer un dato del tipo Fecha_con_hora por teclado.
Mostrar un dato del tipo Fecha_con_hora en el formato que ilustramos con este ejemplo: las siete y media de la tarde
del 11 de septiembre de 2001 se muestran como 19:30 11/9/2001.
Mostrar un dato del tipo Fecha_con_hora en el formato que ilustramos con este ejemplo: las siete y media de la tarde
del 11 de septiembre de 2001 se muestran como 7:30 pm 11/9/2001 y las siete y media de la ma˜ nana del mismo d´ıa
como 7:30 am 11/9/2001.
Determinar si una Fecha_con_hora ocurri´o antes que otra.
Calcular los minutos transcurridos entre dos datos de tipo Fecha_con_hora.
· 432 Dise˜ na una funci´on que dado un registro de tipo Persona (con fecha de nacimiento) y la fecha de hoy, devuelva la
edad (en a˜ nos) de la persona.
· 433 Dise˜ na un registro denominado Periodo. Un periodo consta de dos fechas donde la primera es anterior o igual a la
segunda. Dise˜ na entonces:
a) Un procedimiento muestra_periodo que muestre las dos fechas (en formato breve) separadas entre s´ı por un gui´on.
b) Una funci´on que devuelva el n´ umero de d´ıas comprendidos en el periodo (incluyendo ambos extremos).
c) Una funci´on que reciba un periodo y una fecha y devuelva cierto si la fecha est´a comprendida en el per´ıodo y falso en
caso contrario.
d) Una funci´on que reciba dos periodos y devuelva cierto si ambos se solapan (tienen al menos un d´ıa en com´ un).
· 434 Define t´ u mismo las funciones lee_pelicula, contiene_pelicula_con_titulo, alta_pelicula y baja_pelicula.
· 435 Detecta posibles fuentes de ineficiencia (llamadas a funci´on repetidas) en el fragmento de programa anterior y
corr´ıgelas.
Introducci´on a la Programaci´on con Python 43
2003/11/26-16:57
· 436 A˜ nade nueva funcionalidad al programa: una opci´on que permita devolver una pel´ıcula alquilada. Dise˜ na para ello
un procedimiento devolver_pelicula. A continuaci´on, a˜ nade una opci´on al men´ u para devolver una pel´ıcula. Las acciones
asociadas son:
pedir el nombre de la pel´ıcula;
si no existe una pel´ıcula con ese t´ıtulo, dar el aviso pertinente con un mensaje por pantalla y no hacer nada m´as;
si existe la pel´ıcula pero no estaba alquilada, avisar al usuario y no hacer nada m´as;
y si existe la pel´ıcula y estaba alquilada, ((marcarla)) como disponible (poner a None su campo alquilada).
· 437 Modifica la porci´on del programa que da de baja a un socio o a una pel´ıcula para que no se permita dar de baja
una pel´ıcula que est´a actualmente alquilada ni a un socio que tiene alguna pel´ıcula en alquiler. Te convendr´a disponer de
una funci´on que comprueba si una pel´ıcula est´a disponible y, por tanto, se puede dar de baja y otra que compruebe si un
socio tiene alguna pel´ıcula en alquiler actualmente. Modifica las acciones asociadas a las respectivas opciones del men´ u para
que den los avisos pertinentes en caso de que no sea posible dar de baja a un socio o una pel´ıcula.
· 438 Dise˜ na una funci´on listado_completo_por_genero que muestre los t´ıtulos de todas las pel´ıculas del videoclub del
g´enero que se indique, pero indicando al lado de cada t´ıtulo si la correspondiente pel´ıcula est´a alquilada o disponible.
Y, ya puestos, haz que el listado de pel´ıculas aparezca en pantalla ordenado alfab´eticamente por su t´ıtulo.
· 439 Implementa la nueva funci´on de devoluci´on de pel´ıculas. Ten en cuenta que necesitar´as dos datos: el t´ıtulo de la
pel´ıcula y el DNI del socio.
· 440 Modifica la definici´on de Pelicula para a˜ nadir los nuevos campos. Modifica a continuaci´on lee_pelicula para que pida
tambi´en el valor de dias_permitidos.
· 441 Modifica el m´etodo de devoluci´on de pel´ıculas para que tenga en cuenta la fecha de alquiler y la fecha de devoluci´on.
El m´etodo devolver´a el n´ umero de d´ıas de retraso. Si no hay retraso, dicho valor ser´a cero. (Usa la funci´on dias_transcurridos
del m´odulo fecha para calcular el n´ umero de d´ıas transcurridos desde una fecha determinada.)
Modifica las acciones asociadas a la opci´on de men´ u de devoluci´on de pel´ıculas para que tenga en cuenta el valor devuelto
por devolver_pelicula y muestre por pantalla el n´ umero de d´ıas de retraso (si es el caso).
· 442 Modifica el m´etodo listado_completo_por_genero (ejercicio 438) para que los t´ıtulos no aparezcan repetidos en el
caso de que dispongamos de m´as de un ejemplar de una pel´ıcula. Al lado del t´ıtulo aparecer´a el mensaje ((disponible)) si hay
al menos un ejemplar disponible y ((no disponible)) si todos los ejemplares est´an alquilados.
· 443 Modifica el programa para permitir que una pel´ıcula sea clasificada en diferentes g´eneros. (El atributo genero ser´a
una lista de cadenas, y no una simple cadena.)
· 444 Modifica la aplicaci´on para permitir reservar pel´ıculas a socios. Cuando no se disponga de ning´ un ejemplar libre de
una pel´ıcula, los socios podr´an solicitar una reserva.
¡Ojo!, la reserva se hace sobre una pel´ıcula, no sobre un ejemplar, es decir, la lista de espera de ((Matrix)) permite a un
socio alquilar el primer ejemplar de ((Matrix)) que quede disponible. Si hay, por ejemplo, dos socios con un mismo t´ıtulo
reservado, s´olo podr´a alquilarse a otros socios un ejemplar de la pel´ıcula cuando haya tres o m´as ejemplares libres.
· 445 Modifica el programa del ejercicio anterior para que las reservas caduquen autom´aticamente a los dos d´ıas. Es decir,
si el socio no ha alquilado la pel´ıcula a los dos d´ıas de estar disponible, su reserva expira.
· 446 Modifica el programa para que registre el n´ umero de veces que se ha alquilado cada pel´ıcula. Una opci´on de men´ u
permitir´a mostrar la lista de las 10 pel´ıculas m´as alquiladas hasta el momento.
· 447 Modifica el programa para que registre todas las pel´ıculas que ha alquilado cada socio a lo largo de su vida.
A˜ nade una opci´on al men´ u de la aplicaci´on que permita consultar el g´enero (o g´eneros) favorito(s) de un cliente a partir
de su historial de alquileres.
· 448 A˜ nade al programa una opci´on de men´ u para aconsejar al cliente. Bas´andose en su historial de alquileres, el programa
determinar´a su g´enero (o g´eneros) favorito(s) y mostrar´a un listado con las pel´ıculas de dicho(s) g´enero(s) disponibles para
alquiler en ese instante (ten en cuenta que las pel´ıculas disponibles sobre las que hay lista de espera no siempre se pueden
considerar realmente disponibles).
· 449 Nos gustar´ıa retomar el programa de gesti´on de MP3 que desarrollamos en un ejercicio anterior. Nos gustar´ıa
introducir el concepto de ((´album)). Cada ´album tiene un t´ıtulo, un(os) int´erprete(s) y una lista de canciones (ficheros MP3).
Modifica el programa para que gestione ´albumes. Deber´as permitir que el usuario d´e de alta y baja ´albumes, as´ı como que
obtenga listados completos de los ´albumes disponibles, listados ordenados por int´erpretes, b´ usquedas de canciones en la base
de datos, etc.
44 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 450 Deseamos gestionar una biblioteca. La biblioteca contiene libros que los socios pueden tomar prestados un n´ umero
de d´ıas. De cada libro nos interesa, al menos, su t´ıtulo, autor y a˜ no de edici´on. De cada socio mantenemos su DNI, su nombre
y su tel´efono. Un socio puede tomar prestados tres libros. Si un libro tarda m´as de 10 d´ıas en ser devuelto, el socio no podr´a
sacar nuevos libros durante un per´ıodo de tiempo: tres d´ıas de penalizaci´on por cada d´ıa de retraso.
Dise˜ na un programa que permita dar de alta y baja libros y socios y llevar control de los pr´estamos y devoluciones de los
libros. Cuando un socio sea penalizado, el programa indicar´a por pantalla hasta qu´e fecha est´a penalizado e impedir´a que
efect´ ue nuevos pr´estamos hasta entonces.
· 451 Dise˜ na un programa que cuente el n´ umero de caracteres de un fichero de texto, incluyendo los saltos de l´ınea. (El
nombre del fichero se pide al usuario por teclado.)
· 452 Haz un programa que, dada una palabra y un nombre de fichero, diga si la palabra aparece o no en el fichero. (El
nombre del fichero y la palabra se pedir´an al usuario por teclado.)
· 453 Haz un programa que, dado un nombre de fichero, muestre cada una de sus l´ıneas precedida por su n´ umero de l´ınea.
(El nombre del fichero se pedir´a al usuario por teclado.)
· 454 Haz una funci´on que, dadas la ruta de un fichero y una palabra, devuelva una lista con las l´ıneas que contienen a
dicha palabra.
Dise˜ na a continuaci´on un programa que lea el nombre de un fichero y tantas palabras como el usuario desee (utiliza un
bucle que pregunte al usuario si desea seguir introduciendo palabras). Para cada palabra, el programa mostrar´a las l´ıneas
que contienen dicha palabra en el fichero.
· 455 Haz un programa que muestre por pantalla la l´ınea m´as larga de un fichero. Si hay m´as de una l´ınea con la longitud
de la m´as larga, el programa mostrar´a ´ unicamente la primera de ellas. (El nombre del fichero se pedir´a al usuario por teclado.)
· 456 Haz un programa que muestre por pantalla todas las l´ıneas m´as largas de un fichero. (El nombre del fichero se pedir´a
al usuario por teclado.) ¿Eres capaz de hacer que el programa lea una sola vez el fichero?
· 457 La orden head (((cabeza)), en ingl´es) de Unix muestra las 10 primeras l´ıneas de un fichero. Haz un programa head.py
que muestre por pantalla las 10 primeras l´ıneas de un fichero. (El nombre del fichero se pedir´a al usuario por teclado.)
· 458 En realidad, la orden head de Unix muestra las n primeras l´ıneas de un fichero, donde n es un n´ umero suministrado
por el usuario. Modifica head.py para que tambi´en pida el valor de n y muestre por pantalla las n primeras l´ıneas del fichero.
· 459 La orden tail (((cola)), en ingl´es) de Unix muestra las 10 ´ ultimas l´ıneas de un fichero. Haz un programa tail.py
que muestre por pantalla las 10 ´ ultimas l´ıneas de un fichero. (El nombre del fichero se pide al usuario por teclado.) ¿Eres
capaz de hacer que tu programa lea una sola vez el fichero? Pista: usa una lista de cadenas que almacene las 10 ´ ultimas
cadenas que has visto en cada instante.
· 460 Modifica tail.py para que pida un valor n y muestre las n ´ ultimas l´ıneas del fichero.
· 461 El fichero /etc/passwd de los sistemas Unix contiene informaci´on acerca de los usuarios del sistema. Cada l´ınea del
fichero contiene datos sobre un usuario. He aqu´ı una l´ınea de ejemplo:
al55555:x:1000:2000:Pedro P´erez:/home/al55555:/bin/bash
En la l´ınea aparecen varios campos separados por dos puntos (:). El primer campo es el nombre clave del usuario; el
segundo era la contrase˜ na cifrada (por razones de seguridad, ya no est´a en /etc/passwd); el tercero es su n´ umero de usuario
(cada usuario tiene un n´ umero diferente); el cuarto es su n´ umero de grupo (en la UJI, cada titulaci´on tiene un n´ umero de
grupo); el quinto es el nombre real del usuario; el sexto es la ruta de su directorio principal; y el s´eptimo es el int´erprete de
´ordenes.
Haz un programa que muestre el nombre de todos los usuarios reales del sistema.
(Nota: recuerda que el m´etodo split puede serte de gran ayuda.)
· 462 Haz un programa que pida el nombre clave de un usuario y nos diga su nombre de usuario real utilizando /etc/passwd.
El programa no debe leer todo el fichero a menos que sea necesario: tan pronto encuentre la informaci´on solicitada, debe
dejar de leer l´ıneas del fichero.
· 463 El fichero /etc/group contiene una l´ınea por cada grupo de usuarios del sistema. He aqu´ı una l´ınea de ejemplo:
gestion:x:2000:
Al igual que en /etc/passwd, los diferentes campos aparecen separados por dos puntos. El primer campo es el nombre
del grupo; el segundo no se usa; y el tercero es el n´ umero de grupo (cada grupo tiene un n´ umero diferente).
Haz un programa que solicite al usuario un nombre de grupo. Tras consultar /etc/group, el programa listar´a el nombre
real de todos los usuarios de dicho grupo relacionados en el fichero /etc/passwd.
· 464 El comando wc (por ((word count)), es decir, ((conteo de palabras))) de Unix cuenta el n´ umero de bytes, el n´ umero de
palabras y el n´ umero de l´ıneas de un fichero. Implementa un comando wc.py que pida por teclado el nombre de un fichero
y muestre por pantalla esos tres datos acerca de ´el.
Introducci´on a la Programaci´on con Python 45
2003/11/26-16:57
· 465 Haz un programa que lea un fichero de texto que puede contener vocales acentuadas y muestre por pantalla una
versi´on del mismo en el que cada vocal acentuada ha sido sustituida por la misma vocal sin acentuar.
· 466 Dise˜ na un programa, descifra.py, que descifre ficheros cifrados por cifra.py. El programa pedir´a el nombre del
fichero cifrado y el del fichero en el que se guardar´a el resultado.
· 467 Dise˜ na un programa que, dados dos ficheros de texto, nos diga si el primero es una versi´on cifrada del segundo (con
el c´odigo de cifrado descrito en la secci´on).
· 468 Dise˜ na un programa que obtenga los 100 primeros n´ umeros primos y los almacene en un fichero de texto llamado
primos.txt.
· 469 Haz un programa que pida el nombre de un grupo de usuarios Unix. A continuaci´on, abre en modo escritura un
fichero con el mismo nombre del grupo le´ıdo y extensi´on grp. En dicho fichero deber´as escribir el nombre real de todos los
usuarios de dicho grupo, uno en cada l´ınea. (Lee antes el enunciado de los ejercicios 461 y 463.)
· 470 Deseamos automatizar el env´ıo personalizado de correo electr´onico a nuestros clientes. (¿Recuerdas el apartado ???
Si no, est´ udialo de nuevo.) Disponemos de un fichero de clientes llamado clientes.txt en el que cada l´ınea tiene la direcci´on
de correo electr´onico y el nombre de un cliente nuestro. El fichero empieza as´ı:
1 al00000@alumail.uji.esPedroP´erez
2 spammer@spam.comJohnDoe
3 ...
En otro fichero, llamado carta.txt, tenemos un carta personalizable. En ella, el lugar donde queremos poner el nombre del
cliente aparece marcado con el texto $CLIENTE$. La carta empieza as´ı:
1 Estimado/aSr/a$CLIENTE$:
2
3 Tenemosnoticiasdequeud.,don/do~na$CLIENTE$,nohaabonadoelimporte
4 delacuotamensualaqueleobligaeldraconianocontratoquefirm´o
5 ...
Haz un programa que env´ıe un correo a cada cliente con el contenido de carta.txt debidamente personalizado. Ahora
que sabes definir y usar funciones, dise˜ na el programa sirvi´endote de ellas.
· 471 Nuestro ficheros clientes.txt se modifica ahora para incluir como segundo campo de cada l´ınea el sexo de la
persona. La letra H indica que se trata de un hombre y la letra M que se trata de una mujer. Modifica el programa para
que sustituya las expresiones don/do~na por don o do~na, Estimado/a por Estimado o Estimada y Sr/a por Sr o Sra seg´ un
convenga.
· 472 Hemos decidido sustituir las tres llamadas al m´etodo write de las l´ıneas 32, 33 y 34 por una sola:
fcopia.write(linea1+linea2+linea3)
¿Funcionar´a igual?
· 473 En su versi´on actual, es posible a˜ nadir dos veces una misma entrada a la agenda. Modifica anyadir_entrada para
que s´olo a˜ nada una nueva entrada si corresponde a una persona diferente. A˜ nadir por segunda vez los datos de una misma
persona supone sustituir el viejo tel´efono por el nuevo.
· 474 A˜ nade a la agenda las siguientes operaciones:
Listado completo de la agenda por pantalla. Cada entrada debe ocupar una s´ola l´ınea en pantalla.
Listado de tel´efonos de todas las personas cuyo apellido empieza por una letra determinada.
· 475 Haz que cada vez que se a˜ nade una entrada a la agenda, ´esta quede ordenada alfab´eticamente.
· 476 Deseamos poder trabajar con m´as de un tel´efono por persona. Modifica el programa de la agenda para que la l´ınea
que contiene el tel´efono contenga una relaci´on de tel´efonos separados por blancos. He aqu´ı un ejemplo de entrada con tres
tel´efonos:
1 Pedro

2 L´opez

3 96411253796400992396411092

La funci´on buscar_entrada devolver´a una lista con tantos elementos como tel´efonos tiene la persona encontrada. Enriquece
la aplicaci´on con la posibilidad de borrar uno de los tel´efonos de una persona.
46 Introducci´on a la Programaci´on con Python
c 2003 Andr´es Marzal e Isabel Gracia
· 477 Modifica la aplicaci´on de gesti´on de estudiantes del cap´ıtulo anterior para que recuerde todos los datos entre ejecuci´on
y ejecuci´on. (Puedes inspirarte en la segunda versi´on de la agenda.)
· 478 Modifica la aplicaci´on de gesti´on del videoclub del cap´ıtulo anterior para que recuerde todos los datos entre ejecuci´on
y ejecuci´on. Mant´en dos ficheros distintos: uno para las pel´ıculas y otro para los socios.
· 479 Dise˜ na un programa que lea un fichero de texto en formato HTML y genere otro en el que se sustituyan todos los
fragmentos de texto resaltados en negrita por el mismo texto resaltado en cursiva.
· 480 Las cabeceras (t´ıtulos de cap´ıtulos, secciones, subsecciones, etc.) de una p´agina web se marcan encerr´andolas entre
<Hn> y </Hn>, donde n es un n´ umero entre 1 y 6 (la cabecera principal o de nivel 1 se encierra entre <H1> y </H1>). Escribe
un programa para cada una de estas tareas sobre un fichero HTML:
mostrar ´ unicamente el texto de las cabeceras de nivel 1;
mostrar el texto de todas las cabeceras, pero con sangrado, de modo que el texto de las cabeceras de nivel n aparezca
dos espacios m´as a la derecha que el de las cabeceras de nivel n −1.
Un ejemplo de uso del segundo programa te ayudar´a a entender lo que se pide. Para el siguiente fichero HTML,
1 <HTML>
2 <BODY>
3 <H1>Untitular</H1>
4 <P>Textoenunp´arrafo.
5 <P>Otrop´arrafo.
6 <H1>Otrotitular</H1>
7 <H2>Unsubt´ıtulo</H2>
8 <P>Ysutexto.
9 <H3>Unsubsubt´ıtulo</H3>
10 <H2>Otrosubt´ıtulo</H2>
11 <P>Yelsuyo
12 </BODY>
13 </HTML>
el programa mostrar´a por pantalla:
Un titular
Otro titular
Un subt´ıtulo
Un subsubt´ıtulo
Otro subt´ıtulo
· 481 A˜ nade una opci´on a la agenda desarrollada en el apartado anterior para que genere un fichero agenda.html con
un volcado de la agenda que podemos visualizar en un navegador web. El listado aparecer´a ordenado alfab´eticamente (por
apellido), con una secci´on por cada letra del alfabeto y una l´ınea por entrada. El apellido de cada persona aparecer´a destacado
en negrita.
· 482 Modifica el programa agenda2.py para que asuma un formato de agenda.txt similar al /etc/passwd. Cada l´ınea
contiene una entrada y cada entrada consta de 3 o m´as campos separados por dos puntos. El primer campo es el nombre, el
segundo es el apellido y el tercero y posteriores corresponden a diferentes tel´efonos de esa persona.
· 483 Un programa es, en el fondo, un fichero de texto con formato, aunque bastante complicado, por regla general.
Cuando ejecuta un programa el int´erprete est´a, valga la redundancia, interpretando su significado paso a paso. Vamos a
dise˜ nar nosotros mismos un int´erprete para un peque˜ no lenguaje de programaci´on. El lenguaje s´olo tiene tres variables
llamadas A, B y C. Puedes asignar un valor a una variable con sentencias como las de este programa:
1 asignaAsuma3y7
2 asignaBrestaAy2
3 asignaCproductoAyB
4 asignaAdivisionAy10
Si interpretas ese programa, A acaba valiendo 1, B acaba valiendo 8 y C acaba valiendo 80. La otra sentencia del lenguaje
permite mostrar por pantalla el valor de una variable. Si a˜ nades al anterior programa estas otras sentencias:
1 muestraA
2 muestraB
Introducci´on a la Programaci´on con Python 47
2003/11/26-16:57
obtendr´as en pantalla una l´ınea con el valor 1 y otra con el valor 8.
Dise˜ na un programa que pida el nombre de un fichero de texto que contiene sentencias de nuestro lenguaje y muestre por
pantalla el resultado de su ejecuci´on. Si el programa encuentra una sentencia incorrectamente escrita (por ejemplo muestrame
A), se detendr´a mostrando el n´ umero de l´ınea en la que encontr´o el error.
· 484 Enriquece el int´erprete del ejercicio anterior para que entienda la orden si valor condici´on valor entonces
linea n´umero . En ella, valor puede ser un n´ umero o una variable y condici´on puede ser la palabra igual o la palabra
distinto. La sentencia se interpreta como que si es cierta la condici´on, la siguiente l´ınea a ejecutar es la que tiene el n´ umero
n´umero .
Si tu programa Python interpreta este programa:
1 asignaAsuma0y1
2 asignaBsuma0y1
3 muestraB
4 asignaBproducto2yB
5 asignaAsumaAy1
6 siAdistinto8entonceslinea3
en pantalla aparecer´a
1
2
4
8
16
32
64
48 Introducci´on a la Programaci´on con Python

2003/11/26-16:57 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´ticas a Python y eval´alas. Trata de utilizar el menor n´mero de par´ntesis a u u e posible. a) 2 + (3 · (6/2)) b) 4+6 2+3 c) (4/2)5 d) (4/2)5+1 e) (−3)2 f) −(32 )

(Nota: El resultado de evaluar cada expresi´n es: a) 11; b) 2; c) 32; d) 64; e) 9; f) −9.) o · 16 ¿Qu´ resultar´ de evaluar las siguientes expresiones? Presta especial atenci´n al tipo de datos que resulta de cada e a o operaci´n individual. Haz los c´lculos a mano ayud´ndote con ´rboles sint´cticos y comprueba el resultado con el ordenador. o a a a a a) 1 / 2 / 4.0 b) 1 / 2.0 / 4.0 c) 1 / 2.0 / 4 d) 1.0 / 2 / 4 e) 4 ** .5 f) 4.0 ** (1 / 2) · 17
>>> >>> >>> >>> >>>

g) 4.0 ** (1 / 2) + 1 / 2 h) 4.0 ** (1.0 / 2) + 1 / 2.0 i) 3e3 / 10 j) 10 / 5e-3 k) 10 / 5e-3 + 1 l) 3 / 2 + 1

¿Qu´ resultados se muestran al evaluar estas expresiones? e

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´lidos los siguientes identificadores? a a) Identificador b) Indice\dos c) Dos palabras d) __ e) 12horas f) hora12 g) desviaci´n o h) a˜o n i) from j) var ! k) ’var’ l) import_from m) UnaVariable n) a(b) n) 12 ˜ o) uno.dos p) x q) π r) ´rea a s) area-rect t) x_______ 1 u) ________ 1 v) _x_ w) x_x

· 19 ¿Qu´ resulta de ejecutar estas tres l´ e ıneas?
>>> x = 10 >>> x = x * 10 >>> x

· 20 Eval´a el polinomio x4 + x3 + 2x2 − x en x = 1.1. Utiliza variables para evitar teclear varias veces el valor de x. (El u resultado es 4.1151.) · 21 Eval´a el polinomio x4 + x3 + 1 x2 − x en x = 10. Aseg´rate de que el resultado sea un n´mero flotante. (El resultado u u u 2 es 11040.0.) · 22 ¿Qu´ resultar´ de ejecutar las siguientes sentencias? e a
>>> >>> >>> >>> z z z z =2 += 2 += 2 - 2 *= 2 Introducci´n a la Programaci´n con Python o o

2

c 2003 Andr´s Marzal e Isabel Gracia e

>>> >>> >>> >>> >>> >>> >>> >>>

z z z z z z z z

*= 1 + 1 /= 2 %= 3 /= 3 - 1 -= 2 + 1 -= 2 **= 3

· 23 Eval´a estas expresiones y sentencias en el orden indicado: u a) a = ’b’ b) a + ’b’ c) a + ’a’ d) a * 2 + ’b’ * 3 e) 2 * (a + ’b’) · 24 ¿Qu´ resultados se obtendr´n al evaluar las siguientes expresiones y asignaciones Python? Calcula primero a mano el e a valor resultante de cada expresi´n y comprueba, con la ayuda del ordenador, si tu resultado es correcto. o a) ’a’ * 3 + ’/*’ * 5 + 2 * ’abc’ + ’+’ b) palindromo = ’abcba’ (4 * ’<’ + palindromo + ’>’ * 4) * 2 c) subcadena = ’=’ + ’-’ * 3 + ’=’ ’10’ * 5 + 4 * subcadena d) 2 * ’12’ + ’.’ + ’3’ * 3 + ’e-’ + 4 * ’76’ · 25 Identifica regularidades en las siguientes cadenas, y escribe expresiones que, partiendo de subcadenas m´s cortas y a utilizando los operadores de concatenaci´n y repetici´n, produzcan las cadenas que se muestran. Introduce variables para o o formar las expresiones cuando lo consideres oportuno. a) ’%%%%%./././<-><->’ b) ’(@)(@)(@)======(@)(@)(@)======’ c) ’asdfasdfasdf=-=-=-=-=-=-=-??????asdfasdf’ d) ’........*****---*****---........*****---*****---’ · 26
>>> >>> >>> >>> >>> >>> >>> >>>

¿Qu´ resultados se muestran al evaluar estas expresiones? e

’abalorio’ < ’abecedario’ ’abecedario’ < ’abecedario’ ’abecedario’ <= ’abecedario’ ’Abecedario’ < ’abecedario’ ’Abecedario’ == ’abecedario’ 124 < 13 ’124’ < ’13’ ’ a’ < ’a’

· 27 Calcula con una unica expresi´n el valor absoluto del redondeo de −3.2. (El resultado es 3.0.) ´ o · 28 Convierte (en una unica expresi´n) a una cadena el resultado de la divisi´n 5011/10000 redondeado con 3 decimales. ´ o o · 29
>>> >>> >>> >>> >>> >>>

¿Qu´ resulta de evaluar estas expresiones? e

str (2.1) + str (1.2) int(str (2) + str (3)) str (int(12.3)) + ’0’ int(’2’+’3’) str (2 + 3) str (int(2.1) + float(3))

Introducci´n a la Programaci´n con Python o o

3

2003/11/26-16:57 · 30 ¿Qu´ resultados se obtendr´n al evaluar las siguientes expresiones Python? Calcula primero a mano el valor resultante e a de cada expresi´n y comprueba, con la ayuda del ordenador, si tu resultado es correcto. o a) int(exp(2 * log(3))) b) round (4*sin(3 * pi / 2)) c) abs(log10(.01) * sqrt(25)) d) round (3.21123 * log10(1000), 3) · 31 Dise˜a un programa que, a partir del valor del lado de un cuadrado (3 metros), muestre el valor de su per´ n ımetro (en metros) y el de su ´rea (en metros cuadrados). a (El per´ ımetro debe darte 12 metros y el ´rea 9 metros cuadrados.) a · 32 Dise˜a un programa que, a partir del valor de la base y de la altura de un tri´ngulo (3 y 5 metros, respectivamente), n a muestre el valor de su ´rea (en metros cuadrados). a Recuerda que el ´rea A de un tri´ngulo se puede calcular a partir de la base b y la altura h como A = 1 bh. a a 2

h b (El resultado es 7.5 metros cuadrados.) · 33 Dise˜a un programa que, a partir del valor de los dos lados de un rect´ngulo (4 y 6 metros, respectivamente), muestre n a el valor de su per´ ımetro (en metros) y el de su ´rea (en metros cuadrados). a (El per´ ımetro debe darte 20 metros y el ´rea 24 metros cuadrados.) a · 34 Dise˜a un programa que pida el valor del lado de un cuadrado y muestre el valor de su per´ n ımetro y el de su ´rea. a (Prueba que tu programa funciona correctamente con este ejemplo: si el lado vale 1.1, el per´ ımetro ser´ 4.4, y el ´rea a a 1.21.) · 35 Dise˜a un programa que pida el valor de los dos lados de un rect´ngulo y muestre el valor de su per´ n a ımetro y el de su a ´rea. (Prueba que tu programa funciona correctamente con este ejemplo: si un lado mide 1 y el otro 5, el per´ ımetro ser´ 12.0, a y el ´rea 5.0.) a · 36 Dise˜a un programa que pida el valor de la base y la altura de un tri´ngulo y muestre el valor de su ´rea. n a a (Prueba que tu programa funciona correctamente con este ejemplo: si la base es 10 y la altura 100, el ´rea ser´ 500.0.) a a · 37 Dise˜a un programa que pida el valor de los tres lados de un tri´ngulo y calcule el valor de su ´rea y per´ n a a ımetro. Recuerda que el ´rea A de un tri´ngulo puede calcularse a partir de sus tres lados, a, b y c, as´ A = s(s − a)(s − b)(s − c), a a ı: 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´ 15.0 y a el ´rea 6.49519052838.) a · 38 El ´rea A de un tri´ngulo se puede calcular a partir del valor de dos de sus lados, a y b, y del ´ngulo θ que ´stos a a a e n forman entre s´ con la f´rmula A = 1 ab sin(θ). Dise˜a un programa que pida al usuario el valor de los dos lados (en metros), ı o 2 el ´ngulo que estos forman (en grados), y muestre el valor del ´rea. a a b θ a (Ten en cuenta que la funci´n sin de Python trabaja en radianes, as´ que el ´ngulo que leas en grados deber´s pasarlo a o ı a 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´s y un n´mero de a˜os. Muestra e u n por pantalla en cu´nto se habr´ convertido el capital inicial transcurridos esos a˜os si cada a˜o se aplica la tasa de inter´s a a n n e introducida. Recuerda que un capital de C euros a un inter´s del x por cien durante n a˜os se convierten en C · (1 + x/100)n euros. e n (Prueba tu programa sabiendo que una cantidad de 10 000 ¤ al 4.5% de inter´s anual se convierte en 24 117.14 ¤ al cabo e de 20 a˜os.) n 4
Introducci´n a la Programaci´n con Python o o

%d’ % (1. o · 46 Dibuja esta figura. e Introducci´n a la Programaci´n con Python o o 5 . 100) · 47 Dibuja esta figura. nombre.) · 43 ¿Qu´ peque˜a diferencia hay entre el programa saluda. ’. (Utiliza los operadores de concatenaci´n y repetici´n.upper () % (1.py 1 2 nombre = raw_input(’Tu nombre: ’) print ’Hola.’ · 44 La marca %s puede representar cadenas con un n´mero fijo de casillas. e · 48 Dibuja esta figura. (Te indicamos las coordenadas de las esquinas inferior izquierda y superior derecha.) (900. pero dejando un espacio de separaci´n entre aparici´n y aparici´n del nombre. 200 y 300.py y este otro cuando los ejecutamos? e n saluda2. 2)).c 2003 Andr´s Marzal e Isabel Gracia e · 40 Haz un programa que pida el nombre de una persona y lo muestre en pantalla repetido 1000 veces. Los tres c´ ırculos conc´ntricos tienen radios 100. a d c b Los tres c´ ırculos conc´ntricos tienen radios 100.) o o o o o · 41 ¿Qu´ mostrar´ por pantalla este programa? e a 1 2 3 4 5 6 print print print print print print ’%d’ % 1 ’%d %d’ % (1. 900) (100. cometer errores. A la vista de c´mo se pod´ expresar esta u o ıa caracter´ ıstica en la marca de enteros %d. in ? ValueError: unsupported format character ’D’ (0x44) at index 8 ¿Qu´ crees que ha pasado? e (Nota: Aunque experimentar conlleva el riesgo de equivocarse. 2 ’%d 2’ % 1 · 42 Un alumno inquieto ha experimentado con las marcas de formato y el m´todo upper y ha obtenido un resultado e sorprendente: >>> print (’n´mero %d y n´mero %d’ % (1. 200 y 300. line 1. Probarlo todo. no podemos enfatizar suficientemente cu´n importante es a para que asimiles las explicaciones. respectivamente. 2) u u Traceback (most recent call last): File "<stdin>". 2) ’%d%d’ % (1. 2) 1. respectivamente. reflexionar sobre ellos y corregirlos es uno de los mejores ejercicios imaginables. ¿sabr´ como indicar que deseamos representar una cadena que ocupa 10 casillas? ıas · 45 Dise˜a un programa que solicite el radio de una circunferencia y muestre su ´rea y per´ n a ımetro con s´lo 2 decimales. 2) ’%d.upper () u u N´MERO 1 Y N´MERO 2 U U >>> print ’n´mero %d y n´mero %d’.’.

explica qu´ est´ mal. el n´mero de suspensos. obtiene este mensaje de error. que es la marcada como err´nea. ´ File "primer_grado4. a d c b (Hemos usado los colores amarillo y magenta para las l´ ıneas rectas.py E a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) if a != 0: x = -b/a print ’Soluci´n: ’.2003/11/26-16:57 · 49 Dibuja esta figura. mediante el teclado.’ o o ´ Por m´s que el estudiante lee el programa. mediante el teclado. He aqu´ c´mo: o a ı o 40 % 30 % 20 % 10 % Sus Apr Not Sob Dise˜a un programa que solicite por teclado el n´mero de personas con cada una de las cuatro calificaciones y muestre el n u resultado con un gr´fico de barras. notables y sobresalientes. a · 53 Un programador propone el siguiente programa para resolver la ecuaci´n de primer grado: o 1 2 3 4 5 6 a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) a*x+b=0 print ’Soluci´n: ’. o se lee as´ ((si a es igual a cero. . al ejecutarlo. x o ¿Es correcto este programa? Si no.py 1 2 3 4 5 6 7 8 E primer grado. u aprobados. no encuentra fallo alguno. El dice que la l´ a ınea 7. explica qu´ est´ mal. (Antes de dibujar el gr´fico de pastel debes convertir esas cantidades en porcentajes. )) ¿Est´ en lo cierto? ¿Por qu´ se detecta un error? ı: a e 6 Introducci´n a la Programaci´n con Python o o . .py". e a · 55 Un estudiante ha tecleado el ultimo programa y. · 51 Modifica el programa para que sea el usuario quien proporcione. notables y sobresalientes.) · 50 Modifica el programa para que sea el usuario quien proporcione. el valor del porcentaje de suspensos.) a · 52 Queremos representar la informaci´n de forma diferente: mediante un gr´fico de barras. e a · 54 1 2 3 4 5 6 Otro programador propone este programa: x = -b / a a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) print ’Soluci´n: ’. x o ¿Es correcto? Si no lo es. verde y azul para los c´ ırculos y negro para las letras. aprobados. x o if a = 0: print ’La ecuaci´n no tiene soluci´n. line 7 if a = 0: ^ SyntaxError: invalid syntax Aqu´ tienes el contenido del fichero que ´l ha escrito: ı e primer grado 3.

)) cuando sea impar. Ten en n e a cuenta que ambas pueden tener la misma edad. o a a) 1 2 3 4 5 6 misterio 3. x o print ’La ecuaci´n no tiene soluci´n.py E a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) if a != 0: x = -b/a print ’Soluci´n: ’. En tal caso.)) s´lo si el n´mero es mayor o igual que cero. o u · 59 Dise˜a un programa que lea un n´mero flotante por teclado y muestre por pantalla el mensaje ((El n´mero es n u u positivo.c 2003 Andr´s Marzal e Isabel Gracia e · 56 Un programador primerizo cree que la l´ ınea 7 de la ultima versi´n de primer grado.py 1 2 3 4 5 6 7 8 E primer grado. grados = float(raw_input(’Dame un ´ngulo (en grados): ’)) a cuadrante = int(ceil (grados) % 360) / 90 if cuadrante == 0: print ’primer cuadrante’ if cuadrante == 1: print ’segundo cuadrante’ if cuadrante == 2: print ’tercer cuadrante’ if cuadrante == 3: print ’cuarto cuadrante’ · 63 ¿Qu´ mostrar´ por pantalla el siguiente programa? e a comparaciones. · 58 Dise˜a un programa que lea un n´mero flotante por teclado y muestre por pantalla el mensaje ((El n´mero es n u u negativo.)) cuando el n u u n´mero sea par y el mensaje ((El n´mero es impar. d) a = 0 y b = 0. a ıdo e · 62 Indica en cada uno de los siguientes programas qu´ valores en las respectivas entradas provocan la aparici´n de los e o distintos mensajes.)) s´lo si el n´mero es menor que cero. muestre por pantalla el mensaje ((El n´mero es par. ¿Son correctos todos los mensajes que muestra por pantalla el programa? · 57 Indica qu´ l´ e ıneas del ultimo programa (y en qu´ orden) se ejecutar´n para cada uno de los siguientes casos: ´ e a a) a = 2 y b = 6. e impar en caso contrario.py letra = raw_input(’Dame una letra min´scula: ’) u if letra <= ’k’: print ’Es de las primeras del alfabeto’ if letra >= ’l’: print ’Es de las ´ltimas del alfabeto’ u misterio 4.py misterio.’ o o Haz una traza del programa para a = 2 y b = 2.py 1 2 3 4 comparaciones.py b) 1 2 3 4 5 6 7 8 9 10 11 12 13 misterio. c) a = 0 y b = −3. · 61 Dise˜a un programa que lea un car´cter de teclado y muestre por pantalla el mensaje ((Es par´ntesis)) s´lo si el n a e o car´cter le´ es un par´ntesis abierto o cerrado. as´ que propone ´ o ı esta otra versi´n como soluci´n v´lida: o o a primer grado 4. la primera o la segunda. o u · 60 Dise˜a un programa que lea la edad de dos personas y diga qui´n es m´s joven.py if 14 < 120: print ’Primer saludo’ if ’14’ < ’120’: print ’Segundo saludo’ · 64 Dise˜a un programa que.) u Introducci´n a la Programaci´n con Python o o 7 . dado un n´mero entero. hazlo saber con un mensaje adecuado. b) a = 0 y b = 3. u u (Una pista: un n´mero es par si el resto de dividirlo por 2 es 0.py es innecesaria.py from math import ceil # ceil redondea al alza. Piensa primero la soluci´n y comprueba luego que es correcta ayud´ndote con el ordenador.

2003/11/26-16:57 · 65 Dise˜a un programa que. billete de 20 euros.py from math import sqrt a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) c = float(raw_input(’Valor de c: ’)) if a == 0 and b == 0 and c == 0: print ’La ecuaci´n tiene infinitas soluciones.4*a*c)) / (2 * a) x2 = (-b . dependiendo de la verificaci´n de la condici´n correspondiente al significado de o o cada mensaje.3f’ % (x1. billete de 10 euros. Por ejemplo.’ o else: print ’La ecuaci´n no tiene soluci´n.3f’ % x o o else: x1 = (-b + sqrt(b**2 . x2) o · 70 ¿Hay alguna diferencia entre el programa anterior y este otro cuando los ejecutamos? segundo grado 4. monedas de 2 euros.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 segundo grado.)).) · 66 Dise˜a un programa que. el programa mostrar´ por pantalla el siguiente resultado: a 2 1 1 2 billetes de 200 euros.3f y x2=%4. Hay billetes de 500.py from math import sqrt a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) c = float(raw_input(’Valor de c: ’)) if a == 0: if b == 0: if c == 0: print ’La ecuaci´n tiene infinitas soluciones. muestre por pantalla uno de estos mensajes: ((El segundo n u es el cuadrado exacto del primero.sqrt(b**2 .3f’ % x o o Introducci´n a la Programaci´n con Python o o 8 . como el resto de la ultima divisi´n es 34. . dividimos a continuaci´n 34 entre 100 ı o y vemos que no hay ning´n billete de 100 ¤ en el desglose (cabe a 0).’ o else: if a == 0 and b == 0: print ’La ecuaci´n no tiene soluci´n. . Empieza por calcular la divisi´n entera entre la cantidad y 500 (el valor o u a o de la mayor moneda): 434 entre 500 da 0. cabe a 2 y sobran 34. as´ que no hay billetes de 500 ¤ en el desglose.)).’ o o else: if a == 0: x = -c / b print ’Soluci´n de la ecuaci´n: x=%4. 10 y 5 ¤ y monedas de 2 y 1 ¤. determine si ´ste es el doble de un n´mero impar.)) o ((El segundo es mayor que el cuadrado del primero. as´ que en el desglose hay 2 billetes de 200 ¤.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 segundo grado. dado un n´mero entero. (¿Que c´mo se efect´a el desglose? Muy f´cil. ) u · 69 ¿Hay alguna diferencia entre el programa anterior y este otro cuando los ejecutamos? segundo grado 3. que es impar. dados dos n´meros enteros. 100. e o · 68 Realiza un programa que calcule el desglose en billetes y monedas de una cantidad exacta de euros. (Ejemplo: 14 es n u e u el doble de 7.’ o o else: x = -c / b print ’Soluci´n de la ecuaci´n: x=%4. 50. Dise˜a e n n un programa Python que solicite la cantidad C y el inter´s x y calcule el capital final s´lo si x es una cantidad positiva. 20. pasamos a u ´ o dividir 34 entre 20 y vemos que el desglose incluye un billete de 20 ¤ y a´n nos faltan 14 ¤ por desglosar. 200. ((El segundo es menor que el cuadrado del primero. divide a continuaci´n la cantidad ı o 434 entre 200. · 67 Un capital de C euros a un inter´s del x por cien anual durante n a˜os se convierte en C · (1 + x/100)n euros. si deseamos conocer el desglose de 434 ¤.4*a*c)) / (2 * a) print ’Soluciones de la ecuaci´n: x1=%4.

b) a = 3. ¿Cu´l es.4*a*c)) / (2 * a) x2 = (-b . a · 76 Un programador ha intentado solucionar el problema del discriminante negativo con un programa que empieza as´ ı: E segundo grado. Pero el programa no llega siquiera a dar soluci´n alguna (bien o mal ız o calculada) cuando lo ejecutamos con.sqrt(b**2 . Evidentemente.4*a*c)) / (2 * a) x2 = (-b . vocales acentuadas.py 1 2 3 4 5 6 7 8 9 maximo. no mostrar´ mensaje alguno. b = 1 y c = 1. tendr´s problemas. c) a = 1. u o · 80 Dise˜a un programa que calcule el m´ximo de 5 n´meros enteros. b = 3 y c = 4.) n · 74 Ampl´ el programa del ejercicio anterior para que pueda identificar las letras e˜e min´scula y may´scula. con ayuda del entorno de depuraci´n de PythonG. maximo a ¿Es correcto? ¿Qu´ pasa si introducimos dos n´meros iguales? e u · 79 ¿Qu´ secuencia de l´ e ıneas de este ultimo programa se ejecutar´ en cada uno de estos casos? ´ a a) a = 2. x2) o · 71 Ejecuta paso a paso. . ce cedilla. etc.. pues e ı o pregunta por el signo de la ra´ de dicho argumento. (Considera unicamente letras del alfabeto ingl´s.4*a*c)) / (2 * a) . En cualquier otro a u U u caso. c) a = −2 y b = 0. a = 4. Analiza con cuidado el ultimo caso. el programa del ejercicio anterior. a u Introducci´n a la Programaci´n con Python o o 9 . ¿Qu´ sale por pantalla en ese caso? ¿Por qu´? e e · 77 ¿Qu´ l´ e ıneas del ultimo programa se ejecutan y qu´ resultado aparece por pantalla en cada uno de estos casos? ´ e a) a = 2 y b = 3. d) a = 1 y b = 1.4*a*c)) / (2 * a) print ’Soluciones de la ecuaci´n: x1=%4. a ´ e recuerda que una letra es min´scula si est´ entre la ’a’ y la ’z’. Si sigues una estrategia similar a la de la primera n a u soluci´n propuesta para el problema del m´ximo de 3 n´meros. as´ que la comparaci´n es incorrecta. es decir con un ((candidato a valor m´ximo)) que se va actualizando al compararse con cada n´mero.c 2003 Andr´s Marzal e Isabel Gracia e 16 17 18 19 else: x1 = (-b + sqrt(b**2 .3f’ % (x1. por ejemplo.sqrt(b**2 . El problema estriba en el posible valor negativo del argumento de sqrt. y may´scula si est´ entre la ’A’ y la ’Z’. Ay´date con el modo de depuraci´n de PythonG. b) a = 3 y b = 2. b = 2 y c = 4.py a = int(raw_input(’Dame el primer n´mero: ’)) u b = int(raw_input(’Dame el segundo n´mero: ’)) u if a > b: maximo = a if b > a: maximo = b print ’El m´ximo es’.4*a*c) >= 0 : x1 = (-b + sqrt(b**2 . ıa n u u · 75 Modifica el programa que propusiste como soluci´n al ejercicio 66 sustituyendo todas las condiciones que sea posible o por cl´usulas else de condiciones anteriores. Intenta resolverlo como en el ultimo o a u a ´ programa de ejemplo. el m´ximo? ¿Es correcto el ´ u a a resultado del programa? · 78 Un aprendiz de programador ha dise˜ado este otro programa para calcular el m´ximo de dos n´meros: n a u maximo 2.py E 1 2 3 4 5 6 7 8 9 10 11 from math import sqrt a = float(raw_input(’Valor de a: ’)) b = float(raw_input(’Valor de b: ’)) c = float(raw_input(’Valor de c: ’)) if a != 0: if sqrt(b**2 . Observa que los dos n´meros son iguales. y muestre el mensaje ((Es una MAY´SCULA)) n a U cuando el car´cter sea una letra may´scula y el mensaje ((Es una MIN´SCULA)) cuando sea una min´scula. b = 2 y c = 4. o · 72 Dise˜a un programa Python que lea un car´cter cualquiera desde el teclado.) Pista: aunque parezca una obviedad. (Nota: no te preocupes por las letras e˜e. pues.3f y x2=%4. el programa es incorrecto y te sorprender´ saber que algunos estudiantes proponen soluciones similares a a ´sta. u a u a · 73 Ampl´ la soluci´n al ejercicio anterior para que cuando el car´cter introducido no sea una letra muestre el mensaje ıa o a ((No es una letra)).

’ % anyo n else: print ’El a~o %d no es bisiesto. 4.’ % mes u n identificador. la primera palabra de las cinco en orden n alfab´tico.py car = raw_input(’Dame un car´cter: ’) a if ’a’ <= car. determine cu´l de los cuatro ultimos puntos es m´s cercano n a ´ a al primero.py dia = int(raw_input(’Dime qu´ d´a es hoy: ’)) e ı if 0 < dia <= 15: print ’Puedes aparcar en el lado izquierdo de la calle’ else: if 15 < dia < 32: print ’Puedes aparcar en el lado derecho de la calle’ else: print ’Ning´n mes tiene %d d´as. No aceptaremos que las may´sculas sean ((alfab´ticamente)) menores que las min´sculas.’. La distancia entre dos a puntos (x1 . de acuerdo con la tabla e u e u ASCII. Aceptaremos que las may´sculas son ((alfab´ticamente)) menores que las min´sculas. (Por ejemplo. ı a print ’siempre que no sea el primer car´cter. Un punto se representar´ con dos variables: una para la abcisa y otra para la ordenada. es decir.2003/11/26-16:57 · 81 Dise˜a un programa que calcule la menor de cinco palabras dadas.’ else: if not (mes < 7 or 9 < mes): print ’Verano. es decir. · 82 Dise˜a un programa que calcule la menor de cinco palabras dadas. y2) es (x1 − x2 )2 + (y1 − y2 )2 . determine cu´l de los cuatro ultimos n´meros es m´s cercano n u a ´ u a al primero.’ a a else: if not (car < ’0’ or ’9’ < car ): print ’Un d´gito es v´lido en un identificador en Python. dados cinco puntos en el plano.’ % anyo n 10 Introducci´n a la Programaci´n con Python o o .py aparcar. · 85 Indica en cada uno de los siguientes programas qu´ valores o rangos de valores provocan la aparici´n de los distintos e o mensajes: a) 1 2 3 4 5 6 7 8 9 aparcar.) · 84 Dise˜a un programa que. el programa responder´ que el n´mero m´s u a u a cercano al 2 es el 1.’ n else: print ’Ning´n a~o tiene %d meses. O sea.py d) 1 2 3 4 5 6 bisiesto. ’pepita’ es e u e u menor que ’Pepito’. 6. la primera palabra de las cinco en orden n alfab´tico.’ else: if not (mes != 10 and mes != 11 and mes != 12): print ’Oto~o. · 83 Dise˜a un programa que.py c) 1 2 3 4 5 6 7 8 9 10 identificador.py mes = int(raw_input(’Dame un mes: ’)) if 1 <= mes <= 3: print ’Invierno.’ a else: print ’Car´cter no v´lido para formar un identificador en Python.’ else: if mes == 4 or mes == 5 or mes == 6: print ’Primavera. y1 ) y (x2 .py b) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 estaciones.’ a a bisiesto. 1 y 10.py anyo = int(raw_input(’Dame un a~o: ’)) n if anyo % 4 == 0 and (anyo % 100 != 0 or anyo % 400 == 0): print ’El a~o %d es bisiesto. si el usuario introduce los n´meros 2.lower () <= ’z’ or car == ’ ’: print ’Este car´cter es v´lido en un identificador en Python.’ % dia u ı estaciones. dados cinco n´meros enteros.

La calificaci´n cualitativa ser´ una de las siguientes: ((Suspenso)) o u o a (nota menor que 5).. dado un n´mero real que debe representar la calificaci´n num´rica de un examen. el n´mero de a˜os es 0 independientemente de la tasa de o u n inter´s (incluso de la que provocar´ un error de divisi´n por cero). ((Sobresaliente)) (nota mayor o igual que 8. print a ..5). e ıa o (Ejemplos: Para obtener 11 000 ¤ por una inversi´n de 10 000 ¤ al 5% anual es necesario esperar 1. perimetro ı else: if opcion == c: area = pi * radio ** 2 print ’El ´rea es’. consonante may´scula u otro tipo de car´cter. area a Las l´ ıneas sombreadas son diferentes de sus equivalentes del programa original. Para obtener 10 000 ¤ con una inversi´n de 10 000 ¤ no o o hay que esperar nada. etc). sea cual sea el inter´s. con una excepci´n: si C y C son iguales. Obtener o n 11 000 ¤ por una inversi´n de 10 000 ¤ al 0% anual es imposible. lo identifique como vocal min´scula. u u a · 89 ¿Por qu´ obtenemos un error en esta sesi´n de trabajo con el int´rprete interactivo? e o e >>> a = 0 >>> if 1/a > 1 and a != 0: . el c´lculo de logaritmos de a a o e o a valores negativos. b o c y pulsa el retorno de carro: ’) if opcion == a: diametro = 2 * radio print ’El di´metro es’.’ ı print ’c) Calcular el ´rea. e · 91 Haz una traza del programa suponiendo que el usuario teclea la letra d cuando se le solicita una opci´n. pero menor que 8.) e · 87 Dise˜a un programa que. ((Aprobado)) (nota mayor o igual que 5.py from math import pi radio = float(raw_input(’Dame el radio de un c´rculo: ’)) ı print ’Escoge una opci´n: ’ o print ’a) Calcular el di´metro. ((Notable)) (nota mayor o igual que 7. pero menor que 7). podemos n e despejar n en la f´rmula del ejercicio 67 de la siguiente manera: o n= log(C ) − log(C) log(1 + x/100) Dise˜a un programa Python que obtenga el n´mero de a˜os que se tarda en conseguir un capital final dado a partir de n u n un capital inicial y una tasa de inter´s anual tambi´n dados. ((Matr´ ıcula de Honor)) (nota 10). Si lo que nos interesa conocer es el n´mero de e u n u a˜os n que tardaremos en lograr un capital final C partiendo de un capital inicial C a una tasa de inter´s anual x. vocal may´scula.. ¿Qu´ l´ o e ıneas del programa se ejecutan? Introducci´n a la Programaci´n con Python o o 11 .’ a print ’b) Calcular el per´metro.9535 a˜os. proporcione n u o e la calificaci´n cualitativa correspondiente al n´mero dado. pero menor que 10). line 1. una tasa de inter´s anual (x) en tanto por cien y un n´mero de a˜os (n).py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 circulo. · 88 Dise˜a un programa que. Traceback (most recent call last): File "<stdin>". diametro a else: if opcion == b: perimetro = 2 * pi * radio print ’El per´metro es’. .5. in ? ZeroDivisionError: integer division or modulo by zero · 90 Nuestro aprendiz de programador ha tecleado en su ordenador el ultimo programa.’ a opcion = raw_input(’Teclea a. El programa debe tener en cuenta cu´ndo se puede realizar el e e a c´lculo y cu´ndo no en funci´n del valor de la tasa de inter´s (para evitar una divisi´n por cero. ¿Funcionar´ el programa del aprendiz? Si no a es as´ ¿por qu´ motivo?. ı. dado un car´cter cualquiera.c 2003 Andr´s Marzal e Isabel Gracia e · 86 La f´rmula C = C · (1 + x/100)n nos permite obtener el capital final que lograremos a partir de un capital inicial o (C).. pero se ha despistado y ha escrito ´ esto: circulo 3. conson a u u nante min´scula. .

2003/11/26-16:57 · 92 El programa presenta un punto d´bil: si el usuario escribe una letra may´scula en lugar de min´scula. ¿No te parece m´s legible la nueva soluci´n? o a o · 94 Ejecuta el ultimo programa paso a paso con el entorno de depuraci´n de PythonG. ejercicio bucle 14.py 1 2 3 4 5 ejercicio bucle.py 1 2 3 4 5 ejercicio bucle.py i=0 while i <= 3: print i i += 1 print ’Hecho’ · 96 Haz una traza de este programa: ejercicio bucle 10.py i = int(raw_input(’Valor inicial: ’)) while i < 10: print i i += 1 ¿Qu´ ocurre si el valor de i es mayor o igual que 10? ¿Y si es negativo? e · 101 Haz unas cuantas trazas de este programa para diferentes valores de i y de limite.py 1 2 3 4 5 ejercicio bucle.py 1 2 3 4 ejercicio bucle. o e u · 93 Modifica la soluci´n del ejercicio 87 usando ahora la estructura elif . ´ o · 95 Haz una traza de este programa: ejercicio bucle 9.py i = int(raw_input(’Valor inicial: ’)) limite = int(raw_input(’L´mite: ’)) ı while i < limite: print i i += 1 · 102 Haz unas cuantas trazas de este programa para diferentes valores de i.py 1 2 3 4 ejercicio bucle.py i = 10 while i < 2: i *= 2 print i · 100 Haz unas cuantas trazas de este programa para diferentes valores de i. de limite y de incremento. Modifica el programa para que tambi´n acepte letras may´sculas.py 1 2 3 4 5 ejercicio bucle. 12 Introducci´n a la Programaci´n con Python o o . ejercicio bucle 15.py i=3 while i < 10: i += 2 print i print ’Hecho’ · 98 Haz una traza de este programa: ejercicio bucle 12. no se selecciona e u u ninguna opci´n.py i=1 while i < 100: i *= 2 print i · 99 Haz una traza de este programa: ejercicio bucle 13.py 1 2 3 4 ejercicio bucle.py i=0 while i < 10: print i i += 2 print ’Hecho’ · 97 Haz una traza de este programa: ejercicio bucle 11.

Si el usuario teclea un n u n´mero fuera del rango v´lido. u · 106 Estudia las diferencias entre el siguiente programa y el ultimo que hemos estudiado. el programa no efect´e ning´n c´lculo y muestre por pantalla un u u a mensaje que diga que n debe ser menor o igual que m. ambos inclusive.py 1 2 3 4 5 6 sumatorio. u a a o · 113 Dise˜a un programa que solicite la lectura de un texto que no contenga letras may´sculas. (Ten en cuenta que n ha de ser mayor o igual que m.c 2003 Andr´s Marzal e Isabel Gracia e ejercicio bucle 16. sqrt(x)) ı · 112 Dise˜a un programa que solicite la lectura de un n´mero entre 0 y 10 (ambos inclusive).py sumatorio = 0 i=0 while i < 1000: i += 1 sumatorio += i print sumatorio · 107 Dise˜a un programa que calcule n m i.) n (Puedes comprobar la validez de tu programa introduciendo los valores n = 15 y m = 10: el resultado es 3003. (n − m)! m! m Dise˜a un programa que pida el valor de n y m y calcule Cn . pero no existe ning´n operador Python que permita efectuar este c´lculo directamente.) · 111 ¿Qu´ te parece esta otra versi´n del mismo programa? e o raiz 2. haz un programa que pida el valor de n y muestre por pantalla el resultado de calcular n!. i=n donde n y m son n´meros enteros que deber´ introducir el usuario por teclado. u a · 108 Modifica el programa anterior para que si n > m. · 110 El n´mero de combinaciones que podemos formar tomando m elementos de un conjunto con n elementos es: u m Cn = n m = n! . El factorial de n se denota con u n!.py i = int(raw_input(’Valor inicial: ’)) limite = int(raw_input(’L´mite: ’)) ı incremento = int(raw_input(’Incremento: ’)) while i < limite: print i i += incremento · 103 Implementa un programa que muestre todos los m´ltiplos de 6 entre 6 y 150. el programa solicitar´ nuevamente la introducci´n del texto cuantas veces sea preciso. ambos inclusive. Si el usuario teclea una n u letra may´scula. . u · 105 Implementa un programa que muestre todos los n´meros potencia de 2 entre 20 y 230 . Sabiendo que u a n! = 1 · 2 · 3 · . . · (n − 1) · n y que 0! = 1.py 1 2 3 4 5 6 ejercicio bucle. u a o Introducci´n a la Programaci´n con Python o o 13 .py from math import sqrt x = float(raw_input(’Introduce un n´mero positivo: ’)) u while x < 0: x = float(raw_input(’Introduce un n´mero positivo: ’)) u print ’La ra´z cuadrada de %f es %f’ % (x. · 109 Queremos hacer un programa que calcule el factorial de un n´mero entero positivo. ¿Producen ambos el mismo ´ resultado? sumatorio 2. u · 104 Implementa un programa que muestre todos los m´ltiplos de n entre n y m · n. ambos inclusive.py 1 2 3 4 5 6 7 raiz. el programa solicitar´ nuevamente la introducci´n del valor cuantas veces sea menester. donde n y m son u n´meros introducidos por el usuario.

z1 ) · (x2 . y1 − y2 . a u la opci´n 4 mostrar´ el siguiente men´: o a u 14 Introducci´n a la Programaci´n con Python o o . y2 . perimetro ı elif opcion == ’c’: area = pi * radio ** 2 print ’El ´rea es’.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 circulo. z1 ) × (x2 . z). y1 + y2 . b o c. y2 . Si es as´ la tabla 1 te ser´ de ayuda: a ı. diametro a elif opcion == ’b’: perimetro = 2 * pi * radio print ’El per´metro es’. Por ejemplo. z1 − z2 ) x1 x2 + y1 y2 + z1 z2 (y1 z2 − z1 y2 . b o c y pulsa el retorno de carro: ’) if opcion < ’a’ or opcion > ’c’: print ’S´lo hay tres opciones: a. y1 . y1 . y1 . y2 . z1 x2 − x1 z2 . Deseamos confeccionar un programa que permita operar con dos vectores. si se u o ı escoge cualquiera de ellas. y2 . y.2003/11/26-16:57 · 114 ¿Es correcto este otro programa? ¿En qu´ se diferencia del anterior? ¿Cu´l te parece mejor (si es que alguno de ellos e a te parece mejor)? circulo 4. T´ has tecleado’. Si el usuario escoge una opci´n diferente. z1 ) y (x2 . a Operaci´n o Suma: (x1 .’ ı print ’c) Calcular el ´rea. a Tras la ejecuci´n de cada una de las acciones del men´ ´ste reaparecer´ en pantalla. y2 . y1 . z) C´lculo a (x1 + x2 . z2 ) Producto escalar: (x1 . a · 116 Un vector en un espacio tridimensional es una tripleta de valores reales (x. x1 y2 − y1 x2 ) 180 · arccos π x2 + y 2 + z 2 x1 x2 + y1 y2 + z1 z2 x2 1 2 2 + y 1 + z1 2 2 x2 + y2 + z2 2 Tabla 1: Recordatorio de operaciones b´sicas sobre vectores. z2 ) Diferencia: (x1 . El usuario ver´ en pantalla un men´ con las siguientes opciones: a u 1) 2) 3) 4) 5) 6) 7) 8) 9) Introducir el primer vector Introducir el segundo vector Calcular la suma Calcular la diferencia Calcular el producto escalar Calcular el producto vectorial Calcular el ´ngulo (en grados) entre ellos a Calcular la longitud Finalizar Puede que necesites que te refresquemos la memoria sobre los c´lculos a realizar. opcion o u if opcion == ’a’: diametro = 2 * radio print ’El di´metro es’.’ a opcion = raw_input(’Teclea a. z1 ) − (x2 . a menos que la opci´n escogida sea o ue a o la n´mero 9. u o a u a Las opciones 4 y 6 del men´ pueden proporcionar resultados distintos en funci´n del orden de los operandos. z1 + z2 ) (x1 − x2 . z2 ) Producto vectorial: (x1 . y. z1 ) + (x2 . despu´s. deber´ mostrarse un nuevo men´ que permita seleccionar el orden de los operandos. permite seleccionar uno o m´s c´lculos con ese e a a valor del radio. Modifica el programa para que pida el valor del radio cada vez que se solicita efectuar un nuevo c´lculo.’ a print ’b) Calcular el per´metro.py from math import pi radio = float(raw_input(’Dame el radio de un c´rculo: ’)) ı opcion = ’’ while opcion < ’a’ or opcion > ’c’: print ’Escoge una opci´n: ’ o print ’a) Calcular el di´metro. y1 . el programa advertir´ al usuario de su error y el men´ reaparecer´. area a · 115 El programa anterior pide el valor del radio al principio y. as´ que. z2 ) ´ Angulo entre (x1 . z2 ) Longitud de (x.

200. u Introducci´n a la Programaci´n con Python o o 15 . ´ u · 128 Haz una traza del ultimo programa para el n´mero 125. i=n · 125 Haz un programa que pida el valor de dos enteros n y m y calcule el sumatorio de todos los n´meros pares u comprendidos entre ellos (incluy´ndolos en el caso de que sean pares). a · 124 Haz un programa que pida el valor de dos enteros n y m y que muestre por pantalla el valor de m i2 . todos los n´meros pares comprendidos u entre 0 y 200 (ambos inclusive). a Ten en cuenta que tu programa debe contemplar y controlar toda posible situaci´n excepcional: divisiones por cero. si el usuario se equivoca. i=n Debes usar un bucle for-in para el c´lculo del sumatorio. e · 126 Haz un traza del programa para los siguientes n´meros: u a) 4 b) 13 c) 18 d) 2 (¡ojo con ´ste!) e · 127 Haz una traza del ultimo programa para el n´mero 125. El mcd es el n´mero m´s a u u a grande que divide exactamente a ambos n´meros. · 123 Haz un programa que pida el valor de dos enteros n y m y que muestre por pantalla el valor de m i. 100. etc´tera. · 120 Haz un programa que muestre. Aqu´ u ı tienes un ejemplo de c´mo se debe comportar el programa: o Dame un n´mero: 5 u 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50 · 118 Realiza un programa que proporcione el desglose en billetes y monedas de una cantidad entera de euros. a a La opci´n 8 del men´ principal conducir´ tambi´n a un submen´ para que el usuario decida sobre cu´l de los dos vectores o u a e u a se aplica el c´lculo de longitud.) · 117 Haz un programa que muestre la tabla de multiplicar de un n´mero introducido por teclado por el usuario. 50. (Nota: La funci´n arcocoseno se encuentra disponible en el m´dulo math y su identificador e o o es acos. para n tomando valores entre 2 y ız e u ıdo 100. 20. · 121 Haz un programa que muestre. en l´ ıneas independientes. ra´ o ıces con argumento negativo. 10 y 5 ¤ y monedas de 2 y 1 ¤. Debes ((recorrer)) los valores de billete y moneda disponibles con uno o m´s bucles for-in.c 2003 Andr´s Marzal e Isabel Gracia e 1) Primer vector menos segundo vector 2) Segundo vector menos primer vector Nuevamente. Recuerda que hay billetes de 500. en l´ ıneas independientes y en orden inverso. · 122 Escribe un programa que muestre los n´meros pares positivos entre 2 y un n´mero cualquiera que introduzca el u u usuario por teclado. todos los n´meros pares comprendidos entre 0 y 200 (ambos u inclusive). se le advertir´ del error y se le permitir´ corregirlo. a · 119 Haz un programa que muestre la ra´ n-´sima de un n´mero le´ por teclado. ´ u · 129 Haz un programa que calcule el m´ximo com´n divisor (mcd) de dos enteros positivos.

py c) 1 2 3 ejercicio for.py e) 1 2 3 4 ejercicio for. Ten en cuenta que o la funci´n es ((problem´tica)) en x = −1. · 132 En realidad no hace falta explorar todo el rango de n´meros entre 2 y n − 1 para saber si un n´mero n es o no es u u primo. 4): for k in range(0. k ejercicio for 12. u u el programa mostrar´ por pantalla el n´mero mayor de cuantos ha visto.py b) 1 2 3 ejercicio for. 5): print i. j. o · 133 Ni siquiera hace falta explorar todo el rango de n´meros entre √ y n/2 para saber si un n´mero n es o no es primo. 2] con 100 puntos azules. j ejercicio for 10.py for i in range(0. muestre la funci´n f (x) = ax2 + bx + c en el intervalo [z1 . 4): for j in range(0. j. el programa mostrar´ un mensaje de despedida y finalizar´ su ejecuci´n.py ejercicio for.py for i in range(1.py for i in range(0. a a o · 135 Haz un programa que vaya leyendo n´meros hasta que el usuario introduzca un n´mero negativo. Dibuja con c´ n a o ırculos rojos los puntos en los que la par´bola f (x) corta el eje horizontal. dados tres valores a. j · 137 Haz un programa que muestre la funci´n coseno en el intervalo que te indique el usuario. El programa de dibujo debe calcular el valor m´ximo y m´ a ınimo de f (x) en el intervalo indicado para ajustar el valor de window_coordinates de modo que la funci´n se muestre sin recorte o alguno. 10. En ese momento. por lo que dibujaremos un punto rojo en las coordenadas (−1. 4): for j in range(0.py for i in range(0. z2 ].) Modifica el programa para que s´lo u exploremos ese rango. Recuerda que la par´bola corta al eje horizontal en los a a puntos x1 y x2 que son soluci´n de la ecuaci´n de segundo grado ax2 + bx + c = 0.py for i in range(0. 4): for k in range(i. (Cr´etelo. · 134 Haz un programa que vaya leyendo n´meros y mostr´ndolos por pantalla hasta que el usuario introduzca un n´mero u a u negativo. u 2 u e o Basta con explorar el rango de n´meros entre 2 y la parte entera de n. En ese momento. 3): print i. 5): for j in range(0. i): print i. j): print i. o donde z1 y z2 son valores proporcionados por el usuario. Piensa por qu´.py for i in range(0. o o 16 Introducci´n a la Programaci´n con Python o o . pero o o cada una en un color distinto. · 139 Haz un programa que muestre la funci´n 1/(x + 1) en el intervalo [−2. 0). Modifica el programa para u e que s´lo exploremos ese rango. i): print i. o a · 140 Haz un programa que.py f) 1 2 3 ejercicio for. Basta con explorar el rango de n´meros entre 2 y la parte entera de n/2. El mcd de tres n´meros es a u u el n´mero m´s grande que divide exactamente a los tres. 5): for j in range(0. a u · 136 ¿Qu´ resultar´ de ejecutar estos programas? e a a) 1 2 3 ejercicio for 7. 5): for j in range(i. j ejercicio for 9.py d) 1 2 3 4 ejercicio for. · 141 A˜ade a la gr´fica del ejercicio anterior una representaci´n de los ejes coordenados en color azul. 5): for j in range(0. o · 138 Modifica el programa anterior para que se muestren dos funciones a la vez: la funci´n seno y la funci´n coseno.2003/11/26-16:57 · 130 Haz un programa que calcule el m´ximo com´n divisor (mcd) de tres enteros positivos. j ejercicio for 8. u a · 131 Haz una traza del programa para el valor 125. 2): print i. b y c. k ejercicio for 11.

c 2003 Andr´s Marzal e Isabel Gracia e · 142 ¿Qu´ pasar´ si los dos cuerpos ocuparan exactamente la misma posici´n en el plano? Modifica el programa para e ıa o que. El resto es un n´mero entre 0 y 22. · 151 Modifica el juego del front´n para convertirlo en un teletenis. ´sta a e se destruir´. el a consumo. las l´ a ıneas saldr´n del lado correspondiente. no se produzca error alguno y finalice inmediatamente la ejecuci´n del bucle. ¿Funciona? Introducci´n a la Programaci´n con Python o o 17 . o · 156 La ultima letra del DNI puede calcularse a partir de sus n´meros. Con o o a la raqueta podr´ golpear una pelota que rebotar´ en las paredes. cambia el color del fondo para que sea negro y a˜ade unas estrellas. por ejemplo). un nivel de dificultad. El ordenador controlar´ una raqueta en el lado superior o a de la imagen. el programa apenas ocupa tres l´ o ıneas. Si la nave toca un meteorito. si se da el caso. con un men´. la velocidad de desplazamiento de la plataforma. Piensa c´mo. Ofrece al menos tres niveles: u f´cil. Si se golpea a la plataforma desde abajo.. claro est´. a · 155 Averigua el c´digo ASCII de los 10 primeros caracteres de la tabla ??.. a · 150 Programa un juego de front´n electr´nico. · 152 ¿Qu´ se mostrar´ en pantalla al ejecutar estas sentencias? e a >>> 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.. la l´ ıneas saldr´n de debajo de la nave. s´lo cuando el usuario interrumpa la ejecuci´n o o o del programa). No permitas que el ordenador haga trampas. el a a juego finaliza. · 145 Modifica el juego para que la barra que indica el combustible disponible se ponga de color rojo cuando quede menos del 25%. Puedes modificar la dificultad del juego a voluntad alterando par´metros como el fuel disponible. El usuario controlar´ una raqueta en el lado inferior de la pantalla.) o · 157 Intentamos mostrar los caracteres de la cadena en orden inverso as´ ı: >>> a = "mi cadena" >>> for i in range(len(a). etc. -1): . o · 143 Modifica el programa para que la simulaci´n no finalice nunca (bueno.) · 153 ¿C´mo crees que se pueden representar dos barras invertidas seguidas en una cadena? o · 154 La secuencia de escape \a emite un aviso sonoro (la ((campana))). Si la pelota se sale por el borde inferior de la pantalla. es decir. n n Tambi´n puedes mostrar una l´ e ıneas amarillas saliendo de la nave cuando se activa alg´n propulsor. la fuerza de la gravedad. la velocidad de desplazamiento de la raqueta ha de ser (como mucho) la misma que la del usuario. · 144 ¿Ser´ capaz de extender el programa para que muestre la interacci´n entre tres cuerpos? Repasa la formulaci´n ıas o o f´ ısica del problema antes de empezar a programar. a a a · 148 A˜ade efectos especiales al juego. Si se acciona el propulsor u inferior. normal y dif´ a ıcil. Por ejemplo. la nave se destruir´ y el jugador habr´ fracasado. a · 149 Modifica el juego para que aparezca un n´mero determinado de meteoritos en pantalla (tres. y si se activa un propulsor lateral. Cada u meteorito se representar´ con un c´ a ırculo de color rojo y se ir´ desplazando por la pantalla.. n u (Nota: una implementaci´n basada en tomar una decisi´n con if -elif conduce a un programa muy largo. · 147 Modifica el juego para que la plataforma no est´ en el suelo. Si usas el o o operador de indexaci´n de cadenas de forma inteligente. El usuario debe aterrizar en la plataforma e desde arriba. print a[i] . ¿Qu´ hace exactamente cuando se imprime en e pantalla? Ejecuta print ’\a’ y lo averiguar´s. Para ello s´lo tienes que dividir el n´mero por 23 ´ u o u y quedarte con el resto. · 146 Modifica el juego para que el usuario pueda escoger. La letra que corresponde a cada n´mero la tienes en esta tabla: u u 0 T 1 R 2 W 3 A 4 G 5 M 6 Y 7 F 8 P 9 D 10 X 11 B 12 N 13 J 14 Z 15 S 16 Q 17 V 18 H 19 L 20 C 21 K 22 E Dise˜a un programa que lea de teclado un n´mero de DNI y muestre en pantalla la letra que le corresponde. sino flotando.

Comprueba si tu programa funciona en toda circunstancia. n u · 160 Dise˜a un programa que lea una cadena y muestre el n´mero de letras may´sculas que contiene.. · 173 Dise˜a un programa que muestre la cantidad de d´ n ıgitos que aparecen en una cadena introducida por teclado. La cadena ’un 1. es decir. corr´ ıgelo. tiene 3 n´meros: el 1. n u u · 161 Dise˜a una programa que lea una cadena y muestra en pantalla el mensaje ((Contiene d´gito)) si contiene alg´n n ı u d´ ıgito y ((No contiene d´gito)) en caso contrario. tiene 3 d´ ıgitos: un 1. · 174 Dise˜a un programa que muestre la cantidad de n´meros que aparecen en una cadena le´ de teclado.. sino n´mero propiamente dicho. · 169 Dise˜a un programa que lea una cadena y un n´mero entero k y nos diga si todas sus palabras tienen una longitud n u de k caracteres. · 165 Modifica el programa para que base el c´mputo de palabras en el n´mero de transiciones de blanco a no blanco en o u lugar de en el n´mero de transiciones de no blanco a blanco. ı · 162 Haz una traza del programa para la cadena ’a b’.. por ejemplo. u · 166 Nuestro aprendiz aventajado propone esta otra soluci´n al problema de contar palabras: o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 cadena = raw_input(’Escribe una frase: ’) while cadena != ’’: cambios = 0 for i in range(1. · 170 Escribe un programa que lea una cadena y un n´mero entero k y muestre el mensaje ((Hay palabras largas)) si u alguna de las palabras de la cadena es de longitud mayor o igual que k. · 171 Escribe un programa que lea una cadena y un n´mero entero k y muestre el mensaje ((Todas son cortas)) si todas u las palabras de la cadena son de longitud estrictamente menor que k. palabras cadena = raw_input(’Escribe una frase: ’) ¿Es correcta? · 167 Dise˜a un programa que lea una cadena y un n´mero entero k y nos diga cu´ntas palabras tienen una longitud de n u a k caracteres. len(cadena)): if cadena[i] == ’ ’ and cadena[i-1] != ’ ’: cambios = cambios + 1 if cadena[-1] == ’ ’: cambios = cambios . y ((Hay alguna palabra corta)) en caso contrario. el 201 y el 2. ¿Funciona? · 159 Dise˜a un programa que lea una cadena y muestre el n´mero de espacios en blanco que contiene. -1. u 18 Introducci´n a la Programaci´n con Python o o . · 168 Dise˜a un programa que lea una cadena y un n´mero entero k y nos diga si alguna de sus palabras tiene una longitud n u de k caracteres. print a[i] . secuencia de d´ u ıgitos. -1): . y ((Hay alguna palabra larga)) en caso contrario.. y ((No hay palabras largas)) en caso contrario. ¿Qu´ l´ e ıneas se ejecutan y qu´ valores toman las variables cambios. · 164 ¿Funciona el programa cuando introducimos una cadena formada s´lo por espacios en blanco? ¿Por qu´? Si su o e comportamiento no te parece normal. un 201 y 2 uno por ejemplo. · 172 Escribe un programa que lea una cadena y un n´mero entero k y muestre el mensaje ((Todas las palabras son u largas)) si todas las palabras de la cadena son de longitud mayor o igual que k.2003/11/26-16:57 · 158 Intentamos mostrar los caracteres de la cadena en orden inverso as´ ı: >>> a = "mi cadena" >>> for i in range(len(a)-1. ¡Ojo! Con n u ıda n´mero no queremos decir d´ u ıgito.1 palabras = cambios + 1 print ’Palabras:’. un 2 y un 0. e anterior y caracter tras la ejecuci´n de cada una de ellas? o · 163 ´ Idem para la cadena ’a b’. La cadena ’un 1 y un 20’.

1e-2’. ’3.’. a u · 178 Un texto est´ bien parentizado si por cada par´ntesis abierto hay otro m´s adelante que lo cierra. la a e a cadena ’Esto (es (un) (ejemplo (de) ((cadena) bien)) parentizada). a Por ejemplo.c 2003 Andr´s Marzal e Isabel Gracia e · 175 Dise˜a un programa que indique si una cadena le´ de teclado est´ bien formada como n´mero entero. valor ¿Es correcto? Haz trazas para las cadenas ’1101’ y ’010’.1e01’. valor Haz trazas para las cadenas ’1101’ y ’010’.py bits = raw_input(’Dame un n´mero binario: ’) u valor = 0 for bit in bits: if bit == ’1’: valor += valor + 1 else: valor += valor print ’Su valor decimal es’. ((Identificador inv´lido)). ’3. mostrar´ el texto ((Identificador v´lido)) y si no.’ est´ bien parentizada. para ’12’ mostrar´ ((Es entero)).1’. Si alg´n car´cter de la u u a cadena es distinto de ’0’ o ’1’. nuestro aprendiz ha dise˜ado un programa diferente: a n decimal 4.py bits = raw_input(’Dame un n´mero binario: ’) u valor = 0 for bit in bits: valor += valor + int(bit) print ’Su valor decimal es’. En todos los casos deber´ indicar que se trata de n´meros flotantes correctamente formados. Introducci´n a la Programaci´n con Python o o 19 .py bits = raw_input(’Dame un n´mero binario: ’) u valor = 0 for bit in bits: if bit == ’1’: valor = 2 * valor + 1 else: valor = 2 * valor print ’Su valor decimal es’. n a · 179 Implementa un programa que lea de teclado una cadena que representa un n´mero binario. ’-10. Por ejemplo. Si lo est´. a a a a · 177 Dise˜a un programa que indique si una cadena le´ por teclado est´ bien formada como n´mero flotante. a · 180 Haz una traza para las cadenas ’1101’ y ’010’. ’1e+5’. · 183 ¿Y esta otra? ¿Es correcta? decimal 6. El programa n ıda a u escribir´ ((Es entero)) en caso afirmativo y ((No es entero)) en caso contrario. pero para ’1 2’ o ’a’ mostrar´ ((No es entero)).2E3’. el programa advertir´ al usuario de que la cadena introducida no representa un n´mero a u binario y pedir´ de nuevo la lectura de la cadena.1’. pero no lo est´n estas otras: a a ’una cadena)’ ’(una cadena’ ’(una (cadena)’ ’)una( cadena’ Dise˜a un programa que lea una cadena y nos diga si la cadena est´ bien o mal parentizada. ’.py 1 2 3 4 5 6 7 decimal. · 182 ¿Y esta otra versi´n? ¿Es correcta? o decimal 5. a a · 176 Dise˜a un programa que indique si una cadena introducida por el usuario est´ bien formada como identificador de n a variable. · 181 Una vez m´s. ’.py 1 2 3 4 5 6 7 8 9 10 decimal. valor Haz trazas para las cadenas ’1101’ y ’010’.py 1 2 3 4 5 6 7 8 9 10 decimal. n ıda a u Prueba el programa con estas cadenas: ’3.

a us´ tu auto. · 192 Una frase es pal´ ındromo si se lee igual de derecha a izquierda que de izquierda a derecha. Por ejemplo.) · 197 Una de las t´cnicas de criptograf´ m´s rudimentarias consiste en sustituir cada uno de los caracteres por otro situado e ıa a n posiciones m´s a la derecha.2003/11/26-16:57 · 184 ¿Qu´ pasa si introducimos una cadena con caracteres que no pertenecen al conjunto de d´ e ıgitos binarios como. la cadena se interpretar´ como un n´mero octal (ejemplo: ’017’ es 15).s. Si el nombre no tiene ning´n ´ u punto. y a pap´ Roma le aviva el o e a a a amor a mam´)) y ((¡arriba la birra!)).mpl. · 200 ¿No ser´ tambi´n problem´tico que introduzcamos un valor del ´ a e a ındice i mayor o igual que el de j? ¿Se producir´ a entonces un error de ejecuci´n? ¿Por qu´? o e 20 Introducci´n a la Programaci´n con Python o o . ((Amigo. y as´ sucesivamente. pero obviando los espacios en blanco y los signos de puntuaci´n. ((amor)). en tal caso. muestre en pantalla el mensaje ((N´mero binario mal u formado)) y solicite nuevamente la introducci´n de la cadena. ((Salta Len´ el atlas)). ’101a2’? Modifica el programa para que. respectivamente. que se sustituye por el ((1))). asumiremos que su extensi´n es la cadena vac´ Haz un programa que solicite el nombre de un fichero y muestre por o ıa. o u · 187 Dise˜a un programa que reciba una cadena que codifica un n´mero en octal. la letra ((y)) se sustituir´ por ´ a o a la ((a)) y la letra ((z)) por la ((b)). ’anita lava la tina’. o · 185 Dise˜a un programa que convierta una cadena de d´ n ıgitos entre el ((0)) y el ((7)) al valor correspondiente a una interpretaci´n de dicha cadena como n´mero en base octal. u e · 194 Hay un tipo de pasatiempos que propone descifrar un texto del que se han suprimido las vocales. o may´sculas o la a u apertura de exclamaci´n con su cierre. si no. La sustituci´n debe aplicarse a las letras min´sculas y may´sculas y a los d´ o u u ıgitos (el ((0)) se sustituye por el ((2)). · 196 Haz un programa que lea dos cadenas que representen sendos n´meros binarios. Si n = 2. Susana)). a ı El problema que aparece en las ultimas n letras del alfabeto tiene f´cil soluci´n: en el ejemplo. por ejemplo. demon´ a ın ıaco Ca´ o me delata)).1. Modifica tu programa para que identifique correctamente frases pal´ o ındromas en las que pueden aparecer letras may´sculas. Dise˜a un programa que ayude al creador de pasatiempos. a u · 188 Dise˜a un programa que lea un n´mero entero y muestre una cadena con su representaci´n octal. Por ejemplo. la ((b)) por la ((e)). e n e · 191 Dise˜a un programa que nos diga si una cadena es pal´ n ındromo o no. · 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. A continuaci´n. a a u se interpretar´ como un n´mero decimal (ejemplo: ’99’ es 99). y si no. por ejemplo. vocales acentuadas y la vocal ((u)) con di´resis. ´se de crema)). Si. el usuario introduce las cadenas u a ’100’ y ’111’.n . Dise˜a un programa que lea una palabra y nos diga si es alfab´tica o no. pues hemos de comparar ciertas letras con sus versiones acentuadas. ’luz azul’ o e e y ’la ruta natural’ contienen frases pal´ ındromas. por ejemplo. se descifra sustituyendo cada punto con una vocal del texto. ((A mam´ Roma le aviva el amor a pap´. Por ejemplo.tex. el texto ((.j. o u · 186 Dise˜a un programa que convierta una cadena de d´ n ıgitos o letras entre la ((a)) y la ((f)) al valor correspondiente a una interpretaci´n de dicha cadena como n´mero en base hexadecimal. n u o · 189 Dise˜a un programa que lea una cadena que representa un n´mero codificado en base 8 y muestre por pantalla su n u representaci´n en base 2. que son doc y tex. Por ejemplo.mp.t.. a · 195 El nombre de un fichero es una cadena que puede tener lo que denominamos una extensi´n. n o · 198 Dise˜a un programa que lea un texto criptografiado siguiendo la t´cnica descrita en el apartado anterior y el valor n e de n utilizado al encriptar para mostrar ahora el texto decodificado. si el primer car´cter es ((0)). ’ana’ es un pal´ ındromo. Dise˜a un programa que diga si una frase es o no es pal´ n ındroma. no gima)). · 193 Probablemente el programa que has dise˜ado para el ejercicio anterior falle ante frases pal´ n ındromas como ´stas: e ´ ((D´bale arroz a la zorra el abad)). d. el programa mostrar´ como resultado la cadena ’1011’. a (Nota: El procedimiento de suma con acarreo que implementes deber´ trabajar directamente con la representaci´n binaria a o le´ ıda. El programa recibir´ una cadena y n a mostrar´ otra en la que cada vocal ha sido reemplazada por un punto. las cadenas ’s´ verla al rev´s’. ((An´s ın.s)). sustituiremos la ((a)) por la ((c)). decimal o hexadecimal y muestre el n u valor de dicho n´mero. ı Dise˜a un programa que lea un texto y el valor de n y muestre su versi´n criptografiada. Prueba la validez de tu programa pidiendo que muestre la extensi´n de los o o nombres de fichero documento. o · 190 Una palabra es ((alfab´tica)) si todas sus letras est´n ordenadas alfab´ticamente. Si la cadena empieza por ((0x)) o ((0X)) se interpretar´ como un n´mero hexadecimal (ejemplo: ’0xff’ u a u es 255). pantalla los caracteres que forman su extensi´n.doc y tema. ((A Mercedes. p. el programa mostrar´ u o a el n´mero binario que resulta de sumar ambos (y que ser´ otra cadena). La extensi´n de un o o nombre de fichero es la serie de caracteres que suceden al ultimo punto presente en la cadena. ((chino)) e e a e ((himno)) son palabras ((alfab´ticas)). La soluci´n es ((un o ejemplo de pasatiempos)). el ((1)) por el ((3)) y as´ hasta llegar al ((9)). ((Atale. Una cadena es pal´ ındromo si se lee igual de izquierda a derecha que de derecha a izquierda.

b y c al final? e a · 214 ¿Qu´ aparecer´ por pantalla al evaluar la expresi´n [1][0]? ¿Y al evaluar la expresi´n [][0]? e a o o · 215 Hemos asignado a x la lista [1. i print ’y fin’ · 217 ¿Qu´ aparecer´ por pantalla al ejecutar este programa? e a 1 2 for i in [1] * 10: print i · 218 ¿Sabr´ decir que resultados se mostrar´n al ejecutar estas sentencias? ıas a Introducci´n a la Programaci´n con Python o o 21 . 3] y ahora queremos asignar a y una copia. un ´ n ındice i y un n´mero n. n (Ejemplo: ’sub’ es un prefijo de ’subcadena’. Por ejemplo. >>> >>> >>> >>> >>> a = ’ab’ a *= 3 b=a c = a[:] c=c+b ¿Qu´ se mostrar´ por pantalla si imprimimos a. 2. n · 206 Dise˜a un programa que lea una cadena y un entero k y muestre por pantalla todas sus subcadenas de longitud k. Podr´ ıamos hacer y = x[:].) · 209 Dise˜a un programa que lea dos cadenas y devuelva el prefijo com´n m´s largo de ambas. Por ejemplo. muestre por pantalla todos sus prefijos. n (Ejemplo: ’de’ es una subcadena de ’subcadena’. dada la cadena n ’UJI’.c 2003 Andr´s Marzal e Isabel Gracia e · 201 Dise˜a un programa que. dada una cadena. ¿Es as´ ¿Por qu´? e ı? e · 216 ¿Qu´ aparecer´ por pantalla al ejecutar este programa? e a 1 2 3 4 print ’Principio’ for i in []: print ’paso’. ¿Por qu´? ¿Sabr´ corregir el programa? e ıas · 212 Dibuja un diagrama con el estado de la memoria tras ejecutar estas sentencias: >>> a = ’cadena’ >>> b = a[2:3] >>> c = b + ’’ · 213 Dibuja diagramas que muestren el estado de la memoria paso a paso para esta secuencia de asignaciones. ¿qu´ es el corte a[:]? e · 203 ¿Qu´ corte utilizar´ para obtener los n caracteres de una cadena a partir de la posici´n de ´ e ıas o ındice i? · 204 Dise˜a un programa que. n u a (Ejemplo: las cadenas ’polit´cnico’. n · 207 Dise˜a un programa que lea dos cadenas a y b y nos diga si b es un prefijo de a o no.) · 208 Dise˜a un programa que lea dos cadenas a y b y nos diga si b es una subcadena de a o no. si la variable texto vale ’Hola =A. n u a (Ejemplo: las cadenas ’polit´cnico’ y ’polinizaci´n’ tienen como prefijo com´n m´s largo a la cadena ’poli’. ’polinizaci´n’ y ’poros’ tienen como prefijo com´n m´s largo a la cadena e o u a ’po’. dados una cadena c.) · 211 El programa no funcionar´ bien con cualquier carta.) e o u a · 210 Dise˜a un programa que lea tres cadenas y muestre el prefijo com´n m´s largo de todas ellas. pero parece que y = x + [] tambi´n funciona. muestre la subcadena de c formada por u los n caracteres que empiezan en la posici´n de ´ o ındice i. =’ el programa a falla. por pantalla debe aparecer: U UJ UJI · 205 Dise˜a un programa que lea una cadena y muestre por pantalla todas sus subcadenas de longitud 3. · 202 Si a vale ’Ejemplo’.

22 Introducci´n a la Programaci´n con Python o o . 3] b = [a[0]. 1] >>> (a[0] is b[0]) and (a[1] is b[1]) and (a[2] is b[2]) True >>> a == b True >>> a is b False · 222 ¿Qu´ ocurrir´ al ejecutar estas ´rdenes Python? e a o >>> >>> >>> >>> >>> >>> >>> >>> [1. n No puedes utilizar operadores de comparaci´n entre listas para implementar el programa. 2] [1. 5] b = a[1:3] c=a d = a[:] a == c a == d c == d a == b a is c a is d c is d a is b · 224 Haz un programa que almacene en una variable a la lista obtenida con range(1. 2. 2] [1. 3] is a + [] is a + [] == a · 221 Explica. 3] [0. o · 220 ¿Qu´ ocurrir´ al ejecutar estas ´rdenes Python? e a o >>> >>> >>> >>> a a a a = [1. la modifique o para que cada componente sea igual al cuadrado del componente original. 4. 3] [10. 2] is [1. 3. 20. a continuaci´n.2003/11/26-16:57 >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> [1. 2] a = [1. 2] [1. 3] > [1. 2. 30] > [1. 3] [1] < [1. 2. 2] [1.4) y. 20. 30] > [1. 3] <= [1. 2] < [0] · 219 Dise˜a un programa que tras asignar dos listas a sendas variables nos diga si la primera es menor que la segunda. 2. 3] [1. b[1]. b[2]] · 223 >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> Que se muestra por pantalla como respuesta a cada una de estas sentencias Python: a = [1. 2. 2] [10. 2. a[2]] a == b a is b a[0] == b[1] b is [b[0]. 2. 2] == [1. 2. 1] >>> b = [1. 20. 2. 3] < [1. 3] < [1. 3] > [1. 3] [1] < [2. 2] [1. 1] < [1. a[1]. 3] [10. con la ayuda de un gr´fico que represente la memoria. 2. 2. El programa mostrar´ la lista resultante por a pantalla. 2. 2. los resultados de evaluar estas expresiones: a >>> a = [1. 2] < [1.

py 1 2 3 4 5 6 7 8 9 10 11 copias. ´sta pasar´ a ser [2. 5) del a[1] del a[1] print a · 233 Dise˜a un programa que elimine de una lista todos los elementos de ´ n ındice par y muestre por pantalla el resultado. 3].c 2003 Andr´s Marzal e Isabel Gracia e · 225 Haz un programa que almacene en a una lista obtenida con range(1. donde n es un entero que se pide al usuario y modifique dicha lista para que cada componente sea igual al cuadrado del componente original. 1. f . el programa mostrar´ la lista a [’una’. aunque s´ aparec´ dos veces en la cadena le´ ı ıa ıda. 5. sustituya cualquier elemento negativo por cero. 5. 3]. Cuando un n´mero sea negativo.) e a Introducci´n a la Programaci´n con Python o o 23 . pero asegur´ndose de que todos los n´meros introducidos por n a u el usuario son positivos. d.n). c. -5. (Ejemplo: si trabaja con la lista [1. · 231 Dise˜a un programa que lea una cadena y muestre por pantalla una lista con todas sus palabras en min´sculas. 5) c=a d = b[:] e=a+b f = b[:1] g = b[0] c[0] = 100 d[0] = 200 e[0] = 300 print a. Por ejemplo: ante la cadena ’Una frase formada con palabras. -5. · 226 Haz un programa que. La n u lista devuelta no debe contener palabras repetidas. ’formada’. 2. 5) b = range(0. dada una lista a cualquiera. ’frase’. · 227 ¿Qu´ mostrar´ por pantalla el siguiente programa? e a copias 2. Observa que en la lista no aparece dos veces la palabra ((frase)). 1.’. 2] d=c d[2] = 3 e = d[:1] f = d[:] f [0] = a[1] f [1] = 1 · 229 Dise˜a un programa que construya una lista con los n primeros n´meros primos (ojo: no los primos entre 1 y n. ’palabras’. b. · 228 >>> >>> >>> >>> >>> >>> >>> >>> >>> Representa el estado de la memoria tras efectuar cada una de las siguientes asignaciones: a = [1. ¿Necesitas usar append ? ¿Puedes reservar en primer lugar un vector con n celdas nulas y u asignarle a cada una de ellas uno de los n´meros primos? u · 230 Dise˜a un programa que lea una lista de 10 enteros. lo indicaremos con un mensaje y permitiremos al usuario repetir u el intento cuantas veces sea preciso. ’con’. 1. e. n (Ejemplo: si trabaja con la lista [1. · 232 ¿Qu´ sale por pantalla al ejecutar este programa?: e 1 2 3 4 Otra frase con otras palabras. 0. 2. 3]. g Comprueba con el ordenador la validez de tu respuesta. -2. sino n u los n primeros n´meros primos). 0.py a = range(0. 3]. 1] b=1 c = [2. ’otra’. El programa mostrar´ la a lista resultante por pantalla. a = range(0. ´sta pasar´ a ser [1. 1. ’otras’].) e a · 234 Dise˜a un programa que elimine de una lista todos los elementos de valor par y muestre por pantalla el resultado.

o · 245 Una matriz identidad es aquella cuyos elementos en la diagonal principal. Construye una matriz identidad de 4 filas y 4 columnas. 3): print M [i] print ’--’ for i in range(0. · 246 ¿Qu´ resulta de ejecutar este programa? e 1 2 3 4 5 6 7 8 9 10 M = [ [1. 0].’´’. 0]. ’Luis’.’´’. ¿Podr´ ((estandarizar)) la separaci´n de palabras en una sola l´ ıas o ınea Python? Por estandarizar queremos decir que la cadena no empiece ni acabe con espacios en blanco y que cada palabra se separe de la siguiente por un unico ´ espacio en blanco. ’Mar´a’. 3. 1] ] print M [-1][0] print M [-1][-1] print ’--’ for i in range(0.’´’.’´’. valen uno y el resto valen cero.py por esta otra?: 1 lista = [’Pepe’. 0. 8] for i in lista: if elemento == i: pertenece = True else: pertenece = False break if pertenece: print ’Pertenece’ else: print ’No pertenece’ · 237 ¿Qu´ hace este programa? e 1 2 3 letra = raw_input(’Dame una letra: ’) if (len(letra) == 1 and ’a’<=letra <=’z’) or letra in [’´’.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 E pertenencia. [0. 4.’¨’. es decir. Escribe un programa que determine y muestre el n´mero de palabras de cada frase. ’es una letra min´scula’ u · 239 ¿Qu´ ocurrir´ si sustituimos la primera l´ e a ınea de burbuja. ¿Con qu´ orden simple puedes e contar el n´mero de frases? u · 241 En una cadena llamada texto disponemos de un texto formado por varias frases. ¿qu´ diferencia hay con respecto a usar del a[i]? ı. Construye una matriz nula de 5 filas y 5 columnas. 1.join([’uno’. 1.2003/11/26-16:57 · 235 A nuestro programador novato se le ha ocurrido esta otra forma de eliminar el elemento de ´ ındice i de una lista a: 1 a = a[:i] + a[i+1:] ¿Funciona? Si no es as´ ¿por qu´? Y si funciona correctamente. ’Ana’. ’es una letra min´scula’ u · 238 ¿Qu´ hace este programa? e 1 2 3 letra = raw_input(’Dame una letra: ’) if len(letra) == 1 and (’a’<= letra <=’z’ or letra in ’´´´´´u~’): aeıou¨n print letra. e e · 236 ¿Por qu´ este otro programa es err´neo? e o pertenencia 2. 3): for j in range(0. [0. ’dos’. 0. 5.py E elemento = 5 lista = [1. ’tres’]) · 243 Disponemos de una cadena que contiene una frase cuyas palabras est´n separadas por un n´mero arbitrario de a u espacios en blanco. accesibles con una expresi´n de o la forma M [i][i]. · 244 Una matriz nula es aquella que s´lo contiene ceros. 3): print M [i][j] Introducci´n a la Programaci´n con Python o o 24 .’~’]: a e ı o u u n print letra. ’Pedro’] ı · 240 En una cadena llamada texto disponemos de un texto formado por varias frases. u · 242 ¿Qu´ resulta de ejecutar esta orden? e >>> print ’’. ’Juan’.

· 250 Dise˜a un programa que lea dos matrices y calcule la diferencia entre la primera y la segunda.j . · 256 Una matriz es diagonal superior si todos los elementos por debajo de la diagonal principal son nulos.) u · 252 La traspuesta de una matriz A de dimensi´n m × n es una matriz AT de dimensi´n n × m tal que AT = Aj.j ejemplo.0 for i in range(0. esta matriz es diagonal superior:   1 2 3  0 12 6   A=  0 0 −3  0 0 0 Dise˜a un programa que diga si una matriz es o no es diagonal superior. 3): s += M [i][j] print s / 9. 1]: if y+i >= 0 and y+i < filas and x+j >= 0 and x+j <columnas: n += tablero[y+i. si   1 2 3  2 12 6   A=  1 0 −3  10 −1 0 entonces: 1 AT =  2 3   2 1 10 12 0 −1  6 −3 0 Dise˜a un programa que lea una matriz y muestre su traspuesta. para i entre 1 y n.k . Por o o i. [0. m). 0].c 2003 Andr´s Marzal e Isabel Gracia e · 247 ¿Qu´ resulta de ejecutar este programa? e 1 2 3 4 5 6 M = [ [1. 0. 0. para i entre 1 y min(n. 0. 1]: for j in [-1. 0]. n · 253 Dise˜a un programa tal que lea una matriz A de dimensi´n m × n y muestre un vector v de talla n tal que n o m vi = j=1 Ai. 3): for j in range(0. 1] ] s = 0. 1.  0 0 0 1 0 0   0 1 0  0 0 1 · 249 Haz un programa que pida un entero positivo n y almacene en una variable M la matriz identidad de n × n (la que tiene unos en la diagonal principal y ceros en el resto de celdas). · 254 Dise˜a un programa que lea una matriz A de dimensi´n m × n y muestre un vector v de talla min(n.0 · 248 Crea la siguiente matriz utilizando la t´cnica del e  1  0   0 0 bucle descrita anteriormente. n · 257 ¿Funciona esta otra forma de contar los vecinos de la casilla de la fila y y columna x? n = -tablero[y][x] for i in [-1.x+j] Introducci´n a la Programaci´n con Python o o 25 . [0. n · 251 Dise˜a un programa que lea una matriz y un n´mero y devuelva una nueva matriz: la que resulta de multiplicar la n u matriz por el n´mero. (El producto de un n´mero por una matriz es la matriz que resulta de multiplicar cada elemento por u u dicho n´mero. m) tal que n o i i vi = j=1 k=1 Aj. 0. · 255 Dise˜a un programa que determine si una matriz es prima o no. Una matriz A es prima si la suma de los elementos n de cualquiera de sus filas es igual a la suma de los elementos de cualquiera de sus columnas.i . Por ejemplo.

. . .2003/11/26-16:57 · 258 El ((juego de la vida parametrizado)) es una generalizaci´n del juego de la vida. * . . . . . . no sea que utilices una divisi´n entera y eleves x a la potencia 0. . . . En ellos. . . . . . . . * * . que a o es el resultado de calcular 1/3. . . . . Hay aut´matas celulares unidimensioo o nales. * * . . ceros y unos) evoluciona a lo largo del tiempo a partir del o a estado de sus celdas vecinas (solo las celdas izquierda y derecha en su versi´n m´s simple) y de ella misma en el instante o a anterior. . . explora las siguientes reglas: 000 → 0 000 → 0 000 → 0 000 → 0 000 → 0 001 → 1 001 → 0 001 → 1 001 → 1 001 → 1 010 → 1 010 → 1 010 → 1 010 → 1 010 → 1 011 → 1 011 → 1 011 → 1 011 → 1 011 → 0 100 → 1 100 → 1 100 → 0 100 → 0 100 → 1 101 → 0 101 → 0 101 → 1 101 → 1 101 → 1 110 → 0 110 → 0 110 → 1 110 → 1 110 → 0 111 → 0 111 → 0 111 → 0 111 → 0 111 → 1 · 261 Modifica el programa del ejercicio anterior para obtener una representaci´n gr´fica en PythonG. . * . . el n´mero de vecinos vivos o e u necesarios para activar las reglas de nacimiento. supervivencia. * . o √ (Nota: recuerda que 3 x es x1/3 y ´ndate con ojo. . (x − 1) mod n) ((y − 1) mod m. Tradicionalmente o a se muestra en cada fila el estado del ((tablero unidimensional)) en cada pulso. * . (x + 1) mod n) donde mod es el operador m´dulo (en Python. . (x − 1) mod n) (y. . . . x) tiene siempre 8 vecinas. . una regla 001 → 1 se lee como ((la c´lula est´ viva si en la iteraci´n anterior estaba muerta y ten´ una e a o ıa c´lula muerta a la izquierda y una c´lula viva a la derecha)). * * . . . . o Implementa el juego de la vida toroidal en el entorno PythonG. . . . A continuaci´n. . . . Una especificaci´n completa tiene este aspecto: e e o 000 → 0 001 → 1 010 → 1 011 → 0 100 → 1 101 → 1 110 → 0 111 → 0 Y aqu´ tienes una representaci´n (usando asteriscos para los unos y puntos para los ceros) de la evoluci´n del sistema durante ı o o sus primeros pulsos partiendo de una configuraci´n muy sencilla (un solo uno): o Pulso Pulso Pulso Pulso Pulso Pulso Pulso 0 1 2 3 4 5 6 : : : : : : : . . * . . . . . . . . . . aunque est´ en un borde: e ((y − 1) mod m. . . . mostrar´ en el t´rminal de texto la evoluci´n del u o a e o aut´mata partiendo de una configuraci´n con s´lo una celda viva que ocupa la posici´n central del universo. . o · 259 El juego de la vida toroidal se juega sobre un tablero de dimensi´n finita m × n con unas reglas de vecindad o diferentes. * . . . . . . (x + 1) mod n) ((y + 1) mod m. Implementa un programa para estudiar la evoluci´n de aut´matas celulares unidimensionales. x) ((y + 1) mod m. . o Aqu´ tienes lo que deber´ mostrar tu programa para el ultimo juego de reglas del ejercicio anterior: ı ıa ´ √ · 262 Define una funci´n llamada raiz_cubica que devuelva el valor de 3 x.) 26 Introducci´n a la Programaci´n con Python o o . * . . . · 260 El juego de la vida es un tipo particular de aut´mata celular bidimensional . * . * . . * . . . . . una lista de valores (en su versi´n m´s simple. . . . . . (x + 1) mod n) (y. x) ((y − 1) mod m. * . Por ejemplo. * . . . . (x − 1) mod n) ((y + 1) mod m. %). * * . . . * * . . . . . * * . . aislamiento y superpoblaci´n est´n parametrizados. . . * . . Una casilla de coordenadas (y. * . En ´l. . . * . El programa leer´ un o o a conjunto de reglas por teclado y un n´mero de pulsos. . Haz un o a programa que solicite al usuario el n´mero de c´lulas vecinas vivas necesarias para que se disparen las diferentes reglas y u e muestre c´mo evoluciona el tablero con ellas. . * . As´ se puede estudiar mejor la evoluci´n del ı o aut´mata. . . . . o o o o Cuando tengas el programa. .

1.) e · 277 Dise˜a una funci´n que calcule el sumatorio de la diferencia entre n´meros contiguos en una lista. es_repeticion(’abab’) devolver´ True. que es un n´mero entre 0 y 22. Para ello s´lo tienes que dividir el n´mero por 23 y ´ u o u quedarte con el resto. Ten en cuenta que un a˜o es o u ıas n n bisiesto si es divisible por 4 y no divisible por 100. 2. a partir del radio de un c´ o ırculo. as´ que es bisiesto. aunque es divisible por 100.py 1 2 3 4 5 6 E perfecto.) · 265 Define una funci´n que convierta grados cent´ o ıgrados en grados Farenheit. 10. 7. La letra que corresponde a cada n´mero la tienes en esta tabla: u u 0 T 1 R 2 W 3 A 4 G 5 M 6 Y 7 F 8 P 9 D 10 X 11 B 12 N 13 J 14 Z 15 S 16 Q 17 V 18 H 19 L 20 C 21 K 22 E Define una funci´n que. 0]). · 276 Define una funci´n que devuelva el n´mero de d´ que tiene un a˜o determinado. dado un n´mero de DNI. ¿Sabes efectuar el c´lculo de ese sumatorio sin utilizar bucles (ni la funci´n sum)? a o · 278 Haz una traza de la llamada maximo([6. el 3 de calcular 6 − 3 y el 4 de calcular a 10 − 6). e (Ejemplos: El n´mero de d´ de 2002 es 365: el n´mero 2002 no es divisible por 4. 6. n o u · 272 Dise˜a una funci´n llamada es_repeticion que reciba una cadena y nos diga si la cadena est´ formada mediante la n o a concatenaci´n de una cadena consigo misma. 10] devolver´ 9.py mayoria edad 4. · 266 Define una funci´n que convierta radianes en grados. devuelva la letra que le corresponde. (Para calcular los grados cent´ ıgrados has de restar 32 a los grados Farenheit y multiplicar el resultado por cinco novenos.py E def es_perfecto(n): for i in range(1. Introducci´n a la Programaci´n con Python o o 27 .py 1 2 3 4 def mayoria_de_edad (edad ): if edad < 18: return False return True · 269 ¿Es este programa equivalente al que acabamos de ver? mayoria edad. en cuyo caso es bisiesto.1416 como aproximaci´n de π o importa el valor de π que encontrar´s en el m´dulo math.) · 267 Define una funci´n que convierta grados en radianes. El a˜o 2004 es u ıas u ı n bisiesto y tiene 366 d´ el n´mero 2004 es divisible por 4. a a · 273 ¿En qu´ se ha equivocado nuestro aprendiz de programador al escribir esta funci´n? e o perfecto 2. o (Recuerda que 360 grados son 2π radianes. 3.py 1 2 def mayoria_de_edad (edad ): return edad >= 18 · 270 La ultima letra del DNI puede calcularse a partir del n´mero. 1. pues la cadena ’abab’ o a est´ formada con la cadena ’ab’ repetida. para n o u la lista [1. El a˜o 1900 es divisible por ıas: u ı n 4. Por ejemplo. siendo n un entero n o u que nos proporciona el usuario. El a˜o 2000 s´ es bisiesto: el n´mero 2000 es divisible por 4 n ı u y. Utiliza a el valor 3.c 2003 Andr´s Marzal e Isabel Gracia e · 263 Define una funci´n llamada area_circulo que. pero no es bisiesto porque es divisible por 100 y no por 400.) · 264 Define una funci´n que convierta grados Farenheit en grados cent´ o ıgrados. pero no por 100. tambi´n lo es por 400. devuelva el valor de su ´rea. ¿Es realmente necesario considerar todos los n´meros entre 1 o e a a u y n-1? · 275 Dise˜a una funci´n que devuelva una lista con los n´meros perfectos comprendidos entre 1 y n. o u · 271 Dise˜a una funci´n que reciba una cadena y devuelva cierto si empieza por min´scula y falso en caso contrario. o a o (Recuerda que el ´rea de un c´ a ırculo es πr2 . que es 2 + 3 + 4 (el 2 resulta de calcular 3 − 1. excepto si es tambi´n divisible por 400. Por ejemplo. o · 268 ¿Es este programa equivalente al que acabamos de ver? mayoria edad. n): sumatorio = 0 if n % i == 0: sumatorio += i return sumatorio == n · 274 Mejora la funci´n es_perfecto haci´ndola m´s r´pida. por contra es_repeticion(’ababab’) devolver´ False. as´ que no es bisiesto.py mayoria edad 3.

devuelva una lista con todas las cadenas m´s largas. Si dos o m´s cadenas miden lo n o a a mismo y son las m´s largas. 10. 9] e o deber´s devolver la posici´n 1. la ((serie)) m´s larga empieza en la posici´n 2 (que es el ´ a o ındice donde aparece el primer 8). ’polaridad’.) ı o a ı · 288 Dise˜a una funci´n que. · 292 Dise˜a una funci´n que devuelva la soluci´n de la ecuaci´n lineal ax + b = 0 dados a y b. Por ejemplo. dada una cadena x. para [8. 9. 2 0] es 9. · 280 Dise˜a una funci´n que diga en qu´ posici´n empieza la ((serie)) m´s larga de una lista. (Pista: te puede convenir conocer el valor m´ximo y el valor m´ a ınimo de la lista.’ a print ’a) Ingresar dinero. 8. es decir. 2. n o u · 283 Dise˜a una funci´n que devuelva el valor absoluto de la m´xima diferencia entre dos elementos consecutivos de una n o a lista.) a o · 281 Haz una funci´n que reciba una lista de n´meros y devuelva la media de dichos n´meros. Ten cuidado con la lista o u u vac´ (su media es cero). la funci´n devolver´ la lista de dos elementos [’Pepe’. devuelva el valor de logb (x). ’Mar´a’. Dos n´meros son n o o u u amigos si la suma de los divisores del primero (exclu´ ´l) es igual al segundo y viceversa. ’Ana’]. (Nota: si hay dos ((series)) de igual longitud y ´sta es la mayor. Por ejemplo. ’Juan’]. si n o a dos o m´s cadenas miden lo mismo y son las m´s largas.’ Introducci´n a la Programaci´n con Python o o 28 . 8. la funci´n devolver´ tambi´n el valor cero. el valor devuelto para la lista [1. 6. ’Ana’. o a · 294 Dise˜a una funci´n que calcule i=a i dados a y b.py 1 2 3 4 5 6 def menu(): opcion = ’’ while len(opcion) != 1 or opcion not in ’abc’: print ’Cajero autom´tico. Por ejemplo. Si la ecuaci´n tiene infinitas n o o o o soluciones o no tiene soluci´n alguna. ’pol´fona’. puedes llamar a la funci´n letra_dni . 2. 0] es 9. · 284 Dise˜a una funci´n que devuelva el valor absoluto de la m´xima diferencia entre cualquier par de elementos de una n o a lista. la cadena n o u a ’pol’ es el prefijo com´n m´s largo de esta lista: u a [’poliedro’. devuelva la longitud de su per´ o a ımetro. pues es la diferencia entre el valor 1 y el valor 10. La funci´n devolver´ True si la letra corresponde a ese o u o a n´mero de DNI. devuelva otra cuyo contenido sea el resultado de concatenar 6 veces x o consigo misma. el logaritmo en base b de o a x. 2. ’Juan’. la funci´n devolver´ la cadena ’Mar´a’. 8. la lista las contendr´ a todas. la funci´n lo detectar´ y devolver´ el valor None. ’pol´tica’] ı ı ı · 290 Define una funci´n que. u o Si lo deseas. debes devolver la posici´n de la primera de las ((series)). dados dos par´metros b y x. En el ejemplo del ejercicio n o e o a anterior. es decir. o · 286 Define una funci´n que. el valor devuelto para la lista [1. o a e √ √ · 295 Define una funci´n llamada raiz_n_esima que devuelva el valor de n x. dada una lista de n´meros enteros. ’Juan’. (Nota: recuerda que n x es x1/n ). Por ejemplo. la funci´n devolver´ el valor 0. ’Paz’]. 2. devuelva el n´mero de ((series)) que hay en ella. ıdo e · 298 ¿Funciona esta otra versi´n de menu? o funcion menu. 0. y False en caso contrario. 8. ’polinizar’. · 291 Define una funci´n que. 0. 2. 1. 2. 10. Si a es mayor que b.2003/11/26-16:57 · 279 Dise˜a una funci´n que. 0. la funci´n devolver´ el valor 0. desde esta nueva funci´n. 10] tiene 5 ((series)) (ten en cuenta que el 2 forma parte de una ((serie)) de un solo elemento).py funcion menu 2. Llamamos n o u u ((serie)) a todo tramo de la lista con valores id´nticos. pues es la diferencia entre el valor 10 y el valor 0. 10. desarrollada en el ejercicio 270. 8. la funci´n devolver´ una cualquiera de ellas. o · 296 Haz una funci´n que reciba un n´mero de DNI y una letra. La funci´n debe llamarse comprueba_letra_dni . devuelva la cadena m´s larga. a o a (Ejemplo: dada la lista [’Pepe’. a a a (Ejemplo: dada la lista [’Pepe’. o o a a · 293 Dise˜a una funci´n que calcule n o b i=a b i dados a y b. pero sin necesidad de iterar en un bucle. dado el valor de los tres lados de un tri´ngulo. o o · 297 Dise˜a una funci´n que diga (mediante la devoluci´n de True o False) si dos n´meros son amigos. 6. ’polic´a’. · 287 Dise˜a una funci´n que.) · 285 Modifica la funci´n del ejercicio anterior para que devuelva el valor 0 tan pronto encuentre un 0 en la lista. dada una lista de cadenas. Si 0 se n o o a encuentra entre a y b. ıa · 282 Dise˜a una funci´n que calcule el productorio de todos los n´meros que componen una lista.’ print ’b) Sacar dinero. la lista [1. e Por ejemplo.) o a · 289 Dise˜a una funci´n que reciba una lista de cadenas y devuelva el prefijo com´n m´s largo. Si a es mayor que b. dada una lista de cadenas.

n o u Puedes llamar a la funci´n random desde tu funci´n. n o u · 305 Implementa un procedimiento Python tal que. La funci´n devolver´ a o a True si la respuesta es afirmativa. a o He aqu´ un ejemplo de llamada a la funci´n: ı o menu_generico([’Saludar’. y False en caso contrario. a Debes dise˜ar una funci´n que diga si dos n´meros son amigos y un procedimiento que muestre la tabla. u · 304 Dise˜a un programa que. La matriz tiempos tiene una fila por cada ciclista. Por ejemplo. S´lo aceptaremos como respuestas v´lidas ’si’. las cuatro primeras para respuestas afirmativas y las cuatro ultimas para respuestas negativas. o Dos n´meros amigos s´lo deber´n aparecer una vez por pantalla. Cada fila tiene el tiempo en segundos (un valor flotante) invertido en cada una de las 5 etapas de la carrera. se pide: a) Dise˜ar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes que aprobaron n el examen. ¿Complicado? Este ejemplo te ayudar´: te mostramos a continuaci´n un ejemplo de lista ciclistas y de matriz tiempos para 3 corredores. El usuario o a u u o deber´ introducir por teclado una opci´n. se le advertir´ del error y se a o o a a a solicitar´ nuevamente la introducci´n de un valor. dado un n´mero n. o o · 302 Dise˜a una funci´n sin argumentos que devuelva un n´mero aleatorio mayor o igual que −10. si el nombre est´ en la lista de estudiantes. no podr´ aparecer el mensaje ((284 y 220 son amigos)). Cada opci´n se asociar´ a un n´mero n o o a u entre 1 y la talla de la lista y la funci´n mostrar´ por pantalla el men´ con el n´mero asociado a cada opci´n. ’s’. obtendremos en pantalla el siguiente texto: 1) Saludar 2) Despedirse 3) Salir Escoja opci´n: o · 300 En un programa que estamos dise˜ando preguntamos al usuario numerosas cuestiones que requieren una respuesta n afirmativa o negativa. · 301 Dise˜a una funci´n sin argumentos que devuelva un n´mero aleatorio mayor o igual que 0. ’Despedirse’. Dicha cadena se mostrar´ n o a por pantalla y se solicitar´ al usuario que responda. 220 y 284 son amigos: si aparece el mensaje u o a ((220 y 284 son amigos)). a o Introducci´n a la Programaci´n con Python o o 29 . n o a devolver´ su nota. si el procedimiento recibe el n´mero 324. Por ejemplo. ’NO’. ’Si’.0. · 306 Dise˜a una funci´n es_primo que determine si un n´mero es primo (devolviendo True) o no (devolviendo False). muestre por pantalla sus cifras en orden u inverso. a a · 308 Tenemos los tiempos de cada ciclista y etapa participantes en la ultima vuelta ciclista local. n o u c) Dise˜ar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes que obtuvieron n la m´xima nota. a d) Dise˜ar un procedimiento que reciba las dos listas y muestre por pantalla el nombre de todos los estudiantes cuya n calificaci´n es igual o superior a la calificaci´n media. o o e) Dise˜ar una funci´n que reciba las dos listas y un nombre (una cadena).0 y menor que 10. en pantalla aparecer´ un mensaje que le recuerde las respuestas aceptables. mostrar´ por pantalla el 4. Escribe una funci´n Python n a o o sin argumentos llamada dado que devuelva un n´mero entero aleatorio entre 1 y 6.0 y menor que 10. n o u · 303 Para dise˜ar un juego de tablero nos vendr´ bien disponer de un ((dado electr´nico)). el 2 y el 3 (en l´ u a ıneas diferentes). u · 307 En el problema de los alumnos y las notas. muestre por pantalla todas las parejas de n´meros amigos menores n u u que n. b o c. dado un n´mero entero. se devolver´ su valor. Cada vez ´ que el usuario se equivoque. La impresi´n de los resultados debe hacerse desde un procedimiento. ’no’.0. devolver´ None. y si no.c 2003 Andr´s Marzal e Isabel Gracia e 7 8 9 10 11 print ’c) Consultar saldo. ’SI’. Int´ntelo de nuevo.’ o e return opcion · 299 Dise˜a una funci´n llamada menu_generico que reciba una lista con opciones. La lista ciclistas contiene ´ una serie de nombres. pues es redundante. ’No’.’ opcion = raw_input(’Escoja una opci´n: ’) o if len(opcion) != 1 or opcion not in ’abc’: print ’S´lo puede escoger las letras a. en el mismo orden con que aparecen en ciclistas. a o a ’n’. Dise˜a una funci´n llamada si_o_no que reciba una cadena (la pregunta). Si la opci´n es v´lida. si no. ’Salir’]) Al ejecutarla. b) Dise˜ar una funci´n que reciba la lista de notas y devuelva el n´mero de aprobados. n o u Dise˜a a continuaci´n un procedimiento muestra_primos que reciba un n´mero y muestre por pantalla todos los n´meros n o u u primos entre 1 y dicho n´mero.

y la del bot´n 3. 11292. a Normal: tablero de 4 × 6. una variante de Memori´n en el que hay que emparejar grupos de 3 letras iguales. (Aseg´rate o o u de que el n´mero de casillas de la matriz sea m´ltiplo de 3. ’Joan Beltran’.0]. 10332. o · 312 Dise˜a una funci´n que reciba una lista de palabras (cadenas) y devuelva.9. a · 311 Dise˜a una funci´n que reciba los tres coeficientes de una ecuaci´n de segundo grado de la forma ax2 + bx + c = 0 n o o y devuelva una lista con sus soluciones reales.2003/11/26-16:57 ciclistas = [’Pere Porcar’. b · 310 Dise˜a una funci´n que reciba una lista de enteros y devuelva los n´meros m´ n o u ınimo y m´ximo de la lista sia mult´neamente.) u u · 315 Construye el programa del Buscaminas inspir´ndote en la forma en que hemos desarrollado el juego Memori´n. Piensa bien en la estrategia que has de seguir. 11712. la matriz y un n´mero de etapa y devuelva el nombre del ganador de la etapa. [11726. 12473. Una funci´n que reciba la lista. destruye la baldosa correspondiente. o u Un procedimiento que reciba la lista. crea un objeto gr´fico (texto) que muestre el n´mero de minas vecinas a esa casilla.1. el ciclista Joan Beltran invirti´ 11161.2 segundos en la segunda etapa. 13732. o o o o La marca de posici´n es una se˜al que dispone el usuario en una casilla para indicar que ´l cree que oculta una mina. 11632. 11161.0]] 1 2 3 4 En el ejemplo. Define adecuadamente el sistema de coordenadas del lienzo. Usa una rutina de control del rat´n similar a la desarrollada para Memori´n. la matriz y muestre por pantalla el ganador de cada una de las etapas. 12534. que asociamos a ((marcar posici´n)). · 316 Modifica el Buscaminas para que cada vez que se pulse con el primer bot´n en una casilla con cero bombas vecinas. Ojo con las casillas ((especiales)): el n´mero de vecinos de las casillas de los bordes requiere un cuidado u especial.4. · 309 ¿Qu´ aparecer´ por pantalla al ejecutar este programa? e a 1 2 3 4 a=1 b=2 [a. la primera y la ultima n o a ´ palabras seg´n el orden alfab´tico.3. El primer valor indica que hay una mina en esa casilla. ıcil: · 314 Implementa Memori´n3.0. Ubica las minas al azar. o Se pide: Una funci´n que reciba la lista y la matriz y devuelva el ganador de la vuelta (aquel cuya suma de tiempos en las 5 o etapas es m´ ınima). ’Lled´ Fabra’] o tiempo = [[10092. simult´neamente. 10133. Si no. Te a o damos unas pistas para ayudarte en le implementaci´n: o Crea una matriz cuyas casillas contengan el valor True o False. Dibuja las minas y baldosas que las tapan. devuelve una lista con dos copias o o o de la misma. [10193. que asociamos a ((descubre casilla)). 12272. 10232. u a Crea una matriz que contenga el n´mero de minas que rodean a cada casilla. Si la ecuaci´n s´lo tiene una soluci´n real. la partida ha acabado o e ıa y el jugador ha muerto. El bucle principal finaliza cuando hay una coincidencia total o entre la matriz de bombas y la matriz de marcas puestas por el usuario. Si ´sta escond´ una mina. Si no tiene soluci´n real alguna o si tiene infinitas soluciones devuelve una lista con dos copias del valor None.4. (Este ejercicio es dif´ ıcil.3].) 30 Introducci´n a la Programaci´n con Python o o . Cada vez que se pulse el bot´n 1. Te interesa detectar dos pulsaciones de o o rat´n distintas: la del bot´n 1. o n e Necesitar´s una nueva matriz de marcas.0. ıa en caso contrario. a˜ade una marca a la casilla correspondiente si no la hab´ y elimina la que hab´ o n ıa. a u Cada vez que se pulse el bot´n 3. b] = [b. a El programa principal es un bucle similar al de Memori´n. El n´mero de minas depender´ de la dificultad del juego. Dif´ tablero de 6 × 8.1. Calcula esos valores a partir de la matriz u de minas. a] print a.2.1. 10292. u e · 313 Modifica Memori´n para que se ofrezca al usuario jugar con tres niveles de dificultad: o F´cil: tablero de 3 × 4.1. o se marquen todas las casillas alcanzables desde esta y que no tienen bomba.2.

habremos pagado un inter´s total del 40. (Si te conviene. Si te conviene. Utiliza cuantas o variables locales consideres oportuno. s+1) print s print a · 323 La funci´n area_triangulo que hemos definido puede provocar un error en tiempo de ejecuci´n: si el argumento de la o o ra´ cuadrada calculada en su ultima l´ ız ´ ınea es un n´mero negativo. s. Nota: con los datos del ejemplo anterior. 15. Si te conviene. a · 321 Haz una traza de area_y_angulo. 20 y 25 a˜os. rescata ahora las funciones que dise˜aste como soluci´n de e n n o los ejercicios anteriores. 20 y 25 a˜os. puedes utilizar las funciones que definiste en los ejercicios anteriores. · 328 Dise˜a un procedimiento que muestre por pantalla la cuota mensual que corresponde pagar por una hipoteca para n un capital de h euros al i% de inter´s anual durante 10. u · 319 Dise˜a un programa que permita que dos personas jueguen a las damas. La cuota mensual m que hemos de pagar para amortizar una hipoteca de h euros a lo largo de n a˜os a un inter´s compuesto del i por cien anual se calcula con la n e f´rmula: o hr . · 326 Dise˜a una funci´n que nos diga qu´ cantidad de intereses (en euros) habremos pagado finalmente al banco si n o e abrimos una hipoteca de h euros a un inter´s del i por cien en n a˜os. puedes utilizar las funciones que e n definiste en los ejercicios anteriores. Detecta tambi´n posibles problemas en angulo_alfa y modifica la funci´n para evitar posibles errores al ejecutar e o el programa.01% de 150 000 e ¤).0 return sqrt(s * (s-a) * (s-b) * (s-c)) s=4 print area_triangulo(s-1. b´scala en Internet. 15. puedes utilizar la funci´n que definiste en el ejercicio e n o anterior. rescata ahora las funciones que e n dise˜aste como soluci´n de los ejercicios anteriores. habremos pagado un total de 210 015 ¤. n e · 325 Dise˜a una funci´n que nos devuelva la cantidad de euros que habremos pagado finalmente al banco si abrimos una n o hipoteca de h euros a un inter´s del i por cien en n a˜os. b.py al solicitar el valor del ´ngulo opuesto al lado de longitud 5 en un tri´ngulo de a a lados con longitudes 5. · 327 Dise˜a una funci´n que nos diga qu´ tanto por cien del capital inicial deberemos pagar en intereses al amortizar n o e completamente la hipoteca. El programa debe verificar que todos los n movimientos son v´lidos. · 324 Vamos a adquirir una vivienda y para eso necesitaremos una hipoteca.) Introducci´n a la Programaci´n con Python o o 31 .01% (60 015 ¤ es el 40. Cuando el ordenador n empiece una partida.c 2003 Andr´s Marzal e Isabel Gracia e · 317 Dise˜a un programa que permita jugar a dos personas al tres en raya. n · 318 Dise˜a un programa que permita jugar al tres en raya enfrentando a una persona al ordenador.) ıcil.py from math import sqrt def area_triangulo(a.75 ¤ al mes para o amortizar una hipoteca de 150 000 ¤ en 15 a˜os a un inter´s del 4. la funci´n debe devolver el u o valor cero. Nota: con los datos del ejemplo anterior. n e i. · 322 ¿Qu´ aparecer´ por pantalla al ejecutar el siguiente programa? e a triangulo 2. pero al menos r debe aparecer en la expresi´n cuyo valor se devuelve y antes debe o calcularse y almacenarse en una variable local. Si el argumento es un n´mero negativo. habremos pagado un total de 210 015 − 150 000 = 60 015 ¤ en intereses. 4 y 3. debe ganarla siempre.75% anual. m= 1 − (1 + r)−12n donde r = i/(100 · 12). Haz que la funci´n s´lo u a o o llame a sqrt si su argumento es mayor o igual que cero. se producir´ un error de dominio. El programa debe verificar que todos los n movimientos son v´lidos. (Este ejercicio es dif´ Si no conoces la estrategia ganadora. Nota: puedes comprobar la validez de tu funci´n sabiendo que hay que pagar la cantidad de 1 166. (Si te conviene. Define una funci´n que calcule la cuota (redondeada a dos decimales) dados h. Si te conviene.py 1 2 3 4 5 6 7 8 9 10 triangulo. c): s = (a + b + c) / 2.) n o · 329 Dise˜a un procedimiento que muestre por pantalla el capital total pagado al banco por una hipoteca de h euros al n i% de inter´s anual durante 10. a · 320 Dise˜a un programa que permita que dos personas jueguen al ajedrez. Nota: con los datos del ejemplo anterior.

[5. 2].py def modifica_parametros(x. 2. 2. dada una lista de n´meros. 3. 5]. · 336 Dise˜a una funci´n que. dada una lista de n´meros. 5]. [3. 4].py def incrementa(a): a=a+1 return a a=1 b = incrementa(a) print ’a:’. 5]]. 5]. [3. 2. Por ejemplo. b): for elemento in b: a. 3. · 335 Dise˜a una funci´n que. devuelva otra lista con s´lo aquellos n´meros de la primera que n o u o u son primos. Ejemplo: si recibe las listas [1. 3. 2. Ejemplo: si recibe las listas [1. 3] lista2 = [1. n o sin repetir ninguno (diferencia de conjuntos). · 337 Dise˜a una funci´n que. a · 331 Dise˜a una funci´n que reciba dos listas y devuelva los elementos que pertenecen a una o a otra. devuelva una lista con todos los pares de n´meros que podemos n o u u formar con uno de la primera lista y otro de la segunda. 4]. devuelva otra lista que s´lo incluya sus n´meros impares. dada una lista de nombres y una letra. 3] lista3 = modifica(lista1. n o u o u · 334 Dise˜a una funci´n que. 5] y [2. devuelva una lista con todos los pares de n´meros amigos que n o u u podemos formar con uno de la primera lista y otro de la segunda.py 1 2 3 4 5 6 7 8 9 parametros. lista2) print lista1 print lista2 print lista3 · 340 ¿Qu´ muestra por pantalla este programa al ser ejecutado? e ejercicio parametros 5. 2]. 4]. 2]. 3. [5. 1] y [2. a · 333 Dise˜a una funci´n que. 2. sin repetir ninguno (intersecci´n n o o de conjuntos). 3. 1] y [2.py def modifica(a. 2. 2. a print ’b:’. · 338 ¿Qu´ aparecer´ por pantalla al ejecutar este programa? e a parametros 2.py 1 2 3 4 ejercicio parametros. e a · 339 ¿Qu´ mostrar´ por pantalla el siguiente programa al ejecutarse? e a ejercicio parametros 4. 2. la lista resultante es [[1. dada una lista de n´meros. devuelva una lista con todos los nombres que n o empiezan por dicha letra. 4]. b Hazte un dibujo del estado de la pila de llamadas paso a paso para entender bien qu´ est´ pasando al ejecutar cada sentencia. a · 332 Dise˜a una funci´n que reciba dos listas y devuelva los elementos que pertenecen a la primera pero no a la segunda. devolver´ la lista [2]. dada una lista de n´meros. o Ejemplo: si recibe las listas [1.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ejercicio parametros. [1.append (elemento) b = b + [4] a[-1] = 100 del b[0] return b[:] lista1 = [1. devolver´ la lista [1. pero sin repetir n o ninguno (uni´n de conjuntos). devolver´ la lista [1]. y): x=1 y[0] = 1 32 Introducci´n a la Programaci´n con Python o o . si se suministran las listas [1.2003/11/26-16:57 · 330 Dise˜a una funci´n que reciba dos listas y devuelva los elementos comunes a ambas. 1] y [2. 2.

1. 2] modifica_parametros(a. b) print a print b · 341 ¿Qu´ muestra por pantalla este programa al ser ejecutado? e ejercicio parametros 6. 1. 0] abs_lista(milista) print milista · 346 ¿Qu´ mostrar´ por pantalla el siguiente programa al ejecutarse? e a intercambio 2.py def invierte(lista): for i in range(len(lista)/2): c = lista[i] lista[i] = lista[-i-1] lista[-i-1] = c · 345 ¿Qu´ muestra por pantalla este programa al ser ejecutado? e abslista 2.py def intento_de_intercambio(a. 2] modifica_parametros(a. b): aux = a a=b b = aux lista1 = [1. -2.py 1 2 3 4 5 inversion. 2] lista2 = [3. 2.append (3) y = y + [4] y[0] = 10 a=0 b = [0.py def abs_lista(lista): for i in range(len(lista)): lista[i] = abs(lista[i]) milista = [1. -1.py def modifica_parametros(x. ¿Funciona? o inversion 2. -3. b) print a print b · 342 Utiliza las funciones desarrolladas en el ejercicio 307 y dise˜a nuevas funciones para construir un programa que n presente el siguiente men´ y permita ejecutar las acciones correspondientes a cada opci´n: u o 1) 2) 3) 4) 5) 6) 7) 8) A~adir estudiante y calificaci´n n o Mostrar lista de estudiantes con sus calificaciones Calcular la media de las calificaciones Calcular el n´mero de aprobados u Mostrar los estudiantes con mejor calificaci´n o Mostrar los estudiantes con calificaci´n superior a la media o Consultar la nota de un estudiante determinado FINALIZAR EJECUCI´N DEL PROGRAMA O · 343 ¿Qu´ ocurre con el elemento central de la lista cuando la lista tiene un n´mero impar de elementos? ¿Nuestra funci´n e u o invierte correctamente la lista? · 344 Un aprendiz sugiere esta otra soluci´n. 4] Introducci´n a la Programaci´n con Python o o 33 .c 2003 Andr´s Marzal e Isabel Gracia e 5 6 7 8 9 10 a=0 b = [0.py 1 2 3 4 5 6 7 abslista. y): x=1 y.py 1 2 3 4 5 6 7 8 intercambio.py 1 2 3 4 5 6 7 8 9 10 11 ejercicio parametros.

devolver la nota m´s alta obtenida. funciones que has desarrollado en ejercicios anteriores. Devolver el n´mero de todos los alumnos que han entregado todos los ejercicios y tienen una media superior a 3. si es cuadrada (es decir.2003/11/26-16:57 intento_de_intercambio(lista1. · 350 Dise˜a una funci´n que reciba una lista y devuelva otra lista cuyo contenido sea el resultado de concatenar la lista n o original consigo misma.i ). la u o calificaci´n es −1).) 34 Introducci´n a la Programaci´n con Python o o . u a Dado el n´mero de un ejercicio. u Dado el n´mero de un alumno. La lista original no debe modificarse.5 u puntos. u u Devolver el n´mero de abandonos en funci´n de la semana. · 353 Dise˜a una funci´n que reciba una lista y devuelva una lista cuyo contenido sea la lista original concatenada con n o una versi´n invertida de ella misma. pero con sus n o componentes en orden inverso. o Dise˜a funciones y procedimientos que efect´en los siguiente c´lculos: n u a Dado el n´mero de un alumno. n o e (Recuerda que e−a = 1/ea . 3] se convertir´ en [2. la modifique para que s´lo sobrevivan a la llamada aquellos n u o n´meros que son perfectos. 0]. 2. u a Dado el n´mero de un ejercicio. · 351 Dise˜a una funci´n que reciba una lista y devuelva otra lista cuyo contenido sea la lista original. Si la matriz no es cuadrada. todos los elementos de la forma Ai. devolver la nota m´s baja obtenida. n · 356 Dise˜a una funci´n que reciba una matriz y. La lista original no debe modificarse. ¿Puedes modificar el programa para que s´lo se devuelva o esa lista expl´ ıcita desde un punto del programa? · 359 ¿Y si a pudiera tomar valores enteros negativos? Dise˜a una funci´n exponencial que trate tambi´n ese caso. Este procedimiento mostrar´ en pantalla el n´mero de abandonos u a u para cada semana (si un alumno no ha entregado nunca ning´n ejercicio. 4. u o la media es 0. devolver la media sobre los ejercicios entregados si los entreg´ todos. La lista original no debe modificarse. n o u devuelva la suma de todos los componentes dispuestos en la diagonal principal (es decir.) a · 349 Dise˜a una funci´n duplica_copia que reciba una lista de n´meros y devuelva otra lista en la que cada elemento n o u sea el doble del que tiene el mismo ´ ındice en la lista original. Dado el n´mero de un ejercicio. tiene igual n´mero de filas que de columnas). La lista original no debe sufrir ninguna modificaci´n tras la o llamada a duplica_copia. · 352 Dise˜a una funci´n que reciba una lista y devuelva una copia de la lista concatenada con una inversi´n de s´ misma. La lista original no debe modificarse. · 355 Dise˜a un procedimiento que reciba una lista y ordene sus elementos de menor a mayor. u Dado el n´mero de un ejercicio. n o o ı Puedes utilizar. lista2) print lista1 print lista2 9 10 11 12 · 347 Dise˜a un procedimiento que. u · 348 Dise˜a una funci´n duplica que reciba una lista de n´meros y la modifique duplicando el valor de cada uno de sus n o u elementos. o · 354 Dise˜a una funci´n que reciba una lista y devuelva una copia de la lista con sus elementos ordenados de menor a n o mayor. 6]. la funci´n devolver´ None. o a · 357 Guardamos en una matriz de m × n elementos la calificaci´n obtenida por m estudiantes (a los que conocemos por o su n´mero de lista) en la evaluaci´n de n ejercicios entregados semanalmente (cuando un ejercicio no se ha entregado. Consideramos que un alumno abandon´ en la semana x u o o si no ha entregado ning´n ejercicio desde entonces. en caso contrario. devolver el n´mero de ejercicios entregados. u u Dado el n´mero de un alumno. devolver la media sobre los ejercicios entregados. devolver el n´mero de estudiantes que lo han presentado. (Ejemplo: la lista [1. si lo consideras conveniente. abandon´ en la ((semana cero))). devolver la nota media obtenida por los estudiantes que lo presentaron. dada una lista de n´meros. 0. u o · 358 Hay dos ocasiones en las que se devuelve la lista [0.

i. b] tal que o u a e f (a) y f (b) tienen el mismo signo? ¿Y si f (a) o f (b) valen 0? Modifica la funci´n para que s´lo inicie la b´squeda cuando o o u procede y. Si f (a) o f (b) valen cero. tenemos: (−1)0 x1 = x. k) / factorial (k) return sumatorio · 361 Las funciones seno y coseno se pueden calcular as´ ı sin(x) = x − cos(x) = 1 − x3 x5 x7 (−1)n x2n+1 + − + ··· = 3! 5! 7! (2n + 1)! n=0 x4 x6 (−1)n x2n x2 + − + ··· = 2! 4! 6! (2n)! n=0 ∞ ∞ Dise˜a sendas funciones seno y coseno para aproximar. El programa s´lo aceptar´ valores de a y b o a tales que a < b. n · 363 Modifica las funciones que has propuesto como soluci´n al ejercicio 361 aprovechando las siguientes relaciones.c 2003 Andr´s Marzal e Isabel Gracia e · 360 ¿Es correcta esta otra versi´n? (Hemos destacado los cambios con respecto a la ultima.py def elevado(a. devuelva el valor especial None. el seno y el coseno de x con n t´rminos del sumatorio n e correspondiente. 0! x2 (n + 1) · n x2 = − n · (n − 1) = − (−1)n−1 x2n−1 . si n > 1. o v´lidas para n mayor que 0: a (−1)n x2n+1 (2n + 1)! (−1)n x2n (2n)! Cuando n vale 0. b y . k) : productorio *= i return productorio def exponencial (a. · 365 La funci´n biseccion a´n no est´ acabada del todo.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 exponencial.) o ´ exponencial 2. 1! (−1)0 x0 = 1. Dise˜a una funci´n Python recursiva que calcule el sumatorio de los n primeros n´meros naturales. a seg´n proceda. k): productorio = 1. biseccion devolver´ el valor de a o b. (2n)! · · 364 Modifica la funci´n exponencial 2 del programa anterior para que no se efect´en las ineficientes llamadas a elevado o u y factorial . respectivamente.0 for i in range(k) : productorio *= a return productorio def factorial (k): productorio = 1. · 362 Dise˜a un programa similar que muestre el valor de factorial (n) para n entre 0 y 7. n): sumatorio = 0. n+ n−1 i=1 si n = 1. u · 366 Modifica el programa para que solicite al usuario los valores a.0 for k in range(n): sumatorio += elevado(a. (2n − 1)! (−1)n−1 x2n · .0 for i in range(2. o · 368 Tambi´n podemos formular recursivamente la suma de los n primeros n´meros naturales: e u n i= i=1 1. en caso contrario. n o u Introducci´n a la Programaci´n con Python o o 35 . ¿Qu´ ocurre si el usuario introduce un intervalo [a. · 367 Haz una traza de la pila de llamadas a funci´n paso a paso para factorial (5).

A continuaci´n. n m = n−1 n−1 + m m−1 Dise˜a un programa que. donde n es el valor del argumento. 2). . Haz lo mismo para el d´cimo n´mero u e u de Fibonacci. se trata de un m´todo recursivo. ¿Qu´ comparaci´n? o o u e o compara. calcule a n o n i. 1. y para que. es 1. . a 36 Introducci´n a la Programaci´n con Python o o . El programa llamar´ a una funci´n particiones definida recursivamente. n o e o · 381 Es hora de echar una manita a los monjes. a Dise˜a una funci´n recursiva que calcule el n´mero de d´ n o u ıgitos que tiene un n´mero entero (en base 10). dise˜a una funci´n recursiva que. en el fondo. para n ≥ m. 1. u n m · 380 En el apartado ?? presentamos el m´todo de la bisecci´n. b-1) · 371 · 372 · 373 Dibuja un ´rbol de llamadas que muestre paso a paso lo que ocurre cuando calculas bits(63). a · 375 Modifica la funci´n para que. y con 2. b): if b == 0: return False elif a == 0: return True else: return comparacion(a-1. a o · 378 Haz una traza de las llamadas a mcd para los n´meros 1470 y 693. dados m y n. 2)? · 382 ¿Cu´ntos movimientos son necesarios para resolver el problema de las torres de Hanoi con 1 disco. u · 383 Implementa un programa en el entorno PythonG que muestre gr´ficamente la resoluci´n del problema de las torres a o de Hanoi. i=m · 370 La siguiente funci´n implementa recursivamente una comparaci´n entre dos n´meros naturales. ¿Por qu´ no pruebas a e ejecutar resuelve_hanoi (64. e o e Dise˜a una funci´n que implemente el m´todo de la bisecci´n recursivamente.py 1 2 3 4 5 6 7 def comparacion(a. a partir de un valor n le´ de teclado. · 376 Puedes calcular recursivamente los n´meros combinatorios sabiendo que. · 384 Dibuja el ´rbol de llamadas para resuelve_hanoi (4. ? Dise˜a una funci´n movimientos_hanoi que reciba un n´mero y devuelva el n´mero de movimientos necesarios para n o u u resolver el problema de la torres de Hanoi con ese n´mero de discos. cada vez que se la llame. Ellos han de resolver el problema con 64 discos. justo antes de acabar. 3. Dise˜a un programa que. Observa que. 3.. y con a 3. llama a la funci´n a o o para calcular el cuarto n´mero de Fibonacci y analiza el texto que aparece por pantalla. a partir de un valor n le´ de teclado. u n m y que n n = n 0 = 1. donde m es el valor a devolver. o para m entre 0 y n. o · 374 Dibuja el ´rbol de llamadas para fibonacci (5).py compara. u · 379 Haz una traza de las llamadas a mcd para los n´meros 323 y 323. muestre por pantalla un mensaje que diga ((Empieza c´lculo o a de Fibonacci de n)). muestre por pantalla ((Acaba c´lculo de Fibonacci de n y devuelve el valor m)). muestre n ıdo una funci´n combinaciones definida recursivamente.2003/11/26-16:57 · 369 Inspir´ndote en el ejercicio anterior. muestre n ıdo 1 n para m entre 0 y n. u Calcula F12 con ayuda de la funci´n que hemos definido. al igual que el de n . El programa llamar´ a a n k · 377 El n´mero de formas diferentes de dividir un conjunto de n n´meros en k subconjuntos se denota con u u puede definir recursivamente as´ ı: n n−1 n−1 = +k k k−1 k y se El valor de n .

ye ): a 7 8 9 10 11 12 xc yc xd yd xe ye = xa + (xb .(xd -xc)*sin(pi/3) 7 8 9 10 11 12 xc yc xd yd xe ye = xa + (xb .ya) / 3.0 = yb + (ya .0 = xb + (xa .0 = (xc+xd )*cos(pi/3) .c 2003 Andr´s Marzal e Isabel Gracia e · 385 Puedes jugar con los diferentes par´metros que determinan la curva de von Kock para obtener infinidad de figuras a diferentes.ya) / 4.0 = yb + (ya . yb ) (xa .ya) / 3.xa) / 3. ya ) y (xb . 2 2 (xa . (xd . xb −xa +ya +yb .yb) / 3. La curva drag´n de nivel 0 que une los o u a o puntos (xa .yb) / 3. yb ) se forma con dos curvas o drag´n de nivel 0: la que une (xa . La de nivel 1 ha sido doblada una vez y desdoblada hasta que las partes dobladas forman ´ngulos de 90 grados.0 = xb + (xa .0 = (xc+xd )*cos(pi/3) + (yd -yc)*sin(pi/3) = (yc+yd )*cos(pi/3) . yd ) y (xe . La curva drag´n de nivel 1 es el perfil de una hoja doblada dos veces y desdoblada a o de forma que cada parte forme un ´ngulo de 90 grados con la siguiente. El perfil de la curvas drag´n tiene una analog´ con las dobleces de una hoja de papel.(yd -yc)*sin(pi/3) = (yc+yd )*cos(pi/4) + (xd -xc)*sin(pi/3) 7 8 9 10 11 12 xc yc xd yd xe ye = xa + (xb .(yd -yc)*sin(pi/3) = (yc+yd )*cos(pi/3) + (xd -xc)*sin(pi/3) Prueba a cambiar los diferentes par´metros y trata de predecir la figura que obtendr´s en cada caso antes de ejecutar el a a programa. yb ) con xa +xb +ya −yb .0 = xb + (xa . ya ) y (xb .xb) / 3. ya ) con xa +xb +ya −yb . o 2 2 2 2 He aqu´ las curvas drag´n de niveles 0 y 1: ı o xa +xb +ya −yb xb −xa +ya +yb . xb −xa +ya +yb y la que une (xb .xa) / 3.xa) / 3.2*(yd -yc)*sin(pi/3) = (yc+yd )*cos(pi/3) + (xd -xc)*sin(pi/3) 7 8 9 10 11 12 xc yc xd yd xe ye = xa + (xb .0 = (xc+xd )*cos(pi/3) . yc ). yb ) es la l´ ınea recta que las une.0 = xb + (xa .0 = (xc+xd )*cos(pi/4) . 4.0 = yb + (ya .xa) / 3.xb) / 3.) · 386 La curva drag´n se define de modo a´n m´s sencillo que la curva de von Koch.0 = ya + (yb . yb ) Ya ves cu´l es el principio recursivo con el que se generan curvas drag´n. La curva drag´n de nivel 0 es el o ıa o perfil de una hoja de papel que no ha sido doblada.xb) / 5.0 = ya + (yb . (Recuerda definir adecuadamente las coordenadas con window_coordinates para que te quepan las figuras. 5 a o ı o y 6. ya ) (xb .yb) / 3. 3.ya) / 3.xb) / 3.yb) / 3.0 = ya + (yb . Aqu´ tienes las curvas drag´n de niveles 2. a Introducci´n a la Programaci´n con Python o o 37 . La curva drag´n de nivel 1 entre (xa .0 = yb + (ya . Te mostramos algunas de ellas junto a las nuevas expresiones de c´lculo de los puntos (xc . ya ) (xb .0 = ya + (yb .

curvas drag´n entre dos puntos del nivel que se desee. ¿no te parecen los tri´ngulos de Sierpinski sospechosamente similares a la figura del ejercicio 261?) a · 388 Otra curva fractal de inter´s es la denominada ((curva de relleno del espacio de Hilbert)). por ejemplo. Estas figuras te pueden ser de ayuda para descubrir el procedimiento de c´lculo que has de programar: a · 389 Un curiosa aplicaci´n de la recursi´n es la generaci´n de paisajes por ordenador. Esta figura muestra los tri´ngulos de Sierpinski para a a a niveles de recursi´n de 0 a 4: o Dise˜a un programa para PythonG que dibuje tri´ngulos de Sierpinski para un nivel de recursi´n dado. En cada nivel de recursi´n se divide a a o cada uno de los tri´ngulos del nivel anterior en tres nuevos tri´ngulos. Las monta˜as. 3 y 4: o Dise˜a un programa capaz de dibujar curvas de relleno del espacio de Hilbert en el entorno PythonG dado el nivel de recursi´n n o deseado. Esta figura te muestra e dicha curva con niveles de recursi´n 0. son fractales).2003/11/26-16:57 Dise˜a un programa que dibuje. n o Por cierto. muestran ((esqueletos)) de ´rboles e a a generados en el entorno PythonG: 38 Introducci´n a la Programaci´n con Python o o . entre otras. Los ´rboles a pueden generarse tambi´n con procedimientos recursivos. Estas im´genes. se o o o n dibujan con modelos recursivos: los denominados fractales (las curvas de von Koch. ¿de d´nde viene el nombre de ((curva drag´n))? Del aspecto que presenta en niveles ((grandes)). Aqu´ tienes la o o ı curva drag´n de nivel 11: o · 387 Otra figura recursiva que es todo un cl´sico es la criba o tri´ngulo de Sierpinski. n a o (Por cierto. 1. 2. por ejemplo. en el entorno PythonG.

un error)). Modifica la funci´n del ejercicio anterior para que tanto el n a a o a ´ngulo como la proporci´n rama/tronco se escojan aleatoriamente (dentro de ciertos m´rgenes). vn ). a a · 392 Dise˜a un m´dulo que agrupe las funciones relacionadas con hipotecas de los ejercicios 324–327. a La proporci´n (en tanto por uno) del tama˜o de las ramas con respecto al tronco. a e Introducir el azar en su dise˜o los har´ parecer m´s naturales. v_suma o devolver´ el valor None. La rama que parte a mano ´ izquierda lo hace con un ´ngulo −α. pero usando diferentes argumentos. o a Aqu´ tienes un par de ejemplos. a a · 391 Construye un m´dulo llamado dni que incluya las funciones propuestas en los ejercicios 270 y 296. En caso contrario dir´ ((Ha cometido ud. o n El nivel de recursi´n deseado. Te vamos a describir el o principio b´sico de generaci´n de estos ´rboles. Si no la tienen. . El angulo α que forma la rama que parte a mano derecha del tronco con el propio tronco. . . Vamos con el m´todo. a Introducci´n a la Programaci´n con Python o o 39 . el programa emitir´ el mensaje ((Bienvenido)). El usuario nos proporciona los siguientes datos: e Los puntos en los que empieza y acaba el tronco. o Por cierto. Documenta aden o cuadamente el m´dulo. o Usa el m´dulo desde un programa que pida al usuario su n´mero de DNI y su letra.c 2003 Andr´s Marzal e Isabel Gracia e Todos han sido generados con una misma funci´n recursiva. o v_longitud : devuelve la longitud del vector. los ´rboles ganan bastante si en primeros niveles de recursi´n usas un color anaranjado o marr´n y en los a o o ultimos usas un color verde. El resultado devuelto es la lista de o los componentes. v_muestra_vector : Muestra por pantalla el vector en la notaci´n (v1 . o La recursi´n tiene lugar cuando consideramos que cada una de las dos ramas es un nuevo tronco. donde n es n o a un valor arbitrario. que es n 2 vi i=1 v_suma: Devuelve la suma de dos vectores. ´ · 390 Los ´rboles que hemos generado en el ejercicio anterior parecen un tanto artificiales por ser tan regulares y sim´tricos. o · 393 Dise˜a un m´dulo similar al anterior pero que permita efectuar c´lculos con vectores n-dimensionales. Las funciones que debes definir son: v_lee_vector : Pide el valor de n y a continuaci´n lee los n componentes del vector. Los dos vectores deben tener la misma dimensi´n. ¡m´s bien por un hurac´n!). . pero has de ser t´ mismo quien dise˜e una funci´n recursiva capaz de a o a u n o efectuar este tipo de dibujos. El ´rbol de la izquierda s´ parece bastante real y el de la derecha parece mecido por el ı a ı viento (bueno. v2 . Si el usuario mete un n´mero y letra o u u de DNI correctos.

3]) devolver´ la lista [1. dise˜a una funci´n que calcule su moda. len(b)) for i in range(m): c. o o · 401 Enriquece el m´dulo matrices. Cada vez que se lean los datos de una persona el programa preguntar´ si se desea continuar introduciendo nuevas personas. B): devuelve el conjunto resultante de unir los conjuntos A y B.2] o [3. o a · 394 Dise˜a un m´dulo que facilite el trabajo con conjuntos. si te parece conveniente. Si las matrices no o o son ((multiplicables)). diferencia(A. a · 400 Dise˜a una funci´n llamada es_cuadrada que devuelva True si la matriz es cuadrada (tiene igual n´mero de filas n o u que columnas) y False en caso contrario. o union(A. 3. 1. 3] (aunque tambi´n se acepta como equivalente cualquier a e permutaci´n de esos mismos elementos. que codificaremos con una letra (’M’ para mujer y ’V’ para var´n). que no hay nombres compuestos). pero sin repeticiones. o a · 402 Modifica el programa del ejercicio anterior enriqueciendo el tipo de datos Persona con un nuevo campo: el sexo.3. 2. el programa se detendr´. interseccion(A. la funci´n devolver´ el valor None. Recuerda que un conjunto es una lista en la que no hay n o elementos repetidos. y falso en caso contrario. Los dos vectores deben tener la misma dimensi´n.1. a Cuando el usuario responda que no. B): devuelve cierto si ambos conjuntos tienen los mismos elementos.append (a[i] + b[i]) c = c + a[m:] + b[m:] return c · 396 Dise˜a el siguiente programa que usa el m´dulo polinomios y. a 40 Introducci´n a la Programaci´n con Python o o . iguales(A. o Si no la tienen. · 399 Suponiendo que nos suministran una lista de enteros. la funci´n devolver´ None. Modifica la funci´n mostrar_persona para que tambi´n o o e imprima el valor del nuevo campo. como [3. 2] y [2.1. y falso en caso contrario. · 405 Dise˜a un programa que pida por teclado los datos de varias personas y los a˜ada a una lista inicialmente vac´ n n ıa. B): devuelve el conjunto cuyos elementos pertenecen a A y a B. La moda es el elemento n o m´s repetido en una serie de valores. · 403 Dise˜a una funci´n que permita determinar si una persona es menor de edad y devuelva cierto si la edad es menor n o que 18. S´ ırvete de la funci´n dimension para averiguar la dimensi´n de la matriz.1]).py con una funci´n que devuelva el producto de dos matrices. Supondremos que el nombre n o de pila es la primera palabra del campo nombre (es decir.2. · 404 Dise˜a una funci´n nombre_de_pila que devuelva el nombre de pila de una Persona. (Ejemplo: lista_a_conjunto([1. · 398 Enriquece el m´dulo estadisticas a˜adiendo una funci´n que calcule el coeficiente de variaci´n (definido como σ/¯) o n o o a y el recorrido de la lista (que es la diferencia entre el mayor y el menor elemento de la lista). (Nota: ten en cuenta que los conjuntos representados por las listas [1.2. B): devuelve el conjunto de elementos que pertenecen a A y no a B. Deber´s implementar las siguientes funciones: a lista_a_conjunto(lista): Devuelve un conjunto con los mismos elementos que hay en lista. 3] son iguales. enriquece dicho m´dulo con n o o nuevas funciones utiles para el manejo de polinomios.2003/11/26-16:57 v_producto_escalar : Devuelve el producto escalar de dos vectores.) · 395 ¿Es correcta esta otra versi´n de la funci´n suma? o o 1 2 3 4 5 6 7 def suma(a. b): c = [] m = minimo(len(a). El programa presentar´ al usuario este men´: ´ a u 1) 2) 3) 4) 5) 6) 7) 8) 9) Leer polinomio a Mostrar polinomio a Leer polinomio b Mostrar polinomio b Sumar polinomios a y b Restar a de b Restar b de a Multiplicar a por b FIN DE PROGRAMA · 397 ¿Funcionan bien las funciones que hemos definido cuando suministramos listas vac´ ıas? Corrige las funciones para que traten correctamente este caso particular.

e · 413 Dise˜a una funci´n que devuelva el porcentaje de aprobados sobre el total de estudiantes (y no sobre el total de n o estudiantes que han entregado la pr´ctica).edad . a a · 407 ¿Qu´ mostrar´ por pantalla la ejecuci´n del siguiente programa? e a o ejercicio registros. dada una lista de estudiantes y un grupo (la letra A. edad =19) pedro = Persona(nombre=’Pedro L´pez’.1 persona4. edad =18) o otro = nada_util (juan. hayan entregado la pr´ctica o no. justo antes de ejecutar la l´ ınea 19. a o e · 409 Modifica cuanto consideres necesario para que la lista de estudiantes est´ siempre ordenada alfab´ticamente. a continuaci´n.dni[:]. a ´ Introducci´n a la Programaci´n con Python o o 41 . dni=’12345679Z’.nombre[:]. dni=’23456789D’.c 2003 Andr´s Marzal e Isabel Gracia e · 406 Modifica el programa del ejercicio anterior para que. a · 415 Dise˜a un procedimiento que muestre en pantalla el nombre de todos los estudiantes cuya nota de examen es superior n a la media y hayan entregado la pr´ctica. justo antes de ejecutar la l´ ınea 15 en la invocaci´n de nada_util desde la l´ o ınea 19. a · 414 Dise˜a un procedimiento que muestre en pantalla el nombre de todos los estudiantes cuya nota de examen es superior n a la media.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ejercicio registros. En los no presentados no debe figurar valor num´rico alguno. 3. a · 416 Dise˜a una funci´n que reciba una lista de estudiantes y el c´digo de un grupo (la letra A. adem´s. e e · 410 Dise˜a un procedimiento que.edad = persona4.2 return persona4 juan = Persona(nombre=’Juan Paz’. al finalizar la ejecuci´n del programa. e Quiz´ te convenga definir una funci´n auxiliar que recibe la lista de estudiantes y la ordena alfab´ticamente. · 411 Define una funci´n esta_aprobado que devuelva True si el alumno ha aprobado la asignatura y False en caso contrario. muestre la calificaci´n num´rica (nota del examen) de los alumnos prea o e sentados. Si o a dos o m´s personas coinciden en tener la mayor edad.edad ) def nada_util (persona1. pedro) print juan print pedro print otro Haz un diagrama que muestre el estado de la memoria en los siguientes instantes: 1. o · 412 Modifica muestra_acta para que. B o C) y devuelva la n o o nota media en dicho grupo. dni=pers.edad .edad = persona1. B o C). persona2): persona1. el programa mostrar´ el nombre de todas ellas. o · 408 Modifica las rutinas listado_completo y listado_de_nombres para que los estudiantes aparezcan por orden alfab´tico. 2. muestre por pantalla n un listado con el nombre de los estudiantes de dicho grupo.edad + 1 persona3 = persona2 persona4 = copia(persona2) persona3.edad = persona3.py from record import record class Persona(record ): nombre = ’’ dni = ’’ edad =0 def copia(pers): return Persona(nombre=pers. En primer lugar aparecer´n n o o a las notas m´s altas y en ultimo lugar los no presentados. edad =pers. n o o · 419 Dise˜a una funci´n que ordene la lista de estudiantes por la calificaci´n final obtenida. muestre el nombre de la persona m´s vieja. n o e · 418 Dise˜a una funci´n que ordene la lista de estudiantes por la calificaci´n obtenida en el examen. · 417 Dise˜a una funci´n que ordene alfab´ticamente la lista de estudiantes por su nombre.

ser´ interesante que pudieras salvar la lista de canciones a disco duro. . n · 427 Dise˜a una funci´n que calcule el n´mero de d´ transcurridos entre dos fechas que se proporcionan como par´metro. muestra_mp3 : muestra por pantalla todos los datos de un MP3. A continuaci´n. Ten especial cuidado con el mes de febrero: recuerda que tiene 29 o 28 d´ seg´n sea el a˜o bisiesto o no. Empieza definiendo el tipo MP 3. d´nde?)). o · 424 Haz un programa que use el m´dulo fecha y lea una lista de fechas v´lidas que mostrar´ despu´s ordenadas de m´s o a a e a antigua a m´s reciente. listar todas las canciones de un estilo determinado (en formato resumido). la funci´n definida anteriormente. 6. es decir. n o u ıas a He aqu´ un ejemplo de uso: ı >>> >>> >>> >>> 1 from fecha import Fecha. 5. e (Nota: Si quieres que el programa sea realmente util. eliminar una canci´n de la base de datos dado el t´ o ıtulo y el int´rprete. Por ejemplo. e duraci´n en segundos.2003/11/26-16:57 · 420 Deseamos realizar un programa que nos ayude a gestionar nuestra colecci´n de ficheros MP3. pasar´ a n o n ıa a ser 8/6/2001 tras invocar al m´todo anyade_un_dia sobre ella. anyo=2002) hoy = Fecha(dia=2. ´ ıa de lo contrario. n o a 2. llamando a muestra_mp3). o estilo musical. a · 422 Dise˜a una funci´n fecha_valida que devuelva True si la fecha es v´lida y False en caso contrario. es decir. Por ejemplo. Cuando lo tengas. Similar atenci´n o ´ ıa ıa o requiere el ultimo d´ del a˜o. si te ıas u n conviene. a · 425 Dise˜a una funci´n que devuelva cierto si dos fechas son iguales y falso en caso contrario. as´ que este programa s´lo te resultar´ realmente util cuando hayas estudiado ese tema. Cada fichero MP3 o contiene una canci´n y deseamos almacenar en nuestra base de datos la siguiente informaci´n de cada canci´n: o o o t´ ıtulo. anyo=2002) print dias_transcurridos(hoy. es decir. por ejemplo. 4. Si no sabes de qu´ estamos hablando. listar todos los estilos de los que tenemos alguna canci´n (cada estilo debe mostrarse una sola vez en pantalla). la fecha 31/4/2000 no es v´lida. ayer ) (No tengas en cuenta el salto de fechas producido como consecuencia de la reforma gregoriana del calendario. n o · 426 Dise˜a una funci´n anyade_un_dia que a˜ada un d´ a una fecha dada. ya que abril tiene 30 d´ ıas a ıas. La fecha 7/6/2001.) e a ıas o 42 Introducci´n a la Programaci´n con Python o o . . el 11/9/2001 o a aparecer´ como ((11 de septiembre de 2001)). e Presta especial atenci´n al ultimo d´ de cada mes. o 3. mes=1. a˜adir una nueva canci´n a la base de datos (que ser´ una lista de registros MP 3). dise˜a cuantos procedimientos y funciones consideres pertinentes para implementar un men´ con las siguieno n u tes acciones: 1. con una l´ ınea por cada campo. Puedes utilizar la funci´n fecha_valida desarrollada en el ejercicio anterior. Para comprobar n o a la validez de una fecha debes verificar que el mes est´ comprendido entre 1 y 12 y que el d´ lo est´ entre 1 y el n´mero de e ıa e u d´ que corresponde al mes. int´rprete. consulta el cuadro ((¿Cu´ntos d´ han pasado. mes=1. Debes tener en cuenta que el d´ que sigue al 28 de febrero es el 29 del mismo mes o el 1 de ´ ıa n ıa marzo dependiendo de si el a˜o es bisiesto o no. En el pr´ximo tema aprenderemos a guardar a o datos en disco y a recuperarlos. dias_transcurridos ayer = Fecha(dia=1. pues su siguiente d´ es el primero del mes siguiente. fechas cuyo d´ sea v´lido para el mes o o a ıa a le´ ıdo. o · 423 Modifica la funci´n lee_fecha para que s´lo acepte fechas v´lidas. usando el procedimiento muese tra_resumen_mp3). listar todas las canciones de la base de datos (en formato completo. listar todas las canciones de un int´rprete determinado (en formato resumido. define dos procedimientos: muestra_resumen_mp3 : muestra por pantalla s´lo el t´ o ıtulo y el int´rprete de una canci´n (en una sola l´ e o ınea). Usa. perder´s todos los datos cada vez que salgas del programa.) ı o a ´ · 421 Define una funci´n llamada fecha_larga que devuelva la fecha en un formato m´s verboso.

el n´mero de d´ transcurridos entre esa y la nueva fecha ıa o u ıas m´dulo 7 te permite conocer el d´ de la semana. Determinar si una Fecha_con_hora ocurri´ antes que otra. poca creatividad y falta de capacidad de c´lculo. n almacena la hora (un n´mero entre 0 y 23) y los minutos (un n´mero entre 0 y 59). de 33 d´ Si calculas el seno del n´mero de d´ transcurridos ıas ıas. una variable de tipo Fecha_con_hora n a ıa. en o ı ıas Espa˜a. emocional e intelectual. pero hay infinidad de p´ginas web dedicadas a este asunto. obtendr´s un valor entre −1 (nivel a o ´ptimo) y 1 (nivel p´simo) que indica su estado en cada uno de los tres planos: f´ e ısico. (Si sabes en que d´ cay´ una fecha determinada. Dise˜a entonces: n a) Un procedimiento muestra_periodo que muestre las dos fechas (en formato breve) separadas entre s´ por un gui´n. . o ’martes’. etc. u En lo emocional: falta de ambici´n y mayores fricciones en nuestras relaciones personales. El ciclo f´ o ısico presenta un periodo de 23 d´ el ıas. ciclo emocional. Seg´n sus ((estudiosos)). Los biorrito mos son una de tantas supercher´ populares. alta_pelicula y baja_pelicula. contiene_pelicula_con_titulo. n · 430 Dise˜a una funci´n que devuelva el d´ de la semana (la cadena ’lunes’. o En lo intelectual: mayor distracci´n. o Calcular los minutos transcurridos entre dos datos de tipo Fecha_con_hora. valor y esp´ ıritu positivo.) en que cae una fecha n o ıa cualquiera. un periodo de 28 d´ y el ciclo intelectual. Introducci´n a la Programaci´n con Python o o 43 . ı o b) Una funci´n que devuelva el n´mero de d´ comprendidos en el periodo (incluyendo ambos extremos). (Te parecer´ rid´ a ıculo. o o a Tu programa pedir´ una fecha de nacimiento y proporcionar´ el valor de cada ciclo a d´ de hoy. En el periodo ((alto)). ıas a Y en el periodo ((bajo)). . falta de atenci´n. o ıa u · 434 Define t´ mismo las funciones lee_pelicula. Adem´s del d´ mes y a˜o.) a · 429 Modifica la funci´n anterior para que s´ tenga en cuenta los 10 d´ ((perdidos)) en la reforma gregoriana. acompa˜ado de un texto a a ıa n que resuma su estado en cada uno de los tres planos. Un periodo consta de dos fechas donde la primera es anterior o igual a la n segunda. la persona se encuentra mejor en cada uno de los diferentes aspectos: En lo f´ ısico: mayor fortaleza. o u ıas c) Una funci´n que reciba un periodo y una fecha y devuelva cierto si la fecha est´ comprendida en el per´ o a ıodo y falso en caso contrario. En lo emocional: mayor alegr´ y mejor estado de ´nimo. u · 435 Detecta posibles fuentes de ineficiencia (llamadas a funci´n repetidas) en el fragmento de programa anterior y o corr´ ıgelas. el estado vital empeora: En lo f´ ısico: cansancio. Mostrar un dato del tipo Fecha_con_hora en el formato que ilustramos con este ejemplo: las siete y media de la tarde del 11 de septiembre de 2001 se muestran como 19:30 11/9/2001.c 2003 Andr´s Marzal e Isabel Gracia e · 428 Usando la funci´n desarrollada en el ejercicio anterior. implementa un programa que calcule biorritmos. devuelva la n o edad (en a˜os) de la persona. los ritmos vitales de ıas o u la persona son peri´dicos y se comportan como funciones senoidales (¿?). · 432 Dise˜a una funci´n que dado un registro de tipo Persona (con fecha de nacimiento) y la fecha de hoy. confianza. como el hor´scopo o el tarot. u ıas desde la fecha de nacimiento de un individuo y lo normalizas con el per´ ıodo de cada ciclo. Mostrar un dato del tipo Fecha_con_hora en el formato que ilustramos con este ejemplo: las siete y media de la tarde del 11 de septiembre de 2001 se muestran como 7:30 pm 11/9/2001 y las siete y media de la ma˜ana del mismo d´ n ıa como 7:30 am 11/9/2001. ıa a En lo intelectual: mejores momentos para tomar decisiones y d´ m´s aptos para el estudio. u u Dise˜a a continuaci´n funciones que permitan: n o Leer un dato del tipo Fecha_con_hora por teclado.) o ıa · 431 Dise˜a un nuevo tipo de registro: Fecha_con_hora. d) Una funci´n que reciba dos periodos y devuelva cierto si ambos se solapan (tienen al menos un d´ en com´n). conviene no someter el cuerpo a grandes excesos de ning´n tipo. n · 433 Dise˜a un registro denominado Periodo.

) · 444 Modifica la aplicaci´n para permitir reservar pel´ o ıculas a socios. · 440 Modifica la definici´n de Pelicula para a˜adir los nuevos campos. a y si existe la pel´ ıcula y estaba alquilada. Modifica las acciones asociadas a las respectivas opciones del men´ para u que den los avisos pertinentes en caso de que no sea posible dar de baja a un socio o una pel´ ıcula. Al lado del t´ ıtulo aparecer´ el mensaje ((disponible)) si hay a al menos un ejemplar disponible y ((no disponible)) si todos los ejemplares est´n alquilados. a ıas. ya puestos. · 449 Nos gustar´ retomar el programa de gesti´n de MP3 que desarrollamos en un ejercicio anterior. dos socios con un mismo t´ ıtulo reservado. · 438 Dise˜a una funci´n listado_completo_por_genero que muestre los t´ n o ıtulos de todas las pel´ ıculas del videoclub del g´nero que se indique. etc. la lista de espera de ((Matrix)) permite a un socio alquilar el primer ejemplar de ((Matrix)) que quede disponible. Te convendr´ disponer de a una funci´n que comprueba si una pel´ o ıcula est´ disponible y. Si no hay retraso. A˜ade una opci´n al men´ de la aplicaci´n que permita consultar el g´nero (o g´neros) favorito(s) de un cliente a partir n o u o e e de su historial de alquileres. Las acciones asociadas son: pedir el nombre de la pel´ ıcula. (El atributo genero ser´ e a una lista de cadenas. dar el aviso pertinente con un mensaje por pantalla y no hacer nada m´s. A continuaci´n. s´lo podr´ alquilarse a otros socios un ejemplar de la pel´ o a ıcula cuando haya tres o m´s ejemplares libres.2003/11/26-16:57 · 436 A˜ade nueva funcionalidad al programa: una opci´n que permita devolver una pel´ n o ıcula alquilada. Dise˜a para ello n un procedimiento devolver_pelicula. no sobre un ejemplar. e Modifica el programa para que gestione ´lbumes. si no existe una pel´ ıcula con ese t´ ıtulo. los socios podr´n solicitar una reserva. se puede dar de baja y otra que compruebe si un a socio tiene alguna pel´ ıcula en alquiler actualmente. Ten en cuenta que necesitar´s dos datos: el t´ a ıtulo de la pel´ ıcula y el DNI del socio. es decir. avisar al usuario y no hacer nada m´s. o El m´todo devolver´ el n´mero de d´ de retraso. Cuando no se disponga de ning´n ejemplar libre de u una pel´ ıcula. e · 441 Modifica el m´todo de devoluci´n de pel´ e o ıculas para que tenga en cuenta la fecha de alquiler y la fecha de devoluci´n. haz que el listado de pel´ ıculas aparezca en pantalla ordenado alfab´ticamente por su t´ e ıtulo. ((marcarla)) como disponible (poner a None su campo alquilada). si el socio no ha alquilado la pel´ ıcula a los dos d´ de estar disponible. un(os) int´rprete(s) y una lista de canciones (ficheros MP3). · 448 A˜ade al programa una opci´n de men´ para aconsejar al cliente. a · 445 Modifica el programa del ejercicio anterior para que las reservas caduquen autom´ticamente a los dos d´ Es decir. la reserva se hace sobre una pel´ ıcula. 44 Introducci´n a la Programaci´n con Python o o . Cada ´lbum tiene un t´ a a ıtulo. por tanto. Bas´ndose en su historial de alquileres. (Usa la funci´n dias_transcurridos e a u ıas a o del m´dulo fecha para calcular el n´mero de d´ transcurridos desde una fecha determinada. el programa n o u a determinar´ su g´nero (o g´neros) favorito(s) y mostrar´ un listado con las pel´ a e e a ıculas de dicho(s) g´nero(s) disponibles para e alquiler en ese instante (ten en cuenta que las pel´ ıculas disponibles sobre las que hay lista de espera no siempre se pueden considerar realmente disponibles). Deber´s permitir que el usuario d´ de alta y baja ´lbumes. a si existe la pel´ ıcula pero no estaba alquilada. por ejemplo. as´ como que a a e a ı obtenga listados completos de los ´lbumes disponibles. Si hay. pero indicando al lado de cada t´ e ıtulo si la correspondiente pel´ ıcula est´ alquilada o disponible. dicho valor ser´ cero. · 437 Modifica la porci´n del programa que da de baja a un socio o a una pel´ o ıcula para que no se permita dar de baja una pel´ ıcula que est´ actualmente alquilada ni a un socio que tiene alguna pel´ a ıcula en alquiler. u ıas · 442 Modifica el m´todo listado_completo_por_genero (ejercicio 438) para que los t´ e ıtulos no aparezcan repetidos en el caso de que dispongamos de m´s de un ejemplar de una pel´ a ıcula. Una opci´n de men´ o u permitir´ mostrar la lista de las 10 pel´ a ıculas m´s alquiladas hasta el momento. Nos gustar´ ıa o ıa introducir el concepto de ((´lbum)). a · 443 Modifica el programa para permitir que una pel´ ıcula sea clasificada en diferentes g´neros. listados ordenados por int´rpretes. ıas · 446 Modifica el programa para que registre el n´mero de veces que se ha alquilado cada pel´ u ıcula. a · 447 Modifica el programa para que registre todas las pel´ ıculas que ha alquilado cada socio a lo largo de su vida. b´squedas de canciones en la base a e u de datos. a˜ade una opci´n al men´ para devolver una pel´ o n o u ıcula. Modifica a continuaci´n lee_pelicula para que pida o n o tambi´n el valor de dias_permitidos. y no una simple cadena. · 439 Implementa la nueva funci´n de devoluci´n de pel´ o o ıculas. a Y. su reserva expira.) o u ıas Modifica las acciones asociadas a la opci´n de men´ de devoluci´n de pel´ o u o ıculas para que tenga en cuenta el valor devuelto por devolver_pelicula y muestre por pantalla el n´mero de d´ de retraso (si es el caso). a ¡Ojo!.

el segundo no se usa. Haz un programa tail.py para que tambi´n pida el valor de n y muestre por pantalla las n primeras l´ e ıneas del fichero.py para que pida un valor n y muestre las n ultimas l´ ´ ıneas del fichero. el programa mostrar´ unicamente la primera de ellas. · 455 Haz un programa que muestre por pantalla la l´ ınea m´s larga de un fichero.) a · 453 Haz un programa que. en ingl´s) de Unix muestra las 10 ultimas l´ e ´ ıneas de un fichero. dado un nombre de fichero.) a · 458 En realidad. su nombre n o y su tel´fono. · 463 El fichero /etc/group contiene una l´ ınea por cada grupo de usuarios del sistema. en ingl´s) de Unix muestra las 10 primeras l´ e ıneas de un fichero. su t´ ıas. e Introducci´n a la Programaci´n con Python o o 45 . · 461 El fichero /etc/passwd de los sistemas Unix contiene informaci´n acerca de los usuarios del sistema. cada titulaci´n tiene un n´mero de u u o u grupo). Dise˜a a continuaci´n un programa que lea el nombre de un fichero y tantas palabras como el usuario desee (utiliza un n o bucle que pregunte al usuario si desea seguir introduciendo palabras). el quinto es el nombre real del usuario.) · 452 Haz un programa que. es decir. Modifica head.) ¿Eres capaz de hacer que el programa lea una sola vez el fichero? · 457 La orden head (((cabeza)). (El nombre del fichero se pide al usuario por teclado. los diferentes campos aparecen separados por dos puntos. Haz un programa head. Un socio puede tomar prestados tres libros. incluyendo los saltos de l´ n u ınea. dada una palabra y un nombre de fichero. autor y a˜o de edici´n. ıas o ıa Dise˜a un programa que permita dar de alta y baja libros y socios y llevar control de los pr´stamos y devoluciones de los n e libros. el segundo era la contrase˜a cifrada (por razones de seguridad.) a a´ a · 456 Haz un programa que muestre por pantalla todas las l´ ıneas m´s largas de un fichero.c 2003 Andr´s Marzal e Isabel Gracia e · 450 Deseamos gestionar una biblioteca. Si un libro tarda m´s de 10 d´ en ser devuelto. dadas la ruta de un fichero y una palabra. ((conteo de palabras))) de Unix cuenta el n´mero de bytes.) a · 454 Haz una funci´n que. (El nombre del fichero se pedir´ a a al usuario por teclado. ıtulo. el sexto es la ruta de su directorio principal. El primer campo es el nombre clave del usuario. El primer campo es el nombre del grupo. · 459 La orden tail (((cola)). el socio no podr´ e a ıas a sacar nuevos libros durante un per´ ıodo de tiempo: tres d´ de penalizaci´n por cada d´ de retraso. el tercero es su n´mero de usuario n a u (cada usuario tiene un n´mero diferente). (El nombre del fichero se pide al usuario por teclado. Cuando un socio sea penalizado. ya no est´ en /etc/passwd). (El nombre del fichero se pedir´ al usuario por teclado.) ¿Eres capaz de hacer que tu programa lea una sola vez el fichero? Pista: usa una lista de cadenas que almacene las 10 ultimas ´ cadenas que has visto en cada instante. muestre cada una de sus l´ ıneas precedida por su n´mero de l´ u ınea. (El nombre del fichero se pedir´ al usuario por teclado. y el tercero es el n´mero de grupo (cada grupo tiene un n´mero diferente). De cada socio mantenemos su DNI. u u Haz un programa que solicite al usuario un nombre de grupo. el programa mostrar´ las l´ a ıneas que contienen dicha palabra en el fichero. el programa indicar´ por pantalla hasta qu´ fecha est´ penalizado e impedir´ que a e a a efect´e nuevos pr´stamos hasta entonces. al menos.) e · 462 Haz un programa que pida el nombre clave de un usuario y nos diga su nombre de usuario real utilizando /etc/passwd. Para cada palabra.py que pida por teclado el nombre de un fichero y muestre por pantalla esos tres datos acerca de ´l. Haz un programa que muestre el nombre de todos los usuarios reales del sistema. Implementa un comando wc. He aqu´ una l´ ı ınea de ejemplo: al55555:x:1000:2000:Pedro P´rez:/home/al55555:/bin/bash e En la l´ ınea aparecen varios campos separados por dos puntos (:). (El nombre del fichero se pedir´ al usuario por teclado. diga si la palabra aparece o no en el fichero. el n´mero de u u palabras y el n´mero de l´ u ıneas de un fichero. Cada l´ o ınea del fichero contiene datos sobre un usuario. Si hay m´s de una l´ a a ınea con la longitud de la m´s larga. debe o dejar de leer l´ ıneas del fichero. (Nota: recuerda que el m´todo split puede serte de gran ayuda. (El nombre del fichero y la palabra se pedir´n al usuario por teclado. donde n es un n´mero suministrado u por el usuario. el cuarto es su n´mero de grupo (en la UJI. · 460 Modifica tail. El programa no debe leer todo el fichero a menos que sea necesario: tan pronto encuentre la informaci´n solicitada. · 464 El comando wc (por ((word count)). u e · 451 Dise˜a un programa que cuente el n´mero de caracteres de un fichero de texto.py que muestre por pantalla las 10 ultimas l´ ´ ıneas de un fichero. Tras consultar /etc/group. y el s´ptimo es el int´rprete de e e o ´rdenes.py que muestre por pantalla las 10 primeras l´ ıneas de un fichero. He aqu´ una l´ ı ınea de ejemplo: gestion:x:2000: Al igual que en /etc/passwd. el programa listar´ el nombre a real de todos los usuarios de dicho grupo relacionados en el fichero /etc/passwd. La biblioteca contiene libros que los socios pueden tomar prestados un n´mero u de d´ De cada libro nos interesa. la orden head de Unix muestra las n primeras l´ ıneas de un fichero. devuelva una lista con las l´ o ıneas que contienen a dicha palabra.

. uno en cada l´ ınea. Estimado/a por Estimado o Estimada y Sr/a por Sr o Sra seg´n n n u convenga. En ella. En otro fichero. descifra.) Disponemos de un fichero de clientes llamado clientes. Cada entrada debe ocupar una s´la l´ o ınea en pantalla. La letra H indica que se trata de un hombre y la letra M que se trata de una mujer.uji. Modifica el programa de la agenda para que la l´ a e ınea que contiene el tel´fono contenga una relaci´n de tel´fonos separados por blancos. El programa pedir´ el nombre del n a fichero cifrado y el del fichero en el que se guardar´ el resultado.. que descifre ficheros cifrados por cifra. En dicho fichero deber´s escribir el nombre real de todos los ıdo o a usuarios de dicho grupo. · 469 Haz un programa que pida el nombre de un grupo de usuarios Unix. La carta empieza as´ ı: 1 2 3 4 5 Estimado/a Sr/a $CLIENTE$: Tenemos noticias de que ud. e · 474 A˜ade a la agenda las siguientes operaciones: n Listado completo de la agenda por pantalla. a · 467 Dise˜a un programa que.write(linea1+linea2+linea3) ¿Funcionar´ igual? a · 473 En su versi´n actual. (Lee antes el enunciado de los ejercicios 461 y 463. o · 466 Dise˜a un programa.. n e e · 476 Deseamos poder trabajar con m´s de un tel´fono por persona. est´dialo de nuevo. · 472 Hemos decidido sustituir las tres llamadas al m´todo write de las l´ e ıneas 32.. A continuaci´n.txt. don/do~a $CLIENTE$. es posible a˜adir dos veces una misma entrada a la agenda.py. nos diga si el primero es una versi´n cifrada del segundo (con n o el c´digo de cifrado descrito en la secci´n).2003/11/26-16:57 · 465 Haz un programa que lea un fichero de texto que puede contener vocales acentuadas y muestre por pantalla una versi´n del mismo en el que cada vocal acentuada ha sido sustituida por la misma vocal sin acentuar. Ahora ıe que sabes definir y usar funciones.py.) · 470 Deseamos automatizar el env´ personalizado de correo electr´nico a nuestros clientes.txt en el que cada l´ u ınea tiene la direcci´n o de correo electr´nico y el nombre de un cliente nuestro. o e 46 Introducci´n a la Programaci´n con Python o o . (¿Recuerdas el apartado ??? ıo o Si no. dados dos ficheros de texto.. Listado de tel´fonos de todas las personas cuyo apellido empieza por una letra determinada. A˜adir por segunda vez los datos de una misma o n n persona supone sustituir el viejo tel´fono por el nuevo. Modifica anyadir_entrada para o n que s´lo a˜ada una nueva entrada si corresponde a una persona diferente. dise˜a el programa sirvi´ndote de ellas. ´sta quede ordenada alfab´ticamente. e · 475 Haz que cada vez que se a˜ade una entrada a la agenda.com John Doe . el lugar donde queremos poner el nombre del cliente aparece marcado con el texto $CLIENTE$.txt debidamente personalizado. o o · 468 Dise˜a un programa que obtenga los 100 primeros n´meros primos y los almacene en un fichero de texto llamado n u primos.txt se modifica ahora para incluir como segundo campo de cada l´ ınea el sexo de la persona. tenemos un carta personalizable. Enriquece o a e la aplicaci´n con la posibilidad de borrar uno de los tel´fonos de una persona. no ha abonado el importe n de la cuota mensual a que le obliga el draconiano contrato que firm´ o . llamado carta. Modifica el programa para que sustituya las expresiones don/do~a por don o do~a.txt. abre en modo escritura un o fichero con el mismo nombre del grupo le´ y extensi´n grp. n e · 471 Nuestro ficheros clientes. El fichero empieza as´ o ı: 1 2 3 al00000@alumail.es Pedro P´rez e spammer@spam. Haz un programa que env´ un correo a cada cliente con el contenido de carta. 33 y 34 por una sola: fcopia. He aqu´ un ejemplo de entrada con tres e o e ı tel´fonos: e 1 2 3 Pedro L´pez o 964112537 964009923 96411092 La funci´n buscar_entrada devolver´ una lista con tantos elementos como tel´fonos tiene la persona encontrada.

aunque bastante complicado. interpretando su significado paso a paso. pero con sangrado. e · 483 Un programa es. El lenguaje s´lo tiene tres variables n e n o o llamadas A. Escribe u un programa para cada una de estas tareas sobre un fichero HTML: mostrar unicamente el texto de las cabeceras de nivel 1. etc. un fichero de texto con formato. con una secci´n por cada letra del alfabeto y una l´ o ınea por entrada. La otra sentencia del lenguaje permite mostrar por pantalla el valor de una variable. El apellido de cada persona aparecer´ destacado a en negrita. ´ mostrar el texto de todas las cabeceras. a <H1>Otro titular</H1> <H2>Un subt´tulo</H2> ı <P>Y su texto. subsecciones. Cuando ejecuta un programa el int´rprete est´.) de una p´gina web se marcan encerr´ndolas entre a a <Hn> y </Hn>. B y C. B acaba valiendo 8 y C acaba valiendo 80. A acaba valiendo 1.html con n o un volcado de la agenda que podemos visualizar en un navegador web.) o o · 478 Modifica la aplicaci´n de gesti´n del videoclub del cap´ o o ıtulo anterior para que recuerde todos los datos entre ejecuci´n o y ejecuci´n. secciones.c 2003 Andr´s Marzal e Isabel Gracia e · 477 Modifica la aplicaci´n de gesti´n de estudiantes del cap´ o o ıtulo anterior para que recuerde todos los datos entre ejecuci´n o y ejecuci´n. Vamos a e a dise˜ar nosotros mismos un int´rprete para un peque˜o lenguaje de programaci´n. donde n es un n´mero entre 1 y 6 (la cabecera principal o de nivel 1 se encierra entre <H1> y </H1>). a Un ejemplo de uso del segundo programa te ayudar´ a entender lo que se pide. por regla general. a <P>Otro p´rrafo. Puedes asignar un valor a una variable con sentencias como las de este programa: 1 2 3 4 asigna asigna asigna asigna A B C A suma 3 y 7 resta A y 2 producto A y B division A y 10 Si interpretas ese programa. Cada l´ ınea contiene una entrada y cada entrada consta de 3 o m´s campos separados por dos puntos. Para el siguiente fichero HTML. · 479 Dise˜a un programa que lea un fichero de texto en formato HTML y genere otro en el que se sustituyan todos los n fragmentos de texto resaltados en negrita por el mismo texto resaltado en cursiva.py para que asuma un formato de agenda. El primer campo es el nombre. en el fondo. Si a˜ades al anterior programa estas otras sentencias: n 1 2 muestra A muestra B Introducci´n a la Programaci´n con Python o o 47 . (Puedes inspirarte en la segunda versi´n de la agenda. valga la redundancia. Mant´n dos ficheros distintos: uno para las pel´ o e ıculas y otro para los socios.txt similar al /etc/passwd. el a segundo es el apellido y el tercero y posteriores corresponden a diferentes tel´fonos de esa persona. a 1 2 3 4 5 6 7 8 9 10 11 12 13 <HTML> <BODY> <H1>Un titular</H1> <P>Texto en un p´rrafo. El listado aparecer´ ordenado alfab´ticamente (por a e apellido). <H3>Un subsubt´tulo</H3> ı <H2>Otro subt´tulo</H2> ı <P>Y el suyo </BODY> </HTML> el programa mostrar´ por pantalla: a Un titular Otro titular Un subt´tulo ı Un subsubt´tulo ı Otro subt´tulo ı · 481 A˜ade una opci´n a la agenda desarrollada en el apartado anterior para que genere un fichero agenda. · 482 Modifica el programa agenda2. de modo que el texto de las cabeceras de nivel n aparezca dos espacios m´s a la derecha que el de las cabeceras de nivel n − 1. · 480 Las cabeceras (t´ ıtulos de cap´ ıtulos.

2003/11/26-16:57 obtendr´s en pantalla una l´ a ınea con el valor 1 y otra con el valor 8. u Si tu programa Python interpreta este programa: 1 2 3 4 5 6 asigna A suma 0 y 1 asigna B suma 0 y 1 muestra B asigna B producto 2 y B asigna A suma A y 1 si A distinto 8 entonces linea 3 en pantalla aparecer´ a 1 2 4 8 16 32 64 48 Introducci´n a la Programaci´n con Python o o . En ella. la siguiente l´ o ınea a ejecutar es la que tiene el n´mero u n´mero . o · 484 Enriquece el int´rprete del ejercicio anterior para que entienda la orden si valor condici´n valor entonces e o linea n´mero . Dise˜a un programa que pida el nombre de un fichero de texto que contiene sentencias de nuestro lenguaje y muestre por n pantalla el resultado de su ejecuci´n. valor puede ser un n´mero o una variable y condici´n puede ser la palabra igual o la palabra u u o distinto. se detendr´ mostrando el n´mero de l´ a u ınea en la que encontr´ el error. La sentencia se interpreta como que si es cierta la condici´n. Si el programa encuentra una sentencia incorrectamente escrita (por ejemplo muestrame o A).

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->