Lucidi - Vincenzo Marra - Università degli Studi di Milano

Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Programmazione 1
Lezione 5
Vincenzo Marra
vincenzo.marra@unimi.it
Dipartimento di Matematica Federigo Enriques
Università degli Studi di Milano
2 aprile 2014
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Incrementi e decrementi
È comune l’uso dell’istruzione di post-incremento:
i++;
dove i è, per esempio, una variabile di tipo int.
(?)
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Incrementi e decrementi
È comune l’uso dell’istruzione di post-incremento:
i++;
dove i è, per esempio, una variabile di tipo int.
L’effetto dell’istruzione è di incrementare il valore di i
di uno. Per esempio, se i vale 5, dopo l’istruzione (?) il
valore di i è 6.
(?)
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Incrementi e decrementi
È comune l’uso dell’istruzione di post-incremento:
i++;
(?)
dove i è, per esempio, una variabile di tipo int.
L’effetto dell’istruzione è di incrementare il valore di i
di uno. Per esempio, se i vale 5, dopo l’istruzione (?) il
valore di i è 6.
È possibile anche l’uso dell’istruzione di pre-incremento:
++i;
che ha lo stesso effetto di (?), ma con una importante
differenza nella semantica.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
In una espressione composta in cui compaia il post-incremento:
i++
prima si usa il valore della variabile i e poi lo si incrementa di uno.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
In una espressione composta in cui compaia il post-incremento:
i++
prima si usa il valore della variabile i e poi lo si incrementa di uno.
In una espressione composta in cui compaia il pre-incremento:
++i
prima si incrementa il valore della variabile di uno, e poi si
usa il valore risultante.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
In una espressione composta in cui compaia il post-incremento:
i++
prima si usa il valore della variabile i e poi lo si incrementa di uno.
In una espressione composta in cui compaia il pre-incremento:
++i
prima si incrementa il valore della variabile di uno, e poi si
usa il valore risultante.
Per esempio, se i vale 5, dopo l’istruzione:
int x = i++;
x vale 5. Invece, dopo l’istruzione
int x = ++i;
x vale 6. In entrambi i casi i varrà 6 dopo l’istruzione.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
In una espressione composta in cui compaia il post-incremento:
i++
prima si usa il valore della variabile i e poi lo si incrementa di uno.
In una espressione composta in cui compaia il pre-incremento:
++i
prima si incrementa il valore della variabile di uno, e poi si
usa il valore risultante.
Per esempio, se i vale 5, dopo l’istruzione:
int x = i++;
x vale 5. Invece, dopo l’istruzione
int x = ++i;
x vale 6. In entrambi i casi i varrà 6 dopo l’istruzione.
Considerazioni analoghe valgono per gli operatori di predecremento: --i e di post-decremento: i--.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
È diffuso l’uso degli operatori ++ e -- assieme all’istruzione
for.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
È diffuso l’uso degli operatori ++ e -- assieme all’istruzione
for.
Supponiamo ad esempio di voler visualizzare i primi 100
numeri naturali in ordine crescente. Possiamo scrivere:
for(int i=1; i<=100; i++)
printf("%d",i);
Se invece volessimo visualizzare i primi 100 numeri naturali in ordine decrescente, potremmo scrivere:
for(int i=100; i>=1; i--)
printf("%d",i);
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
È diffuso l’uso degli operatori ++ e -- assieme all’istruzione
for.
Supponiamo ad esempio di voler visualizzare i primi 100
numeri naturali in ordine crescente. Possiamo scrivere:
for(int i=1; i<=100; i++)
printf("%d",i);
Se invece volessimo visualizzare i primi 100 numeri naturali in ordine decrescente, potremmo scrivere:
for(int i=100; i>=1; i--)
printf("%d",i);
Nel primo esempio è equivalente scrivere i=i+1, i++ o ++i;
nel secondo è equivalente scrivere i=i-1, i-- o --i.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Altri operatori di assegnamento
Abbiamo visto che = è l’operatore di assegnamento. Ve ne
sono altri da esso derivati, fra i quali:
+=, -=, *=, /=, %=.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Altri operatori di assegnamento
Abbiamo visto che = è l’operatore di assegnamento. Ve ne
sono altri da esso derivati, fra i quali:
+=, -=, *=, /=, %=.
Esempio:
int i=2;
i=i+3;
\\dopo questa istruzione i vale 5
Si può anche scrivere:
int i=2;
i+=3;
\\dopo questa istruzione i vale 5
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
i=i+3 : Valuta il membro destro (ossia valuta i, valuta 3,
e computa la somma dei risultati), valuta il membro sinistro (ossia valuta di nuovo i) e assegna il primo risultato
al secondo.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
i=i+3 : Valuta il membro destro (ossia valuta i, valuta 3,
e computa la somma dei risultati), valuta il membro sinistro (ossia valuta di nuovo i) e assegna il primo risultato
al secondo.
i+=3 : Valuta il membro destro (ossia valuta 3), valuta il
membro sinistro (ossia valuta i), e assegna la somma del
primo e del secondo risultato al secondo.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
i=i+3 : Valuta il membro destro (ossia valuta i, valuta 3,
e computa la somma dei risultati), valuta il membro sinistro (ossia valuta di nuovo i) e assegna il primo risultato
al secondo.
i+=3 : Valuta il membro destro (ossia valuta 3), valuta il
membro sinistro (ossia valuta i), e assegna la somma del
primo e del secondo risultato al secondo.
Nel primo caso i è valutata due volte, nel secondo caso
una volta.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
i=i+3 : Valuta il membro destro (ossia valuta i, valuta 3,
e computa la somma dei risultati), valuta il membro sinistro (ossia valuta di nuovo i) e assegna il primo risultato
al secondo.
i+=3 : Valuta il membro destro (ossia valuta 3), valuta il
membro sinistro (ossia valuta i), e assegna la somma del
primo e del secondo risultato al secondo.
Nel primo caso i è valutata due volte, nel secondo caso
una volta.
Negli esempi semplici come questo la differenza è trascurabile. Vedremo più avanti che in esempi più complessi le
cose cambiano.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
C’è però una differenza fra la semantica di = e quella di +=.
i=i+3 : Valuta il membro destro (ossia valuta i, valuta 3,
e computa la somma dei risultati), valuta il membro sinistro (ossia valuta di nuovo i) e assegna il primo risultato
al secondo.
i+=3 : Valuta il membro destro (ossia valuta 3), valuta il
membro sinistro (ossia valuta i), e assegna la somma del
primo e del secondo risultato al secondo.
Nel primo caso i è valutata due volte, nel secondo caso
una volta.
Negli esempi semplici come questo la differenza è trascurabile. Vedremo più avanti che in esempi più complessi le
cose cambiano.
Considerazioni analoghe valgono per gli altri operatori
elencati sopra.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Esercizio in classe: La Trattoria
Esercizio.
Scrivere un programma che presenti all’utente il menu seguente.
1
Primo – 8.5 euro
2
Secondo – 10 euro
3
Contorno – 4 euro
4
Frutta – 3.5 euro
5
Conto
L’utente è libero di ordinare piatti dal menu in qualunque ordine e
quantità. Dopo ogni ordinazione il programma scrive Primo servito
(o Secondo ecc.) e visualizza nuovamente il menu. Se ciò che digita
l’utente non corrisponde a una voce del menu, il programma visualizza un messaggio d’errore e torna al menu. Quando l’utente chiede il
conto, il programma visualizza l’importo totale dovuto e termina.
Gli operatori ++ e +=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Esercizi in classe
Introduzione agli array
Esercizi in classe
trattoria.c
#include "Prog1/IO.h" //Per la funzione leggi_car e il tipo definito String
int main(void)
{
char sc;
// scelta dell’utente
int itera=1;
// termina programma quando ==0
double conto=0;
// importo totale dovuto
String m="1. Primo\t8.5 e.\n2. Secondo\t10 e.\n3. Contorno\t4 e.\n4. Frutta\t3.5 e.\n5. Conto.\n";
do{
printf("%s> ",m);
// visualizza il menu e il prompt >
sc=leggi_car();
// legge scelta dell’utente
switch (sc){
case ’1’:
break;
case ’2’:
break;
case ’3’:
break;
case ’4’:
break;
case’5’:
printf("Primo servito.\n");
conto+=8.5;
printf("Secondo servito.\n");
conto+=10;
printf("Contorno servito.\n");
conto+=4;
printf("Frutta servita.\n");
conto+=3.5;
printf("Ecco il suo conto: %g euro. Grazie e arrivederci.\n",conto);
itera=0; //impostando itera=0 si ottiene l’uscita dal while
break;
default:
printf("Scelta inesistente.\n");
break;
}
} while (itera); // continua fino a che itera==0
return 0;
}
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Esercizio in classe: Distanza euclidea
Esercizio.
Scrivere un programma che chieda all’utente di inserire le coordinate
di due punti nel piano R × R, e visualizzi poi la loro distanza nella
metrica euclidea. Si usi il tipo double.
Suggerimento. Per estrarre la radice quadrata si usi la funzione
double sqrt(double) contenuta nel file di intestazione math.h della
libreria standard.
Gli operatori ++ e +=
1
2
Esercizi in classe
Introduzione agli array
Esercizi in classe
distanza.c
#include "Prog1/IO.h" //Include anche stdio.h
#include <math.h> //Per la funzione sqrt
3
4
5
6
7
8
9
int main(void)
{
double
double
double
double
px
py
qx
qy
=
=
=
=
leggi_double("Inserisci
leggi_double("Inserisci
leggi_double("Inserisci
leggi_double("Inserisci
px:
py:
qx:
qy:
");
");
");
");
10
printf("La distanza fra (%g,%g) e (%g,%g) e’ ",px,py,qx,qy);
11
12
double d=sqrt( (px-qx)*(px-qx) + (py-qy)*(py-qy) );
13
14
printf("%g.\n",d);
15
16
return 0;
17
18
}
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Esercizio in classe: Distanza euclidea iterata
Esercizio.
Modificare il programma scritto per risolvere l’esercizio precedente di
modo che l’utente abbia la possibilità di iterare il calcolo della distanza per una nuova coppia di punti. Una volta finito un primo calcolo,
il programma chiede all’utente se intende continuare, ricominciando
da capo in caso di risposta affermativa e terminando l’esecuzione in
caso contrario.
Suggerimento. Per decidere se continuare o no, il programma chiede
all’utente di inserire una risposta Sì/No. Essa può essere acquisita
leggendo un carattere dalla console con la funzione char
leggi_car() della libreria Prog1. Per semplicità d’implementazione
si può poi decidere di terminare l’esecuzione se il carattere letto è
'N', e continuare in qualunque altro caso.
Gli operatori ++ e +=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Esercizi in classe
Introduzione agli array
distanza2.c
#include "Prog1/IO.h" //Include anche stdio.h
#include <math.h> //Per la funzione sqrt
int main(void)
{
char sc; //scelta utente: continua o no
do
{
double
double
double
double
px
py
qx
qy
=
=
=
=
leggi_double("Inserisci
leggi_double("Inserisci
leggi_double("Inserisci
leggi_double("Inserisci
px:
py:
qx:
qy:
");
");
");
");
printf("La distanza fra (%g,%g) e (%g,%g) e’ ", px,py,qx,qy);
double d=sqrt( (px-qx)*(px-qx) + (py-qy)*(py-qy) );
printf("%g.\n",d);
printf("Continuare? (S/N) ");
sc=leggi_car();
} while (sc!=’N’); //continua se sc non e’ N
return 0;
}
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Morale
La regola delle quattro P
Prima Progettare Poi Programmare
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Morale
La regola delle quattro P
Prima Progettare Poi Programmare
La scrittura del codice è solo l’ultimo passo nella soluzione del
problema. Come nella comunicazione ordinaria, prima di cominciare a parlare (o scrivere) sarebbe bene sapere cosa si vuol
dire.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Morale
La regola delle quattro P
Prima Progettare Poi Programmare
La scrittura del codice è solo l’ultimo passo nella soluzione del
problema. Come nella comunicazione ordinaria, prima di cominciare a parlare (o scrivere) sarebbe bene sapere cosa si vuol
dire.
Scrivere codice non è un’attività lineare: non ha senso pensare
di scrivere anche solo 50 righe di codice dalla prima all’ultima
in bella copia, come fosse un dettato. In effetti, la stesura del
codice di un programma è forse più simile alla costruzione di un
oggetto che non invece alla composizione di un testo.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Morale
La regola delle quattro P
Prima Progettare Poi Programmare
Come abbiamo visto negli esempi la stesura di un programma
procede per approssimazioni successive, avendo cura di verificare
il corretto funzionamento di quanto già scritto man mano che si
procede ad una fase successiva.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Morale
La regola delle quattro P
Prima Progettare Poi Programmare
Come abbiamo visto negli esempi la stesura di un programma
procede per approssimazioni successive, avendo cura di verificare
il corretto funzionamento di quanto già scritto man mano che si
procede ad una fase successiva.
Repetita iuvant. Non si riesce a procedere come nel punto precedente, per approssimazioni successive, se non si ha chiara in
mente (o su carta, nei casi meno semplici) la struttura complessiva del programma che si sta scrivendo. Di nuovo, quindi:
PPPP.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Gli array
In gergo informatico, un array è una collezione di dati
(solitamente tutti dello stesso tipo, diciamo T) cui si può
accedere tramite un indice, che è un valore intero non
negativo.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Gli array
In gergo informatico, un array è una collezione di dati
(solitamente tutti dello stesso tipo, diciamo T) cui si può
accedere tramite un indice, che è un valore intero non
negativo.
In italiano si usa il termine inglese array, oppure a volte il
termine vettore. Si parla di array di T o di vettore di T.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Gli array
In gergo informatico, un array è una collezione di dati
(solitamente tutti dello stesso tipo, diciamo T) cui si può
accedere tramite un indice, che è un valore intero non
negativo.
In italiano si usa il termine inglese array, oppure a volte il
termine vettore. Si parla di array di T o di vettore di T.
La rappresentazione tipica di una array di T nella memoria centrale del computer è costituita da una successione
di celle di memoria adiacenti, ciascuna atta a memorizzare un dato del tipo T. L’array ha una dimensione o lunghezza: il numero di elementi del tipo T che è in grado di
memorizzare.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Il modo tipico di raffigurarsi, ad esempio, un array di int
di lunghezza 5 è il seguente:
12 0 5 4 5
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Il modo tipico di raffigurarsi, ad esempio, un array di int
di lunghezza 5 è il seguente:
12 0 5 4 5
Le celle sono numerate consecutivamente a partire da zero:
Indice
0 1 2 3 4
Array
12 0 5 4 5
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Il modo tipico di raffigurarsi, ad esempio, un array di int
di lunghezza 5 è il seguente:
12 0 5 4 5
Le celle sono numerate consecutivamente a partire da zero:
Indice
0 1 2 3 4
Array
12 0 5 4 5
Se il nome di questo array è pippo, allora per accedere
all’elemento i -esimo su usa la notazione pippo[i]. Per
esempio,
pippo[3]
è un’espressione di tipo int e valore 4. Invece,
pippo[0]
è un’espressione di tipo int e valore 12.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Nota Bene 1. In C la numerazione comincia da 0: nell’esempio, l’array pippo ha dimensione 5, il suo primo
elemento è pippo[0], e il suo ultimo elemento è pippo[4].
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Nota Bene 1. In C la numerazione comincia da 0: nell’esempio, l’array pippo ha dimensione 5, il suo primo
elemento è pippo[0], e il suo ultimo elemento è pippo[4].
Nota Bene 2. Nell’esempio, l’espressione
pippo[6]
è sintatticamente corretta, ma il suo uso costituirebbe un
errore di programmazione: la posizione numero 6 di pippo
non esiste.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Nota Bene 1. In C la numerazione comincia da 0: nell’esempio, l’array pippo ha dimensione 5, il suo primo
elemento è pippo[0], e il suo ultimo elemento è pippo[4].
Nota Bene 2. Nell’esempio, l’espressione
pippo[6]
è sintatticamente corretta, ma il suo uso costituirebbe un
errore di programmazione: la posizione numero 6 di pippo
non esiste.
Sintassi. Per dichiarare un array di int di nome pippo e
dimensione 5 si usa l’istruzione:
int pippo[5];
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Nota Bene 1. In C la numerazione comincia da 0: nell’esempio, l’array pippo ha dimensione 5, il suo primo
elemento è pippo[0], e il suo ultimo elemento è pippo[4].
Nota Bene 2. Nell’esempio, l’espressione
pippo[6]
è sintatticamente corretta, ma il suo uso costituirebbe un
errore di programmazione: la posizione numero 6 di pippo
non esiste.
Sintassi. Per dichiarare un array di int di nome pippo e
dimensione 5 si usa l’istruzione:
int pippo[5];
Vedremo adesso degli esempi di utilizzo degli array analizzando brani di codice. La discussione sugli array proseguirà per varie lezioni, e avremo modo di approfondire a
lungo l’argomento.
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
array1.c
1
#include <stdio.h>
2
3
4
5
6
7
int main(void)
{
//dichiara array di 10 int
//da v[0] a v[9]
int v[10];
8
for(int i=0; i<10; i++)
//stampa elemento i-esimo,
//non inizializzato
printf("%d\n",v[i]);
9
10
11
12
13
return 0;
14
15
}
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
array2.c
1
#include <stdio.h>
2
3
4
5
6
7
8
9
int main(void)
{
//dichiara array di 10 int
//da v[0] a v[9]
int v[10];
//variabile indice
int i;
10
for(i=0; i<10; i++)
v[i]=0; //iniz. elemento i-esimo a 0
11
12
13
for(i=0; i<10; i++)
printf("%d\n",v[i]); //stampa elemento i-esimo
14
15
16
return 0;
17
18
}
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
array3.c
1
#include <stdio.h>
2
3
4
5
6
7
int main(void)
{
//dichiara array di 10 int
//da v[0] a v[9]
int v[10];
8
//ERRORE: accede a elemento inesistente
printf("%d\n",v[100]);
9
10
11
return 0;
12
13
}
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
array4.c
1
#include <stdio.h>
2
3
4
5
6
7
8
int main(void)
{
int v[10];
int w[10];
//variabile indice
int i;
9
for(i=0; i<10; i++)
v[i]=i*i; //iniz. elemento i-esimo a i^2
10
11
12
for(i=0; i<10; i++)
w[9-i]=v[i]; //w e’ v in ordine inverso
13
14
15
for(i=0; i<10; i++)
printf("%d\t%d\n",v[i],w[i]);
16
17
18
return 0;
19
20
}
Esercizi in classe
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
Esercizi in classe
Esercizio in classe: Istogrammi orizzontali
Esercizio.
Scrivere un programma che chieda all’utente di inserire dieci valori
interi positivi, e visualizzi un istogramma (orizzontale) di asterischi *
che li rappresenti.
Esempio. Se i 10 valori in ingresso fossero, nell’ordine,
2, 1, 5, 4, 4, 4, 6, 1, 7, 4, il programma dovrebbe visualizzare:
**
*
*****
****
****
****
******
*
*******
****
Gli operatori ++ e +=
Esercizi in classe
Introduzione agli array
isto.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Prog1/IO.h" //Per leggi_int
int main(void)
{
int v[10];
int i;
//lettura
for(i=0; i<10; i++)
while( (v[i]=leggi_int("Inserisci prossimo intero: ")) <= 0 )
printf("Solo valori positivi: reinserire.\n");
//scrittura
for(i=0; i<10; i++)
{
for(int j=0;j<v[i];j++)
printf("*");
printf("\n");
}
return 0;
}
Esercizi in classe