Le istruzioni di selezione condizionale in C La

  • Slides: 20
Download presentation
Le istruzioni di selezione condizionale in C

Le istruzioni di selezione condizionale in C

La selezione condizionale è la principale modalità di controllo dei linguaggi di programmazione: •

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: selezioni condizionali Ø Il costrutto if…else Ø Il costrutto switch…case

La selezione condizionale if … else In C, l’istruzione condizionale viene realizzata tramite le

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: else If(condizione) Istruzione; oppure If(condizione) Istruzione 1; else Istruzione 2; Si osservi che se Istruzione, Istruzione 1 e Istruzione 2 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 { }.

La selezione condizionale if … else Primo semplice esempio If in questo caso esegue

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 numeron"); scanf("%d", &numero); if(numero>0) printf(" il numero che hai scelto e' positivo %d. n", numero); return 0; } fig. A fig. B

La selezione condizionale if … else Apportiamo una modifica all’esempio precedente. . #include <stdio.

La selezione condizionale if … else Apportiamo una modifica all’esempio precedente. . #include <stdio. h> In questo esempio l’istruzione If si completa con else. int numero; In questo caso esegue un controllo sul numero inserito, se è maggiore di zero esegue il primo printf main( ) (vedi esecuzione fig. A). { printf ("inserisci un numeron"); Altrimenti nel caso il numero inserito sia negativo salta il scanf("%d", &numero); primo, ed esegue il printf if(numero>0) all’interno dell’istruzione else printf(" il numero che hai scelto e' positivo %d. n", numero); (vedi esecuzione fig. B). else Anche in questo caso il fatto printf(" il numero che hai scelto e' negativo %d. n", numero); che sia una singola istruzione, non necessità di parentesi return 0; graffe. } fig. A fig. B

La selezione condizionale if … else Programma per la risoluzione di una equazione di

La selezione condizionale if … else Programma per la risoluzione di una equazione di primo grado #include <stdio. h> Questo programma prevede l’inserimento di 2 variabili di tipo main() float, che sono i coefficienti di una equazione di primo grado. { Le novità sono che in questo esercizio, si vedono : float a, b ; /* coefficienti a e b */ 1. La presenza di più istruzioni all’interno del if e float x ; /* valore di x che risolve l’equazione */ if else questo else printf("Risoluzione equazioni di primo gradon"); fa si che sono presenti le parentesi graffe a delimitare le printf("Equazione nella forma: ax + b = 0n"); istruzione che ne fanno parte. printf("Immetti coefficiente a: "); 2. La presenza di un if if all’interno di un altro, questa scanf("%f", &a) ; tipologia di costrutto viene detta annidata, ovvero la printf("Immetti coefficiente b: "); possibilità di avere più if all’interno di altri. scanf("%f", &b); if if( a != 0 ) Infatti il primo if verifica se il valore di a è diverso da 0 (zero) if { x = - b / a ; Se è vero, esegue il calcolo di x, è stampa il risultato printf("La soluzione e’ x = %fn", x) ; } Altrimenti se a è uguale 0 (zero) salta le istruzioni precedenti else { /* CASO a==0 */ E va a verificare con un altro if, se il valore di b è if if( b==0 ) uguale a 0 (zero): printf("Equazione indeterminata (ammette infinite soluzioni)n"); • Se è vero stampa che l’equazione è indeterminata. else printf("Equazione impossibile (non ammette soluzioni)n"); • Se è falso stampa che l’equazione è impossibile. } return 0; }

La selezione condizionale if … else Vediamo l’esito dei vari casi, nell’esecuzione del programma

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: 1. 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. 2. 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. 3. 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.

if. . else annidate Nelle istruzioni if if annidate sorge il problema di far

if. . else annidate Nelle istruzioni if if annidate sorge il problema di far corrispondere ad ogni clausola else l’opportuna istruzione else if, ecco alcune semplici regole: • Una clausola else viene sempre associata all’istruzione else if più vicina fra quelle “aperte” precedenti. • Ad ogni istruzione if 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.

if. . else annidate Molti programmatori adottano uno stile diverso per questo stesso codice

if. . else annidate Molti programmatori adottano uno stile diverso per questo stesso codice if ( voto >= 90 ) printf("An"); else if ( voto >= 80 ) printf("Bn"); else if ( voto >= 70 ) printf("Cn"); else if ( voto >= 60 ) printf("Dn"); else printf("Fn"); Forme equivalenti printf("An"); else if ( voto >= 80 ) printf("Bn"); else if ( voto >= 70 ) printf("Cn"); else if ( voto >= 60 ) printf("Dn"); else printf("Fn"); • Molti preferiscono la seconda perché il rientro non raggiunge un livello troppo marcato; • Più leggibile.

La selezione condizionale switch In presenza di cammini multipli all’interno di un programma, le

La selezione condizionale switch In presenza di cammini multipli all’interno di un programma, le diramazioni if - else possono complicare la comprensione del codice. else 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 witch case. Ø Inoltre si utilizzano, anche se non sono obbligatorie, le istruzioni break e break default.

La selezione condizionale switch La semantica dell’istruzione switch impone che: switch • venga valutata

La selezione condizionale switch La semantica dell’istruzione switch impone che: switch • venga valutata l’espressione intera: se corrisponde ad uno dei valori case, case il flusso di esecuzione viene trasferito alla prima istruzione successiva al case nel programma. case • se non c’è corrispondenza tra l’espressione switch ed alcun valore switch case, allora il flusso di esecuzione viene trasferito all’istruzione del case ramo default (non obbligatorio). default • Non possono esistere case con valori uguali. case • Nell’istruzione switch, 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 break switch controllo alla prima istruzione che segue il costrutto.

