La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

2000 Prentice Hall, Inc. All rights reserved. Capitolo 4 (Deitel) Le strutture di controllo in C Indice degli argomenti 4.1 - Introduzione 4.2 - Concetti.

Presentazioni simili


Presentazione sul tema: "2000 Prentice Hall, Inc. All rights reserved. Capitolo 4 (Deitel) Le strutture di controllo in C Indice degli argomenti 4.1 - Introduzione 4.2 - Concetti."— Transcript della presentazione:

1 2000 Prentice Hall, Inc. All rights reserved. Capitolo 4 (Deitel) Le strutture di controllo in C Indice degli argomenti Introduzione Concetti di base sulle iterazioni Concetti di base sulle iterazioni controllate da contatore La struttura di iterazione for Costrutto for: note ed osservazioni Esempio di utilizzo del costrutto for La struttura di selezione multipla switch La struttura di iterazione do/while Le istruzioni break e continue Gli operatori logici Operatori di uguaglianza e assegnamento Riepilogo sulla programmazione strutturata

2 2000 Prentice Hall, Inc. All rights reserved Introduzione Si suppone che chi affronta questo capitolo sia ormai in grado di scrivere con agio dei semplici programmi in C Questo capitolo introduce: –Una visione più dettagliata delle strutture di controllo Nuovi costrutti iterativi: for e do/while Il costrutto di scelta multipla: switch Luscita rapida da una struttura di controllo: break Come saltare uno o più giri di un ciclo: continue –Gli operatori logici per combinare varie condizioni –I principi fondamentali sulla programmazione strutturata

3 2000 Prentice Hall, Inc. All rights reserved Concetti di base sulle iterazioni Ciclo (Loop) –E costituito da un blocco di istruzioni che il computer esegue ripetutamente finché una certa condizione resta vera –Esistono principalmente due modi per controllare un ciclo Iterazione controllata da un contatore –Il numero di ripetizioni del ciclo è ben definito e noto a priori –Sfrutta una variabile di controllo per contare il numero di iterazioni –Usare il costrutto while è un pò macchinoso Serve unistruzione apposita nel corpo del ciclo per incrementare il contatore Il C offre una struttura iterativa più compatta: for Iterazione controllate da un valore sentinella (flag) –Il numero di ripetizioni del ciclo è indefinito e non noto a priori –Il valore sentinella indica la fine della sequenza di iterazioni Generalmente coincide con la fine dellacquisizione dei dati –Il costrutto while spesso non è proprio adatto ai problemi normali In genere almeno un giro del ciclo va sempre eseguito Per fare ciò, il blocco di istruzioni nel ciclo va replicato fuori (prima del ciclo) Il C offre una struttura iterativa più adatta allo scopo: do/while

4 2000 Prentice Hall, Inc. All rights reserved Concetti di base sulle iterazioni controllate da contatore Literazione controllata da un contatore richiede di: –Definire una variabile di controllo (contatore del ciclo) e darle un nome –Specificare il valore iniziale della variabile di controllo (inizializzarla) –Fornire la condizione che testa il valore della variabile di controllo ad ogni ripetizione del ciclo, in attesa che essa assuma il valore finale Ovvero, quello che determinerà luscita dal ciclo –Stabilire entità dellincremento (o decremento) con cui la variabile di controllo sarà modificata ad ogni ripetizione del ciclo Esempio: int counter = 1; //inizializzazione while (counter <= 10){ //condizione di iterazione printf( "%d\n", counter ); ++counter; //incremento del contatore } //equivalente a counter++ –Listruzione int counter = 1; Assegna il nome counter alla variabile di controllo La dichiara di tipo intero (altri tipi non hanno senso) Le riserva uno spazio in memoria La inizializza con valore pari a 1

5 2000 Prentice Hall, Inc. All rights reserved La struttura di iterazione for (1/2) E un costrutto di iterazione che gestisce autonomamente tutti i dettagli di uniterazione controllata da contatore Formato di un ciclo for for ( inizializzazione ; condizione di iterazione ; incremento ) istruzione Esempio: for( int counter = 1; counter <= 10; counter++ ) printf( "%d\n", counter ); –Questo ciclo di esempio stampa gli interi da 1 a 10 –Il valore iniziale del contatore è 1, il valore finale è 10 –for è una parola riservata del linguaggio C, come while –Nella pratica il ciclo comprende più istruzioni da eseguire In tal caso il blocco di istruzioni va incluso tra { }, come per il while Non usare il punto e virgola dopo lultima espressione

6 2000 Prentice Hall, Inc. All rights reserved La struttura di iterazione for (2/2) Ogni ciclo for solitamente può essere riscritto tramite un ciclo while equivalente e viceversa: inizializzazione ; while ( condizione di iterazione ){ istruzione incremento; } –Tuttavia for è un costrutto più compatto ed elegante di while –Se la variabile contatore non ha altri usi nel programma è meglio usare for Inizializzazione ed incremento –Possono essere liste di istruzioni separate da virgole –Esempio: for (int i = 0, j = 0; j + i <= 10; j++, i++) printf( "%d\n", j + i ); –Nellesempio la condizione di iterazione coinvolge due variabili, che sono inizializzate ed incrementate separatamente

7 2000 Prentice Hall, Inc. All rights reserved Costrutto for : note e osservazioni (1/2) Espressioni aritmetiche –Inizializzazione, condizione di iterazione e incremento possono contenere espressioni aritmetiche –Se ad un certo punto di un programma x = 2 e y = 10, allora for ( j = x; j <= 4 * x * y; j += y / x ) è equivalente a scrivere for ( j = 2; j <= 80; j += 5 ) Lincremento può essere negativo (decremento) Se la condizione di iterazione è inizialmente falsa –Il corpo interno alla struttura for non viene eseguito (come col while) –Lesecuzione procede dalla prima istruzione successiva alla struttura for La variabile di controllo spesso viene usata e/o stampata a video nel corpo del ciclo, ma non è indispensabile –Il suo valore può anche essere modificato in itinere da altre istruzioni presenti nel corpo del ciclo –Meglio evitare luso di questo tipo di istruzioni, perché potenzialmente possono generare errori logici molto difficili poi da trovare

8 2000 Prentice Hall, Inc. All rights reserved Costrutto for : note e osservazioni (2/2) Lincremento agisce come se fosse unistruzione posta in coda al corpo della for –Quindi le seguenti espressioni di incremento sono equivalenti counter = counter +1 | counter += 1 | counter++ | ++counter Il diagramma di flusso for e while sono uguali

9 2000 Prentice Hall, Inc. All rights reserved Esempio di utilizzo del costrutto for 1/* Fig. 4.5: fig04_05.c 2 Somma con for */ 3#include 4 5int main() 6{6{ 7 int somma = 0, numero; 8 9 for ( numero = 2; numero <= 100; numero += 2 ) 10 somma += numero; printf( La somma è %d\n", somma ); return 0; 15} La somma è 2550 Programma per sommare i numeri pari da 2 a 100 Output del programma

10 2000 Prentice Hall, Inc. All rights reserved La struttura di selezione multipla switch (1/5) switch –Torna utile quando una variabile o espressione deve essere confrontata con molteplici (o tutti i) possibili valori che può assumere –A seconda del valore assunto, vengono intraprese azioni differenti Formato di una selezione switch switch ( value ){ case 1: istruzioni case 2: istruzioni default: istruzioni } –La variabile o espressione da testare sta tra le ( ) che seguono switch –Prevede una sequenza di etichette case più una di default (opzionale) –Ogni case può contenere una o più azioni, ma le { } non sono necessarie –Luso di istruzioni break; nel blocco di codice relativo ad una opzione consente luscita immediata dalla struttura di controllo Vanno messe in coda ad ogni blocco per evitare di eseguire anche gli altri –default serve ad indicare cosa fare se nessun altro case va a buon fine

11 2000 Prentice Hall, Inc. All rights reserved La struttura di selezione multipla switch (2/5) Nota: –Switch può solo testare una variabile o espressione che assume valori interi (es. 1, senza apici) o costanti di carattere (es. A, tra apici) Diagramma di flusso di switch vero falso..... caso a azione del caso abreak caso b azione del caso bbreak falso caso z azione del caso zbreak vero azione di default

12 2000 Prentice Hall, Inc. All rights reserved La struttura di selezione multipla switch (3/5) 1/* Programma che conta i voti espressi tramite lettere */ 2#include 3 4int main(){ 5 int grade; 6 int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0; 7 8 printf( Inserisci la lettera del voto.\n" ); 9 printf( Digita il carattere di EOF per finire linput.\n" ); while ( ( grade = getchar() ) != EOF ){ 12 switch ( grade ){ /* switch nidificato nel while */ 13 case 'A': case 'a': /* il voto è una A maiuscola */ 14 ++aCount; /* o una a minuscola */ 15 break; 16 case 'B': case 'b': /* il voto è una B maiuscola */ 17 ++bCount; /* o una b minuscola */ 18 break; 19 case 'C': case 'c': /* il voto è una C maiuscola */ 20 ++cCount; /* o una c minuscola */ 21 break; 22 case 'D': case 'd': /* il voto è una D maiuscola */ 23 ++dCount; /* o una d minuscola */ 24 break; 1. Inizializza le variabili 2. Invita lutente a inserire i dati 3. Usa una switch per aggiornare il contatore opportuno ad ogni giro del ciclo while

