martedì 24 gennaio 2012

Operazioni con due frazioni (Java)


Analisi dei dati:
INPUT
-A = numeratore 1^ frazione
-B = denominatore 1^ frazione
-C = numeratore 2^ frazione
-D = denominatore 2^ frazione
-tip = tipo dell'operazione da eseguire
-rip = risposta SI/NO per ripetere l'esercizio
ELABORAZIONE
-MCD = Minimo comun divisore
-M = minimo comune multiplo
-X = variabile intera
-Y = variabile intera
-R = variabile (fa da resto nel calolo del MCD)
OUTPUT
-P = Numeratore della frazione finale
-Q = Denominatore della frazione finale

import IO.*;

class calcola_frazioni {

    public static void main(String[] args) {

     Input pc = new Input();

     int A, B, C, D; //Numeri delle frazioni
     int P, Q; //Valori del risultato
     int tip; //Tipo dell'operazione da eseguire
     int MCD; //Minimo comune divisore tra numeratore e denominatore
  int X, Y, R, M; //Altre variabili
  String rip;

  do
  {
      //Input dei valori delle frazioni
      System.out.println("Date le frazioni A/B e C/D");
      System.out.print("A = ");
      A = pc.leggiInt();
      System.out.print("B = ");
      B = pc.leggiInt();
      System.out.print("C = ");
      C = pc.leggiInt();
      System.out.print("D = ");
      D = pc.leggiInt();
      //Mostra le due frazioni scritte
      System.out.println("Le due frazioni sono: "+A+"/"+B+" e "+C+"/"+D);

   //Chiedere all'utente che operazione vuole fare
   System.out.println("Che operazione vuoi effettuare?");
   System.out.println("1 - Addizione");
   System.out.println("2 - Prodotto");
   System.out.println("3 - Quoziente");
   System.out.println("4 - Calolare le frazioni inverse");
   System.out.print("Scrivi il numero dell'operazione: ");
   tip = pc.leggiInt();

   //Per ogni operazione si seguiranno passi diversi
   switch (tip)
   {
    case 1: // Addizione
    {
     //Calcoliamo prima MCM
     M = B;

        while (M%D!=0)
        {
         M = M+B;
        }

        A = A*(M/B);
        B = B*(M/B);
        C = C*(M/D);
        D = D*(M/D);

        P = A + C;
        Q = B;

        /*Verificare se la frazione risultata sia ridotta ai minimi termini
      *Semplifica se si ritiene necessario
      *Usiamo il metodo di Euclide per trovare MCD
      */
     //per A e B
     X = P;
     Y = Q;

     if (P<Q)
     {
      X = Q;
      Y = P;
     }

     while (X%Y!=0)
     {
      R = X%Y;
      X = Y;
      Y = R;
     }

     MCD = Y;

     //Se MCD e' 1 allora lascia invariate P e Q
     if (MCD!=1)
     {
      P = P/MCD;
      Q = Q/MCD;
     }

        System.out.println("L'addizione e' uguale a: "+P+"/"+Q);
    }
    break;

    case 2: //Prodotto
    {
     P = A*C;
     Q = B*D;

     /*Verificare se la frazione risultata sia ridotta ai minimi termini
      *Semplifica se si ritiene necessario
      *Usiamo il metodo di Euclide per trovare MCD
      */
     //per A e B
     X = P;
     Y = Q;

     if (P<Q)
     {
      X = Q;
      Y = P;
     }

     while (X%Y!=0)
     {
      R = X%Y;
      X = Y;
      Y = R;
     }

     MCD = Y;

     if (MCD!=1)
     {
      P = P/MCD;
      Q = Q/MCD;
     }

     System.out.println("Il prodotto e': "+P+"/"+Q);
    }
    break;

    case 3: //Quoziente
    {
     //Troviamo il reciproco di C/D
     X = C;
     C = D;
     D = X;

     P = A*C;
     Q = B*D;

     /*Verificare se la frazione risultata sia ridotta ai minimi termini
      *Semplifica se si ritiene necessario
      *Usiamo il metodo di Euclide per trovare MCD
      */
     //per A e B
     X = P;
     Y = Q;

     if (P<Q)
     {
      X = Q;
      Y = P;
     }

     while (X%Y!=0)
     {
      R = X%Y;
      X = Y;
      Y = R;
     }

     MCD = Y;

     //Se MCD e' 1 allora lascia invariate P e Q
     if (MCD!=1)
     {
      P = P/MCD;
      Q = Q/MCD;
     }

     System.out.println("Il quoziente e': "+P+"/"+Q);
    }
    break;

    case 4: //Frazioni inverse
    {
     X = A;
     A = B;
     B = X;
     Y = C;
     C = D;
     D = Y;

     System.out.println("Le due frazioni inverse sono: "+A+"/"+B+" e "+C+"/"+D);
    }
    break;

    default: //Per nessuna operazione
    {
     System.out.println("Il numero non corrisponde a nessun'operazione.");
     System.out.println("Dovrai ricominciare l'esercizio!");

    }
   }

      //Ciede all'utente se vuole ripetere l'esercizio
   System.out.println("Vuoi ripetere l'esercizio? si/no");
      rip = pc.leggiString();

      while (rip.compareTo("no")!=0 && rip.compareTo("si")!=0)
      {
       System.out.println("La risposta non è valida. Riprova!");
       System.out.println("Vuoi ripetere l'esercizio? si/no");
       rip = pc.leggiString();
       //Se la risposta e' diversa da SI/NO, allora chiede di nuovo
      }

     if (rip.compareTo("no")==0)
     {
       System.out.println("L'esercizio è finito");
       //Se la risposta e' no, allora conclude l'esercizio
     }

    }
    while (rip.compareTo("si")==0); //Se la risposta è si, ripete l'esecizio

    }

}

Nessun commento: