Capitolo 4 (Deitel) Le strutture di controllo in C

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Programma: main() { istruzioni } ; assegnazione condizione ciclo istruzione: ;
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Iterazione while – do while - for.
Iterazione A. Ferrari.
PROGRAMMARE IN PASCAL (le basi)
3TC – 5/11/2010 Cicli while e do.. While Contatori e Totalizzatori.
Sviluppo di programmi strutturati
PHP.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F3 Iterazione.
Universita di Camerino
Informatica Generale Marzia Buscemi
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture di controllo Ing.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Strutture di controllo Ing. Simona Colucci.
Introduzione al linguaggio C
INFORMATICA Strutture iterative
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Iterazione enumerativa (for)
Linguaggio MATLAB: costrutti tipici (IF,WHILE…)
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione 1, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Corso di Informatica (Programmazione) Lezione 11 (19 novembre 2008) Programmazione in Java: controllo del flusso (iterazione)
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Programmazione Un programma descrive al computer, in estremo dettaglio, la sequenza di passi necessari a svolgere un particolare compito L’attività di.
Introduzione alla programmazione lll
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente) ITERAZIONE: ripetere piu volte una sequenza di operazioni istruzioni: for, while, do.
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
Istruzioni di ripetizione in Java
Selezione (=scelta) con “if-else”
Istruzioni Iterative Nicola Fanizzi
Strutture di controllo nel C
Java base II: Strutture di Controllo
2000 Prentice Hall, Inc. All rights reserved. Capitolo 3 (Deitel) Lo sviluppo di programmi strutturati Indice degli argomenti Introduzione 3.2 -
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
CODIFICA Da flow-chart a C++.
Lezione 6 Strutture di controllo Il condizionale
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Architettura degli Elaboratori II (canale P-Z) Istruzioni di controllo Dott. Franco Liberati.
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Parte 4 Elementi di Informatica di base
Laboratorio di Informatica1 Parte 4 Laboratorio di Informatica Dott.ssa Elisa Tiezzi Dott.ssa Elisa Mori.
14 marzo 2002 Avvisi:.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Programmazione Strutturata
Anno accademico Le istruzioni di controllo in C.
L’iterazione while La sintassi è la seguente: while (condizione) {
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
TURBOPASCAL L’iterazione - prof. V. Riboldi -.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Ottobre 2014.
Il ciclo while.  Permette di ripetere un blocco di istruzioni fino a quando non si verifica un determinato evento  Il ciclo while può essere realizzato.
Corso JAVA Lezione n° 03 Istituto Statale di Istruzione Superiore “F. Enriques”
Introduzione a Javascript
R 255 G 211 B 8 R 255 G 175 B 0 R 127 G 16 B 162 R 163 G 166 B 173 R 104 G 113 B 122 R 234 G 234 B 234 R 175 G 0 B 51 R 0 G 0 B 0 R 255 G 255 B 255 Supporting.
1 Università della Tuscia - Facoltà di Scienze Politiche.Informatica 2 - a.a Prof. Francesco Donini Istruzioni iterative For, while.
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
Diagrammi a blocchi.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Ciclo for nei linguaggi di programmazione. Nei linguaggi di programmazione, il ciclo for è una struttura di controllo iterativa che determina l'esecuzione.
Eprogram informatica V anno. Introduzione a PHP Introduzione La diffusione di PHP ha avuto un notevole incremento dalla fine degli anni Novanta a oggi,
Strutture di controllo
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 6 – Invariante.
Cicli e Array. 2 Costrutto while while(espressione) { … } Il codice dentro le parentesi graffe viene eseguito finché la condizione è vera Potrebbe non.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Capitolo 4 (Deitel) Le strutture di controllo in C Indice degli argomenti 4.1 - Introduzione 4.2 - Concetti di base sulle iterazioni 4.3 - Concetti di base sulle iterazioni controllate da contatore 4.4 - La struttura di iterazione for 4.5 - Costrutto for: note ed osservazioni 4.6 - Esempio di utilizzo del costrutto for 4.7 - La struttura di selezione multipla switch 4.8 - La struttura di iterazione do/while 4.9 - Le istruzioni break e continue 4.10 - Gli operatori logici 4.11 - Operatori di uguaglianza e assegnamento 4.12 - Riepilogo sulla programmazione strutturata

4.1 - 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 L’uscita 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

4.2 - 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 un’istruzione 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 dell’acquisizione 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.3 - Concetti di base sulle iterazioni controllate da contatore L’iterazione 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à l’uscita dal ciclo Stabilire entità dell’incremento (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++ L’istruzione 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

4.4 - La struttura di iterazione for (1/2) E’ un costrutto di iterazione che gestisce autonomamente tutti i dettagli di un’iterazione 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 l’ultima espressione

4.4 - 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 ); Nell’esempio la condizione di iterazione coinvolge due variabili, che sono inizializzate ed incrementate separatamente

4.5 - 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 ) L’incremento può essere negativo (decremento) Se la condizione di iterazione è inizialmente falsa Il corpo interno alla struttura for non viene eseguito (come col while) L’esecuzione 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 l’uso di questo tipo di istruzioni, perché potenzialmente possono generare errori logici molto difficili poi da trovare

4.5 - Costrutto for: note e osservazioni (2/2) L’incremento agisce come se fosse un’istruzione 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

