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
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