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 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) – inizializzare questa variabile eseguire il blocco di codice 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. Associando una locazione di memoria alla variabile 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; Es. for (contatore =1; contatore <= 10; contatore ++) printf (%d \n, contatore); /*stampa in linee successive i valori da 1 a 10 */ Nome della variabile di controllo Inizializzazione della variabile di controllo La variabile deve comunque essere definita allinizio del main
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. for (contatore =1; contatore <= 10; contatore ++) printf (%d \n, contatore); /*stampa in linee successive i valori da 1 a 10 */ Condizione di terminazione del ciclo Incremento della variabile di controllo
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto for VERA BLOCCO DI CODICE espressione 2 FALSA espressione 1 espressione 3 for (c =1; c <= 10; c++) printf (%d \n, c); Cosa fa questo codice?
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++) { for (j=1; j <= DIM_LATO; j++) printf (*); printf (\n); } Cosa fa questo ciclo? Stampa quadrati di asterischi. Ad esempio se DIM_LATO vale 4: **** ATTENZIONE ad -inizializzare correttamente la variabile di controllo -Ad usare loperatore relazionale giusto (< oppure <= ?) -A scegliere correttamente il valore finale della variabile di controllo IN MODO DA ESEGUIRE IL NUMERO DI UTERAZIONI CORRETTO
Rappresentazione con diagramma di flusso VERA BLOCCO DI CODICE espressione 2 FALSA espressione 1 espressione 3 CICLO FOR VERA espressione 2 FALSA espressione 1 espressione 3 VERA BLOCCO DI CODICE espressione 2 espressione 1 espressione 3 FALSA ANNIDAMENTO DI 2 CICLI FOR E possibile rappresentare il comportamento di q.siasi programma con diagrammi di flusso Per problemi complessi lo pseudocodice è tuttavia un meccanismo piu efficace per progettare il programma Con il costrutto di sequenza, lif ed il while è possibile progettare q.siasi programma
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempi di uso del for … for (i=1; i <= 10; i++) printf(%d \n, i); Cosa stampa in output questo blocco di codice ?
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 ?
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 ?
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/2007Soluzione #include #include int main() { int righe, i, j; printf(Inserisci il numero di righe \n); scanf (%d,&righe); printf(FIGURA A: \n); for (i=1; i<=righe; i++) { for (j=1; j<=i, j++); printf(*); printf (\n); } return 0; } Inserisci il numero di righe 5 FIGURA A: * ** *** **** *****
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/2007Soluzione #include #include int main() { int righe, i, j; printf(Inserisci il numero di righe \n); scanf (%d,&righe); printf(FIGURA B: \n); for (i=0; i<righe; i++) { for (j=1; j<=righe - i, j++) printf(*); printf (\n); } return 0; } Inserisci il numero di righe 5 FIGURA B: ***** **** *** ** *
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/2007Soluzione #include #include 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++) { for (j=1; j<=righe; j++); { if (j<i) printf ( ); elseprintf(*); printf (\n); }} return 0; } Inserisci il numero di righe 5 FIGURA C: ***** **** *** ** *
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Una persona investe 1000 euro in un conto corrente che ha l1.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 lipotesi 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 lr % 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 lipotesi che non vengano mai prelevati soldi dal conto corrente). Dopo un anno la quanità disponibile sul conto è: p* (1+r) Dopo due anni è pari a: Quantita sul conto dopo un anno * (1+r) = p * (1+r) * (1+r) = p * (1+r) 2 FORMULA GENERALE. Dopo n anni p* (1+r) 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 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/2007Soluzione #include #include 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 Esercizio Si scriva un programma che prenda in input due interi ed un operatore. Il programma stampa in output il valore delloperazione sui due interi. #include #include int main() { int x,y; char op; printf (inserisci i valori x e y \n); scanf (%d %d, &x, &y) printf (inserisci il simbolo delloperatore \n); scanf (%c,&op); switch (op) switch (op){ case *: printf (%d \n, x*y); break; break; case +: printf (%d \n, x+y); break; break; case /: printf (%d \n, x/y); break; break; case -: printf (%d \n, x-y); break; break; default: printf (operatore non valido \n); } return 0; } Espressione di controllo (il valore di questa espressione -costante intera- e confrontata con le etichette dello switch) etichetta Si esce dallo switch
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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/2007Soluzione #include #include int main() { int voto; int aCount, bCount, cCount, dCount, eCount, fCount; aCount= bCount= cCount= dCount= eCount= fCount=0; aCount= bCount= cCount= dCount= eCount= fCount=0; printf (inserisci da input i voti, terminando con EOF \n); while ((voto=getchar())!= EOF) { switch (voto) { case a: case A:aCount ++; break; case b: case B:bCount ++; break; case c: case C:cCount ++; break; …… Listruzione voto=getchar () prende il prossimo carattere da input –tramite la funzione della libreria di I/O getchar()- e lo memorizza nella variabile voto Listruzione di assegnamento ha un valore dato dal valore assegnato alla variabile a sinistra del = Controlla se lultimo carattere letto è il carattere di End Of File return ctrl D Unix ctrl Z Windows
Caratteri e interi I caratteri sono rappresentati con interi di un byte CODICE ASCII Possono quindi essere memorizzati in variabili intere voto =getchar (); Un esempio: printf (il carattere %c ha il valore %d, x, x); Se x vale a viene stampato a 97
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione case d: case D:dCount ++; break; case e: case E:eCount ++; break; case f: case F:fCount ++; break; }} printf (num. studenti voto A: %d, aCount); printf (num. studenti voto B: %d, bCount); printf (num. studenti voto C: %d, cCount); printf (num. studenti voto D: %d, dCount); printf (num. studenti voto E: %d, eCount); printf (num. studenti voto F: %d, fCount); return 0; } Inserisci da input i voti terminando con EOF A b C a E Num student voto A: 2 Num studenti voto B: 1 …..
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 VERA BLOCCO DI CODICE condizione FALSA
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Break e continue Listruzione break può essere usata per alterare il flusso di controllo di qualsiasi costrutto break in while, for, do…while, switch break in while, for, do…while, switch – causa luscita immediata dal corpo del while, for, do…while, switch (uscita dal ciclo) continue in while, for, do…while – salta le istruzioni successive del while, for, do..whilee passa ad eseguire la prossima iterazione del ciclo Possono aumentare lefficienza MA vanno contro la filosofia della Programmazione strutturata e aggiungono Complessità al programma Cerchiamo di programmare pulito non li voglio vedere usare a meno che sia necessario
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 lespressione 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à x yx AND y x OR y NOT x in C: x &&y in C: x || y in C: !x in C: x &&y in C: x || y in C: !x T T TTF T F FTF F T FTT F F FFT Op. binario Op binario Op unario
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempi if ((a>= inf_intervallo) && (a = inf_intervallo) && (a <=sup_intervallo)) printf (il valore si trova nellintervallo \n); if ((superato_esonero_1 && superato_esonero_2) || superato_esame) printf (ho passato lesame 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 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); Indipendentemente dal valore di x il valore dellistruzione di assegnamento è 4 (!=0, quindi TRUE) Viene sempre stampato BLABLA ERRORE Soluzione: scrivere (4==x) se dimentichiamo un == (4=x) darà un errore di compilazione
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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 lespressione 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 Nessun errore in fase di compilazione. Viene valutata lespressione 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)