Un esercizio piuttosto complesso che unisce molti elementi di programmazione: c, struct, vettori, puntatori a tipi strutturati, con selezione switch e le immancabili funzioni. Vediamoli applicati ad un contesto semplice di alunni con la ricerca di un cognome e la visualizzazione del voto massimo.
Il livello di questo esercizio è piuttosto altino. Considerando che queste tematiche vengono affrontate nel terzo anno di informatica di un istituto tecnico, l’esercizio rappresenta un ottimo riepilogo conclusivo per i più giovani e un punto di partenza doveroso per chi prosegue con la carriera universitaria.
Cominciamo col definirci una semplice struct di prova denominata alunno. In questa parte del programma andrebbero definite le eventuali variabili globali o define.
typedef struct
{
char cognome[30];
char nome[20];
int voto;
} alunno;
Per comodità, ci definiamo gli header delle funzioni che ci occorrono e che sviluppiamo poi n fondo
void trova(alunno [], int );
void votoMax(alunno [], int );
La prima parte serve a gestire gli input. Il primo do-while fa scegliere il numero do valori da inserire con un controllo di validità del valore inserito. Quindi il successivo for prende in input i valori e carica una vettore costruito col tipo della struct alunno. Lo switch poi esegue una funzione a scelta dell’utente con un menù semplice.
do
{
printf("Quanti alunni vuoi inserire?");
scanf("%d", &n);
}
while (n<1 || n>MAX);
for(i=0; i<n; i++)
{
printf("Inserisci il cognome dell'alunno:");
scanf("%s", a[i].cognome);
printf("Inserisci il nome dell'alunno:");
scanf("%s", a[i].nome);
printf("Inserisci il voto:");
scanf("%d", &a[i].voto);
}
printf("\nCerca -> Digita 1");
printf("\nVoto Max -> Digita 2 ");
printf("\nVoto Scegli ");
scanf("%d", &scelta);
switch(scelta)
{
case 1:
trova( a, n);
break;
case 2:
votoMax(a, n);
break;
default:
printf("\n Scelta sbagliata");
}
La funzione trova
void trova(alunno _v[], int n)
{
int i;
int trovato;
char cerca[20];
alunno *p; //useremo un puntatore per scorrere il vettore degli alunni
printf("\nInserisci il cognome dell'alunno da cercare: ");
scanf("%s", cerca);
p = &_v[0]; //posiziono il puntatore all'inizio del vettore
trovato=0;
for(i=0;i<n;i++)
{
if(strcmp(p->cognome, cerca)==0)
{
printf("\nAlunno trovato in posizione %d.\n%s\t%d\n",i+1,p->nome, p->voto);
trovato=1;
}
p= &_v[i+1]; //scorro un alunno avanti
}
if (!trovato)
printf("\nAlunno non trovato.\n");
}
La funzione max
void votoMax(alunno _v[], int n)
{
int i;
alunno *p; //useremo un puntatore per scorrere il vettore degli alunni
alunno *maxp; //useremo un puntatore per fissare l'alunno con voto massimo
p = &_v[0]; //posiziono il puntatore all'inizio del vettore
maxp = &_v[0]; //posiziono il puntatore all'inizio del vettore
for(i=0;i<n;i++)
{
if(p->voto > maxp->voto)
{
*maxp = *p;
}
p= &_v[i+1]; //scorro un alunno avanti
}
printf("\nAlunno trovato in posizione %d.\n%s\t%d\n",i+1,maxp->cognome, maxp->voto);
}
Listato completo
#include <stdio.h>
#include <string.h> //per la funzione strcmp
#define MAX 100
typedef struct {
char cognome[30];
char nome[20];
int voto;
}alunno;
void trova(alunno [], int );
void votoMax(alunno [], int );
int main() {
alunno a[MAX];
int n,i,scelta;
do
{
printf("Quanti alunni vuoi inserire?");
scanf("%d", &n);
}
while (n<1 || n>MAX);
for(i=0; i<n; i++)
{
printf("Inserisci il cognome dell'alunno:");
scanf("%s", a[i].cognome);
printf("Inserisci il nome dell'alunno:");
scanf("%s", a[i].nome);
printf("Inserisci il voto:");
scanf("%d", &a[i].voto);
}
printf("\nCerca -> Digita 1");
printf("\nVoto Max -> Digita 2 ");
printf("\nVoto Scegli ");
scanf("%d", &scelta);
switch(scelta)
{
case 1:
trova( a, n);
break;
case 2:
votoMax(a, n);
break;
default:
printf("\n Scelta sbagliata");
}
return 0;
}
void trova(alunno _v[], int n)
{
int i;
int trovato;
char cerca[20];
alunno *p; //useremo un puntatore per scorrere il vettore degli alunni
printf("\nInserisci il cognome dell'alunno da cercare: ");
scanf("%s", cerca);
p = &_v[0]; //posiziono il puntatore all'inizio del vettore
trovato=0;
for(i=0;i<n;i++)
{
if(strcmp(p->cognome, cerca)==0)
{
printf("\nAlunno trovato in posizione %d.\n%s\t%d\n",i+1,p->nome, p->voto);
trovato=1;
}
p= &_v[i+1]; //scorro un alunno avanti
}
if (!trovato)
printf("\nAlunno non trovato.\n");
}
void votoMax(alunno _v[], int n)
{
int i;
alunno *p; //useremo un puntatore per scorrere il vettore degli alunni
alunno *maxp; //useremo un puntatore per fissare l'alunno con voto massimo
p = &_v[0]; //posiziono il puntatore all'inizio del vettore
maxp = &_v[0]; //posiziono il puntatore all'inizio del vettore
for(i=0;i<n;i++)
{
if(p->voto > maxp->voto)
{
*maxp = *p;
}
p= &_v[i+1]; //scorro un alunno avanti
}
printf("\nAlunno trovato in posizione %d.\n%s\t%d\n",i+1,maxp->cognome, maxp->voto);
}
Ultima modifica 5 Aprile 2023