13 2000 Prentice Hall, Inc. All rights reserved La struttura di selezione multipla switch (4/5) 4. Output dei risultati 25 case 'F': case 'f': /* il voto era una F maiuscola */ 26 ++fCount; /* o una f minuscola */ 27 break; 28 case '\n': case' ': /* ignora i caratteri vuoti */ 29 break; 30 default: /* respinge tutti gli altri caratteri */ 31 printf( Hai inserito una lettera non corretta." ); 32 printf( " Inserisci unaltra lettera.\n" ); 33 break; 34 } 35 } printf( "\nI totali per ogni voto in lettera sono:\n" ); 38 printf( "A: %d\n", aCount ); 39 printf( "B: %d\n", bCount ); 40 printf( "C: %d\n", cCount ); 41 printf( "D: %d\n", dCount ); 42 printf( "F: %d\n", fCount ); 44 return 0; 45} 43

14 2000 Prentice Hall, Inc. All rights reserved La struttura di selezione multipla switch (5/5) Inserisci la lettera del voto. Digita il carattere di EOF per finire linput. A B C A D F C E Hai inserito una lettera non corretta. Inserisci unaltra lettera. D A B I totali per ogni voto in lettera sono : A: 3 B: 2 C: 3 D: 2 F: 1 Visualizzazione del programma –getchar è la funzione C usata per acquisire in input un singolo carattere per volta e restituisce lintero (convertito) corrispondente a quel carattere. –Tale intero può essere confrontato con interi o caratteri equivalenti (messi tra apici) –Il carattere EOF di fine acquisizione dati è CTRL-Z in windows e CTRL-D in linux –Per eseguire le stesse azioni per vari case, si scrivono una volta sola (riunendo i case)

15 2000 Prentice Hall, Inc. All rights reserved La struttura di iterazione do/while (1/3) Il costrutto di iterazione do/while –E molto simile alla struttura while –Nel while, la condizione di iterazione viene controlla allinizio del ciclo, cioè prima che siano eseguite le istruzioni che compongono il ciclo Se la condizione è inizialmente falsa, le azioni non sono mai eseguite –Nel do/while, la condizione di iterazione viene controllata a fine ciclo, cioè dopo aver eseguito le istruzioni che compongono il ciclo Tutte le azioni sono eseguite comunque almeno una volta Formato di do/while : do{ istruzione } while ( condizione ); –È buona norma mettere sempre le { } anche quando il corpo del ciclo è composto da una sola istruzione (non sono realmente necessarie)

16 2000 Prentice Hall, Inc. All rights reserved La struttura di iterazione do/while (2/3) Esempio (supponendo che counter = 1 ) do { printf( "%d ", counter ); } while (++counter <= 10); –Stampa gli interi da 1 a 10 Diagramma di flusso vera falsa Azione/i condizione - Nel while il rombo anticipava il rettangolo - Nel do/while il rettangolo anticipa il rombo

17 2000 Prentice Hall, Inc. All rights reserved La struttura di iterazione do/while (3/3) 1/* Fig. 4.9: fig04_09.c 2 Usare la struttura di iterazione do/while */ 3#include 4 5int main(){ 6 7 int counter = 1; 8 9 do { 10 printf( "%d ", counter ); 11 } while ( ++counter <= 10 ); return 0; 14} Inizializza il contatore 2. Ciclo di stampa Attenzione che counter++ <=10 avrebbe stampato anche 11 !!! Output del programma Esecuzione del programma

18 2000 Prentice Hall, Inc. All rights reserved Le istruzioni break e continue (1/2) break –Causa luscita immediata dalle strutture while, for, do/while o switch –Lesecuzione del programma prosegue a partire dalla prima istruzione che segue sequenzialmente la fine della struttura di controllo –Usi più comuni dellistruzione break : Anticipare luscita da un ciclo (uscita rapida) Saltare tutti gli altri case una switch continue –Salta le tutte le rimanenti istruzioni del corpo di una struttura iterativa Si usa con while, for o do/while Procede con lesecuzione delliterazione successiva del medesimo ciclo –Nel caso di cicli while o do/while La condizione di iterazione per la ripetizione del ciclo viene valutata immediatamente dopo che listruzione continue è stata eseguita –Nel caso di cicli for Prima si esegue lincremento del contatore, poi viene valutata la condizione di iterazione per la ripetizione del ciclo

19 2000 Prentice Hall, Inc. All rights reserved Le istruzioni break e continue (2/2) 1/* Fig. 4.12: fig04_12.c 2 Uso dellistruzione continue in una struttura */ 3#include 4 5int main(){ 6 int x; 7 8 for ( x = 1; x <= 10; x++ ) { 9 10 if ( x == 5 ) /* salta la printf per literazione */ 11 continue; /* corrente se x == 5 */ printf( "%d ", x ); 14 } printf( "\nSi usa continue per saltare la stampa del 5\n" ); 17 return 0; 18} 1. Definisce il contatore 2. Ciclo di stampa Esecuzione del programma Esecuzione del programma Si usa continue per saltare la stampa del 5

20 2000 Prentice Hall, Inc. All rights reserved Gli operatori logici Sono usati per costruire condizioni complesse combinando espressioni semplici && ( AND logico) –Restituisce vero solo se entrambe le condizioni sono vere –Ha priorità desecuzione maggiore rispetto alloperatore OR || (OR logico) –Restituisce vero se almeno una delle sue condizioni è vera ! (NOT logico, negazione logica) –Inverte la veridicità/falsità della condizione a cui è applicato –E un operatore unario, cioè ammette un solo operando Sono molto utili per esprimere le condizioni di iterazione Espressione1 Espressione2 Risultato vero && falso falso vero || falso vero !falso vero

21 2000 Prentice Hall, Inc. All rights reserved Operatori di uguaglianza e assegnamento (1/2) Uguaglianza (==) e assegnamento (=) –Confondere i due operatori può causare gravi errori –Anche se solitamente confonderli non causa errori di sintassi, ma logici –Ogni espressione che restituisce un valore può essere utilizzata come condizione in una struttura di controllo Se assume valori diversi allora la condizione è vera, altrimenti è falsa Esempio di scambio tra i due operatori: if( payCode == 4 ) if( payCode = 4 ) printf(Hai un bonus!\n"); printf(Hai un bonus!\n"); Controlla il valore di payCode Se vale 4, stampa Hai un bonus Assegna a payCode il valore 4 Dato che 4 è un valore non nullo, stampa comunque Hai un bonus perché lespressione vale VERO Lerrore è logico, non di sintassi Il programma funziona male ma va

22 2000 Prentice Hall, Inc. All rights reserved Operatori di uguaglianza e assegnamento (2/2) In C gli assegnamenti producono sempre un valore –Tale valore viene assegnato alla variabile a sinistra delloperatore (=) lvalues –Sono le espressioni che possono apparire a sinistra delloperatore di assegnamento –Il loro valore può cambiare durante lesecuzione del programma –Generalmente sono nomi di variabili x = 4; rvalues –Sono le espressioni che possono apparire a destra delloperatore di assegnamento –Possono essere anche delle costanti, cioè numeri Ma assolutamente non si può scrivere 4 = x; –Gli lvalues possono essere usati come rvalues, ma mai viceversa y = x;

23 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (1/6) Programmazione strutturata –Rende più semplice capire, testare, debuggare e modificare i programmi rispetto alla programmazione non strutturata Regole della programmazione strutturata –Sono state sviluppate dalla comunità dei programmatori –Fanno uso solo di strutture di controllo del tipo single-entry/single-exit –Regole: 1) Iniziare con il diagramma di flusso elementare, il più semplice (del top) 2) Ogni rettangolo (azione) può essere sostituito da due rettangoli in sequenza 3) Ogni rettangolo (azione) può essere sostituito da una qualsiasi struttura di controllo (sequenza, if, if/else, switch, while, do/while o for ) 4) Le regole 2 e 3 possono essere applicate in qualunque ordine e più volte

