prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Può essere necessario, nel corso di un programma, variare l’elaborazione in seguito a più condizioni. In questi casi il linguaggio C fornisce la struttura:
if(espressione) istruzione else if(espressione) istruzione ... else istruzione
In questo caso le espressioni vengono valutate nell’ordine in cui sono scritte: se è vera la prima espressione si esegue l’istruzione specificata e poi si passa all’istruzione successiva alla chiusura della struttura. Se la prima condizione non è vera si passa ad esaminare la seconda e così via. Si tenga presente che:
Ci possono essere tante else if quante ne occorrono per l’elaborazione richiesta. Per ogni elaborazione l’istruzione eseguita è solo quella soggetta alla condizione verificata
La clausola else finale, se presente (in quanto, come l’equivalente nella if già vista in precedenza, può mancare) gestisce l’istruzione eseguita quando nessuna delle espressioni specificate è verificata.
Al fine di mostrare un esempio di alcune delle istruzioni esposte ultimamente si propone un programma che, data una espressione algebrica, calcoli quante parentesi graffe, quadre e tonde sono contenute nella espressione stessa. Le righe più significative sono etichettate per permettere un commento successivo:
/* Conta i vari tipi di parentesi contenute in una espressione algebrica (non fa distinzione fra parentesi aperte e chiuse) */ #include <stdio.h> main(){ char espress[30]; /*1*/ int pargraf,parquad,partond; int c; printf("\nEspressione algebrica "); gets(espress); /*2*/ pargraf=parquad=partond=0; for(c=0;c<30 && espress[c]!=‘\0’;c++) { /*3*/ if(espress[c]==‘{’ || espress[c]==‘}’) /*4*/ pargraf++; else if(espress[c]==‘[’ || espress[c]==‘]’) /*4*/ parquad++; else if(espress[c]==‘(’ || espress[c]==‘)’) /*4*/ partond++; }; printf("\nGraffe = %d",pargraf); printf("\nQuadre = %d",parquad); printf("\nTonde = %d",partond); }
Nella riga con etichetta 1 si dichiara un vettore di tipo char e di lunghezza massima di 30 caratteri, cioè una stringa di 30 caratteri.
Nella 2 si acquisisce dall’input la stringa (cioè l’espressione algebrica da elaborare).
Nella 3 c’è l’inizio di un ciclo a contatore che servirà per la scansione della stringa: i caratteri verranno esaminati uno per volta per verificare se sono parentesi. Nella gets la stringa è vista nel suo complesso, qui si esaminano i singoli elementi del vettore cioè i caratteri che compongono la stringa. Si noti il controllo di fine ciclo: il contatore del ciclo, che qui assume il compito di indice del vettore, non può superare 29 (l’array ha 30 elementi al massimo) ed inoltre il carattere esaminato non può essere null (qualora lo fosse, la stringa sarebbe terminata). Le due condizioni devono essere verificate contemporaneamente. Se una delle due non è verificata (superamento dei limiti fissati o fine stringa) l’elaborazione passa all’istruzione immediatamente dopo la chiusura del ciclo: la printf dopo la chiusura della parentesi (qui le parentesi sono state aggiunte per aumentare la leggibilità infatti, contenendo il ciclo una sola istruzione, non sarebbero indispensabili).
Nelle righe etichettate con 4 si esaminano i vari casi possibili (i tre tipi di parentesi). Il carattere esaminato può essere indifferentemente la parentesi aperta o quella chiusa e, a seconda del tipo, viene conteggiato nell’apposito contatore. Se il carattere esaminato non è una parentesi, mancando la clausola else, non viene preso in considerazione.
http://ennebi.solira.org | ennebi@solira.org |