Problema 3.1. Un usuario nos plantea su problema: necesita que se facture el uso de un telé-fono. Nos informará la tarifa por segundo, cuántas comunicaciones se realizaron, la duración de cada comunicación expresada en horas, minutos y segundos. Como resultado deberemos informar la duración en segundos de cada comunicación y su costo.
Solución. Aplicaremos los pasos aprendidos:
1. Análisis:
- ¿Cuántas tarifas distintas se usan? Una sola (la llamaremos
f
). - ¿Cuántas comunicaciones se realizaron? La cantidad de comunicaciones (a la que llamaremos
n
) se informa cuando se inicia el programa. - ¿En qué formato vienen las duraciones de las comunicaciones? Vienen como ternas
(h, m, s)
. - ¿Qué se hace con esas ternas? Se convierten a segundos y se calcula el costo de cada comunicación multiplicando el tiempo por la tarifa.
2. Especificación:
- Entradas:
- Una tarifa
f
expresada en pesos/segundo. - Una cantidad
n
de llamadas telefónicas. n
duraciones de llamadas leídas de teclado y expresadas en horas, minutos y segundos.
- Una tarifa
- Salidas: Mostrar por pantalla las
n
duraciones ingresadas, convertidas a segundos, y su costo. Para cada juego de datos de entrada(h, m, s)
se imprime:3600 * h + 60 * m + s, f * (3600 * h + 60 * m + s)
3. Diseño:
Siguiendo a Thompson, buscamos un programa que haga algo análogo, y vemos si se lo puede modificar para resolver nuestro problema. El programa tres_tiempos
que hicimos anteriormente, se parece bastante a lo que necesitamos.
En primer lugar se observa que el tarifador
debe leer el valor de la tarifa (f
) y que en tres_tiempos
se conoce la cantidad de ternas (3
), mientras que en tarifador
la cantidad de ternas es un dato a ingresar.
Además, se puede ver que en el cuerpo del ciclo de tres_tiempos
, se lee una terna y se llama a print_asegundos
que calcula, imprime y no devuelve ningún valor. Si hiciéramos lo mismo en tarifador
, no podríamos calcular el costo de la comunicación. Es por ello que en lugar de usar print_asegundos
se utiliza la función asegundos
, que calcula el valor transformado y lo devuelve en lugar de imprimirlo y en el cuerpo principal del programa se imprime el tiempo junto con el costo asociado.
4. Implementación: El siguiente es el programa resultante:
# tarifador.py: Factura el tiempo de uso de un teléfono
def main():
""" El usuario ingresa la tarifa por segundo, cuántas
comunicaciones se realizaron, y la duracion de cada
comunicación expresada en horas, minutos y segundos. Como
resultado se informa la duración en segundos de cada
comunicación y su costo. """
f = input("¿Cuánto cuesta 1 segundo de comunicacion?: ")
n = input("¿Cuántas comunicaciones hubo?: ")
for x in range(n):
hs = input("¿Cuántas horas?: ")
min = input("¿Cuántos minutos?: ")
seg = input("¿Cuántos segundos?: ")
segcalc = asegundos(hs, min, seg)
costo = segcalc * f
print "Duracion: ", segcalc, "segundos. Costo: ",costo, "$."
def asegundos (horas, minutos, segundos):
segsal = 3600 * horas + 60 * minutos + segundos
return segsal
main()
5. Prueba: Lo probamos con una tarifa de $ 0,40 el segundo y tres ternas de (1,0,0)
, (0,1,0)
y (0,0,1)
. Este es el resultado:
>>> import tarifador
Cuanto cuesta 1 segundo de comunicacion?: 0.40
Cuantas comunicaciones hubo?: 3
Cuantas horas?: 1
Cuantos minutos?: 0
Cuantos segundos?: 0
Duracion: 3600 segundos. Costo: 1440.0 $.
Cuantas horas?: 0
Cuantos minutos?: 1
Cuantos segundos?: 0
Duracion: 60 segundos. Costo: 24.0 $.
Cuantas horas?: 0
Cuantos minutos?: 0
Cuantos segundos?: 1
Duracion: 1 segundos. Costo: 0.4 $.
>>>
6. Mantenimiento:
Ejercicio 3.6. Corregir el programa para que:
- Imprima el costo en pesos y centavos, en lugar de un número decimal.
- Informe además cuál fue el total facturado en la ejecución.