La selezione condizionale switch In C, l’istruzione condizionale viene realizzata tramite le parole chiave:

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 break default Selezione switch: switch (scelta) { case 1: istruzione/i break; case 2: istruzione/i break; case 3: istruzione/i } Selezione switch con default: switch (scelta) { case 1: istruzione/i break; case 2: istruzione/i break; default: istruzione/i }

La selezione condizionale switch Primo semplice esempio #include <stdio. h> int main ( )

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 zeron"); break; case 1 : printf ("Hai digitato unon"); break; case 2 : printf ("Hai digitato duen"); } } L’istruzione switch, 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 zeron"); L’istruzione break provoca l’uscita dallo switch break Se la cifra inserita è rispettivamente 1 o 2, vengono eseguite le istruzioni presenti in case 1 o case 2 , ovvero : • printf ("Hai digitato unon"); In questo caso l’istruzione break, 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

La selezione condizionale switch Vediamo l’esito dei vari casi durante l’esecuzione del primo semplice

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: 1. Nel caso x sia 0 (zero) si attiverà il case 0 e stamperà la frase "Hai digitato zero". 2. Nel caso x sia 1 si attiverà il case 1 e stamperà la frase "Hai digitato uno". 3. Nel caso x sia 2 si attiverà il case 2 e stamperà la frase "Hai digitato due". 4. Nel caso x sia qualsiasi altro carattere non si attiverà nessun case e uscirà dallo switch. case switch

La selezione condizionale switch #include <stdio. h> int main ( ) { int x;

La selezione condizionale switch #include <stdio. h> int main ( ) { int x; printf ("Digita una cifra: "); scanf ("%d", &x); switch(x) { case 0 : printf ("Hai digitato zeron"); break; case 1 : printf ("Hai digitato unon"); break; case 2 : printf ("Hai digitato duen"); break; default: printf("non previston"); } } Apportiamo una modifica all’esempio precedente. . 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 break 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.

La selezione condizionale switch Vediamo l’esito dei vari casi durante l’esecuzione del esempio a

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". default 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. Parte programma, dove non c’è l’istruzione break Programma eseguito, dove si vede l’errore in esecuzione case 2 : printf ("Hai digitato duen"); default: printf("non previston"); Infatti in questo caso stampa prima la frase del case 2 e in sequenza la frase del default.

La selezione condizionale switch Programma che simula una calcolatrice con le 4 operazioni #include<stdio.

La selezione condizionale switch Programma che simula una calcolatrice con le 4 operazioni #include<stdio. h> int main() { int numero 1, numero 2, scelta, Ris, R, Q; printf("inserisci mumero 1n"); scanf("%d", &numero 1); printf("inserisci numero 2n"); scanf("%d", &numero 2); printf("che operazione vuoi svolgere? n"); printf (" digita 1 per la somman"); printf (" digita 2 per la sottrazionen"); printf (" digita 3 per la moltiplicazionen"); printf (" digita 4 per la divisionen"); printf ("digita la scelta "); scanf("%d", &scelta); switch(scelta) { case 1: Ris=numero 1+numero 2; printf("la somma dei due numeri e' %dn", Ris); break; case 2: Ris=numero 1 -numero 2; printf("la sottrazione dei due numeri e' %dn", Ris); break; case 3: Ris=numero 1*numero 2; printf("il prodotto dei due numeri e' %dn", Ris); break; case 4: if (numero 2==0) printf("divisione per 0 "); else { R=numero 1/numero 2; Q=numero 1 % numero 2; printf("il quoziente dei due numeri e' %dn", R); printf("il resto dei due numeri e' %dn", Q); } } return 0; } #include<stdio. h> int main() { int numero 1, numero 2, scelta, Ris, R, Q; printf("inserisci mumero 1n"); scanf("%d", &numero 1); printf("inserisci numero 2n"); scanf("%d", &numero 2); printf("che operazione vuoi svolgere? n"); printf (" digita 1 per la somman"); printf (" digita 2 per la sottrazionen"); printf (" digita 3 per la moltiplicazionen"); printf (" digita 4 per la divisionen"); printf ("digita la scelta "); scanf("%d", &scelta); In questa prima parte di programmazione, vi è in sequenza: 1. la dichiarazione delle variabili. 2. la stampa a video dei messaggi con relativo inserimento dei due numeri sui quali fare l’operazione matematica. 3. La stampa a video dei messaggi a formare il menù di scelta. 4. L’inserimento della variabile scelta, che è quella dell’operazione che vogliamo effettuare.

La selezione condizionale switch Programma che simula una calcolatrice con le 4 operazioni switch(scelta)

La selezione condizionale switch Programma che simula una calcolatrice con le 4 operazioni switch(scelta) { case 1: Ris=numero 1+numero 2; printf("la somma dei due numeri e' %dn", Ris); break; case 2: Ris=numero 1 -numero 2; printf("la sottrazione dei due numeri e' %dn", Ris); break; case 3: Ris=numero 1*numero 2; printf("il prodotto dei due numeri e' %dn", Ris); break; case 4: if (numero 2==0) printf("divisione per 0 "); else { R=numero 1/numero 2; Q=numero 1 % numero 2; printf("il quoziente dei due numeri e' %dn", R); printf("il resto dei due numeri e' %dn", Q); } return 0; } Istruzione switch, a seconda del valore della variabile scelta, attiva il case richiesto. case 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 numero 2 è 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=numero 1/numero 2; • R=numero 1%numero 2; il simbolo (%) genera il resto della divisione tra 2 numeri.

La selezione condizionale switch Vediamo ciò che succede nell’esecuzione del programma In questa prima

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.

La selezione condizionale switch Qui vediamo l’esito delle possibili situazioni che potrebbero verificarsi durante

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