RISOLTO Programma per stampare occorrenze

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
184
14
Ciao, ho il seguente esercizio.
"Scrivere un programma che legge da tastiera una sequenza di voti (A, B, C, D, E, F) che finisce quando si premia il carattere EOF (Ctrl+Z). Per ogni sequenza di voti inserita, il programma conta il numero di occorrenze di ogni voto. Quando l’utente immette il carattere EOF (Ctrl+Z), il programma stampa il numero di occorrenze di ogni voto. Quando l'utente scrive un voto diverso di quelle nella lista ammessa, si stampa un messaggio di errore, e.s. 'IL voto inserito non è corretto') e il programma si interrompe."
Io ho fatto questo ma non mi stampa il la ricorrenza dei voti. Mi spunta "Il numero di volte... e: 0".
E poi non riesco a usare EOF, come si imposta e come funziona??


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

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

    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(i='A';i<='F';i++)
    {
        printf("Il numero di volte in cui il voto %c compare nella sequenza e: %d\n", i,Voti[i]);
    }


return(0);
}
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel 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
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non stai rispettando la condizione di uscita: il messaggio è corretto, ma devi interrompere il programma.
L'altro errore evidente è che stai usando la variabile i, che è di tipo char, come indice dell'array.

In merito a CTRL+Z (su windows e CTRL+D su Linux) puoi confrontare il valore letto con EOF.

Comunque non mi sembra che il tuo codice rispetti la richiesta: tu devi contare quante volte si ripete ogni voto.
Non è particolarmente complesso, puoi usare ad esempio un array di interi (non aggiungo altro, lascio prima a te).
 

Andretti60

Utente Èlite
6,440
5,091
Iniziamo con EOF, che è triviale, basta che dai una occhiata alla pagina del manuale della funzione scanf(), in particolare al suo valore di ritorno.
Un errore molto comune di chi inizia a programmare è di trascurare questo valore.
 
  • Mi piace
Reazioni: Vito-

Vito-

Utente Attivo
184
14
Non stai rispettando la condizione di uscita: il messaggio è corretto, ma devi interrompere il programma.
L'altro errore evidente è che stai usando la variabile i, che è di tipo char, come indice dell'array.

In merito a CTRL+Z (su windows e CTRL+D su Linux) puoi confrontare il valore letto con EOF.

Comunque non mi sembra che il tuo codice rispetti la richiesta: tu devi contare quante volte si ripete ogni voto.
Non è particolarmente complesso, puoi usare ad esempio un array di interi (non aggiungo altro, lascio prima a te).
In che senso non sto rispettando la condizione di uscita?
E in che senso il codice non rispetta la richiesta?
Piu che altro io ho preso spunto da un esempio sul libro perche non ho idea di come contare le occorrenze...
Per quanto riguarda EOF il prof non ce ne ha mai parlato e non ho idea di come si usi.
Post unito automaticamente:

Iniziamo con EOF, che è triviale, basta che dai una occhiata alla pagina del manuale della funzione scanf(), in particolare al suo valore di ritorno.
Un errore molto comune di chi inizia a programmare è di trascurare questo valore.
Non riesco a trovare niente
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel 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
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
In che senso non sto rispettando la condizione di uscita?
Te l'ho scritto: devi interrompere il programma.

E in che senso il codice non rispetta la richiesta?
Piu che altro io ho preso spunto da un esempio sul libro perche non ho idea di come contare le occorrenze...
Devi contare le occorrenze, quante volte si ripete ogni voto.
Abituati perché non trovi come risolvere i problemi sul libro. Sul libro trovi la sintassi del linguaggio, è utile per imparare un linguaggio e tutti i vari concetti; è utile specie agli inizi, altrimenti poi si può fare a meno dei libri, e usare le doc ufficiali. ;)

Ragionaci, un modo semplice è sfruttare un array di interi.
Prova a pensarci un po', e se vuoi portare codice o ragionamenti, siamo qui per indirizzarti.

EDIT: la funzione printf torna un valore, devi usare quello (è ciò a cui fa riferimento Andretti).
Link https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm
 
  • Mi piace
Reazioni: Vito-

Vito-

Utente Attivo
184
14
Te l'ho scritto: devi interrompere il programma.


Devi contare le occorrenze, quante volte si ripete ogni voto.
Abituati perché non trovi come risolvere i problemi sul libro. Sul libro trovi la sintassi del linguaggio, è utile per imparare un linguaggio e tutti i vari concetti; è utile specie agli inizi, altrimenti poi si può fare a meno dei libri, e usare le doc ufficiali. ;)

Ragionaci, un modo semplice è sfruttare un array di interi.
Prova a pensarci un po', e se vuoi portare codice o ragionamenti, siamo qui per indirizzarti.

EDIT: la funzione printf torna un valore, devi usare quello (è ciò a cui fa riferimento Andretti).
Link https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm
ok, mi é venuta una mezza idea, domani lo scrivo e vediamo che succede
 
  • Mi piace
