Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi “La Sapienza” (lezioni 4 e 5) for, do..while, switch, problemi con le operazioni sui reali, debugging & test Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cicli controllati da contatore Abbiamo bisogno di – definire una variabile di controllo (contatore delle iterazioni) Associando una locazione di memoria alla variabile – inizializzare questa variabile eseguire il blocco di codice – Incrementare (o decrementare) la variabile di controllo ogni volta che viene eseguito il ciclo Abbiamo inoltre bisogno di una condizione di terminazione del ciclo che venga testata ad ogni iterazione. Solo se la condizione è vera verrà eseguita una nuova iterazione. Nelle scorse lezioni abbiamo visto il costrutto while… Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto for for (espressione 1; espressione 2; espressione 3) BLOCCO DI CODICE; Nome della variabile di controllo Es. La variabile for (contatore =1; contatore <=deve 10;comunque contatore ++) essere definita all’inizio del main printf (“%d \n”, contatore); /*stampa in linee successive i valori da 1 a 10 */ Inizializzazione della variabile di controllo Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto for for (espressione 1; espressione 2; espressione 3) BLOCCO DI CODICE; Es. Condizione di terminazione del ciclo for (contatore =1; contatore <= 10; contatore ++) printf (“%d \n”, contatore); Incremento della variabile di controllo /*stampa in linee successive i valori da 1 a 10 */ Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto for espressione 1 FALSA espressione 2 for (c =1; c <= 10; c++) printf (“%d \n”, c); VERA BLOCCO DI CODICE Cosa fa questo codice? espressione 3 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Confronto tra for e while for (espressione 1; espressione 2; espressione 3) BLOCCO DI CODICE; espressione 1; while (espressione 2) { BLOCCO DI CODICE; espressione 3; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 For … alcuni esempi Cicli annidati for (i=1; i<=DIM_LATO; i++) { Cosa fa questo ciclo? for (j=1; j <= DIM_LATO; j++) printf (“*”); ATTENZIONE ad -inizializzare correttamente la variabile di controllo printf (“\n”); -Ad usare l’operatore relazionale giusto (< oppure <= ?) Ad esempio se DIM_LATO Stampa quadrati di asterischi. } -A sceglierevale correttamente il valore finale 4: della variabile di controllo **** **** IN MODO DA**** ESEGUIRE IL NUMERO DI Prof.ssa Chiara Petrioli -- corso di UTERAZIONI CORRETTO **** programmazione 1, a.a. 2006/2007 Rappresentazione con diagramma ANNIDAMENTO DI di flusso 2 CICLI FOR espressione E’ possibile rappresentare espressione 1 il comportamento di q.siasi programma con diagrammi di flusso FALSA espressione 2 complessi Per problemi lo pseudocodice è tuttavia un VERA meccanismo piu’ efficace per progettare BLOCCO DI il programma 1 FALSA espressione 2 VERA 1 espressione CODICE Con il costrutto di sequenza, l’if ed il while 3è possibile espressione progettare q.siasi programma espressione 2 VERA FALSA BLOCCO DI CODICE espressione 3 CICLO FOR espressione 3 Esempi di uso del for … for (i=1; i <= 10; i++) printf(“%d \n”, i); Cosa stampa in output questo blocco di codice ? 1 2 3 4 5 6 7 8 9 10 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempi di uso del for … for (i=10; i > 0; i--) printf(“%d \n”, i); Cosa stampa in output questo blocco di codice ? 10 9 8 7 6 5 4 3 2 1 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempi di uso del for … for (i=8; i >=2 ; i-=2) printf(“%d \n”, i); Cosa stampa in output questo blocco di codice ? 8 6 4 2 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che consenta di stampare in output il tipo di figura riportata qui di seguito. Il numero di righe di ciascuna figura sarà inserito da input. * ** *** **** ***** Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { int righe, i, j; } printf(“Inserisci il numero di righe \n”); scanf (“%d”,&righe); printf(“FIGURA A: \n”); Inserisci il numero di righe 5 for (i=1; i<=righe; i++) FIGURA A: { * for (j=1; j<=i, j++); ** *** printf(“*”); **** printf (“\n”); ***** } return 0; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che consenta di stampare in output il tipo di figura riportata qui di seguito. Il numero di righe di ciascuna figura sarà inserito da input. ****** ***** **** *** ** * Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { int righe, i, j; } printf(“Inserisci il numero di righe \n”); scanf (“%d”,&righe); Inserisci il numero di righe printf(“FIGURA B: \n”); 5 for (i=0; i<righe; i++) FIGURA B: { ***** **** for (j=1; j<=righe - i, j++) *** printf(“*”); ** printf (“\n”); * } return 0; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che consenta di stampare in output il tipo di figura riportata qui di seguito. Il numero di righe di ciascuna figura sarà inserito da input. **** *** ** * Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { int righe, i, j; } printf(“Inserisci il numero di righe \n”); scanf (“%d”,&righe); printf(“FIGURA C: \n”); for (i=1; i<=righe; i++) { Inserisci il numero di righe for (j=1; j<=righe; j++); 5 { FIGURA C: if (j<i) ***** printf (“ ”); **** else *** printf(“*”); ** printf (“\n”); * } } return 0; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Una persona ‘investe’ 1000 euro in un conto corrente che ha l’1.5 % di interesse. Si scriva un programma che prenda come input un numero di anni n. Il programma calcolerà e stamperà quanti soldi saranno sul contocorrente dopo 1, 2, …, n anni (sotto l’ipotesi che non vengano mai prelevati soldi dal contocorrente). Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Generalizziamo Una persona ‘investe’ p euro in un conto corrente che ha l’r % di interesse. Si scriva un programma che prenda come input Dopo un anno la quanità disponibile sul conto è: un p* (1+r) numero di anni n. Il programma calcolerà Dopo due anni è pari a: sul soldi conto dopo un anno * (1+r) e stamperàQuantita quanti saranno sul = p * (1+r) * (1+r) p * 2, (1+r)…, n anni (sotto contocorrente dopo =1, l’ipotesi che FORMULA non vengano GENERALE.mai Dopo nprelevati anni p* (1+r) soldi dal conto corrente). 2 n Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione Pseudocodice – Inserisci da input i valori di n, p, r – Fino a quando non sono stati considerati tutti gli anni del piano di investimento aggiorna e stampa il valore a (soldi sul conto corrente) secondo la formula della slide precedente Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { float p,r; int n; int i; printf (“inserisci da input il numero di anni del piano di investimento \n”); scanf (“%d”, &n); printf (“inserisci da input i valori di p e r \n”); scanf (“%f”, &p); scanf (“%f”, &r); for (i=0; i<n; i++) { p=p*(1+r); printf (“quantità di denaro accumulata sul conto dopo %d anni: %f \n”, i, p); } return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Switch Un algoritmo può dover esaminare una espressione ed a secondo del suo valore effettuare azioni diverse. Si può esprimere con una serie di if In C esiste un costrutto apposito: switch Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 #include <stdio.h> int main() { Siintscriva un programma che prenda in input due x,y; char op; interi ed un operatore. Il programma stampa in printf (“inserisci i valori x e y \n”); output il valore dell’operazione sui due interi. scanf (“%d %d”, &x, &y) printf (“inserisci il simbolo dell’operatore \n”); scanf (“%c”,&op); Espressione di controllo switch (op) (il valore di questa espressione -costante intera- e’ confrontata { con le etichette dello switch) case ‘*’: printf (“%d \n”, x*y); break; etichetta case ‘+’: printf (“%d \n”, x+y); Si esce dallo switch break; case ‘/’: printf (“%d \n”, x/y); break; case ‘-’: printf (“%d \n”, x-y); break; default: printf (“operatore non valido \n”); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 return 0; Esercizio Costrutto switch Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che prenda da input una serie di voti di studenti (A,…,F), calcoli e stampi in output il numero di studenti che hanno preso A, B, C, …F. Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 #include <stdio.h> int main() Soluzione { int voto; int aCount, bCount, cCount, dCount, eCount, fCount; aCount= bCount= cCount= dCount= eCount= fCount=0; printf (“inserisci da input i voti, terminando con EOF \n”); while ((voto=getchar())!= EOF) { switch (voto) { L’istruzione voto=getchar () case ‘a’: L’istruzione di prende il prossimo carattere case ‘A’:aCount ++; break; assegnamento da input –tramite la funzione Controlla se l’ultimo carattere ha un valore case dato ‘b’: della libreria di I/O getchar()letto ++; è il carattere dal valore case ‘B’:bCount break; di End Of File assegnato alla case ‘c’: variabile a case ‘C’:cCount ++;ctrl break; return D Unix …… sinistra del = ctrl Z Windows e lo memorizza nella variabile voto Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Caratteri e interi I caratteri sono rappresentati con interi di un byte CODICE ASCII Un esempio: printf (“il carattere %c ha il valore %d”, x, x); Se x vale ‘a’ viene stampato a 97 Possono quindi essere memorizzati in variabili intere voto =getchar (); Soluzione case ‘d’: case ‘D’:dCount ++; break; case ‘e’: case ‘E’:eCount ++; break; case ‘f’: case ‘F’:fCount ++; break; } Inserisci da input i voti terminando con EOF } A printf (“num. b studenti voto A: %d”, aCount); C studenti voto B: %d”, bCount); printf (“num. a printf (“num. studenti voto C: %d”, cCount); E printf (“num. studenti D:2 %d”, dCount); Num studentvoto voto A: Num studentivoto voto E: B: 1%d”, eCount); printf (“num. studenti ….. printf (“num. studenti voto F: %d”, fCount); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Altri costrutti: do…while do { BLOCCO DI CODICE; } while (condizione); Il ciclo viene eseguito almeno una volta BLOCCO DI CODICE VERA condizione FALSA Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Break e continue L’istruzione break può essere usata per alterare il flusso di controllo di qualsiasi costrutto Possono aumentare l’efficienza vanno contro la filosofia della break in while, for,MAdo…while, switch – causa l’uscita for, do…while, Programmazione strutturata e aggiungono Complessità al programma immediata dal corpo del while, Cerchiamo di programmare pulito switch (uscita dal ciclo) non li voglio vedere usare a meno che sia necessario continue in while, for, do…while – salta le istruzioni successive del while, for, do..whilee passa ad eseguire la prossima iterazione del ciclo Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatori logici Fino ad ora abbiamo assunto di dover testare semplici condizioni esprimibili tramite operatori relazionali o di uguaglianza Cosa succede se dobbiamo testare più condizioni prima di prendere una decisione… 1° possibilità: if, if… else annidati 2° possibilità: esprimere direttamente con una sola espressione le condizioni che devono essere verificate perché venga effettuata una determinata azione l’espressione può essere espressa come combinazione, tramite operatori logici, di condizioni semplici (che abbiamo già imparato ad esprimere) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 OR, AND, NOT Tabelle di verità Op. binario x y T T F F T F T F Op binario x AND y x OR y in C: x &&y in C: x || y T T F T F T F F Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Op unario NOT x in C: !x F F T T Esempi if ((a>= inf_intervallo) && (a <=sup_intervallo)) printf (“il valore si trova nell’intervallo \n”); if ((superato_esonero_1 && superato_esonero_2) || superato_esame) printf (“ho passato l’esame di prog1 ! \n”); If (!(c==EOF)) if (c !=EOF) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Potenziali problemi confondere operatori di uguaglianza e assegnamento Tipo di errore: if (x==4) if (x=4) x = 17; x == 17 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Confondere operatori di uguaglianza e assegnamento 1° caso: volevamo scrivere if (x==4) printf (“BLABLABLA”); ma abbiamo scritto if (x=4) printf (“BLABLABLA”); Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Indipendentemente dal valore Soluzione: di x il valore dell’istruzione di scrivereè(4==x) assegnamento 4 (!=0, quindi se dimentichiamo un == TRUE) daràstampato un errore Viene(4=x) sempre di compilazione BLABLA ERRORE Confondere operatori di uguaglianza e assegnamento 2° caso: volevamo scrivere x=17; ma abbiamo scritto x==17; Nessun errore in fase di compilazione. Viene valutata l’espressione x==17. Tale espressione varrà true o false a seconda del valore di x: il suo valore non è usato. La variabile x continua a memorizzare il valore originale ERRATO Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori (sintesi) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007