RISOLTO Programma per stampare occorrenze

Stato
Discussione chiusa ad ulteriori risposte.

Ibernato

Utente Èlite
4,171
1,920
OS
Windows 10 Pro
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]
 

Vito-

Nuovo Utente
120
9
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);
}
 

Ibernato

Utente Èlite
4,171
1,920
OS
Windows 10 Pro
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?)
 

Vito-

Nuovo Utente
120
9
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]?
 

Ibernato

Utente Èlite
4,171
1,920
OS
Windows 10 Pro
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
 
  • Mi piace
Reazioni: Vito-

Andretti60

Utente Èlite
5,622
4,238
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:

Vito-

Nuovo Utente
120
9
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'".
 

DispatchCode

Moderatore
Staff Forum
1,490
1,151
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
5,622
4,238
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.

Entra

oppure Accedi utilizzando

Discussioni Simili