// sezione di include generali #include #include #define MAXLEN 20 // dichiarazione delle funzioni utilizzate int mostraMenu (void); void leggiCoeff (float*, float*, float*); float calcolaDet (float, float, float); void calcolaSol (float, float, float, float, float*, float*); // VARIABILE GLOBALE int ceCoeff; int ceDet; // programma principale int main(int argc, char *argv[]) { // dichiarazione variabili locali int scelta; float a, b, c, det, x1, x2; // inizializzazioni scelta = 0; ceCoeff = 0; ceDet = 0; do { // ripulisco lo schermo system("CLS"); // chiamo la funzione che crea il menù utente scelta = mostraMenu(); switch (scelta) { case 1: { if (ceCoeff == 0) { leggiCoeff (&a, &b, &c); system("PAUSE"); } else { printf ("\n\nOPERAZIONE IMPOSSIBILE: I coefficienti dell'equazione di 2^grado sono stati già acquisiti\n\n"); system("PAUSE"); } break; } case 2: { if (ceCoeff == 1) { ceDet = 1; det = calcolaDet (a, b, c); printf ("\nIl determinante dell'equazione di 2^grado e' %f \n", det); system("PAUSE"); } else { printf ("\n\nOPERAZIONE IMPOSSIBILE: I coefficienti dell'equazione di 2^grado non sono stati acquisiti\n\n"); system("PAUSE"); } break; } case 3: { if ((ceCoeff == 1) && (ceDet == 1)) { //riabbasso i flag ceCoeff = 0; ceDet = 0; calcolaSol (det, a, b, c, &x1, &x2); system("PAUSE"); } else { if (ceCoeff == 0) { printf ("\n\nOPERAZIONE IMPOSSIBILE: I coefficienti dell'equazione di 2^grado non sono stati acquisiti\n\n"); } else { printf ("\n\nOPERAZIONE IMPOSSIBILE: Il determinante dell'equazione di 2^grado non e' stato acquisito\n\n"); } system("PAUSE"); } break; } case 4: { //riabbasso i flag ceCoeff = 0; ceDet = 0; printf ("\n\nReimmettere i coefficienti dell'equazione di 2^grado \n\n"); system("PAUSE"); break; } case 5: { printf ("\n\nGrazie per averci utilizzato CORRETTAMENTE ........ \n\n"); } } } while (scelta != 5); system("PAUSE"); return 0; } // FUNZIONE DI CREAZIONE DEL MENU' UTENTE int mostraMenu (void) { int scelta; do { system("CLS"); printf ("\n\n"); printf ("\t\t********************************************\n"); printf ("\t\t* RISOLUZIONE EQUAZIONE DI 2^GRADO *\n"); printf ("\t\t********************************************\n"); printf ("\n"); printf ("\t\t********************************************\n"); printf ("\t\t*\tMenu' utente principale *\n"); printf ("\t\t********************************************\n"); printf ("\t\t* 1 ACQUISIZIONE DEI COEFFICIENTI *\n"); printf ("\t\t* 2 CALCOLO DEL DETERMINANTE *\n"); printf ("\t\t* 3 CALCOLO DELLE SOLUZIONI *\n"); printf ("\t\t* 4 NUOVA EQUAZIONE *\n"); printf ("\t\t* 5 =======> USCITA *\n"); printf ("\t\t********************************************\n\n\n"); printf ("\t\tInserire scelta (1, 2, 3, 4 oppure 5) : "); fflush(stdin); scanf("%d", &scelta); if ((scelta < 1) || (scelta > 5)) { printf ("\n\nERRORE Digitare la scelta corretta.....\n\n"); system("PAUSE"); } else; } while ((scelta < 1) || (scelta > 5)); return scelta; } // FUNZIONE DI LETTURA DEI COEFFICIENTI void leggiCoeff (float* a1, float* b1, float*c1) { char elem[MAXLEN]; int uscita; char segno1, segno2; // Acquisizione prime coefficiente dell'equazione uscita = 0; do { printf ("\nInserire il primo coefficiente dell'equazione di 2^grado....\n"); fflush (stdin); scanf("%s", elem); if (strcmp(elem,"0") == 0) { // il primo coefficiente non può essere zero printf ("\nERRORE: Primo coefficiente acquisito uguale a zero \n"); } else if (atof(elem) != 0) { uscita = 1; *a1 = atof(elem); printf ("Primo coefficiente acquisito correttamente\n"); } else { printf ("\nERRORE: Primo coefficiente acquisito non numerico\n"); } } while (uscita == 0) ; // Acquisizione secondo coefficiente dell'equazione uscita = 0; do { printf ("\nInserire il secondo coefficiente dell'equazione di 2^grado....\n"); fflush (stdin); scanf("%s", elem); if (strcmp(elem,"0") == 0) { uscita = 1; *b1 = 0; printf ("\nSecondo coefficiente acquisito correttamente\n"); } else if (atof(elem) != 0) { uscita = 1; *b1 = atof(elem); printf ("Secondo coefficiente acquisito correttamente\n"); } else { printf ("\nERRORE: Secondo coefficiente acquisito non numerico\n"); } } while (uscita == 0) ; // Acquisizione terzo coefficiente dell'equazione uscita = 0; do { printf ("\nInserire il terzo coefficiente dell'equazione di 2^grado....\n"); fflush (stdin); scanf("%s", elem); if (strcmp(elem,"0") == 0) { uscita = 1; *c1 = 0; printf ("Terzo coefficiente acquisito correttamente\n"); } else if (atof(elem) != 0) { uscita = 1; *c1 = atof(elem); printf ("Terzo coefficiente acquisito correttamente\n"); } else { printf ("\nERRORE: Terzo coefficiente acquisito non numerico\n"); } } while (uscita == 0) ; printf ("\n********************************************************"); if ((*b1 == 0) && (*c1 == 0)) { printf("\n ------- EQUAZIONE MONOMIA ------- "); printf ("\nL'equazione di 2^grado e' del tipo A X^2 = 0\n"); printf ("\nL'equazione esatta e' %f X^2 = 0\n", *a1); } else if ((*b1 == 0) && (*c1 != 0)) { printf("\n ------- EQUAZIONE PURA ------- "); printf ("\nL'equazione di 2^grado e' del tipo A X^2 + C = 0\n"); if (*c1 < 0) { printf ("\nL'equazione esatta e' %f X^2 %f = 0\n", *a1, *c1); } else { printf ("\nL'equazione esatta e' %f X^2 + %f = 0\n", *a1, *c1); } } else if ((*b1 != 0) && (*c1 == 0)) { printf("\n ------- EQUAZIONE SPURIA ------- "); printf ("\nL'equazione di 2^grado e' del tipo A X^2 + B X = 0\n"); if (*b1 < 0) { printf ("\nL'equazione esatta e' %f X^2 %f X = 0\n", *a1, *b1); } else { printf ("\nL'equazione esatta e' %f X^2 + %f X = 0\n", *a1, *b1); } } else { segno1 = ' '; segno2 = ' '; printf("\n ------- EQUAZIONE COMPLETA ------- "); printf ("\nL'equazione di 2^grado e' del tipo A X^2 + B X + C = 0\n"); //aggiusto l'output if (*b1 > 0) { segno1 = '+'; } else; if (*c1 > 0) { segno2 = '+'; } else; printf ("\nL'equazione esatta e' %f X^2 %c %f X %c %f = 0\n", *a1, segno1, *b1, segno2, *c1); } printf ("********************************************************\n\n"); // i coefficienti sono stati acquisiti tutti pertanto lo segnalo nel flag apposito ceCoeff = 1; return; } // FUNZIONE DI CALCOLO DEL DETERMINANTE float calcolaDet (float a1, float b1, float c1) { float d; //calcolo del determinante d = b1*b1 - 4*a1*c1; //restituzione del determinante return d; } // FUNZIONE DI CALCOLO DELLE SOLUZIONI void calcolaSol (float d1, float a1, float b1, float c1, float* px1, float* px2) { printf ("\n********************************************************"); if (d1 < 0) { // calcolo della prima e seconda soluzione printf ("\nL'equazione di 2^grado ha soluzioni complesse coniugate\n"); *px1 = 0; *px2 = 0; // scrittura della prima e seconda soluzione complessa coniugata printf ("\nLe radici complesse coniugate dell'equazione di 2^grado sono: \n"); printf ("X1 = (%f - %f i) \\ %f\n", b1, sqrt(-d1), 2*a1); printf ("X2 = (%f + %f i) \\ %f\n", b1, sqrt(-d1), 2*a1); } else if (d1 == 0) { // calcolo della prima e seconda soluzione *px1 = -b1 / 2*a1; *px2 = *px1; //altrimenti mi dice quadrato di un binomio anche nel caso eq. monomia // basta testare il termine di primo grado che non sia nullo if (b1 != 0) { printf ("\nL'equazione di 2^grado e' il quadrato di un binomio "); } else; printf ("\nL'unica soluzione (radice doppia) dell'equazione di 2^grado e': \n"); printf ("X1 = X2 = %f \n", *px1); } else { // calcolo della prima soluzione *px1 = (-b1 - sqrt(d1) ) / (2*a1); // calcolo della prima soluzione *px2 = (-b1 + sqrt(d1) ) / (2*a1); printf ("\nLe 2 soluzioni dell'equazione di 2^grado sono ......... \n"); printf ("X1 = %f \n", *px1); printf ("X2 = %f \n", *px2); } printf ("********************************************************\n\n"); return; }