24 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (2/6) Regola 2 Regola 1 – Iniziare con il più semplice diagramma di flusso Regola 2 – Qualsiasi rettangolo può essere sostituito da 2 rettangoli in sequenza

25 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (3/6) Regola 3 Regola 3 – Qualsiasi rettangolo può essere sostituito con una qualsiasi struttura di controllo

26 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (4/6) Tutti i programmi possono essere scomposti in 3 parti: Sequenza - banale perchè attuata automaticamente dal compilatore Selezione - if, if/else, o switch Ripetizione - while, do/while, o for –Ogni selezione può essere riscritta con il costrutto if e ogni iterazione può essere riscritta con il costrutto while Quindi tutti i programmi si possono ridurre a: –Sequenze –Strutture if (selezione) –Strutture while (ripetizione) –Queste strutture di controllo possono essere combinate solo in due modi, annidandole (regola 3) e mettendole in sequenza (regola 2) –Tutto ciò promuove la semplicità della programmazione strutturata

27 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (5/6) SEQUENZA VeroFalso SELEZIONE IF/ELSE Vero Falso SELEZIONE IF

28 2000 Prentice Hall, Inc. All rights reserved Riepilogo sulla programmazione strutturata (6/6) break Vero Falso break Vero Falso break Vero Falso SELEZIONE SWITCH Vero Falso ITERAZIONE WHILE o FOR ITERAZIONE DO/WHILE Vero Falso


Scaricare ppt "2000 Prentice Hall, Inc. All rights reserved. Capitolo 4 (Deitel) Le strutture di controllo in C Indice degli argomenti 4.1 - Introduzione 4.2 - Concetti."

Presentazioni simili


Annunci Google