Realizzare un menù di scelta in C

In questa breve lezione impareremo a realizzare un menù di scelta in C, utilizzando anche le funzioni e le strutture.

A scopo didattico proponiamo dunque questo esercizio:

Realizzare una struttura libro con i campi id, che corrisponde all’ISBN, titolo e genere.
Dichiariamo una tabella archivio_libri di tipo libro con 50 elementi al massimo, inserendo a titolo d’esempio i primi 4 libri.
Creare un menù di scelta che consente di scegliere tra: visualizzare i libri inseriti, inserire nuovi libri ed effettuare una ricerca per genere.

Quindi di seguito il menù che vogliamo realizzare:

1 – Stampa libri presenti;
2 – Inserisci nuovo libro;
3 – Ricerca libro per genere;
4 – Esci.

Procedimento esempio di come realizzare un menù di scelta in C

Inizialmente dal main invocheremo la funzione menu_scelta che presenta a video il menù di scelta così come descritto sopra.

Quindi, con la scelta 1 lanceremo la funzione stampaLibri che semplicemente visualizza i dati inseriti.

Con la scelta 2 lanceremo invece la funzione insertLibri che permette l’inserimento dei dati di un libro. Per semplicità, per il momento, non effettuiamo nessun controllo sui dati inseriti. L’unico controllo che viene fatto riguarda il superamento delle dimensioni dell’array.

Invece con la scelta 3 invocheremo la funzione stampaGenere che consente di effettuare una semplice ricerca per genere.

Infine con la scelta 4 usciremo dal programma.


Ecco il codice d’esempio che consente di realizzare un menù di scelta in C.

N.B. Il seguente esempio utilizza gets che in alcuni compilatori restituisce:

warning: implicit declaration of function ‘gets’ is invalid in C99

Il motivo è semplice, gets è stata rimossa da stdio.h in quanto presentava alcuni problemi.

Infatti ne viene sconsigliato l’utilizzo. L’ho proposta a scopo didattico anche perché ancora in molti testi, non aggiornati, si vede l’utilizzo di questa funzione. Consultate anche questo link: gets.

Al suo posto quindi è bene utilizzare fgets che a breve vi spiegherò, per ora vi dico semplicemente che potete sostituire ad esempio con fgets(archivio_libri[pos].id,N,stdin);

E così via.

#include <stdio.h>
#include <string.h>

#define N 50

typedef struct {
	char id[40];
  	char titolo[150];
	char genere[40];  
} libro;


libro archivio_libri[N]={ 
	{"32 - 45435 - 1223- 4","Il nome della rosa", "romanzo"},
	{"78- 674 - 5435 - 1223- 4","Il linguaggio C", "informatica"},
	{"6- 7887- 6 - 8435 - 12234","Il linguaggio C++", "informatica"},
	{"324- 5- 435 - 1234","Java", "informatica"},
};


int my_index=4;
//indico il numero di elementi allocati nel vettore archivio_libri 

void stampaLibri(int pos)
{ 
int i=0;
while(i<pos)
{	
 	printf("\n\nCodice libro: %s", archivio_libri[i].id);
 	printf("\nTitolo %s ", archivio_libri[i].titolo);
	printf("\nGenere %s: ", archivio_libri[i].genere);

	i++;
 }
}

int insertLibri(int pos)
{
	char invio;
	char c;
	
	if(pos>=N) {
		printf("\n\nHai raggiunto il limite massimo di libri che puoi inserire ");
		
	scanf("%c", &invio);
	return(pos);
	}
	
	fflush(stdin);
	printf("\nISBN:");
	gets(archivio_libri[pos].id);
	fflush(stdin);	
	printf("\nTitolo:");
	gets(archivio_libri[pos].titolo);
	printf("\nGenere:");
	gets(archivio_libri[pos].genere);
	fflush(stdin);
	
	pos++;
	return(pos);
}

void stampaGenere(int pos)
{ 
	char genere[40];
	int i=0, trovato=0;
	
	printf("\nQuale genere cerchi?:");
 	scanf("%s", genere);
 	
	for (i=0; i<pos; i++){
	 	if(strcmp(archivio_libri[i].genere,genere)==0) {
	 		printf("\n\n ISBN: %s ", archivio_libri[i].id);
	 		printf("\n Titolo: %s ", archivio_libri[i].titolo);
	 		trovato=1;
		 }
 	}
 	if (trovato==0) 
		 printf("\nNon e' presente nessuna categoria:");
}

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 - Stampa libri presenti" );
    printf("\n2 - Inserisci libro");
    printf("\n3 - Ricerca libro per genere");
    printf("\n4 - Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    }
    while (selezione < 1 || selezione > 4);
  return selezione;
}

int main(void)
{
    int scelta;
    
    while((scelta=menu_scelta())!=4){
    switch(scelta){
        case 1: 
               stampaLibri(my_index);
               break;
        case 2:
               my_index=insertLibri(my_index);
               break;
        case 3:
               stampaGenere(my_index);
               break;
        case 4: break;
             }
    }             
    return 0;
}

Chiaramente questo è solo un esempio di realizzazione di un menù di scelta in C.

Prossimamente parleremo dei puntatori a struttura.

Alcuni link utili

Media per riga e per colonna

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Sommare dei numeri di una matrice

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Inserire dati in una matrice

Tavola pitagorica in C

Array multidimensionali

Programma sui triangoli in C

Media dei numeri in un array

Array con numeri random

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *