Ver índice de contenidos del libro

3.5. Un ejemplo completo

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.
  • 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.
Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano, Nicolás Paez. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.