import java.util.Scanner;

public class Quiz02
{
  public static void main(String args[]) 
  {
    Scanner teclado = new Scanner(System.in);
    
    
    double min = 0.0;
    double max = 0.0;
    double incremento = 0.0;
    boolean continuar = true;
    int tamano = 10;
    String operador = "";
    
    System.out.println("Tablas de operadores\n");
    
    System.out.print("Operador [+|-|*|/|%|salir]: ");
    
    operador = teclado.nextLine();
    
    while(continuar)  
    {
      if(continuar)
      {
        System.out.print("\nValor mínimo: ");
        min = teclado.nextDouble();
        
        System.out.print("\nValor maximo: ");
        max = teclado.nextDouble();
        while ( incremento <= 0 )
        { //pregunta hasta que el valor sea correcto
          try 
          {
            System.out.print("\nIncremento: ");
            incremento = teclado.nextDouble();
          } 
          catch ( java.util.InputMismatchException e ) 
          {
            teclado.nextLine();
          }
        }
        
        //Encabezado 
        System.out.print("   " + operador + "    | ");
        
        for(double i = min; i <= max; i+=incremento)  
        {
          imprimir(i);
          tamano += 6; //Esto es para que la linea de guiones quede a la medida pues espacio para imp numeros es de 6
        }
        System.out.println();
        
        for(int u = tamano; u != 0; u--)
        {
          System.out.print("-");
        }
        System.out.println();
        
        //Tabla
        
        switch(operador)
        {
          case "+"://suma
            
            for(double i = min; i <= max; i += incremento)//fila
          { 
            imprimir(i);
            System.out.print("  | ");
            for(double j = min; j <= max; j += incremento) //columna
            { 
              imprimir(i + j);
            }
            System.out.println( );//espacio entre filas
          }
            break;
            
          case "-"://resta
            for(double i = min; i <= max; i += incremento)//fila 
          { 
            imprimir(i);
            System.out.print("  | ");
            for(double j = min; j <= max; j += incremento)//columna
            { 
              imprimir(i - j);
            }
            System.out.println( );//espacio entre filas
          }
            break;
          case "*":
            for(double i = min; i <= max; i += incremento)//fila
          { 
            imprimir(i);
            System.out.print("  | ");
            for(double j = min; j <= max; j += incremento)//columna
            { 
              imprimir(i * j);
            }
            System.out.println( );//espacio entre filas
          }
            break;
          case "/": //div
            
            for(double i = min; i <= max; i += incremento)//fila
          { 
            imprimir(i);
            System.out.print("  | ");
            for(double j = min; j <= max; j += incremento) //columna
            { 
              imprimir(i / j);
            }
            System.out.println( );//espacio entre filas
          }
            break;
            
          case "%"://modulo
            for(double i = min; i <= max; i += incremento)//fila
          { 
            imprimir(i);
            System.out.print("  | ");
            for(double j = min; j <= max; j += incremento) //columna
            { 
              imprimir(i % j);
            }
            System.out.println( );//espacio entre filas
          }
            break;
            
        }
      }
      incremento = 0; //Reinicia el incremento pq lo pida al principio!
      
      teclado.nextLine(); //Hace q se espere a q uno entre el operador la veces posteriores a la primera!
      
      System.out.print("\nOperador [+|-|*|/|%|salir]: ");
      operador = teclado.nextLine();  //lee el operador de nuevo
      
      if(operador.equalsIgnoreCase("salir")) 
      {
        continuar = false;
      }
    }
    
  }
  
  
  //Esto agarra el numero que se le de como parametro, lo multiplica x10 y le saca modulo 10.
  //Si da (numero*10)%10 == 0, numero no tenía decimales.
  //Si da (numero*10)%10 != 0, numero tenía decimales.
  
  public static boolean esEntero(double numero)
  {
    boolean entero = true;
    
    if((numero * 10)%10 != 0)
    {
      entero = false;
    }
    
    return entero;
  }
  
  
  //Esto imprime los numeros! los imprime con punto si tenian decimales, sino los tira normales
  
  public static void imprimir(double numero)
  {
    if(esEntero(numero)) 
    {
      
      System.out.printf("%6d",(int)numero);
    }   else    {
      System.out.printf("%6.1f",numero);
    }
  }
}
