LINGUAGGI E STRUMENTI
DI PROGRAMMAZIONE CON
LABORATORIO
PROGRAMMI CON
COSTRUTTI CONDIZIONALI
1 Docente: Maurizio Boscaini (Matricole pari)
Lezioni 6 – a.a. 2023/2024
Original work Copyright © Sara Migliorini
University of Verona
Modifications Copyright © Damiano Macedonio, Maurizio Boscaini, Vincenzo Bonnici,
Elisa Quintarelli, Roberto Di Marco
University of Verona 2
Costrutti Decisionali
Il linguaggio C offre tre costrutti che consentono
di eseguire una o più istruzione in base a una
condizione:
L’istruzione if.
L’istruzione switch.
L’operatore condizionale, o ternario.
3
Operatori relazionali
a d ati d ello s tess o tip o!
Solo tr
maggiore di: >
maggiore uguale: >=
minore di: <
minore uguale: <=
uguale a: ==
diverso da: !=
4
Istruzione if (e if-else)
L’istruzione if (o if-else) è utilizzata per
determinare l’esecuzione di una o più istruzioni in
base a particolari condizioni (risultato di espressioni):
if (espressione) {
istruzione_1;
… Blocco eseguito
istruzione_n; se condizione è TRUE
} else {
istruzione_1; Blocco eseguito
…
se condizione è FALSE
istruzione_m;
5
}
Esempio con gli operatori di
Incremento/Decremento
int a = 0;
if (a++ == 0) {
printf("Il valore di a e' zero\n.");
} else {
printf("Il valore di a e' positivo\n.");
}
if (++a == 0) {
printf("Il valore di a e' zero\n.");
} else {
printf("Il valore di a e' positivo\n.");
6
}
Espressioni Logiche
La condizione specificata nell’istruzione if può
essere una qualsiasi espressione logica (valori vero
o falso).
L’espressione logica può essere formata anche da
più condizioni unite attraverso un operatore logico
binario.
&&: and logico.
||: or logico.
Il valore di un’espressione logica può essere negato
attraverso operatore logico unario: 7
!: not logico.
Operatori logici
erità!
Risultato da tavole di v
and: &&
or: | |
not (unario): !
8
Istruzioni if Annidate
Le istruzioni if possono essere annidate.
if (n % 2 == 0) {
if (n < 0) {
printf("Il numero %i è pari e negativo.\n", n);
} else {
printf("Il numero %i è pari e positivo.\n", n);
}
} else {
if (n < 0) {
printf("Il numero %i è dispari e negativo.\n", n);
} else {
printf("Il numero %i è dispari e positivo.\n", n);
}
}
Attenzione: il codice sopra riportato è corretto ed è anche la forma 9
consigliata che usa i blocchi anche di una sola istruzione!
Costrutto else-if
Quando il numero di casi da distinguere è
maggiore di 2, è possibile usare una o più
istruzioni else-if.
if (espressione_1) {
istruzione_1;
} else if (espressione_2) {
istruzione_2;
}
…
} else {
istruzione_3;
} 10
Operatore Condizionale 1/2
L’operatore condizionale è un operatore ternario
caratterizzato dalla seguente forma:
condizione ? istruzione_1 : istruzione_2
condizione è un’espressione booleana
Per prima cosa viene valutata condizione.
Se condizione è vera, allora viene eseguita
istruzione_1, altrimenti viene eseguita
istruzione_2.
11
Operatore Condizionale 2/2
È una forma compatta solitamente utilizzata per
assegnare un valore ad una variabile in base ad
una determinata condizione.
Esempi:
div = (y != 0) ? x / y : 0;
int a, b, max;
b
max = (a > b) ? a :
12
Istruzione switch
Una serie di istruzioni if-else può essere sostituita dall’uso
dell’istruzione switch quando i valori di confronto sono costanti
semplici o espressioni che producono valori costanti.
switch (espressione) {
case valore_1: Solo valori costanti
istruzione_1;
… No parentesi per definire un blocco
break; interrompe istruzione switch
case valore_2:
istruzione_2;
…
break;
default: Eseguito se non si è verificato nessun
istruzione_d; match nei casi precedenti
…
break; // Ridondante13
}
Istruzione switch
Le istruzioni all’interno di ciascun case non devono essere
racchiuse tra parentesi graffe!
Ciascun blocco case deve essere concluso con l’istruzione
break, che determina la fine dell’istruzione switch,
altrimenti l’esecuzione prosegue con il prossimo blocco
case.
Il blocco default è facoltativo ed è eseguito quando
l’espressione non assume nessuno dei valori specificati nei
case.
Non possono esistere due blocchi case con valori uguali,
però è possibile associare lo stesso blocco di istruzioni a più
valori:
case value_1:
case value_2:
istruzioni; 14
break;
Istruzione break all'interno di un ciclo
L'istruzione break può essere usata anche all'interno
di un ciclo.
L’istruzione break permette di uscire
immediatamente dal ciclo che si sta eseguendo.
Utilizzata per terminare un ciclo perché si è
verificata una certa condizione.
Le successive istruzioni all’interno del ciclo vengono
ignorate e l’esecuzione riprende dalla prima
istruzione dopo il ciclo.
Se l’istruzione break viene eseguita all’interno di un
gruppo di cicli annidati, termina soltanto il ciclo più
interno che la contiene.
15
Istruzione continue all'interno di un ciclo
break continue
Utilizzo anche nei cicli solo nei cicli
Funzione Uscita dal ciclo Uscita da iterazione corrente
16
Ignora successive istruzioni Ignora successive istruzioni
Effetto nel ciclo e successive iterazioni nell’iterazione corrente
Prima istruzione iterazione succ.
Esegue Prima istruzione fuori dal ciclo Prima istruzione fuori dal ciclo
Se cicli Esce da solo ciclo Salta iterazione del ciclo
annidati che la contiene che la contiene
Istruzione continue all'interno di un ciclo
L’istruzione continue può essere usata solo
all'interno di un ciclo.
L'istruzione continue determina l’uscita
dall’iterazione corrente e si prosegue con
l’esecuzione di una nuova iterazione.
Le istruzioni che restano dal punto di continue alla
fine del corpo del ciclo sono saltate.
Utilizzata per saltare un blocco di istruzione del corpo
del ciclo quando si verifica una certa condizione.
17
Esercizio 1
Scrivere un programma C che chiede all’utente di
inserire un numero intero, calcola se il valore
inserito è positivo o negativo, e stampa a video il
risultato.
Il confronto tra numeri si esegue con gli
operatori:
a < b: a minore di b,
a <= b: a minore o uguale a b,
a > b: a maggiore di b,
a >= b: a maggiore o uguale a b,
a == b: a uguale a b.
a != b: a diverso da b. 18
Esercizio 2
Scrivere un programma C che richiede all’utente
di inserire un numero intero, calcola se il numero
è positivo, negativo oppure nullo, e stampa il
risultato ottenuto.
19
Esercizio 3
Scrivere un programma C che richiede all’utente
di inserire un numero intero e restituisce il
valore 0 se il numero è pari oppure 1 se il numero
è dispari.
Usare una variabile ausiliaria per memorizzare il
valore da ritornare e l’operatore condizionale per
assegnarle il valore.
20
Esercizio 4
Scrivere un programma C che richiede all’utente
tre numeri interi che rappresentano una data:
Giorno, mese, anno
e verifica se la data inserita è valida.
Anno: 4 cifre.
Mese: valore compreso tra 1 e 12
Giorno: compreso tra 1 e ...
29 o 28 se il mese è Febbraio e l’anno è/non è bisestile
Un anno è bisestile se:
È divisibile per 4 e non è divisibile per 100
oppure è divisibile per 400.
31 se il mese è Gennaio, Marzo, Maggio, Luglio, Agosto,
Ottobre, Dicembre 21
30 se il mese è Aprile, Giugno, Settembre, Novembre.
Esercizio 5
Scrivere un programma C che richiede all’utente
due date (spezzare la richiesta di
giorno/mese/anno come nell’esempio precedente)
e stampa a video la più recente.
Per questo esempio assumere che le date inserite
siano valide.
22
Esercizio 6
Scrivere un programma C che classifica un
carattere immesso da tastiera come:
alfabetico (a-z oppure A-Z)
cifra (0-9)
speciale (tutti gli altri).
23
Esercizio 7
Scrivere un programma in C che richiede
all’utente di inserire i coefficienti a, b, c di un
polinomio di secondo grado ax2 + bx + c = 0.
Se a è pari a zero, il programma informa che il
polinomio è di grado inferiore al secondo. In caso
contrario, il programma calcola il determinante
(det) dell’equazione di secondo grado e informa
l’utente se le soluzioni sono reali e distinte
(det>0), coincidenti (det=0) o complesse coniugate
(det<0).
24
Esercizio 8
Scrivere un programma in C che acquisisce tre
numeri. Il programma verifica se i tre numeri
possono rappresentare le dimensioni dei
lati di un triangolo: devono essere valori
positivi e la somma di due numeri deve essere
maggiore del terzo. In caso il controllo fallisca, il
programma deve stampare un apposito
messaggio di errore. Se il controllo è stato
superato con successo, il programma stabilisce
che tipo di triangolo è (isoscele, equilatero o
scaleno) e stampa un apposito messaggio a video. 25
Esercizio 9
Scrivere un programma C che chiede all’utente
due numeri interi n1 e n2 e un carattere op
(appartenente all’insieme {'+', '-', '*', '/'}), che
indica un’operazione aritmetica. Il
programma calcola e stampa a video il risultato
dell’operazione corrispondente a op applicata ai
numeri n1 e n2.
26
Esercizio 10
Scrivere un programma in C che richiede
all’utente di inserire ore e minuti, calcola l’ora a
San Francisco (9 ore indietro) e a Teheran (+3:30)
e la stampa a video in formato «0-24 h : min».
Se a Teheran è già il giorno successivo o a San
Francisco ancora quello precedente, il
programma corregge l’ora e avvisa l’utente con un
opportuno messaggio a schermo.
27
Esercizio 11
Su una scacchiera 8x8 sono posizionati due pezzi: il
Re bianco e la Regina nera. Si scriva un programma in
linguaggio C che acquisisca le posizioni del Re e della
Regina in termini di coordinate (x,y), assumendo che
la posizione (1,1) sia situata in basso a sinistra
rispetto al giocatore. Il programma controlla prima
che le coordinate inserite siano valide; in particolare
entrambi i pezzi devono trovarsi all’interno della
scacchiera e non possono trovarsi nella stessa
posizione. Quindi, il programma determina se la
Regina è in posizione tale da poter mangiare il Re e
visualizza un apposito messaggio specificando anche
in che direzione e per quante posizioni deve muoversi 28
per mangiare.
Esercizio 12
Scrivere un programma C che calcola la media
dei voti inseriti dall’utente:
Ciclo do-while che itera la richiesta di un nuovo
voto finché l’utente sceglie di continuare.
Lettura dei caratteri s/n.
2 variabili intere aggiornate ad ogni ciclo per tener
traccia del numero di voti inseriti e della somma
totale dei voti.
Il risultato deve essere stampato con 2 cifre decimali.
29
Esercizio 13
Scrivere un programma C che richiede all’utente un
numero intero n e stampa le sue cifre in lettere.
Suggerimento: usate due cicli.
Primo ciclo: determina il numero di cifre che
compongono n.
x
Se 10 è la potenza di 10 immediatamente superiore a n,
allora x corrisponde al numero di cifre di n.
Secondo ciclo: divide ripetutamente n per una potenza
di 10, partendo da quella immediatamente più piccola
di n fino a 1, per recuperare le cifre da sinistra a 30
destra.