Struct, vettori, puntatori a struct per ricerca e max in C

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

Lascia un commento