Domanda Domanda codice in C

Stato
Discussione chiusa ad ulteriori risposte.

Haler1631

Utente Bronze
30 Settembre 2015
19
3
1
38
Ultima modifica da un moderatore:
Salve volevo chiedervi un aiuto, sto impazzendo
devo calcolare l'area di un trapezio, utilizzando anche il comando if
C:
#include <stdio.h>
main()
{
    int var1,var2,h;
    float area;
    printf("calcolo dell'area di un trapezio");
    latomaggiore:
    printf("\n inserisci il lato maggiore del trapezio... \n");
    scanf("%d",&var1);
    if (var1>0)
         printf("il lato maggiore del trapezio vale %d\n",var1);
    else if (var1==0)
    {
            printf("il lato non puo essere uguale a 0");
            goto latomaggiore;
    }
    else if(var1<0)
    {
        printf("Il valore inserito è negativo");
        goto latomaggiore;
    }
    latominore:
        printf("\n inserisci il lato minore del trapezio... \n");
    scanf("%d",&var2);
    if (var2<var1)
        printf("il lato minore del trapezio vale %d\n",var2);
    else if(var2>var1)
        printf("il valore inserito è piu grande del lato maggiore");
        goto latominore;
    if (var2==0)
        printf("il lato non puo essere uguale a 0");
        goto latominore;
    if (var2<0)
        printf("Il valore inserito è negativo");
        goto latominore;



    altezza:
    printf("\n infine inserisci l'altezza del trapezio... \n");
    scanf("%d",&h);
    if (h<0){
        printf("il valore inserito è negativo");
        goto altezza;}
    else if (h==0){
        printf("l'altezza non puo essere uguale a 0");
        goto altezza;}
    area=(var1+var2)*h/2;
    printf("l'area del tuo trapezio vale %f",area);

return 0;

}

Questo è il codice, il programma si blocca in un loop al lato minore, nonostante io inserisca qualsiasi tipo di valore non mi manda avanti nel codice, e non esegue le istruzioni assegnate, se provo a modificare gli ultimi due if con else if mi da errore.
Qualcuno sa spiegarmi il problema?
 
Sezione errata, sposto. Inoltre usa sempre il tag [code=lang] per i codici.

Ad ogni modo, rispondo velocemente (ci sarebbero tante cose da dire: il codice è orribile, tutti quei goto non vanno bene) perché ora ho poco tempo: non hai messo le parentesi graffe correttamente per tutti i costrutti if e perciò ci sono alcun goto (che non dovresti usare) che vengono presi sempre, perciò si blocca: guarda tra gli if di latominore.
 
Ultima modifica:
Il problema è abbastanza ingenuo, la causa è molto cospicua (pessimo formatting) che ti porterà a confonderti quando scrivi i codici. Questo è quello corretto:
C:
#include <stdio.h>

  int main() {
    int var1, var2, h;
    float area;
    printf("calcolo dell'area di un trapezio");
    latomaggiore:
      printf("\n inserisci il lato maggiore del trapezio... \n");
    scanf("%d", & var1);
    if (var1 > 0)
      printf("il lato maggiore del trapezio vale %d\n", var1);
    else if (var1 == 0) {
      printf("il lato non puo essere uguale a 0");
      goto latomaggiore;
    } else if (var1 < 0) {
      printf("Il valore inserito è negativo");
      goto latomaggiore;
    }
    latominore:
      printf("\n inserisci il lato minore del trapezio... \n");

    scanf("%d", & var2);
    if (var2 < var1) {
      printf("il lato minore del trapezio vale %d\n", var2);
    } else if (var2 > var1) {
      printf("il valore inserito è piu grande del lato maggiore");
      goto latominore;
    }
    if (var2 == 0) {
      printf("il lato non puo essere uguale a 0");
      goto latominore;
    }
    if (var2 < 0) {
      printf("Il valore inserito è negativo");
      goto latominore;
    }

    altezza:
      printf("\n infine inserisci l'altezza del trapezio... \n");
    scanf("%d", & h);
    if (h < 0) {
      printf("il valore inserito è negativo");
      goto altezza;
    } else if (h == 0) {
      printf("l'altezza non puo essere uguale a 0");
      goto altezza;
    }
    area = (var1 + var2) * h / 2;
    printf("l'area del tuo trapezio vale %f", area);

    return 0;
  }

in sintesi, quando fai una disposizione di codice del genere:
C:
if (var2 < 0)
      printf("Il valore inserito è negativo");
      goto latominore;
quel `goto latominore;` verrà eseguito indipendentemente e svincolato dall'if, perchè non usi le parentesi graffe. Sintatticamente stai indicando, qualora quella condizione sarà soddisfatta, che eseguirai SOLO una istruzione, in questo caso `printf("Il valore inserito è negativo");`. Perciò, formattandolo correttamente, il codice verrebbe così:
C:
if (var2 < 0)
      printf("Il valore inserito è negativo");
goto latominore;
che è quello che non vuoi fare tu, l'istruzione `goto latominore;` dovrebbe essere ragionevolmente eseguita solo se quella condizione è appagata come già ho detto, quindi dobbiamo usare le parentesi graffe per avere più di due istruzioni nell'if statement:
C:
if (var2 < 0)
{
      printf("Il valore inserito è negativo");
      goto latominore;
}

Nota: ti consiglio di lasciar perdere l'uso dei `goto`.
 
  • Mi piace
Reazioni: killaemo
La risposta di @nullptr è perfetta, ti suggerisco di evitare tutti quei goto, sono proprio brutti, poco efficienti e creano molto disordine.
Le istruzioni di salto sono più per un codice Assembly.
 
Stato
Discussione chiusa ad ulteriori risposte.