INFORMATICA B Ingegneria Elettrica Le strutture di controllo
Selezione un esempio introduttivo Si disegni il diagramma di flusso di un algoritmo che chiede all utente un valore intero e visualizza il suo valore assoluto Inizio Leggi(valore) Vero valore < 0 Falso Selezione ass = - valore ass = valore Scrivi(ass) Fine 2
Selezione - if Le parole chiave if e else permettono di definire due cammini di esecuzione alternativi (è un costrutto di selezione) La condizione è una espressione logica che può essere vera o falsa Il <bloccoif> e il <bloccoelse> sono eseguiti in alternativa in base all esito della valutazione della condizione <istruzione> viene eseguita in ogni caso dopo if (<condizione>) { <bloccoif> else { <bloccoelse> <istruzione> vero bloccoif Condizione falso bloccoelse istruzione 3
Selezione un esempio introduttivo Si disegni il diagramma di flusso di un algoritmo che chiede all utente un valore intero e visualizza il suo valore assoluto Inizio Leggi(valore) Vero valore < 0 Falso ass = - valore ass = valore Scrivi(ass) void main() int valore, ass; scanf("%d ", &valore); if (valore < 0){ ass = - valore; else { ass = valore; printf("%d", ass); Fine 4
Selezione una soluzione alternativa Si disegni il diagramma di flusso di un algoritmo che chiede all utente un valore intero e visualizza il suo valore assoluto Inizio Leggi(valore) valore < 0 Vero valore= - valore Scrivi(valore) Falso void main() int valore; scanf("%d ", &valore); if (valore < 0){ valore = - valore; printf("%d", valore); Fine 5
Selezione - if Il blocco riferito al if è obbligatorio Il blocco riferito al else è opzionale if (<condizione>) { <bloccoif> <istruzione> vero bloccoif Condizione falso istruzione 6
Blocchi di istruzioni Un blocco di istruzioni è una successione di istruzioni racchiuse tra parentesi graffe { istruzione1; istruzione2;... istruzionen; Se <bloccoif> o <bloccoelse> contengono una sola istruzione non è necessario inserire le parentesi Queste regole valgono anche per i costrutti ciclici presentati di seguito 7
Indentazione del codice È necessario formattare correttamente (indentare) il codice per renderlo leggibile: Ogni volta che apriamo un nuovo blocco ci spostiamo verso destra di un livello di tabulazione Ogni volta che chiudiamo un blocco, riprendiamo a scrivere il successivo codice un livello più a sinistra if (condizione1){ istruzione1; istruzione2; if (codizione2){ istruzione3; istruzione4; istruzione5;... istruzionen; istruzionen1; L indentazione non influisce minimamente con la correttezza del programma realizzato 8
Selezione un altro esempio Scrivere un programma che acquisisce un intero che rappresenta un voto e stampa «grav. insuff.» se il voto è minore 10, «insuff.» se il voto è compreso tra 10 e 17 estremi inclusi, «suff.» se è compreso tra 18 e 24 estremi inclusi, «ottimo» se maggiore di 24 void main() int voto; scanf("%d ", &voto); if (voto < 10) printf("grav. insuff.\n"); else if (voto>=10 && voto<=17) printf("insuff.\n"); else if (voto>=18 && voto<=24) printf("suff.\n"); else printf("ottimo\n"); Possiamo concatenare più istruzioni if-else 9
Selezione - concatenare istruzioni if Possiamo scrivere altre istruzioni if all interno di entrambi i blocchi bloccoif e bloccoelse Possiamo concatenare un numero qualsivoglia di if-else Verrà eseguito solo il blocco di codice relativo alla prima condizione che risulta vera if (<condizione1>) { <bloccoif1> else if (<condizione2>) { <bloccoif2> else { <bloccoelse> <istruzione> La condizione2 è valutata solo se si entra nel ramo else del primo if (cioè se la condizione1 è falsa). 10
Selezione un altro esempio Scrivere un programma che acquisisce un intero che rappresenta un voto. Il programma prima verifica che il numero rappresenti un voto valido (un intero tra 0 e 30 estremi inclusi) e poi lo analizza come presentato nell esempio precedente. Altrimenti stampa un messaggio di errore void main() int voto; scanf("%d ", &voto); if (voto>=0 && voto <= 30){ if (voto<10) printf("grav. insuff.\n"); else if (voto>=10 && voto<=17) printf("insuff.\n"); else if (voto>=18 && voto<=24) else else printf("suff.\n"); printf("ottimo\n"); printf("voto non valido\n"); Possiamo annidate più istruzioni if-else una all interno dell altra 11
Condizioni In C i valori vero e falso sono espressi mediante valori interi 0 vuol dire falso Qualsiasi numero intero diverso da 0 vuol dire vero Operatori relazionali Operatori supportati: ==!= > < <= >= Restituiscono 0 (falso) o 1 (vero) Operatori logici Operatori supportati:! && Restituiscono 0 (falso) o 1 (vero) Attenzione a non confonderli con & e Esempio Il valore della variabile a deve essere compresa nell intervallo [0;10] a<=10 && a>=0 12
Condizioni Precedenza degli operatori Operatore Associatività () Da sinistra a destra! - Da destra a sinistra * / % Da sinistra a destra + - Da sinistra a destra > < <= >= Da sinistra a destra ==!= Da sinistra a destra && Da sinistra a destra Da sinistra a destra = Da destra a sinistra, Da sinistra a destra 13
Classici errori La condizione deve essere sempre racchiusa tra parentesi () L errore è sintattico e pertanto è rilevato a tempo di compilazione L istruzione if non deve terminare con il ; Se non c è la clausola else, non viene segnalato alcun errore sintattico È presente però un errore semantico visto che significa se la condizione è vera non fare nulla if (a<0); { a=-a;... Attenzione: non va messo il punto e virgola 14
Iterazione un esempio introduttivo Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero positivo o nullo, e calcola e visualizza il suo fattoriale Inizio Leggi(n) f = 1 Iterazione Vero f = f * n n > 0 Falso Scrivi(f) n = n - 1 Fine 15
Iterazione - while La parola chiave while permette di definire un ciclo a condizione iniziale Il blocco viene eseguito finché la condizione permane vera while (<condizione>) { <blocco di istruzioni> <istruzione>... Condizione Vero Falso Blocco Istruzione 16
Iterazione un esempio introduttivo Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero positivo o nullo, e calcola e visualizza il suo fattoriale Inizio void main() Leggi(n) int n, f; scanf("%d ", &n); f = 1 f = 1; Vero n > 0 Falso while (n > 0){ f = f * n; f = f * n Scrivi(f) n = n - 1; n = n - 1 Fine printf("%d", f); 17
Elementi di un costrutto ciclico Inizializzazione Le variabili interessate, e soprattutto quelle usate nella condizione del ciclo, devono essere inizializzate prima della valutazione della condizione Test Deve essere prevista una valutazione della condizione di permanenza nel ciclo, che determini la ripetizione o la terminazione del ciclo Aggiornamento Almeno una delle variabili della condizione deve essere modificata all interno del ciclo, in modo che prima o poi la condizione di ripetizione diventi falsa, causando la terminazione del ciclo 18
Iterazione un altro esempio Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero positivo e visualizza tutti i numeri da 0 al valore inserito Inizio Leggi(n) c = 0 Iterazione Vero Scrivi(c) c <= n Falso Fine c = c + 1 19
Iterazione una soluzione Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero positivo e visualizza tutti i numeri da 0 al valore inserito Vero Scrivi(c) c = c + 1 Inizio Leggi(n) c = 0 c <= n Falso Fine void main() int n, c; scanf("%d ", &n); c = 0; while(c <= n){ printf("%d ", c); c = c + 1; 20
Iterazione una soluzione Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero positivo e visualizza tutti i numeri da 0 al valore inserito Inizio Vero Scrivi(c) c = c + 1 Leggi(n) c = 0 c <= n Falso Fine void main() int n, c; scanf("%d ", &n); for(c = 0; c <= n; c = c + 1){ printf("%d ", c); 21
Iterazione - for inizializzazione test modifica for (c=0; c<=n; c=c+1) { printf("%d ", c); Blocco di istruzioni da eseguire ciclicamente Il blocco di istruzioni viene eseguito finché la condizione di test è vera 22
Iterazione - for for (inizializzazione; test; modifica) { <blocco di istruzioni> <istruzione>... inizializzazione Vero blocco modifica test Falso istruzione 23
Iterazione - for Anche il ciclo for è un costrutto ciclico a condizione iniziale Utilizzato ogni volta che è noto a priori il numero di cicli da eseguire (detto ciclo di conteggio) Nel while la condizione di uscita era dettata da una condizione generica Nel ciclo for la condizione di uscita predica su un contatore Il contatore è una variabile intera che memorizza il numero di volte che il ciclo è stato eseguito 24
Iterazione - for Gli elementi del ciclo for sono identici agli elementi di un costrutto ciclico generico ma sono applicati al contatore Inizializzazione: il contatore viene inizializzato Test: il contatore viene confrontato con il limite superiore (inferiore) Aggiornamento: il contatore viene incrementato (decrementato) Il costrutto for racchiude tutti e tre gli elementi for (inizializzazione; test; modifica) { <blocco di istruzioni> 25
Equivalenza tra for e while int c, n;... c = 0; while (c <= n) {... printf("%d ", c); c=c+c; int c, n;... for (c=0; c<=n; c=c+1) {... printf("%d ", c); 26
Autoincremento L istruzione i=i+1 può essere sostituita da i++; (autoincremento) L autoincremento vale solo per variabili intere e può essere espresso in due forme variabile++ (prima accedo alla variabile e poi incremento) ++variabile (prima incremento e poi accedo alla variabile) Sostituendo l operatore ++ con -- si ottiene l autodecremento 27
Autoincremento La differenza tra le due forme è evidente solo quando l autoincremento (autodecremento) è inserito in una espressione Esempio 1 a=5; b=a++;/* b vale 5 */ Esempio 2 a=5; b=++a;/* b vale 6 */ In ogni caso, utilizzare le operazioni di autoincremento (autodecremento) all interno di espressioni più complesse o assegnamenti è un cattiva pratica 28
Iterazione un altro esempio Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero e verifica se questo è positivo; in caso la condizione non sia verificata ripete l acquisizione. Una volta letto un valore valido, l algoritmo lo visualizza Inizio Iterazione Vero Leggi(n) n<=0 Falso Scrivi(n) Fine 29
Iterazione do-while Le parole chiave do e while permettono di definire un ciclo a condizione finale do{ <blocco> while (<condizione>); <istruzione>... Vero Blocco Condizione Falso Attenzione: Serve il punto e virgola per terminare l istruzione Istruzione 30
Iterazione un altro esempio Disegnare il diagramma di flusso di un algoritmo che acquisisce un numero intero e verifica se questo è positivo; in caso la condizione non sia verificata ripete l acquisizione. Una volta letto un valore valido, l algoritmo lo visualizza Vero Inizio Leggi(n) n<=0 Falso Scrivi(n) Fine void main() int n; do{ scanf("%d ", &n); while (n <= 0); printf("%d", n); 31
Combinazione di più costrutti I costrutti presentati possono essere combinati come presentato co i diagrammi di flusso Possiamo annidare un costrutto nel corpo di un altro costrutto Possiamo utilizzare più costrutti in sequenza nello stesso blocco di istruzioni... if (...){ do {... while(...); else { if(...){... else {... 32