[C] Problema variabili

di il
4 risposte

[C] Problema variabili

Salve, ragazzi.
E' la prima volta che posto su questo forum.
Ho iniziato ieri a programmare in C, ed oggi ho scritto questo semplice programmino che memorizza fino a 20 voti per tre materie (matematica, italiano e inglese) e permette di aggiungerne e di eliminarne.
Ora, non so perché, quando vado ad aggiungere il primo voto alla materia Italiano, questo viene memorizzato anche per la materia Matematica.
Stesso discorso è per la materia Inglese, per quella Italiano.
Ho analizzato il codice più volte, ma non riesco a comprendere la causa di questo problema...
Potete aiutarmi?

Ecco il codice:

#include <stdio.h>
main ()
{
    int i;
    int mate=0;
    int ita=0;
    int ing=0;
    // Dichiarazione della struct
    struct voti
    {
        int matematica[19];
        int italiano[19];
        int inglese[19];
    };
    struct voti alunno;
    // Azzeramento degli array
    for (i=0; i<20; i++)
    {
        alunno.matematica[i]=0;
        alunno.italiano[i]=0;
        alunno.inglese[i]=0;
    }
    i=0;
    // Menu principale
    label:
    printf("Questo programma permette la registrazione di voti in tre materie. \n");
    printf("1. Visualizza voti \n");
    printf("2. Aggiungi voti \n");
    printf("3. Elimina voti \n");
    printf("0. Esci. \n");
    scanf("%d",&i);
    switch(i) {
        case 1:
        goto visualizza_voti;
        case 2:
        goto aggiungi_voti;
        case 3:
        goto elimina_voti;
        case 0:
        goto label2;
        default:
        printf("Digitare 1, 2, 3 o 0. \n");
        goto label;
    }

    // 1.Visualizza voti
    visualizza_voti:
    printf("Visualizza voti \n");
    printf("Matematica: ");
    int c;
    for (c=0; c<20; c++)
    {
        if(alunno.matematica[c]!=0)
        printf("%d ",alunno.matematica[c]);
    }
    printf("\nItaliano: ");
    for (c=0; c<20; c++)
    {
        if(alunno.italiano[c]!=0)
        printf("%d ",alunno.italiano[c]);
    }
    printf("\nInglese: ");
    for (c=0; c<20; c++)
    {
        if(alunno.inglese[c]!=0)
        printf("%d ",alunno.inglese[c]);
    }
    printf("\n");
    goto label;

    // 2.Aggiungi voti
    aggiungi_voti:
    printf("Aggiungi voti \n");
    printf("Selezionare la materia: \n");
    printf("1. Matematica \n");
    printf("2. Italiano \n");
    printf("3. Inglese \n");
    printf("0. Torna al menu \n");
    scanf("%d",&i);
    switch(i) {
        case 1:
        {
            if(mate!=20)
            {
                printf("Voto: ");
                scanf("%d",&i);
                if(i==0)
                {
                    printf("Impossibile registrare il voto '0'. \n");
                    goto aggiungi_voti;
                }
                alunno.matematica[mate]=i;
                mate++;
                goto aggiungi_voti;
            }
            else
            printf("Sono stati già registrati 20 voti. Impossibile registrarne altri. \n");
            goto label;
        }
        case 2:
        {
            if(ita!=20)
            {
                printf("Voto: ");
                scanf("%d",&i);
                if(i==0)
                {
                    printf("Impossibile registrare il voto '0'. \n");
                    goto aggiungi_voti;
                }
                alunno.italiano[ita]=i;
                ita++;
                goto aggiungi_voti;
            }
            else
            printf("Sono stati già registrati 20 voti. Impossibile registrarne altri. \n");
            goto label;
        }
        case 3:
        {
        if(ing!=20)
            {
                printf("Voto: ");
                scanf("%d",&i);
                if(i==0)
                {
                    printf("Impossibile registrare il voto '0'. \n");
                    goto aggiungi_voti;
                }
                alunno.inglese[ing]=i;
                ing++;
                goto aggiungi_voti;
            }
            else
            printf("Sono stati già registrati 20 voti. Impossibile registrarne altri. \n");
            goto label;
        }
        case 0:
        goto label;
        default:
        printf("Digitare 1, 2, 3 o 0. \n");
        goto aggiungi_voti;
    }

    // 3.Elimina voti
    elimina_voti:
    printf("Elimina voti \n");
    printf("Selezionare la materia: \n");
    printf("1. Matematica \n");
    printf("2. Italiano \n");
    printf("3. Inglese \n");
    printf("0. Torna al menu \n");
    scanf("%d",&i);
    switch(i) {
        case 1:
        {
            for (i=0; i<20; i++)
            {
            alunno.matematica[i]=0;
            }
            i=0;
            mate=0;
            goto elimina_voti;
        }
        case 2:
        {
            for (i=0; i<20; i++)
            {
            alunno.italiano[i]=0;
            }
            i=0;
            ita=0;
            goto elimina_voti;
        }
        case 3:
        {
            for (i=0; i<20; i++)
            {
            alunno.inglese[i]=0;
            }
            i=0;
            ing=0;
            goto elimina_voti;
        }
        case 0:
        goto label;
        default:
        printf("Digitare 1, 2, 3 o 0. \n");
        goto elimina_voti;
    }
    label2:;
}
Vi ringrazio in anticipo.

4 Risposte

  • Re: [C] Problema variabili

    L'errore è dovuto al tuo dimensionamento degli interi della struttura.
    Nel tuo programma definisci gli array a 19 (dall'elemento 0 all'elemento 18) mentre deve definirne 20.

    Saluti,
    Max
  • Re: [C] Problema variabili

    ...Che errore stupido.
    Grazie mille, e perdona il disturbo.
  • Re: [C] Problema variabili

    No problem... Saluti,
    Max
  • Re: [C] Problema variabili

    Oddio, i goto...
    ma quanti anni ha il testo su cui stai studiando??? sono deprecati da tempo
Devi accedere o registrarti per scrivere nel forum
4 risposte