Struct, vettori, puntatori a tipi 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.

#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 30 Gennaio 2022

Lascia un commento