Le istruzioni di selezione condizionale in C

Slides:



Advertisements
Presentazioni simili
INFORMATICA Strutture condizionali
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
In molti casi è utile assegnare a degli identificatori dei valori che restino costanti durante tutto il programma e che non possano essere cambiati nemmeno.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
2a + 10b abx2 3a + 1 y 2 a + 1 x + 2y a − Espressioni algebriche
7. Strutture di controllo Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
L’addizione ESEMPIO Rappresentazione
Unità di apprendimento 6 Dal problema al programma.
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(“Hello World!\n”); }
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Linguaggio C: strutture di controllo
Introduzione al linguaggio C
PROGRAMMAZIONE SHELL -
7. Strutture di controllo Ing. Simona Colucci
IL CONCETTO DI ALGORITMO
10. Programmazione Ricorsiva Ing. Simona Colucci
SWITCH – CASE LINGUAGGIO C.
7. Strutture di controllo
Unità di apprendimento 7
Equazioni e disequazioni
Strutture di controllo
Prof.ssa Carolina Sementa
I FILES AD ACCESSO SEQUENZIALE
PROGRAMMAZIONE BASH – ISTRUZIONE IF
CICLO DO – WHILE LINGUAGGIO C.
Lezione 9 – A.A. 2016/2017 Prof. Giovanni Acampora
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
I RADICALI Definizione di radicali Semplificazione di radicali
Linguaggio C++ Selezione.
Codicfiche Interi Complemento alla base.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Strutture di Controllo
Secondo Programma in C.
Programmazione e Laboratorio di Programmazione
{ } Multipli di un numero M4 ESEMPIO 0, 4, 8, 12, 16, 20, 24, …
I numeri relativi DEFINIZIONE. Si dicono numeri relativi tutti i numeri interi, razionali e irrazionali dotati di segno (positivo o negativo). ESEMPI Numeri.
Le espressioni algebriche letterali
Algebra Booleana.
Fondamenti di Informatica
Ricorsione 16/01/2019 package.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Programmazione e Laboratorio di Programmazione
Codici rilevatori di errori
La struttura dei primi programma in C
Le istruzioni di iterazione in C
Le 4 operazioni.
Le 4 operazioni.
Processi decisionali e funzioni di controllo
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Lezione Terza Primi passi di programmazione
Programmazione e Laboratorio di Programmazione
La programmazione strutturata
Algoritmi.
Le Equazioni di 1°grado Prof.ssa A.Comis.
Programmazione e Laboratorio di Programmazione
Process synchronization
Programmazione e Laboratorio di Programmazione
LE DISEQUAZIONI DI PRIMO GRADO
Transcript della presentazione:

Le istruzioni di selezione condizionale in C

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

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 { }.

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

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

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.

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.

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.

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.

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.

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.

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

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.

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.

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.

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");

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.

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.

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