Ejercicio 16. Compañía telefónica

La política de cobro de una compañía telefónica es:
Cuando se realiza una llamada, el cobro es por el tiempo que esta dura, de tal forma que los primeros cinco minutos cuestan 1 euro, los siguientes tres, 80 céntimos, los siguientes dos minutos a 70 céntimos y a partir del décimo minuto, 50 céntimos.
Además, se carga un impuesto de 3% cuando es domingo, y si es otro día, en turno de mañana 15% y en turno de tarde 10%.
Realice un algoritmo para determinar cuánto debe pagar por cada concepto una persona que realiza una llamada.

Recuerdo que cuando hicimos este ejercicio en Python (después lo realizamos en Java), hubo varias formas de interpretar el enunciado, es importante dejar clara la interpretación con la que vamos a trabajar, pues en base a ella variará el resultado que obtendremos.

Se puede interpretar, que el coste de la llamada es 1 € por cada minuto, durante los cinco primeros minutos, 0,80 € por cada uno de los minutos recorridos del 6 al 8, 0,70 € por los minutos 9 y 10 y a 0,50 € por cada uno de los minutos que supere la duración de la llamada en los 10 minutos.

Reconozco, que esta fue mi primera interpretación, válida a nivel semántico, pero quizás bastante irreal a nivel de tarificación (aunque en un ejercicio… no siempre los valores son reales, ya habrás tenido alguna otra experiencia con valores estratosféricos), ya que una llamada de 11 minutos por ejemplo, el precio sería de 5 € por los primeros 5 minutos, 2,40 euros por los tres siguientes, 1,40 € los otros dos, y el de 11 a 0,50 €… total 9,30 €… a día de hoy fuera de mercado totalmente.

Por este motivo, la otra interpretación, aunque la hubiese redactado de otro modo, me parece más acertada para llevarla a cabo y será la que desarrollaremos aquí:

  • Entre los minutos 0 a 5, el cliente pagará 1 €
  • Del minuto 6 a 8, el cliente pagará 0,80 €
  • Del minuto 9 a 10, el cliente pagará 0,70 €
  • A partir de los 11 minutos, el cliente pagará 0,50 €

Con esta tarificación, el cliente pagará por la misma llamada de 11 minutos, un total de 3 €. Por tanto, las condiciones vendrían a ser las siguientes:

  • Si duracion > 10, coste = 3 €
  • Si duracion > 8, coste = 2,50 €
  • Si duracion > 5, coste = 1,80 €
  • Si duracion <= 5, coste = 1 €

Si comenzamos el if de este modo, sólo debemos poner estas condiciones, al ser unas excluyentes de las otras, no podrá entrar en >5, si la duración es de 9, porque antes ya habría entrado en su apartado correspondiente, etc.

Una vez desarrollada esta parte, debemos tener en cuenta, la lectura del día de la semana. Si es domingo, se debe aplicar una comisión del 3 %.

Si el día de la semana es diferente a domingo, debemos estudiar el horario en el que se realiza.

  • Si horario = mañana, impuesto = 15%
  • Si horario = tarde, impuesto = 10 %
package estructurasAlternativas;

/**
16 Ejercicios Estructuras Alternativas en Java

Programa:
La política de cobro de una compañía telefónica es: cuando se realiza una llamada,
el cobro es por el tiempo que ésta dura, de tal forma que los primeros cinco minutos
cuestan 1 euro, los siguientes tres, 80 céntimos, los siguientes dos minutos, 70 céntimos,
y a partir del décimo minuto, 50 céntimos. 
Además, se carga un impuesto de 3 % cuando es domingo, y si es otro día, en turno de mañana,
15 %, y en turno de tarde, 10 %. Realice un algoritmo para determinar cuánto debe pagar por
cada concepto una persona que realiza una llamada.

Interpretamos que el coste de la llamada es por tramos.

@author: manolohidalgo_
@date: 09-11-19

Variables a utilizar:
    #   minutos (int)
    #   dia (string)
    #   horario (string)
    #   precio (double)
    #   impuesto (double)

ALGORITMO
    - LEER minutos, dia, horario
    - Cálculos
        #   Realizamos cálculos del precio
        # Si precio > 10 --> 3 euros
        # Si precio > 8 -->  2.50 euros
        # Si precio > 5 --> 1.80 euros
        # Si precio <= 5 --> 1 euro
    #   Realizamos cálculo del impuesto
        # Si domingo 3% del precio
        # Si != domingo 
            # mañana --> 15% del precio
            # tarde --> 10% del precio
    - MOSTRAR resultado
*/

import java.util.Scanner;
// Inicio del programa y declaración de variables:
public class Ejercicio16Telefonica {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int duracion;
    String dia;
    String horario;
    double precio;
    double impuesto;

    // Solicitud de datos al usuario
    System.out.println("Calculamos el precio base de la llamada y el impuesto a pagar:");
    System.out.print("Duración de la llamada en minutos: ");
    duracion = scanner.nextInt();
    System.out.print("Día de la semana: ");
    dia = scanner.next(); scanner.nextLine();
    
    // Calculamos el precio base a pagar:
    if (duracion > 10){
        precio = 3;
    } else if (duracion > 8){
        precio = 2.5;
    } else if (duracion > 5){
        precio = 1.80;
    } else {
        precio = 1;
    }   
    
    // Preguntamos día y calculamos impuesto correspondiente.
    if (!dia.toUpperCase().equals("DOMINGO")) {
      System.out.print("¿La llamada se realizó en horario de mañana o tarde? ");
      horario = scanner.nextLine();
      if (horario.toUpperCase().equals("MAÑANA")) {
        impuesto = precio * 0.15;
      } else if (horario.toUpperCase().equals("TARDE")) {
        impuesto = precio * 0.10;
      // Si el horario es incorrecto se dará valor 0 al impuesto y el programa 
      // presentará error.
      } else {
        impuesto = 0; 
      }
    } else {
      impuesto = precio * 0.03;
    }
    
    // Mostramos resultado en pantalla, si horario incorrecto, mostrará error.
    if (impuesto == 0) {
      System.out.println("El horario introducido es incorrecto, reinicia el programa "
          + "e introduce los valores correctos.");
    } else {
      System.out.println("El precio total de la llamada es de " + (precio + impuesto) 
          + " siendo el precio base de " + precio + " y el impuesto a pagar " + impuesto);
    }
  }
}

Puedes acceder a este ejercicio en GitHub en este enlace

Si tienes alguna duda al respecto, alguna sugerencia o algo que no te haya quedado claro, no tienes más que escribirme en los comentarios, estoy aquí para ayudarte y aprender, ¡Nos leemos!