// sezione di include generali
#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 20 


// dichiarazione delle funzioni utilizzate
int mostraMenu (void);
void leggiCoeff (float*, float*, float*, int);
void calcolaSol (float, float, float, float, float, float, float*, float*);

// VARIABILE GLOBALE
int ceEq;

// programma principale
int main(int argc, char *argv[])
{
// dichiarazione variabili locali
int scelta;
float a, b, c, m;
float a2, b2, c2, m2;
float x, y;


// inizializzazioni
scelta = 0;
ceEq = 0;


do
   {
   // ripulisco lo schermo
   system("CLS");

   // chiamo la funzione che crea il menù utente
   scelta = mostraMenu();

   switch (scelta)
      {
      case 1:
             {
             if (ceEq == 0)
                {
                leggiCoeff (&a, &b, &c, 1);
                printf ("\n\nLA PRIMA RETTA HA COEFFICIENTI: \nA = %f \nB = %f  \nC = %f   \n", a, b, c);
                system("PAUSE");               
                leggiCoeff (&a2, &b2, &c2, 2);
                printf ("\n\nLA SECONDA RETTA HA COEFFICIENTI: \nA = %f \nB = %f  \nC = %f   \n", a2, b2, c2);
                system("PAUSE"); 
                }
             else
                {
                printf ("\n\nOPERAZIONE IMPOSSIBILE: I coefficienti delle rette sono stati già acquisiti\n\n");
                system("PAUSE"); 
                }              
             break;
             }
      case 2:
             {
             if (ceEq == 1)
                {
                calcolaSol (a, b, c, a2, b2, c2, &x, &y);
                }
             else
                {
                printf ("\n\nOPERAZIONE IMPOSSIBILE: I coefficienti delle rette non sono stati acquisiti\n\n"); 
                system("PAUSE"); 
                }
             break;
             } 
      case 3:
             {
            //riabbasso il flag
             ceEq = 0; 
             printf ("\n\nReimmettere i coefficienti delle rette da intersecare \n\n");
             system("PAUSE");                 
             break;
             }
      case 4:
             {
             printf ("\n\nGrazie per averci utilizzato CORRETTAMENTE ........ \n\n");
             }
 
      }

   } while (scelta != 4);

  
system("PAUSE");	
return 0;
}


// FUNZIONE DI CREAZIONE DEL MENU' UTENTE
int mostraMenu (void)
{
int scelta;

do
   {
   system("CLS");
   printf ("\n\n");
   printf ("\t**************************************************************\n");
   printf ("\t*   INTERSEZIONE DI DUE RETTE NELLA FORMA aX + bY + C = 0    *\n");
   printf ("\t**************************************************************\n");
   printf ("\n");
   printf ("\t**************************************************************\n");
   printf ("\t*\t\tMenu' utente principale                      *\n");
   printf ("\t**************************************************************\n");
   printf ("\t* \t1 ACQUISIZIONE DELLE 2 RETTE                         *\n");
   printf ("\t* \t2 CALCOLO PUNTO DI INTERSEZIONE                      *\n");
   printf ("\t* \t3 NUOVA INTERSEZIONE                                 *\n");
   printf ("\t* \t4 =======> USCITA                                    *\n");
   printf ("\t**************************************************************\n\n\n");

   printf ("\t\tInserire scelta (1, 2, 3 oppure 4)   :    ");
   fflush(stdin);
   scanf("%d", &scelta);

   if ((scelta < 1) || (scelta > 4))
      {
      printf ("\n\nERRORE Digitare la scelta corretta.....\n\n");
      system("PAUSE");
      }
   else;
   } while ((scelta < 1) || (scelta > 4));

return scelta;
}


// FUNZIONE DI LETTURA DEI COEFFICIENTI
void leggiCoeff (float* a1, float* b1, float*c1, int i)
{
char elem[MAXLEN];
int uscita;
char segno1, segno2;


system ("CLS");
// Acquisizione primo e secondo coefficiente coefficiente della retta
uscita = 0;

do
   {   
   printf ("\nInserire il primo coefficiente della %d retta....\n", i);
   fflush (stdin);
   scanf("%s", elem);
  
   if (strcmp(elem,"0") == 0)
      {
      // il primo coefficiente è zero
      *a1 = 0;
      printf ("\nPrimo coefficiente della %d retta acquisito correttamente uguale a zero \n", i);
      }
   else if (atof(elem) != 0)
      {
      uscita = 1;
      *a1 = atof(elem);
      printf ("Primo coefficiente della %d retta acquisito correttamente\n", i);
      }
   else
      {
      uscita = 0;
      printf ("\nERRORE: Primo coefficiente della %d retta acquisito non numerico\n", i);
      }

   if (uscita == 1)
      {
      printf ("\nInserire il secondo coefficiente della %d retta....\n", i);
      fflush (stdin);
      scanf("%s", elem);
  
      if (strcmp(elem,"0") == 0)
         { 
         *b1 = 0;

         if ((*b1 == 0) && (*a1 == 0))
            {
            uscita = 0;
            printf ("\nERRORE: Primo e secondo coefficiente della %d retta entrambi nulli\n",i);
            }
         else
            {
            uscita = 1;
            printf ("\nSecondo coefficiente della %d retta acquisito correttamente uguale a zeo\n", i);
            }
         }
      else if (atof(elem) != 0)
         {
         uscita = 1;
         *b1 = atof(elem);
         printf ("Secondo coefficiente della %d retta acquisito correttamente\n", i);
         }
      else
         {
         uscita = 0;
         printf ("\nERRORE: Secondo coefficiente della %d retta acquisito non numerico\n",i);
         }
      }
   else;     

   } while (uscita == 0) ;



// Acquisizione terzo coefficiente dell'equazione
uscita = 0;
do
   {   
   printf ("\nInserire il termine noto della %d retta....\n",i);
   fflush (stdin);
   scanf("%s", elem);
  
   if (strcmp(elem,"0") == 0)
      {
      uscita = 1;
      *c1 = 0;
      printf ("Termine noto della %d retta acquisito correttamente\n",i);
      }
   else if (atof(elem) != 0)
      {
      uscita = 1;
      *c1 = atof(elem);
      printf ("Termine noto della %d retta acquisito correttamente\n",i);
      }
   else
      {
      printf ("\nERRORE: Termine noto della %d retta acquisito non numerico\n",i);
      } 

   } while (uscita == 0) ;


// i coefficienti sono stati acquisiti tutti pertanto lo segnalo nel flag apposito
ceEq = 1;

return;
}


// FUNZIONE DI CALCOLO DELLE SOLUZIONI
void calcolaSol (float A, float B, float C, float A2, float B2, float C2,  float* px, float* py)
{

if ((A*B2 - A2*B) != 0)
   {
   *px = (B*C2 -B2*C) / (A*B2 - A2*B);
   *py = (C*A2 -A*C2)/ (A*B2 - A2*B);
   printf ("\n Il punto di intersezione tra le due rette ha  \n ascissa X = %f \n ordinata Y = %f\n\n", *px, *py); 
   }
else
   {
   printf ("\nIl sistema non ammette soluzioni con il metodo di Kramer \nIl determinante dei coefficienti e' uguale a zero\n");
   }
system ("PAUSE");

return;
}