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
Scarica

LEZ_4_5 - TWiki