4.6 - Esempio di utilizzo del costrutto for Programma per sommare i numeri pari da 2 a 100 Output del programma 1 /* Fig. 4.5: fig04_05.c 2 Somma con for */ 3 #include <stdio.h> 4 5 int main() 6 { 7 int somma = 0, numero; 8 9 for ( numero = 2; numero <= 100; numero += 2 ) 10 somma += numero; 11 12 printf( “La somma è %d\n", somma ); 13 14 return 0; 15 }   La somma è 2550

4.7 - La struttura di selezione multipla switch (1/5) 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: default: } 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 L’uso di istruzioni break; nel blocco di codice relativo ad una opzione consente l’uscita 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  

4.7 - 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 a break caso b azione del caso b caso z azione del caso z azione di default

4.7 - La struttura di selezione multipla switch (3/5) 1 /* Programma che conta i voti espressi tramite lettere */ 2 #include <stdio.h> 3 4 int 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 l’input.\n" ); 10 11 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 */ 1. Inizializza le variabili 2. Invita l’utente a inserire i dati 3. Usa una switch per aggiornare il contatore opportuno ad ogni giro del ciclo while 24 break;

4.7 - La struttura di selezione multipla switch (4/5) 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 un’altra lettera.\n" ); 33 break; 34 } 35 } 36 37 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 4. Output dei risultati

4.7 - La struttura di selezione multipla switch (5/5) Visualizzazione del programma Inserisci la lettera del voto. Digita il carattere di EOF per finire l’input. A B C D F E Hai inserito una lettera non corretta. Inserisci un’altra lettera. I totali per ogni voto in lettera sono: A: 3 B: 2 C: 3 D: 2 F: 1 getchar è la funzione C usata per acquisire in input un singolo carattere per volta e restituisce l’intero (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)

4.8 - 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 all’inizio 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)  

4.8 - 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

4.8 - 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 <stdio.h> 4 5 int main(){ 6 7 int counter = 1; 8 9 do { 10 printf( "%d ", counter ); 11 } while ( ++counter <= 10 ); 12 13 return 0; 14 } Inizializza il contatore 2. Ciclo di stampa Attenzione che counter++ <=10 avrebbe stampato anche 11 !!! Output del programma Esecuzione del programma 1 2 3 4 5 6 7 8 9 10

4.9 - Le istruzioni break e continue (1/2) Causa l’uscita immediata dalle strutture while, for, do/while o switch L’esecuzione del programma prosegue a partire dalla prima istruzione che segue sequenzialmente la fine della struttura di controllo Usi più comuni dell’istruzione break: Anticipare l’uscita 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 l’esecuzione dell’iterazione 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 l’istruzione continue è stata eseguita Nel caso di cicli for Prima si esegue l’incremento del contatore, poi viene valutata la condizione di iterazione per la ripetizione del ciclo

4.9 - Le istruzioni break e continue (2/2) 1 /* Fig. 4.12: fig04_12.c 2 Uso dell’istruzione continue in una struttura */ 3 #include <stdio.h> 4 5 int main(){ 6 int x; 7 8 for ( x = 1; x <= 10; x++ ) { 9 10 if ( x == 5 ) /* salta la printf per l’iterazione */ 11 continue; /* corrente se x == 5 */ 12 13 printf( "%d ", x ); 14 } 15 16 printf( "\nSi usa continue per saltare la stampa del 5\n" ); 17 return 0; 18 } Definisce il contatore 2. Ciclo di stampa Esecuzione del programma Esecuzione del programma 1 2 3 4 6 7 8 9 10 Si usa continue per saltare la stampa del 5

4.10 - 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à d’esecuzione maggiore rispetto all’operatore 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

4.11 - Operatori di uguaglianza e assegnamento (1/2) 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é l’espressione vale VERO L’errore è logico, non di sintassi Il programma funziona male ma va

4.11 - Operatori di uguaglianza e assegnamento (2/2) In C gli assegnamenti producono sempre un valore Tale valore viene assegnato alla variabile a sinistra dell’operatore (=) lvalues Sono le espressioni che possono apparire a sinistra dell’operatore di assegnamento Il loro valore può cambiare durante l’esecuzione del programma Generalmente sono nomi di variabili x = 4; rvalues Sono le espressioni che possono apparire a destra dell’operatore 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;

4.12 - Riepilogo sulla programmazione strutturata (1/6) 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    

4.12 - Riepilogo sulla programmazione strutturata (2/6) Regola 2 – Qualsiasi rettangolo può essere sostituito da 2 rettangoli in sequenza Regola 1 – Iniziare con il più semplice diagramma di flusso . Regola 2

4.12 - Riepilogo sulla programmazione strutturata (3/6) Regola 3 – Qualsiasi rettangolo può essere sostituito con una qualsiasi struttura di controllo Regola 3

4.12 - 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

4.12 - Riepilogo sulla programmazione strutturata (5/6) Vero Falso SELEZIONE IF SEQUENZA Vero Falso SELEZIONE IF/ELSE

4.12 - Riepilogo sulla programmazione strutturata (6/6) Vero Falso ITERAZIONE WHILE o FOR break Vero Falso SELEZIONE SWITCH ITERAZIONE DO/WHILE Vero Falso