RISOLTO Programma per stampare occorrenze

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Con gli IF l'ho sistemato e funziona.
Ora devo capire come fare con la tabella. La cosa che proprio non capisco é che se creo un vettore da 6 se io inserisco piu di 6 lettere come le salva? E come le conta le occorrenze?
Ti crei un vettore iniziale inizializzato a 0
array[0] tiene traccia delle occorrenze dei voti A
array[1] tiene traccia delle occorrenze dei voti B
.....
.....
array[5] tiene traccia delle occorrenze dei voti F

Tu inserisci A, quindi devi incrementare array[0], come fai? La lettera A corrisponde al valore 65 in intero, quindi array['A' - 65]
Poi inserisci E, quindi devi incrementare array[4], come fai? La lettera E corrisponde al valore 69 in intero, quindi array['E' - 65]
 
Ti crei un vettore iniziale inizializzato a 0
array[0] tiene traccia delle occorrenze dei voti A
array[1] tiene traccia delle occorrenze dei voti B
.....
.....
array[5] tiene traccia delle occorrenze dei voti F

Tu inserisci A, quindi devi incrementare array[0], come fai? La lettera A corrisponde al valore 65 in intero, quindi array['A' - 65]
Poi inserisci E, quindi devi incrementare array[4], come fai? La lettera E corrisponde al valore 69 in intero, quindi array['E' - 65]
Ho fatto questo ma penso non c'entri niente...

C:
#include <stdio.h>
#define N 100
#define M 6

int main()
{
    char voto,Voti[N];
    int i=0,Occorrenze[M];

    printf("Inserire i voti\n");
    scanf(" %c", &voto);

    while(voto!='#')
    {
        if(voto!='A' && voto!='B' && voto!='C' && voto!='D' && voto!='E' && voto!='F' && i<N)
        {
            printf("Il voto inserito non e corretto.\n");
        }
        else
        {
            Voti[i]=voto;
            i++;
        }
        scanf(" %c", &voto);
    }

    for(int k=0;k<i;k++)
    {
        if(Voti[k]>'@' && Voti[k]<'B')
        {
            Occorrenze[0]=Occorrenze['A'-65]++;
        }
        else if(Voti[k]>'A' && Voti[k]<'C')
        {
            Occorrenze[1]=Occorrenze['B'-65]++;
        }
        else if(Voti[k]>'B' && Voti[k]<'D')
        {
            Occorrenze[2]=Occorrenze['C'-65]++;
        }
        else if(Voti[k]>'C' && Voti[k]<'E')
        {
            Occorrenze[3]=Occorrenze['D'-65]++;
        }
        else if(Voti[k]>'D' && Voti[k]<'F')
        {
            Occorrenze[4]=Occorrenze['E'-65]++;
        }
        else
        {
            Occorrenze[5]=Occorrenze['F'-65]++;
        }
    }

    printf("Il voto A compare %d volte.\nIl voto B compare %d volte.\nIl voto C compare %d volte.\n"
           "Il voto D compare %d volte.\nIl voto E compare %d volte.\nIl voto F compare %d volte.",Occorrenze[0],Occorrenze[1],Occorrenze[2],Occorrenze[3],Occorrenze[4],Occorrenze[5]);


    return(0);
}
 
Ho fatto questo ma penso non c'entri niente...

C:
#include <stdio.h>
#define N 100
#define M 6

int main()
{
    char voto,Voti[N];
    int i=0,Occorrenze[M];

    printf("Inserire i voti\n");
    scanf(" %c", &voto);

    while(voto!='#')
    {
        if(voto!='A' && voto!='B' && voto!='C' && voto!='D' && voto!='E' && voto!='F' && i<N)
        {
            printf("Il voto inserito non e corretto.\n");
        }
        else
        {
            Voti[i]=voto;
            i++;
        }
        scanf(" %c", &voto);
    }

    for(int k=0;k<i;k++)
    {
        if(Voti[k]>'@' && Voti[k]<'B')
        {
            Occorrenze[0]=Occorrenze['A'-65]++;
        }
        else if(Voti[k]>'A' && Voti[k]<'C')
        {
            Occorrenze[1]=Occorrenze['B'-65]++;
        }
        else if(Voti[k]>'B' && Voti[k]<'D')
        {
            Occorrenze[2]=Occorrenze['C'-65]++;
        }
        else if(Voti[k]>'C' && Voti[k]<'E')
        {
            Occorrenze[3]=Occorrenze['D'-65]++;
        }
        else if(Voti[k]>'D' && Voti[k]<'F')
        {
            Occorrenze[4]=Occorrenze['E'-65]++;
        }
        else
        {
            Occorrenze[5]=Occorrenze['F'-65]++;
        }
    }

    printf("Il voto A compare %d volte.\nIl voto B compare %d volte.\nIl voto C compare %d volte.\n"
           "Il voto D compare %d volte.\nIl voto E compare %d volte.\nIl voto F compare %d volte.",Occorrenze[0],Occorrenze[1],Occorrenze[2],Occorrenze[3],Occorrenze[4],Occorrenze[5]);


    return(0);
}
Ma così hai ancora tutti gli if. L'array di mappatura ti serve apposta per evitare tutti questi if

