Programma di esempio:
#include <stdio.h> #include <string.h> #define NUMERO_DELLE_STRINGHE 3 #define LUNGHEZZA_STRINGA_MAGGIORE 9 void funzioneQuadrato(); void funzioneCubo(); int main() { char comandi[NUMERO_DELLE_STRINGHE][LUNGHEZZA_STRINGA_MAGGIORE] = {"quadrato", "cubo", "esci"}; char comandoUtente[LUNGHEZZA_STRINGA_MAGGIORE]; /*vettore per immagazzinare il comando inserito dall'utente*/ int nComando; /*identificatore del comando scelto*/ int i; /*contatore necessario per il confronto tra la stringa dell'utente e quelle del programma*/ int uscita = 0; /*quando è uguale a 1 vuol dire che è stata inserita la stringa "esci", che termina l'esecuzione*/ do { do { nComando = 0; /*i due elementi vengono inizializzati per le scelte dei successivi cicli*/ i = 0; printf("nInserire un comando: "); scanf ("%s", &comandoUtente); for(nComando = 0, i = 0; i < NUMERO_DELLE_STRINGHE; i++){ if(strcmp(comandoUtente, comandi[i]) == 0) /*se il confronto fra il comando inserito e un comando del programma è positivo...*/ nComando = i + 1; /*...l'identificatore è uguale (per semplificare) alla posizione del comando nella matrice più uno*/ else printf("La stringa inserita non corrisponde al comando "%s".n", comandi[i]); } /*fine del comando while per il confronto delle stringhe*/ } while(nComando == 0); /*continua a richiedere l'inserimento della stringa fino a quando non c'è una corrispondenza*/ switch(nComando) { /*in questo switch è come se l'utente avesse inserito un numero per scegliere un'opzione*/ case 1: funzioneQuadrato(); break; case 2: funzioneCubo(); break; case 3: uscita = 1; break; } /*fine del comando switch*/ } while(uscita == 0); /*il programma continuerà fino a quando non verrà inserito il comando "esci"*/ } /*fine della funzione main*/ void funzioneQuadrato() { int n; int quad; printf("Inserisci un intero: "); scanf ("%d", &n); quad = n * n; printf("Quadrato di %d = %dn", n, quad); } void funzioneCubo() { int n; int cubo; printf("Inserisci un intero: "); scanf ("%d", &n); cubo = n * n * n; printf("Cubo di %d = %dn", n, cubo); }
Analizziamo il codice:
La funzione che verrà utilizzata strcmp è contenuta nella libreria standard string.h, che va inclusa:
#include <string.h>
Sono poi necessari:
- una matrice che contenga i comandi utilizzabili
- un vettore (o array) che conterrà il comando inserito dall'utente
- un intero che identifichi il comando scelto con un valore numerico
- un intero che svolga il compito di contatore per il confronto fra le stringhe
- un intero che diventa uguale a 1 all'inserimento del comando per uscire
char comandi[NUMERO_DELLE_STRINGHE][LUNGHEZZA_STRINGA_MAGGIORE] = {"quadrato", "cubo", "esci"}; char comandoUtente[LUNGHEZZA_STRINGA_MAGGIORE]; int nComando; int i; int uscita = 0;
Si passa quindi al confronto, con la funzione strcmp che restituisce 0 se le stringhe sono uguali; -1 se la prima è, in ordine alfabetico, minore; 1 se lo è la seconda.
Un ciclo permetterà il confronto fino a quando non ci sarà una corrispondenza, a quel punto viene assegnato un valore a nComando:
while(nComando == 0 && i < NUMERO_DELLE_STRINGHE){ if(strcmp(comandoUtente, comandi[i]) == 0) nComando = i + 1; else { printf("La stringa inserita non corrisponde al comando "%s".n", comandi[i]); i++; } }
Ora abbiamo un intero che identifica il comando inserito: 1 per il comando "quadrato", 2 per il comando "cubo", 3 per il comando "esci"; adesso è come se la scelta dell'utente fosse effettuata con l'inserimento di un numero, usiamo uno switch per richiamare i comandi adatti alla scelta:
switch(nComando) { case 1: funzioneQuadrato(); break; case 2: funzioneCubo(); break; case 3: uscita = 1; break;
}
I primi due case richiamano rispettivamente le funzioni funzioneQuadrato e funzioneCubo, il terzo modifica il valore uscita e il programma termina il ciclo principale.
Ricordatevi che il C è case sensitive, se un comando si chiama quadrato, non si può inserire QUADRATO.
Questa tipologia di menù si può usare in molte situazioni e a volte è meglio di quella con la richiesta dell'inserimento di un valore per la scelta di un'opzione.
Aggiungi un commento