Reazioni: DispatchCode

Vito-

Utente Attivo
184
14
Ok... avevo il pensiero li quindi ho fatto ora :).
L'unico problema é che considera tutto 'A', ovvero anche se metto B lui considera come se fosse A e quindi quando stampo anche se metto altre lettere lui le conteggia nella A.
Penso di non aver capito bene la differenza tra char e int e le loro relazioni... se non ci sono altri errori nel programma, cosa di cui dubito

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

int main()
{
    char voto,Voti[N];
    int i=0;
    int a=0,b=0,c=0,d=0,e=0,f=0;

    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]='A')
        {
            a=a+1;
        }
        else if(Voti[k]='B')
        {
            b=b+1;
        }
        else if(Voti[k]='C')
        {
            c=c+1;
        }
        else if(Voti[k]='D')
        {
            d=d+1;
        }
        else if(Voti[k]='E')
        {
            e=e+1;
        }
        else
        {
            f=f+1;
        }
    }

    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.",a,b,c,d,e,f);


    return(0);
}
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel 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
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
C'è un errore in tutte le condizioni: stai assegnando e non confrontando i valori. Quindi sicuramente ti entra sempre nel primo if, in quanto voti[k] = 'k' non fa altro che assegnare alla locazione voti[k] il valore 'A' (quindi sarà sempre true).

Come seconda cosa, ti stai complicando un pò troppo la vita... innanzitutto perchè non ti servono N variabili, hai già l'array.
Provo a darti un hint, vediamo: ricordi quello che dicevamo nell'altro topic, dove si faceva '1' - '0' per ottenere il numero 1?

EDIT: comunque anche l'if puoi restringerlo (concatenando le condizioni) utilizzando l'operatore &&, come già visto negli altri esercizi
 
  • Mi piace
Reazioni: Vito- e Ibernato

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Io, più che fare tutti questi if, mi costruirei un array con dimensione 6 (indice da 0 a 5).
Poi, come tu sai (spero), i char sono anche degli interi (codice ASCII), quindi, se inserisci 'A', in intero è 65, e aumenti l'array di posizione 0 e così via.
Verrebbe tipo così: voti[valore_char_inserito - 65]++;
Questo array conterrà le occorrenze dei voti inseriti.
Così il programma diventa davvero minuscolo.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel 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
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Io, più che fare tutti questi if, mi costruirei un array con dimensione 6 (indice da 0 a 5).
Poi, come tu sai (spero), i char sono anche degli interi (codice ASCII), quindi, se inserisci 'A', in intero è 65, e aumenti l'array di posizione 0 e così via.
Verrebbe tipo così: voti[valore_char_inserito - 65]++;
Questo array conterrà le occorrenze dei voti inseriti.
Così il programma diventa davvero minuscolo.
Esatto, è quello che intendevo... volevo però lasciare a lui il ragionamento. ?
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Piu o meno lo so, se non ho capito male un char in realtá é un intero a cui é associato un valore, giusto?
Si, il char può contenere massimo 8bit (1byte). Ora tu useresti il char per memorizzare le lettere A,B,C,D,E,F. Ora queste lettere, le puoi vedere come numeri (i loro valori ascii). Puoi sfruttare questi numeri associandoli all'indice del vettore.
Quindi, ti crei una mappa tramite un vettore di interi lungo 6 (da 0 a 5)
array[0] corrisponde ad A e così via.
Ora, se tu inserisci A, questo carattere corrisponde a 65 in intero e deve essere mappato nella posizione 0. Per farlo, basta fare array['A' - 65]++ e così incrementi man mano l'array.

Se inserisci F, corrisponde a 70 in intero, e lo devi mappare nella posizione 5. Per farlo, basta fare array['F' - 65]++ e così via.

Spero che hai capito. Prova a farlo :)
Magari, continua l'esercizio con gli IF per vedere se funziona e poi lo accorci tramite questa soluzione
 

Vito-

Utente Attivo
184
14
Si, il char può contenere massimo 8bit (1byte). Ora tu useresti il char per memorizzare le lettere A,B,C,D,E,F. Ora queste lettere, le puoi vedere come numeri (i loro valori ascii). Puoi sfruttare questi numeri associandoli all'indice del vettore.
Quindi, ti crei una mappa tramite un vettore di interi lungo 6 (da 0 a 5)
array[0] corrisponde ad A e così via.
Ora, se tu inserisci A, questo carattere corrisponde a 65 in intero e deve essere mappato nella posizione 0. Per farlo, basta fare array['A' - 65]++ e così incrementi man mano l'array.

Se inserisci F, corrisponde a 70 in intero, e lo devi mappare nella posizione 5. Per farlo, basta fare array['F' - 65]++ e così via.

Spero che hai capito. Prova a farlo :)
Magari, continua l'esercizio con gli IF per vedere se funziona e poi lo accorci tramite questa soluzione
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?
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili