Fondamenti di informatica – A.A. 2013/2014
Laboratorio 2 – Costrutti
Integrate a partire da slide
di Alberto Quattrini Li
2012/2013
Avvio dei PC






Se non acceso, avviare il PC
Il PC si avvierà in ambiente Windows
Avviare l'applicazione Internet Explorer
Si presenterà una schermata nera: Virtual Desktop
Inserire i propri Codice Persona e Password
Tra le applicazioni che saranno disponibili selezionare NX Client
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
2
Programma di oggi
Rivedremo molto brevemente la sintassi di alcuni costrutti visti ad
esercitazione:
●
Strutture di selezione:
• if/else
• switch
●
Strutture di iterazione:
• while
• do
while
• for
●
Condizioni
●
Operatori di incremento (++) e decremento (--)
●
Esercizi
●
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
3
Selezione – costrutto if



4
Permette una scelta nell'esecuzione
Sceglie se eseguire delle istruzioni oppure altre sulla base del valore
di verità assunto da una condizione
Sintassi
if (condizione) {
/* istruzioni condizione vera*/
}
else{
/* istruzioni condizione falsa*/
}

Note:


Si possono omettere le graffe se si ha una sola "istruzione"
all'interno del blocco
Blocco else non obbligatorio
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
5
Selezione – Operatori per condizioni
Operatori in una condizione C
Significato della condizione
in C
=
if (x == y)
Se x è uguale a y …
≠
if (x != y)
Se x è diverso da y …
>
if (x > y)
Se x è maggiore di y …
<
if (x < y)
Se x è minore di y …
≥
if (x >= y)
Se x è maggiore o uguale a y …
≤
if (x <= y)
Se x è minore o uguale a y …
&&
if (esp1 && esp2)
Se esp1 AND esp2 …
||
if (esp1 || esp2)
Se esp1 OR esp2 …
!
if (!esp)
Se NOT esp …
Operatori di uguaglianza
Operatori relazionali
Operatori logici
Figura riadattata del Deitel & Deitel

Attenzione all'operatore di uguaglianza “==” e non “=”!
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Selezione – Esempi condizioni



6
Nel laboratorio precedente c'era un esercizio in cui si chiedeva
all'utente di inserire un carattere maiuscolo
Supponiamo che il carattere ricevuto sia contenuto nella variabile cm
Qual è la condizione che è vera se e solo se cm è maiuscolo?

cm deve stare tra i caratteri A e Z (estremi inclusi)

Come lo andiamo a scrivere in linguaggio C?

cm >= 'A' && cm <= 'Z'
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Selezione – costrutto switch


Permette una scelta tra più valori costanti
Sintassi
switch (variabile) {
case cost1:
/* istruzioni */
break;
case cost2:
/* istruzioni */
break;
default:
/* istruzioni */
break;
}

Note:



Attenzione al break
Graffe non necessarie per racchiudere il blocco
di istruzioni all'interno di ogni case
Possibile omettere caso default
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
7
Selezione – costrutto switch


Permette una scelta tra più valori costanti
Sintassi
switch (variabile) {
case cost1:
/* istruzioni */
break;
case cost2:
/* istruzioni */
break;
default:
/* istruzioni */
break;
}

Note:



Attenzione al break
Graffe non necessarie per racchiudere il blocco
di istruzioni all'interno di ogni case
Possibile omettere caso default
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
8
Selezione – costrutto switch


Permette una scelta tra più valori costanti
Sintassi
switch (variabile) {
case cost1:
/* istruzioni */
break;
case cost2:
/* istruzioni */
break;
default:
/* istruzioni */
break;
}

Note:



Attenzione al break
Graffe non necessarie per racchiudere il blocco
di istruzioni all'interno di ogni case
Possibile omettere caso default
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
9
Selezione – costrutto switch


Permette una scelta tra più valori costanti
Sintassi
switch (variabile) {
case 1:
/* istruzioni */
break;
case 2:
/* istruzioni */
break;
default:
/* istruzioni */
break;
}

Note:



Attenzione al break
Graffe non necessarie per racchiudere il blocco
di istruzioni all'interno di ogni case
Possibile omettere caso default
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
10
Selezione – costrutto switch


Permette una scelta tra più valori costanti
Sintassi
switch (variabile) {
case 'a':
/* istruzioni */
break;
case 'b':
/* istruzioni */
break;
default:
/* istruzioni */
break;
}

Note:



Attenzione al break
Graffe non necessarie per racchiudere il blocco
di istruzioni all'interno di ogni case
Possibile omettere caso default
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
11
Selezione – costrutto while


Ripete un blocco di istruzioni, mentre la condizione è vera
Sintassi
while (condizione) {
/* istruzioni */
}

Note:

Attenzione alle condizioni: cicli infiniti
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
12
Selezione – costrutto do...while


Ripete un blocco di istruzioni

Mentre una condizione è vera

Condizione verificata alla fine del blocco

Prima iterazione sempre eseguita
Sintassi
do {
/* istruzioni */
} while (condizione);

Note:

Attenzione alle condizioni: cicli infiniti
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
13
Selezione – costrutto for


14
Ripete un blocco di istruzioni, mentre la condizione è vera
Sintassi
for (inizializzazione contatore; condizione; aggiornamento contatore) {
/* istruzioni */
}

Note:




Simile al ciclo while
for solitamente utilizzato quando il numero di iterazioni è conosciuto
in anticipo
Attenzione alle condizioni: cicli infiniti
Esempio:
int i;
for (i = 0; i < n; i++) {
printf("i=%d\n", i);
}
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Operatori incremento/decremento



Operatore incremento (++)

Pre-incremento: ++c

Post-incremento: c++
Operatore decremento (--)

Pre-decremento: --c

Post-decremento: c-Esempio:

c=5;

var = c++;

var = ? c = ?
•
var = 5 e c = 6



c=5;
var = ++c;
var = ? c = ?
• var = 6 e c = 6
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
15
Indentazione


16
Visto che ci possono essere diversi livelli di annidamento, è importante
l'indentazione del codice, ovvero aggiungere spazi per tabulare
correttamente il codice, a seconda del livello di annidamento
Esempio
for (inizializzazione contatore; condizione; aggiornamento contatore) {
/* istruzioni blocco for */
if (condizione2){
/* istruzioni blocco if */
}
}
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Debugging - Richiamo
 Stampate a video i valori delle variabili
utilizzando le printf
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
17
ESERCIZI
18
 Potete scaricare gli esercizi dal seguente link:
ftp://ftp.elet.polimi.it/users/Marco.Rocco/
 Scaricate il file esercizi_lab2.pdf
 Potete andare avanti finché riuscite, ognuno può
andare alla propria velocità
 Vi interromperemo di tanto in tanto per vedere alcuni
aspetti problematici e/o importanti nella risoluzione dei
diversi esercizi proposti

 Verso metà lezione faremo una pausa di 10 minuti
 Comandi utili: cd, ls, pwd,
gcc nomefile.c -o nome_eseguibile
./nome_eseguibile
Evitate di mettere spazi nei nomi dei file
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Problema 1
19
 Ricevere da tastiera un carattere
 Verificare se il carattere ricevuto è Maiuscolo
 Se non fosse Maiuscolo, stampare un messaggio di errore e chiedere
un nuovo carattere all'utente
 Ripetere il tutto finché l'utente non inserisce un carattere maiuscolo
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Programmazione - Input
 Analizziamo meglio l'ultimo problema:
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
20
Programmazione - Input
21
 Cosa è accaduto?
 L'utente ha inserito nello stdin:
c
\n
 La scanf ha consumato il primo carattere, ora lo stdin contiene:
\n
 La seconda scanf cerca un carattere nello stdin e lo trova senza doverlo
chiedere nuovamente all'utente, in seguito alla scanf lo stdin diventa:
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Programmazione - Input
 Analizziamo meglio l'ultimo problema:
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
22
Programmazione - Input
 Cosa è accaduto?
 L'utente ha inserito nello stdin:
c
\n
 La scanf ha consumato il primo carattere, ora lo stdin è:
\n
 L'istruzione aggiunta consuma tutto lo stdin:
 La seconda scanf cerca un carattere nello stdin, non lo trova e quindi
attende che l'utente lo immetta:
C
\n
 La scanf consuma il carattere:
\n
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
23
Problema 2 – Maggiore, minore e media
24
 Scrivere un programma che prendendo numeri positivi inseriti da
tastiera (per terminare il processo di inserimento dei dati, l'utente deve
digitare -1)
– Trovi il maggiore
– Trovi il minore
– Calcoli la media
 Provate a scriverlo in due differenti versioni:

Usando la struttura di iterazione while

Usando la struttura di iterazione: for
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Problema 2 – Maggiore, minore e media
Sappiamo già che il valore minimo che assume max è 0
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
25
Problema 2 – Maggiore, minore e media
Contatore numeri ricevuti
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
26
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
27
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
28
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
29
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
30
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
31
Problema 2 – Maggiore, minore e media
float
int
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
32
Problema 2 – Maggiore, minore e media
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
33
Problema 3 – Carta Sasso Forbice
 Scrivere un programma per il gioco “carta sasso e
forbice”

bisogna far scegliere una strategia casuale al
computer ed inserire la propria

dopo un numero di round definito dall'utente
restituisce il numero di partite vinte, perse e
pareggiate
 Per gli appassionati di ...
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
41
Problema 3 - Considerazioni
 srand(unsigned int seed) + rand()
 “For every different seed value used in a call to
srand, the pseudo-random number generator can be
expected to generate a different succession of
results in the subsequent calls to rand.”
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
42
Problema 3 - Considerazioni
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
43
Problema 3 - Considerazioni
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
44
Problema 3 - Considerazioni
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
45
Problema 3 - Considerazioni
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
46
Problema 4 - Fattoriale
54
 Si chieda all'utente di inserire un numero intero e poi se ne calcoli il fattoriale
 Si ricorda che:
– n! = n * (n -1) * (n – 2) * … * 1
– 0! = 1
 Cosa accade se provate a calcolare 12! (= 479001600)?
 Cosa accade se provate a calcolare 13! (= 6227020800)?
 Perché? Se si è presentato un problema avete idea di come risolverlo?
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Variabili – Modificatori Tipi
 Oltre ai già noti tipi di dato: char, int, float e double
Ad alcuni di essi è possibile applicare dei modificatori:

short

long

signed

unsigned
 short è applicabile a: int
 long è applicabile a: int e double
 signed e unsigned sono applicabili a: char e int
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
55
Variabili – Modificatori Tipi: short e long
56
 short e long
L'obiettivo di questi modificatori è di cambiare il numero di bit dedicati alla
rappresentazione di un intero, rispetto a quanti dedicati dal tipo int
bit(short int) <= bit(int) <= bit(long int) <= bit(long long int)
 Quanti bit vengono effettivamente utilizzati dipende dalla macchina che si sta
utilizzando, ma ci sono alcuni vincoli:

bit(short int) >= 16

bit(int) >= 16

bit(long int) >= 32

bit(long long int) >= 64
 Sulla macchina che state utilizzando ora: bit(short int) = 16, bit(int) = 32, bit(long
int) = 32 e bit(long long int) = 64
 bit(double) = 64, bit(long double) = 80
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Variabili – Modificatori Tipi: signed e unsigned
57
 signed



signed char e signed int sono equivalenti a char e int, rispettivamente
char assume valori tra -128 e 127
int (16 bit) assume valori tra -32768 e 32767
 unsigned



Ci permette di rappresentare solo numeri positivi (senza segno)
unsigned char può assumere valori tra: 0 e 255
unsigned int (16 bit) può assumere valori tra: 0 e 65535
 Esempio dichiarazione:
unsigned int x;
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Problema 4 - Fattoriale
 Per stampare un long int il carattere spericificatore è %ld
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
58
Problema 5 - Determinare il giorno
59
 L'utente fornisce una data: giorno/mese/anno
 Verificare che la data inserita sia ammissibile (es. 40/5/2010 non è ammissible,
29/2/2013 non è ammissibile)
 Calcolare che giorno (lunedì, martedì, ...) era/sarà in quella data
 Aiuti:
1) Un anno è bisestile se e solo se è divisibile per 4 e non è divisibile per 100,
a meno che non sia divisibile per 400
2) Come calcolare il giorno, una volta nota la data? Algoritmo di Gauss
Calcolare m:

m = 11 se gennaio, m = 12 se febbraio, m = mese - 2 per tutti gli altri
mesi
Calcolare y:

y = anno – 1 se gennaio o febbraio, y = anno altrimenti
giornosettimana=( giorno+⌊ 2.6∗m−0.2 ⌋+4∗( y mod 4)+5∗( y mod 100)+6∗( y mod 400)) mod 7
giornosettimana (0 = Domenica, 1 = Lunedì, …, 6 = Sabato)
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Problema 6 - Ricevere numero da input
60
 Si ipotizzi che l'utente voglia inserire un numero, ma lo faccia inserendo una
cifra alla volta (es. per scrivere 123, l'utente inserirà prima 1, poi 2 e poi 3). In
questo modo ogni cifra deve essere ricevuta singolarmente dall'algoritmo
 L'utente comunica la terminazione dell'inserimento delle cifre tramite il carattere
'e'
 Obiettivo del programma: ricevere le cifre scritte dall'utente e ricostruire il
numero che l'utente voleva inserite
 AIUTO:

345 = 3 * 100 + 4 * 10 + 5
Laboratorio di Fondamenti di Informatica – A.A. 2013/2014
Scarica

Strutture di controllo