Febrero 2013 con solución

Anuncio
Introducción a la Computación
Examen de febrero de 2013 con solución
Ejercicio 1: Para representar un tiempo de duración de cierto evento se utiliza un diccionario para
indicar cantidad de dı́as, horas, minutos y segundos; de modo que, por ejemplo, un perı́odo de 2
dı́as, 6 horas, 4 minutos y 30 segundos se representa mediante
{’dias’:2, ’horas’:6, ’minutos’:4, ’segundos’:30}
a) Escribir una función en python que reciba un diccionario que representa un tiempo y retorne
un entero indicando el tiempo en segundos. Ejemplo
>>> a_segundos({’dias’:0, ’horas’:0, ’minutos’:2, ’segundos’:20}
140
b) Escribir una función en python que reciba un tiempo expresado en segundos y devuelva un
diccionario que representa el tiempo en dı́as, horas, minutos y segundos. Ejemplo
>>> de_segundos(140)
{’dias’:0, ’horas’:0, ’minutos’:2, ’segundos’:20}
Solución:
a) def a_segundos(dic):
horas = dic[’dias’]*24+dic[’horas’]
minutos = horas*60 + dic[’minutos’]
segundos = minutos*60 + dic[’segundos’]
return segundos
b) def de_segundos(segundos):
dic={}
dic[’segundos’]=segundos % 60
minutos = segundos/60
dic[’minutos’]=minutos % 60
horas = minutos/60
dic[’horas’]=horas % 24
dic[’dias’]=horas / 24
return dic
Ejercicio 2:
a) Implementar una función recursiva que dada una lista indique su cantidad de elementos (no
se puede usar length).
b) Resolver el problema de la parte anterior con un algoritmo iterativo.
c) Definir una funcion separar, que dada una lista de enteros devuelva una tupla de listas
con las ocurrencias negativas, nulas y positivas de de la misma con el mismo orden. Ej:
> separar([0, -1, 2, 0, 0, -3])
([-1, -3], [0, 0, 0], [2])
d) Hacer lo mismo que en la parte c), pero eliminando las ocurrencias repetidas. Ej:
> separar2([0, -1, 2, 0, 0, -3])
([-1, -3], [0], [2])
e) Hacer lo mismo que en la parte d), pero considerando que la lista termina si aparecen dos
números iguales seguidos. Ej:
> separar2([0, -1, 2, 0, 0, -3])
([-1], [0], [2])
Solución:
a) def elementos (lista):
if lista==[]:
return 0
else:
return 1+ elementos(lista[1:])
b) def elementos (lista):
res = 0
for i in lista:
res = res+1
return res
c) def separar (lista):
neg = []
nul = []
pos = []
for i in lista:
if i<0:
neg.append(i)
elif i == 0:
nul.append(i)
else:
pos.append(i)
return (neg, nul, pos)
d) def separarSinRep (lista):
neg = []
nul = []
pos = []
for i in lista:
if i<0 and i not in neg:
neg.append(i)
elif i == 0 and i not in nul:
nul.append(i)
elif i>0 and i not in pos:
pos.append(i)
return (neg, nul, pos)
e) def separarHastaRepetidos (lista):
n= len(lista)
neg = []
nul = []
pos = []
if n!=0:
i = lista[0]
if i<0:
neg.append(i)
elif i == 0:
nul.append(i)
else:
pos.append(i)
j=1
while j<n and lista[j] != i:
i=lista[j]
j=j+1
if i<0 and i not in neg:
neg.append(i)
elif i == 0 and i not in nul:
nul.append(i)
elif i>0 and i not in pos:
pos.append(i)
return (neg, nul, pos)
Ejercicio 3: Una progresión aritmética de diferencia común d, empezando de a con n elementos
es la sucesión finita de números: a, a + d, a + 2d, . . . , a + (n − 1)d
a) Escribir una función python que reciba a, d y n y escriba en pantalla los elementos de la
progresión aritmética correspondiente.
b) Dada una lista de enteros, escribir una funcion prog_ar que imprima en pantalla si la lista
corresponde a los primeros elementos de una progresión aritmética, y si es asi que imprima
su comienzo, diferencia común, y cantidad de elementos.
Ejemplos
> prog_ar([1, 2, 3])
Es progresión aritmética
a es 1
d es 1
n es 3
>prog_ar([9, 13, 17, 21])
Es progresión aritmética
a es 9
d es 4
n es 4
>prog_ar([9, 17, 13, 21])
No es progresión aritmética
>prog_ar([-1, 2, 8])
No es progresión aritmética
c) Escribir un programa Python que solicite números al usuario hasta que la suma de los
números ingresados supere 1000 y luego muestre en pantalla si es parte de una progresión
aritmética o no, indicando a, d y n en caso de que sı́ lo sea.
Solución:
a) def prog(a,d,n):
for i in range(n):
print a+d*i
b) def es_prog(lista):
if lista==[]:
print ’la lista es vacı́a’
else:
a = lista[0]
n = len(lista)
if n==1:
print ’lista de un elemento’
else:
d=lista[1]-a
prog = True
anterior = lista[1]
j = 2
while prog and j<n:
actual = lista[j]
if actual-anterior != d:
prog = False
anterior = actual
j = j+1
if prog:
print ’es prog de a=%d, d=%d y n=%d’ %(a,d,n)
else:
print ’no es prog’
c) num = input()
lista=[num]
suma = num
while suma <= 1000:
num = input()
suma = suma + num
lista.append(num)
es_prog(lista)
Descargar