Strutture di Controllo
Esempio Alzarsi dal letto Togliersi il pigiama Fare la doccia Vestirsi Fare colazione Prendere il bus per andare a scuola NOTA I passi sono eseguiti in sequenza e l’ordine delle istruzioni è essenziale per la correttezza dell’algoritmo
Non basta organizzare i passi in sequenza Alzarsi dal letto Togliersi il pigiama Fare la doccia Vestirsi Fare colazione Se piove Prendere ombrello Prendere il bus per andare a scuola
Ulteriore forma di flusso: se…altrimenti Alzarsi dal letto Togliersi il pigiama Fare la doccia Vestirsi Fare colazione Se sciopero Prendere macchina Altrimenti Prendere il bus Prendere il bus per andare a scuola
Ulteriore forma di controllo: ciclo «mentre» Alzarsi dal letto Togliersi il pigiama Fare la doccia Vestirsi Fare colazione Mentre piove Restare in casa Prendere il bus per andare a scuola
Linguaggio naturale se...allora...altrimenti.... qualora.....ma ......nel caso in cui... ripeti ...... fino a quando... mentre..... nel primo caso...., nel secondo caso...,..... nell’ennesimo caso..... nei linguaggi di programmazione questi costrutti sintattici vengono chiamati strutture di controllo
Strutture di controllo del flusso Le strutture di controllo del flusso specificano l’ordine secondo il quale le operazioni devono essere effettuate istruzione composta istruzioni decisionali istruzioni cicliche
Istruzione composta Le parentesi graffe {} vengono usate per raggruppare in un'unica istruzione composta, detta blocco, dichiarazioni ed istruzioni, in modo che, dal punto di vista sintattico, esse formino un’entità equivalente ad una sola istruzione Esempio { a = b + 19; b = c * 23; c = c + 1; } Dopo la parentesi graffa di chiusura di un blocco non esiste punto e virgola
Strutture di controllo del flusso Le strutture di controllo del flusso specificano l’ordine secondo il quale le operazioni devono essere effettuate istruzione composta istruzioni decisionali istruzioni cicliche
Istruzioni Decisionali if if-else switch
if Sintassi if (espressione) istruzione Semantica Valuta espressione Se l’espressione è vera (cioè assume valore diverso da zero) viene eseguita istruzione In ogni caso continua eseguendo la prima istruzione successiva alla struttura di controllo
If: diagramma di flusso if (E) I1; I2; la struttura introduce due possibili sequenze: la sequenza (se E è vera): I0 I1 I2 2. la sequenza (se E è falsa): I0 I2
Esempio #include <stdio.h> main() { } int i; printf("Dammi un intero: "); scanf("%d", &i); if (i<100) printf("Minore di 100\n"); } Stampa «minore di 100» se il numero letto è minore di 100
if Sintassi if (espressione) istruzione
If + istruzione composta #include <stdio.h> main() { int i; int min_100=0; printf("Dammi un intero: "); scanf("%d", &i); if (i<100) printf("Minore di 100\n"); min_100=1; } blocco
Esercizio Scrivere un programma che richieda in ingresso un valore intero e stampa il suo valore assoluto Valore assoluto di un numero n: Se n < 0: -n Se n >= 0: n Esempio 9 ! 9 -27 ! 27
Soluzione #include<stdio.h> main() { } int n; printf("Dammi un intero: "); scanf("%d", &n); if (n<0) n=-n; printf("Risultato: %d", n); }
Istruzioni Decisionali if if-else switch
If-else Sintassi if (espressione) istruzione_1 else istruzione_2
If-else: semantica Viene valutata espressione Se l’espressione è vera (cioè assume valore diverso da zero) viene eseguita istruzione_1 Se l’ espressione è falsa (cioè assume valore nullo) viene eseguita istruzione_2
If-else: diagramma di flusso I0; if (E) I1; else I2; I3; la struttura introduce due possibili sequenze: 1. la sequenza (se E è vera): I0 I1 I3 2. la sequenza (se E è falsa): I0 I2 I3
Esempio /* Utilizzo if-else */ #include <stdio.h> main() { } int i; printf("Dammi un intero: "); scanf("%d", &i); if (i<100) printf("Minore di 100\n"); else printf("Maggiore o uguale a 100\n"); }
If-else + istruzione composta #include <stdio.h> main() { int i; int mag_100=0; int min_100=0; printf("Dammi un intero: "); scanf("%d", &i); if (i<100) printf("Minore di 100\n"); min_100=1; } else printf("Maggiore o uguale a 100\n"); mag_100=1; blocco blocco
Osservazione #include<stdio.h> main() { int x; scanf("%d", &x); if (x==0) printf("pippo "); printf("pluto "); }; else printf("minnie"); } ERRORE
osservazione if (x!=0) printf("pippo"); if (x) printf("pippo"); equivalenti
if annidati Le istruzioni che compaiono nell’if non sono soggette ad alcuna restrizione, per cui possono essere anch’esse if: if annidati
Ambiguità in caso di if annidati else è relativa al più vicino degli if che lo precedono che manchi dell’else
Ambiguità: esempio
Esercizi Cosa stampa? #include<stdio.h> main() { } int i=7, j=7; if (i==1) if (j==2) printf("%d\n", i+j); else printf("%d\n", i-j); printf("%d\n",i); }
Soluzione #include<stdio.h> main() { } int i=7, j=7; if (i==1) if (j==2) printf("%d\n", i+j); else printf("%d\n", i-j); printf("%d\n",i); } #include<stdio.h> main() { int i=7, j=7; if (i==1) if (j==2) printf("%d\n", i+j); else printf("%d\n", i-j); printf("%d\n",i); }
Esercizio Determinare l’output di ognuna delle seguenti istruzioni quando x vale 9 e y vale 11 x vale 11 e y vale 9 if (x<10) if (y>10) printf("*****\n"); else printf("#####\n"); printf("$$$$$\n");
Soluzione x vale 9 e y vale 11 ***** $$$$$ x vale 11 e y vale 9 if (x<10) if (y>10) printf("*****\n"); else printf("#####\n"); printf("$$$$$\n");
Esercizio Scrivere un programma che richiede in ingresso 2 valori interi e stampa il maggiore
Diagramma di flusso
Soluzione #include <stdio.h> main() { } int n1, n2; printf("Dammi 2 interi separati dallo spazio: \n"); scanf("%d", &n1); scanf("%d", &n2); if (n1>n2) printf("Il maggiore è: %d", n1); else printf("Il maggiore è: %d", n2); }
Esercizio Scrivere un programma che richieda in ingresso un valore intero e stampa "pari" se il numero è pari, "dispari" altrimenti Esempio 7 -> Il numero è dispari 90 -> Il numero è pari
Soluzione #include <stdio.h> main() { } int n; printf("Dammi un intero: \n"); scanf("%d", &n); if (n%2==0) printf("Il numero è pari"); else printf("Il numero è dispari"); }
Crittografia Una azienda vuole trasmettere dei dati sulla linea telefonica, ma i suoi responsabili sono preoccupati dal fatto che i propri telefoni potrebbero essere spiati. Tutti i loro dati sono trasmessi come interi di quattro cifre. Vi hanno quindi chiesto di scrivere un programma che crittografi i loro dati in modo che possano essere trasmessi con maggior sicurezza. Il vostro programma dovrà leggere un intero di 4 cifre e crittografarlo nel modo seguente: sostituite ogni cifra con la somma di quella cifra + 7 modulo 10. In seguito, scambiare la prima cifra con la terza e la seconda cifra con la quarta. Visualizzate quindi l'intero crittografato. Scrivere in programma a parte che prende in input un intero crittografato di 4 cifre e lo decifri, in modo fa formare il numero originale. Esempio: originale = 3219 e crittografato = 8609