Codice:
#include "stdio.h"

#define N 100
#define M 6

int main()
{
    char voto,Voti[N];
    int i=0,Occorrenze[M];

    printf("Inserire i voti\n");
    scanf("%c", &voto);

    while(voto!='#' && i < N){

        // da 65 a 70 sono caratteri accettati
        if(voto < 65 /*minore di A*/ && voto > 70 /* maggiore di F*/){
            printf("Il voto inserito non e corretto.\n");
        }else{
            Voti[i]=voto;
            i++;
        }

        scanf("%c", &voto);
    }
 
    for(int k=0;k<i;k++)
    {
         Occorrenze[Voti[k] - 65]++;

    }

    printf("Il voto A compare %d volte.\nIl voto B compare %d volte.\nIl voto C compare %d volte.\n"

           "Il voto D compare %d volte.\nIl voto E compare %d volte.\nIl voto F compare %d volte.\n",Occorrenze[0],Occorrenze[1],Occorrenze[2],Occorrenze[3],Occorrenze[4],Occorrenze[5]);

    return(0);
}


Però se non capisci il ragionamento, è inutile fare copia e incolla. Anche perchè, se è un esercizio per la scuola, il docente poi ti chiederà sicuro il ragionamento e tu non sarai in grado di spiegarlo.
Per esempio, una domanda che farei io da prof "Perchè sottrai proprio 65?)
 
Ma così hai ancora tutti gli if. L'array di mappatura ti serve apposta per evitare tutti questi if

Codice:
#include "stdio.h"

#define N 100
#define M 6

int main()
{
    char voto,Voti[N];
    int i=0,Occorrenze[M];

    printf("Inserire i voti\n");
    scanf("%c", &voto);

    while(voto!='#' && i < N){

        // da 65 a 70 sono caratteri accettati
        if(voto < 65 /*minore di A*/ && voto > 70 /* maggiore di F*/){
            printf("Il voto inserito non e corretto.\n");
        }else{
            Voti[i]=voto;
            i++;
        }

        scanf("%c", &voto);
    }
 
    for(int k=0;k<i;k++)
    {
         Occorrenze[Voti[k] - 65]++;

    }

    printf("Il voto A compare %d volte.\nIl voto B compare %d volte.\nIl voto C compare %d volte.\n"

           "Il voto D compare %d volte.\nIl voto E compare %d volte.\nIl voto F compare %d volte.\n",Occorrenze[0],Occorrenze[1],Occorrenze[2],Occorrenze[3],Occorrenze[4],Occorrenze[5]);

    return(0);
}


Però se non capisci il ragionamento, è inutile fare copia e incolla. Anche perchè, se è un esercizio per la scuola, il docente poi ti chiederà sicuro il ragionamento e tu non sarai in grado di spiegarlo.
Per esempio, una domanda che farei io da prof "Perchè sottrai proprio 65?)
Intanto ti ringrazio
Sono all'universitá, il fatto piu che altro che il docente é straniero e ho difficolta a capirlo, quindi poi ho questi problemi.
Comunque ho capito il tuo codice, l'unica cosa che non avevo mai usato un array dentro array. E poi cosa significa quel ++ dopo Occorrenze[Voti[k] - 65]?
 
Intanto ti ringrazio
Sono all'universitá, il fatto piu che altro che il docente é straniero e ho difficolta a capirlo, quindi poi ho questi problemi.
Comunque ho capito il tuo codice, l'unica cosa che non avevo mai usato un array dentro array. E poi cosa significa quel ++ dopo Occorrenze[Voti[k] - 65]?
il ++ equivale a fare array[index] = array[index] + 1
array dentro un array non è proprio corretto perchè nelle parentesi quadre sarebbe l'indice che lo calcolo con il valore dell'array dei voti e sottraggo 65
 
il ++ equivale a fare array[index] = array[index] + 1
array dentro un array non è proprio corretto perchè nelle parentesi quadre sarebbe l'indice che lo calcolo con il valore dell'array dei voti e sottraggo 65
ok penso di aver capito
 
Comuqnue faccio -65 per questo motivo
I valori di A, B, C,D,E,F sono 65,66,67,68,69,70
Io ora devo mappare 65=> 0 ; 66 => 1 .... 70 => 5. Vien da sè che devo sottrarre il primo valore per ottenere gli altri indici successivi
ok grazie
 
