[C] il goto si ripete -__-

di il
13 risposte

[C] il goto si ripete -__-

Buonasera ragazzi ho un piccolo problema...
ecco il codice:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>

char scelta_utente,uscita;
float a,b,c,delta,x,x_1,x_2;

main () 

{
 menu:
   system("color 1a");
   printf("Programma per il calcolo di equazioni.\n\n"
          "1. Equazioni di primo grado\n"
          "2. Equazioni di secondo grado\n"
          "3. Credits\n"
          "4. Esci\n\n"
          "Scelta: ");
   scanf("%c",&scelta_utente);
 //printf("scelta_utente=%c\n",scelta_utente); /*Funzione di controllo in caso di errori*/
   switch(scelta_utente) {
          case '1': 
            primo_grado:
               system("CLS");
               printf("Hai scelto -Equazione di Primo Grado-\n"
                      "Secondo la forma generale ax = b\n\n\n\n"
                      "Inserisci il valore di a: ");
               scanf("%f",&a);
             //printf("\n\n\na=%.2f\n\n\n",a); /*Funzione di controllo in caso di errori*/
               printf("\nAdesso inserisci il valore di b: ");
               scanf("%f",&b);
             //printf("\n\n\nb=%.2f\n\n\n",b); /*Funzione di controllo in caso di errori*/
               system("CLS");
               printf("Secondo la forma generale la tua equazione e':\n"
                      "(%.2f)x = (%.2f)\n\n\n",a,b);
               system("PAUSE");
               system("CLS");
               if(a != 0){
                  x=b/a;
                  printf("Secondo la formula risolutiva \t x = b/a \n"
                         "si ha:\tx = %.2f\n\n\n",x);
                  system("PAUSE");
                    menu1:
                  system("CLS");
                  printf("Vuoi risolvere un'altra equazione?\n\n"
                         "1. Si grazie!\n"
                         "2. No, desidero uscire dal programma.\n\n"
                         "Scelta: ");
                  scanf("%c",&uscita);
                //printf("\n\nuscita=%c\n\n\n",uscita); /*Funzione di controllo in caso di errori*/
                //system("PAUSE"); /*Mette in pausa il programma in modo tale da poter visualizzare il valore*/
                                   /*della variabile uscita, che non sarebbe possibile vedere
                                   per via del system("CLS"); presente nei seguenti casi*/
                  switch(uscita) {
                     case '1':
                       system("CLS");
                       goto menu;
                       break;
                     case '2':
                       system("CLS");
                       printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\tArrivederci!");
                       break;
                     default:
                       system("CLS");
                       printf("\n\n\n\n\n\n\n\n\n\n\t\t\tLa tua scelta non e' valida!"
                              "\n\n\t\t\t\tRiprova!\n\n\n\n\n\n\n\n\n\n\n\n");
                       system("PAUSE");
                       system("CLS");
                       goto menu1;
                       break;
                                 }
                       }
               else if(b != 0) {
                    printf("L'equazione e' impossibile.\n\n\n");
                    system("PAUSE");
                    goto menu1;
                               }
               else {
                   printf("L'equazione e' indeterminata.\n\n\n");
                   system("PAUSE");
                   goto menu1;
                   }
               break;
             case '2':
               system("CLS");
               printf("Hai scelto -Equazione di Secondo Grado-\n"
                      "Secondo la forma generale ax^2 + bx + c = 0\n\n\n\n"
                      "Inserisci il valore di a: ");
               scanf("%f",&a);
             //printf("\n\n\na=%.2f\n\n\n",a); /*Funzione di controllo in caso di errori*/
               if(a==0) {
                  system("CLS");
                  printf("\n\n\n\n\n\n\n\n\n\t\t\tL'equazione e' di primo grado!\n"
                         "Verrai reindirizzato al programma per "
                         "risolvere le equazioni di primo grado.\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                  system("PAUSE");
                  goto primo_grado;
                       }
               else if (a!=0) {
                  printf("\nInserisci il valore di b: ");
                  scanf("%f",&b);
                //printf("\n\nb=%.2f\n\n\n",b); /*Funzione di controllo in caso di errori*/
                  printf("\nInserisci il valore di c: ");
                  scanf("%f",&c);            
                //printf("\n\nc=%.2f\n\n\n",c); /*Funzione di controllo in caso di errori*/
                  system("CLS");
                  printf("Secondo la forma generale la tua equazione e':\n"
                         "(%.2f)x^2 + (%.2f)x + (%.2f) = 0\n\n\n",a,b,c);
                  system("PAUSE");
                  system("CLS");
                  delta=pow(2,b)-4*a*c;
                  if(delta>0) {                                                    
                      x_1=-b+sqrt(delta);
                      x_2=-b-sqrt(delta);
                      printf("L'equazione ha due soluzioni:\n"
                             "x_1 = %.2f\nx_2 = %.2f\n\n\n",x_1,x_2);
                      system("PAUSE");
                      goto menu1;
                              }                                  
                  else if(delta==0) { 
                      x_1=-b+sqrt(delta);
                      x_2=-b-sqrt(delta); 
                      printf("L'equazione ha due soluzioni coincidenti:\n"
                             "x_1 = %.2f\nx_2 = %.2f\n\n\n",x_1,x_2);
                      goto menu1;
                                    }
                  else {
                      printf("L'equazione e' impossibile.\n\n\n");
                      system("PAUSE");
                      goto menu1;
                       }
                             }                                          
             break;    
           case '3':
             system("CLS");
             printf("\n\n\n\n\n\n\n\n\n\n\t\t\tProgramma creato da: Melis Davide"
                    "\n\t\t\t\tIn data: 10/11/2011\n\n\n\n\n\n\n\n\n\n\n\n\n");
             system("PAUSE");
             system("CLS");
             goto menu;
             break;                               
           case '4':
             system("CLS");
             printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\tArrivederci!");
             break;
           default:  
             system("CLS"); 
             printf("\n\n\n\n\n\n\n\n\n\n\t\t\tLa tua scelta non e' valida!"
                    "\n\n\t\t\t\tRiprova!\n\n\n\n\n\n\n\n\n\n\n\n");
             system("PAUSE"); 
             system("CLS"); 
             goto menu;
             break; 
                         }
     getch ();
}

/*                         ATTENZIONE!
Per rendere operative le funzioni di controllo cancellare i segni di commento //
che le anticipano.
*/
Comunque il problema sta nel fatto che, quando siamo nel menù di scelta iniziale (o anche nel menu1) e inseriamo un carattere o un numero non previsto dal menù, appare la schermata con scritto "scelta non valida" e poi il goto dovrebbe portarci direttamente al menù iniziale.. e invece questo si ripete
Ho notato inoltre che si ripete una volta in piu' per ogni carattere o numero inserito..
esempio:
se scrivo dopo scelta: 7
il goto si esegue 2 volte
se scrivo 78
il goto si esegue 3 volte e così via...
Il problema è correggibile o è per il fatto che il goto non è un'istruzione molto consigliata??

P.S.
se dichiaro scelta_utente come variabile di tipo intero il goto non si ripete... ma se nel menu di scelta inserisco un carattere il programma ovviamente crasha

13 Risposte

  • Re: [C] il goto si ripete -__-

    Usa i cicli for()
  • Re: [C] il goto si ripete -__-

    Non ho mai usato il for.. potresti farmi un piccolo esempio?
  • Re: [C] il goto si ripete -__-

    int i;
    for (i = 0; i < 10; i++) {
        printf("%d", i);
    }
    In pratica il primo parametro di for sarebbe l'inizializzazione del ciclo, quindi l'assegnamento di un valore iniziale della variabile i. Il secondo parametro indica la condizione che, se è vera, continua il ciclo ripetendolo. L'ultimo parametro indica l'incremento (o decremento) che viene effettuato ad ogni ripetizione del ciclo. Per avere ad esempio un ciclo infinito:
    for (i = 0; ; i++) {
        printf("%d", i);
    }
  • Re: [C] il goto si ripete -__-

    Grazie mille! Ora vedo un po' come utilizzarlo nel programma
  • Re: [C] il goto si ripete -__-

    O se no usa il while
  • Re: [C] il goto si ripete -__-

    Alee ha scritto:


    O se no usa il while
    sintassi:
    while (condizione)
    {
    cosa fare 
    }
    Esempio:
    while (x<10)
    {
    x++;
    }
    
    Finchè x sarà minore di 10 verrà aumentato di 1.
  • Re: [C] il goto si ripete -__-

    Hmmmmm ho capito come funzionano e sono riuscito a sfruttarli in programmini prova... ma.. non riesco proprio a capire come potrei implementarlo qua qualche idea?
  • Re: [C] il goto si ripete -__-

    Qui sarebbe meglio però usare le funzioni sai... scusa se cambio sempre idea:)
  • Re: [C] il goto si ripete -__-

    Funzioni? ho letto qualcosina ma non le ho mai usate
  • Re: [C] il goto si ripete -__-

    Esempio:
    #include <stdio.h>
    #include <stdlib.h>
    
    int Funzione2(int Par1, int *Par2) {
        *Par2 = Par1 / 2;
        return 0;
    }
    
    int Funzione(int Par) {
        return Par * 2;
    }
    int main(void) {
        int Var = Funzione(2), Var2;
        printf("%d", Var); // 2 * 2 = 4
        Funzione2(4, &Var2);
        printf("%d", Var2); // 4 / 2 = 2
        system("PAUSE >NUL");
        return 0;
    }
  • Re: [C] il goto si ripete -__-

    Lascia gli switch che se ti sono comodi non danno fastidio togli i goto (non siamo in qbasic ) e fai una funzione per il menu con anche il controllo (magari tramite una variabile che poi processi negli switch) e una per il menu1 come sopra con patate. io personalmente arrivando da python preferisco gl'if e i while(per i menù) .

    Ciao Marco.
  • Re: [C] il goto si ripete -__-

    Grazie mille! seguirò i vostri consigli
    Comunque inizialmente i menù li avevo fatti con gli if.. poi pero' dopo averlo fatto vedere al professore siamo giunti alla decisione di usare switch per cambiare un po'...
    Grazie ancora
  • Re: [C] il goto si ripete -__-

    Diciamo che per i menù è più compatto l'utilizzo dello switch e anche più intuitivo per chi legge il codice...
Devi accedere o registrarti per scrivere nel forum
13 risposte