In questa lezione svolgeremo un’altra esercitazione sulle struct in C, al fine di consolidare quanto studiato finora.
Quindi proponiamo questo esercizio sulle struct in C a scopo didattico:
Definire la struttura alunno che descrivere un alunno in base al nome, cognome, nerrori. Scriviamo quindi un programma in C, che dichiara una tabella alunni di tipo alunno che permette di inserire 20 studenti. Il programma deve consentire di inserire i dati di un quiz somministrato agli alunni e di memorizzare le risposte in una matrice.
Realizzare un menù che consente, dopo l’inserimento degli alunni e delle risposte corrette del quiz di visualizzare le risposte sbagliate per ciascun alunno, visualizzi gli alunni che hanno superato il quiz con il conteggio degli errori commessi ed effettui una ricerca per alunno.
Innanzitutto definiamo la struttura alunno dove specifico i campi, poi creiamo la tabella alunni di tipo alunno, un array quiz dove memorizzo le risposte corrette e una matrice risposte dove memorizzo le risposte per ciascun alunno.
Quindi con la procedura insert() carichiamo tutti i dati nella struttura, nell’array e nella matrice.
Dopo realizziamo la procedura print_error() che visualizza semplicemente tutti gli alunni e il conteggio degli errori.
Poi realizziamo la procedura risposte_date() che visualizza in dettaglio di tutti gli alunni con le risposte date e accanto quelle corrette.
Infine realizziamo la procedura stampaAlunno() che ricerca un alunno per cognome, calcola gli errori che ha commesso e infine calcola in base al numero degli errori se l’esame è stato superato oppure no.
Ecco dunque il listato completo dell’esercitazione sulle struct in C
#include <stdio.h>
#include <string.h>
#define N 20
#define M 30
typedef struct {
char cognome[30];
char nome[20];
int errori;
}alunno;
alunno alunni[N];
int quiz[M];
int risposte[N][M];
void insert()
{
int i,j;
for (i=0; i<N; i++){
printf("Inserisci il cognome dell'alunno: ");
scanf("%s", alunni[i].cognome);
printf("Inserisci il nome dell'alunno: ");
scanf("%s", alunni[i].nome);
}
//caricamento risposte corrette nell'array quiz
printf("\nCarichiamo il quiz con le risposte corrette!\n");
for (i=0; i<M; i++){
printf("Inserisci la risposta esatta alla domanda %d: ", i+1);
scanf("%d", &quiz[i]);
}
//caricamento risposte alunni nella matrice risposte
printf("\nCarichiamo le risposte al quiz date dagli alunni! ");
for (i=0; i<N; i++){
printf("\nInserisci le risposte dell'alunno: %s %s\n", alunni[i].cognome, alunni[i].nome);
for (j=0;j<M; j++) {
printf("Inserisci risposta domanda %d: ", i+1);
scanf("%d", &risposte[i][j]);
}
}
}
int menu()
{
int selezione = 0;
do
{
printf("\n" );
printf("\n1 - Visualizza esiti " );
printf("\n2 - Risposte date");
printf("\n3 - Ricerca per alunno");
printf("\n4 - Esci");
printf("\n" );
printf("\nEffettua una scelta: " );
scanf("%d", &selezione );
}
while (selezione < 1 || selezione > 4);
return selezione;
}
void stampaAlunno()
{
char cognome[40];
int i,j, trovato=0;
for(i=0;i<N;i++)
alunni[i].errori=0; //azzeriamo gli errori
printf("\nQuale alunno cerchi?:");
scanf("%s", cognome);
for (i=0; i<N; i++){
if(strcmp(alunni[i].cognome,cognome)==0) {
printf("\n\n Nome: %s\n Risposte date: ", alunni[i].nome);
for (j=0;j<M; j++) {
printf(" %d ", risposte[i][j]);
if (risposte[i][j]!=quiz[j])
alunni[i].errori=alunni[i].errori+1;
}
printf("\n Errori totali: %d ", alunni[i].errori);
if (alunni[i].errori<N)
printf("\n Esame superato!");
else
printf("\n Esame non superato, studia e riprova!");
trovato=1;
}
}
if (trovato==0)
printf("\nNon e' presente nessun alunno:");
}
void print_error(){
int i, j;
for(i=0;i<N;i++)
alunni[i].errori=0; //azzeriamo gli errori
for (i=0; i<N; i++){
for (j=0;j<M; j++)
if (risposte[i][j]!=quiz[j])
alunni[i].errori=alunni[i].errori+1;
printf("\nAlunno %s, errori %d", alunni[i].cognome, alunni[i].errori);
}
}
void risposte_date(){
int i, j;
for(i=0;i<N;i++)
alunni[i].errori=0; //azzeriamo gli errori
for (i=0; i<N; i++){
printf("\nAlunno %s. \nRisposte date: ", alunni[i].cognome);
for (j=0;j<M; j++)
printf("\nDomanda %d - risposta data: %d - la risposta corretta era: %d", j+1, risposte[i][j], quiz[j]);
}
}
int main()
{
int scelta;
insert();
while((scelta=menu())!=4){
switch(scelta){
case 1:
print_error();
break;
case 2:
risposte_date();
break;
case 3:
stampaAlunno();
break;
case 4:
break;
}
}
return 0;
}
Chiaramente questo è solo una possibile implementazione di questa esercitazione sulle struct in C.
Alcuni link utili
Realizzare un menù di scelta in C
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice