Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Le istruzioni di selezione condizionale in C
2
La selezione condizionale
La selezione condizionale è la principale modalità di controllo dei linguaggi di programmazione: Permette di prendere decisioni, attivando o meno una sequenza di istruzioni in dipendenza del valore di un’espressione. Dato che il valore di un’espressione può cambiare da esecuzione ad esecuzione, i programmi sono dinamici: si comportano diversamente in funzione dei dati in ingresso. Le selezioni condizionali che permettono questo sono: Il costrutto if…else Il costrutto switch…case
3
La selezione condizionale if … else
In C, l’istruzione condizionale viene realizzata tramite le parole chiave: if e else, l’istruzione ha due possibili formulazioni: If(condizione) Istruzione; If(condizione) Istruzione1; else Istruzione2; oppure Si osservi che se Istruzione, Istruzione1 e Istruzione2 sono istruzioni singole (una sola istruzione) non necessitano di parentesi graffe { }, se invece è necessaria una sequenza di istruzioni esse devono essere racchiuse tra una coppia di parentesi graffe { }.
4
La selezione condizionale if … else
Primo semplice esempio If in questo caso esegue un controllo sul numero inserito, se è maggiore di zero esegue il printf (vedi esecuzione fig. A), nel caso il numero inserito sia negativo salta e non esegue niente (vedi esecuzione fig. B) . Inoltre il fatto che sia una singola istruzione non necessità di parentesi graffe. #include <stdio.h> int numero; main( ) { printf ("inserisci un numero\n"); scanf("%d",&numero); if(numero>0) printf(" il numero che hai scelto e' positivo %d .\n",numero); return 0; } fig. A fig. B
5
La selezione condizionale if … else
Apportiamo una modifica all’esempio precedente.. #include <stdio.h> int numero; main( ) { printf ("inserisci un numero\n"); scanf("%d",&numero); if(numero>0) printf(" il numero che hai scelto e' positivo %d .\n",numero); else printf(" il numero che hai scelto e' negativo %d .\n",numero); return 0; } In questo esempio l’istruzione If si completa con else. In questo caso esegue un controllo sul numero inserito, se è maggiore di zero esegue il primo printf (vedi esecuzione fig. A). Altrimenti nel caso il numero inserito sia negativo salta il primo, ed esegue il printf all’interno dell’istruzione else (vedi esecuzione fig. B) . Anche in questo caso il fatto che sia una singola istruzione, non necessità di parentesi graffe. fig. A fig. B
6
La selezione condizionale if … else
Programma per la risoluzione di una equazione di primo grado #include <stdio.h> main() { float a, b ; /* coefficienti a e b */ float x ; /* valore di x che risolve l’equazione */ printf("Risoluzione equazioni di primo grado\n"); printf("Equazione nella forma: ax + b = 0\n"); printf("Immetti coefficiente a: "); scanf("%f", &a) ; printf("Immetti coefficiente b: "); scanf("%f", &b); if( a != 0 ) x = - b / a ; printf("La soluzione e’ x = %f\n", x) ; } else { /* CASO a==0 */ if( b==0 ) printf("Equazione indeterminata (ammette infinite soluzioni)\n"); printf("Equazione impossibile (non ammette soluzioni)\n"); return 0; Questo programma prevede l’inserimento di 2 variabili di tipo float, che sono i coefficienti di una equazione di primo grado. Le novità sono che in questo esercizio, si vedono : La presenza di più istruzioni all’interno del if e else questo fa si che sono presenti le parentesi graffe a delimitare le istruzione che ne fanno parte. La presenza di un if all’interno di un altro, questa tipologia di costrutto viene detta annidata, ovvero la possibilità di avere più if all’interno di altri. Infatti il primo if verifica se il valore di a è diverso da 0 (zero) Se è vero, esegue il calcolo di x, è stampa il risultato Altrimenti se a è uguale 0 (zero) salta le istruzioni precedenti E va a verificare con un altro if, se il valore di b è uguale a 0 (zero): Se è vero stampa che l’equazione è indeterminata. Se è falso stampa che l’equazione è impossibile.
7
La selezione condizionale if … else
Vediamo l’esito dei vari casi, nell’esecuzione del programma per la risoluzione di una equazione di primo grado. Questi sono i 3 possibili casi che si possono verificare: Nel caso a e b siano due numeri interi o con la virgola, il programma eseguirà il calcolo dell’incognita x e stamperà il risultato. Nel caso in cui, a è uguale a 0 (zero), il programma va a verificare b, e, se anche questa è uguale a 0 (zero) stampa che l’equazione è indeterminata. Nel caso in cui, a è uguale a 0 (zero), il programma va a verificare b, e, se questa è diversa da 0 (zero) stampa che l’equazione è impossibile.
8
if .. else annidate Nelle istruzioni if annidate sorge il problema di far corrispondere ad ogni clausola else l’opportuna istruzione if, ecco alcune semplici regole: Una clausola else viene sempre associata all’istruzione if più vicina fra quelle “aperte” precedenti. Ad ogni istruzione if può corrispondere una sola clausola else. Per facilitare la programmazione, è opportuno indentare (spazi/tabulazione) correttamente i vari if. Una clausola else dovrebbe sempre essere posta allo stesso livello di indentazione dell’if associato.
9
if .. else annidate Molti programmatori adottano uno stile diverso per questo stesso codice if ( voto >= 90 ) printf("A\n"); else if ( voto >= 80 ) printf("B\n"); if ( voto >= 70 ) printf("C\n"); if ( voto >= 60 ) printf("D\n"); printf("F\n"); if ( voto >= 90 ) printf("A\n"); else if ( voto >= 80 ) printf("B\n"); else if ( voto >= 70 ) printf("C\n"); else if ( voto >= 60 ) printf("D\n"); else printf("F\n"); Forme equivalenti Molti preferiscono la seconda perché il rientro non raggiunge un livello troppo marcato; Più leggibile.
10
La selezione condizionale switch
In presenza di cammini multipli all’interno di un programma, le diramazioni if - else possono complicare la comprensione del codice. L’istruzione switch consente di specificare un numero illimitato di cammini di esecuzione in dipendenza dal valore di un’espressione. In C, l’istruzione condizionale viene realizzata tramite le parole chiave: switch e case. Inoltre si utilizzano, anche se non sono obbligatorie, le istruzioni break e default.
11
La selezione condizionale switch
La semantica dell’istruzione switch impone che: venga valutata l’espressione intera: se corrisponde ad uno dei valori case, il flusso di esecuzione viene trasferito alla prima istruzione successiva al case nel programma. se non c’è corrispondenza tra l’espressione switch ed alcun valore case, allora il flusso di esecuzione viene trasferito all’istruzione del ramo default (non obbligatorio). Non possono esistere case con valori uguali. Nell’istruzione switch, il flusso di esecuzione, a partire dal case selezionato, prosegue fino alla successiva istruzione di controllo del flusso o alla fine dell’istruzione switch. L’istruzione break forza l’uscita dal costrutto switch, trasferendo il controllo alla prima istruzione che segue il costrutto.
12
La selezione condizionale switch
In C, l’istruzione condizionale viene realizzata tramite le parole chiave: switch e case, l’istruzione ha alcune possibili formulazioni, legate all’uso delle istruzioni break e default. Selezione switch: switch (scelta) { case 1: istruzione/i break; case 2: case 3: } Selezione switch con default: switch (scelta) { case 1: istruzione/i break; case 2: default: }
13
La selezione condizionale switch
Primo semplice esempio #include <stdio.h> int main ( ) { int x; printf ("Digita una cifra: "); scanf ("%d", &x); switch(x) case 0 : printf ("Hai digitato zero\n"); break; case 1 : printf ("Hai digitato uno\n"); case 2 : printf ("Hai digitato due\n"); } L’istruzione switch, è quella che confronta, in questo caso, il valore di x con i case al suo interno, dirottando a quel case che risulta uguale a x. Se la cifra inserita è 0 (zero), viene eseguito l’istruzione presente in case 0, ovvero printf ("Hai digitato zero\n"); L’istruzione break provoca l’uscita dallo switch Se la cifra inserita è rispettivamente 1 o 2, vengono eseguite le istruzioni presenti in case 1 o case 2 , ovvero : printf ("Hai digitato uno\n"); In questo caso l’istruzione break, che provoca l’uscita dallo switch, è presente solo nel case 1, in quanto nel case 2 non è necessaria, perché in questo caso è l’ultima istruzione dello switch.
14
La selezione condizionale switch
Vediamo l’esito dei vari casi durante l’esecuzione del primo semplice esempio Questi sono i 4 possibili casi che si possono verificare: Nel caso x sia 0 (zero) si attiverà il case 0 e stamperà la frase "Hai digitato zero". Nel caso x sia 1 si attiverà il case 1 e stamperà la frase "Hai digitato uno". Nel caso x sia 2 si attiverà il case 2 e stamperà la frase "Hai digitato due". Nel caso x sia qualsiasi altro carattere non si attiverà nessun case e uscirà dallo switch.
15
La selezione condizionale switch
Apportiamo una modifica all’esempio precedente.. #include <stdio.h> int main ( ) { int x; printf ("Digita una cifra: "); scanf ("%d", &x); switch(x) case 0 : printf ("Hai digitato zero\n"); break; case 1 : printf ("Hai digitato uno\n"); case 2 : printf ("Hai digitato due\n"); default: printf("non previsto\n"); } In questo programma, rispetto al precedente in aggiunta c’è l’istruzione default. Così facendo il programma nell’esecuzione rimarrà inalterato nei casi in cui venga digitato 0, 1 e 2, ma nel caso sia digitato un qualunque altro carattere si attiverà l’istruzione default e stamperà la frase "non previsto". Ovviamente in questo caso bisogna aggiungere l’istruzione break al case 2, altrimenti nel caso di attivazione, del case 2, non sarebbe uscito dallo switch ma avrebbe proseguito con l’istruzione successiva, in questo caso il default, quindi stamperebbe erroneamente entrambi le frasi.
16
La selezione condizionale switch
Vediamo l’esito dei vari casi durante l’esecuzione del esempio a cui abbiamo modificato Come si può veder rispetto all’esecuzione del programma precedente, l’unico caso che cambia e il caso in cui venga inserito un carattere diverso da 0, 1, e 2. Infatti nel caso di digitazione di un qualsiasi altro carattere si attiva il default che genera la stampa "non previsto". Qui sotto c’è l’esempio in cui non mettiamo l’istruzione break alla fine di un case, ovvero passa alla istruzione successiva, case o default che sia. Infatti in questo caso stampa prima la frase del case 2 e in sequenza la frase del default. Parte programma, dove non c’è l’istruzione break Programma eseguito, dove si vede l’errore in esecuzione case 2 : printf ("Hai digitato due\n"); default: printf("non previsto\n");
17
La selezione condizionale switch
Programma che simula una calcolatrice con le 4 operazioni #include<stdio.h> int main() { int numero1,numero2, scelta,Ris,R,Q; printf("inserisci mumero1\n"); scanf("%d",&numero1); printf("inserisci numero2\n"); scanf("%d",&numero2); printf("che operazione vuoi svolgere?\n"); printf (" digita 1 per la somma\n"); printf (" digita 2 per la sottrazione\n"); printf (" digita 3 per la moltiplicazione\n"); printf (" digita 4 per la divisione\n"); printf ("digita la scelta "); scanf("%d",&scelta); switch(scelta) case 1: Ris=numero1+numero2; printf("la somma dei due numeri e' %d\n",Ris); break; case 2: Ris=numero1-numero2; printf("la sottrazione dei due numeri e' %d\n",Ris); case 3: Ris=numero1*numero2; printf("il prodotto dei due numeri e' %d\n",Ris); case 4: if (numero2==0) printf("divisione per 0 "); else R=numero1/numero2; Q=numero1 % numero2; printf("il quoziente dei due numeri e' %d\n",R); printf("il resto dei due numeri e' %d\n",Q); } return 0; #include<stdio.h> int main() { int numero1,numero2, scelta,Ris,R,Q; printf("inserisci mumero1\n"); scanf("%d",&numero1); printf("inserisci numero2\n"); scanf("%d",&numero2); printf("che operazione vuoi svolgere?\n"); printf (" digita 1 per la somma\n"); printf (" digita 2 per la sottrazione\n"); printf (" digita 3 per la moltiplicazione\n"); printf (" digita 4 per la divisione\n"); printf ("digita la scelta "); scanf("%d",&scelta); In questa prima parte di programmazione, vi è in sequenza: la dichiarazione delle variabili. la stampa a video dei messaggi con relativo inserimento dei due numeri sui quali fare l’operazione matematica. La stampa a video dei messaggi a formare il menù di scelta. L’inserimento della variabile scelta, che è quella dell’operazione che vogliamo effettuare.
18
La selezione condizionale switch
Programma che simula una calcolatrice con le 4 operazioni switch(scelta) { case 1: Ris=numero1+numero2; printf("la somma dei due numeri e' %d\n",Ris); break; case 2: Ris=numero1-numero2; printf("la sottrazione dei due numeri e' %d\n",Ris); case 3: Ris=numero1*numero2; printf("il prodotto dei due numeri e' %d\n",Ris); case 4: if (numero2==0) printf("divisione per 0 "); else R=numero1/numero2; Q=numero1 % numero2; printf("il quoziente dei due numeri e' %d\n",R); printf("il resto dei due numeri e' %d\n",Q); } return 0; Istruzione switch, a seconda del valore della variabile scelta, attiva il case richiesto. I prime 3 case sono simili, l’unica differenza è nell’operazione matematica che svolgono per calcolare il risultato, e la relativa frase di stampa. Nel case 4, della divisione si può notare che all’interno del c’è un blocco di istruzione più complesso. Infatti, all’interno vi è un if per controllare se la variabile numero2 è uguale a 0 (zero), perché una divisione per zero causerebbe un errore nell’esecuzione del programma. Oltre il controllo vi è una doppia operazione, una per il calcolo del quoziente, e un’altra per il calcolo del resto: R=numero1/numero2; R=numero1%numero2; il simbolo (%) genera il resto della divisione tra 2 numeri.
19
La selezione condizionale switch
Vediamo ciò che succede nell’esecuzione del programma In questa prima parte vediamo l’esecuzione delle prime istruzioni, ovvero la parte iniziale con la richiesta di inserimento dei numeri e la stampa a video, di un di menù dove è indicato cosa digitare per scegliere l’operazione da far svolgere.
20
La selezione condizionale switch
Qui vediamo l’esito delle possibili situazioni che potrebbero verificarsi durante l’esecuzione del programma, in base alla scelta dell’operazione da svolgere. Come visto prima nella spiegazione del codice del programma, le prime 3 operazioni generano un risultato simile, tranne ovviamente per la frase e il risultato dell’operazione matematica. Mentre per la divisione è leggermente diversa, perché appunto prevede un quoziente, un resto e un ulteriore messaggio in caso di divisione per 0 (zero).
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.