Visto che gli altri ti stanno aiutando ad usare un vettore per calcolare una distribuzione, ritorno al concerto del Control-Z
Sinceramente sono un po’ stupefatto che tu sia all’uni, tali domande me le aspetto da uno studente alle prime armi nelle superiori.
Prima di tutto DEVI imparare a usare i manuali di programmazione, e sto parlando dei Reference Manual, quelli che puoi accedere semplicemente digitando ‘man’ da terminale. I corsi scolastici ti insegnano i concetti ma non puoi pretendere che ti insegnano i dettagli di TUTTE le funzioni di tutte le librerie (anche quelle native tipo I/O).
In questo caso ti serve la pagina di manuale della funzione scanf() che puoi trovare anche online in mille siti.
La reference manual ha diverse sezioni, quella che interessa te in questo caso è il valore di ritorno, se esiste. La scanf() ritorna un intero che rappresenta il numero dei dati letti e convertiti con successo. Occorrerebbe SEMPRE controllare questo valore, perché è possibile che il dato letto non sia nel formato giusto. Per esempio, cosa succede se digiti un simbolo (tipo il cancelletto) e cerchi di leggerlo usando il formato “%d” ? Ovviamente non può essere letto, il cancelletto NON è un numero, scanf() ritornerà zero. Ma se leggi bene, il manuale ti dice anche che in caso di errore di lettura come per esempio la fine di un file (che corrisponde a digitare Control-Z da tastiera) scanf() ritorna EOF (end of file, definito come -1)

Quindi il tuo codice diventa

C:
while (scanf() != EOF)
{
}

Scusa se non ho usato la formattazione, sto scrivendo da iPhone. EDIT: grazie al gentile admin che ha aggiunto la formattazione del codice
 
Ultima modifica:
Visto che gli altri ti stanno aiutando ad usare un vettore per calcolare una distribuzione, ritorno al concerto del Control-Z
Sinceramente sono un po’ stupefatto che tu sia all’uni, tali domande me le aspetto da uno studente alle prime armi nelle superiori.
Prima di tutto DEVI imparare a usare i manuali di programmazione, e sto parlando dei Reference Manual, quelli che puoi accedere semplicemente digitando ‘man’ da terminale. I corsi scolastici ti insegnano i concetti ma non puoi pretendere che ti insegnano i dettagli di TUTTE le funzioni di tutte le librerie (anche quelle native tipo I/O).
In questo caso ti serve la pagina di manuale della funzione scanf() che puoi trovare anche online in mille siti.
La reference manual ha diverse sezioni, quella che interessa te in questo caso è il valore di ritorno, se esiste. La scanf() ritorna un intero che rappresenta il numero dei dati letti e convertiti con successo. Occorrerebbe SEMPRE controllare questo valore, perché è possibile che il dato letto non sia nel formato giusto. Per esempio, cosa succede se digiti un simbolo (tipo il cancelletto) e cerchi di leggerlo usando il formato “%d” ? Ovviamente non può essere letto, il cancelletto NON è un numero, scanf() ritornerà zero. Ma se leggi bene, il manuale ti dice anche che in caso di errore di lettura come per esempio la fine di un file (che corrisponde a digitare Control-Z da tastiera) scanf() ritorna EOF (end of file, definito come -1)

Quindi il tuo codice diventa

C:
while (scanf() != EOF)
{
}

Scusa se non ho usato la formattazione, sto scrivendo da iPhone. EDIT: grazie al gentile admin che ha aggiunto la formattazione del codice
Intanto grazie. Io in realtá sono alle prime armi perche non ho mai fatto programmazione prima d'ora, quindi per me é tutto nuovo...
per quanto riguarda EOF, se metto quello che mi hai scritto mi dice "too few arguments to function 'scanf'".
 
Intanto grazie. Io in realtá sono alle prime armi perche non ho mai fatto programmazione prima d'ora, quindi per me é tutto nuovo...
per quanto riguarda EOF, se metto quello che mi hai scritto mi dice "too few arguments to function 'scanf'".

Nel primo post ti ho scritto

...puoi confrontare il valore letto con EOF.

ad ogni modo:

per quanto riguarda EOF, se metto quello che mi hai scritto mi dice "too few arguments to function 'scanf'".
Bhe, ovviamente non è corretta la scanf in quel modo (non ti sembra manchino parametri?)... Quello di Andretti è solo un esempio.
 
No, leggi caratteri e non numeri, %d va bene SOLO con numeri.
D’accordo che sei alle prime armi, ma per favore impara a leggere il reference manual…
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top