c istruzione di assegnazione - unina.it · c istruzione di controllo if se un blocco di istruzioni...
TRANSCRIPT
![Page 1: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/1.jpg)
C istruzione di assegnazione
Forma sintattica della istruzione di assegnazione:
variabile = espressione
– In esecuzione il computer valuta l’espressione ed il suo valore è assegnato alla variabile (detta variabile di assegnazione).
Il simbolo speciale = è detto operatore di assegnazione.l-value è una variabiler-value è (il valore di) una qualsiasi espressione
– con tipo standard uguale o implicitamente convertibile nel tipo di l-valueIn C++ l’istruzione di assegnazione è una espressione (di
assegnazione) il cui valore è r-value
Esempio: a = b; n = n + 1;
r-valuel-value
![Page 2: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/2.jpg)
stato del programma: l’insieme dei valori delle variabili del programma– L’esecuzione di una istruzione di
assegnazione provoca il cambiamento dello stato del programma
Esempio:
C istruzione di assegnazione
x1 x2 astr[]
2 3,14c i a o \0
variabili
valori
31.2 3.0 1 4r2 = 2 + n1;31.2 7.4 1 4r1 = n2 * r1;5.2 7.4 1 4r2 = r1 + 2.2;5.2 3.14 1 4r1 = 5.2;? 3.14 1 4n2 = n1*n2+1;? 3.14 1 3
n1 n2
int n1=1, n2=3;
r1 r2? 3.14float r1, r2=3.14;
![Page 3: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/3.jpg)
Poiché l’espressione deve essere valutata occorre che tutte le variabili che vi compaiono ABBIANO UN VALORE
Sono state inizializzate (è associato un valore iniziale)
Si consideri la sequenza di istruzioni:
n = 4; n = n+1;
C istruzione di assegnazione
r-valuel-value
REGOLA La variabile di assegnazione deve essere dello stesso tipo del
valore dell’espressione
Se però le variabili presenti nell’espressione sono tutte variabili numeriche è ammessa la conversione implicita dal tipo della espressione al tipo della variabile se quest’ultima è di tipo più generale.
![Page 4: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/4.jpg)
C istruzioni semplici e composte
Le istruzioni del programma sono classificate come:
Semplici: istruzioni di assegnazione, istruzioni di I/O, dichiarazioni di costanti e variabili– Divise dal simbolo speciale “;”
Composte: sequenze di istruzioni semplici– Racchiuse da parentesi graffe
Un istruzione composta è anche detta blocco di istruzioni
![Page 5: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/5.jpg)
C istruzione di controllo if
L’istruzione di controllo if (o selezione) indica al calcolatore di eseguire una tra due istruzioni (semplici o blocchi) al verificarsi di una certa condizione:
if (condizione) istruzione;
dove– condizione é una espressione logica
se la condizione é true il programma esegue l'istruzione, altrimenti passa direttamente all'istruzione successiva
no
cond?
istruzione
si
![Page 6: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/6.jpg)
C istruzione di controllo if
Nel caso di due scelte alternative, all’istruzione di controllo if si può associare l'istruzione else:
if (condizione) istruzioneA;else istruzioneB;
dove– condizione é una espressione logica– se la condizione é true il programma esegue
l‘istruzioneA, – altrimenti esegue l'istruzioneB
no cond?
istruzioneAistruzioneB
si
![Page 7: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/7.jpg)
Se la condizione determina l’esecuzionedi un blocco di istruzioni:
if (condizione) { istruzione1; ...istruzioneN;
};
Analogamente se la condizione determina l’esecuzione di uno di due blocchi di istruzioni
if (condizione) {istruzioneA1; ...istruzioneAN;
} else {istruzioneB1; ...istruzioneBM;
}
C istruzione di controllo if
Istruzione1
si
nocond?
IstruzioneN
cond?sino
IstruzioneA1
IstruzioneAN
IstruzioneB1
IstruzioneBM
![Page 8: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/8.jpg)
Dati due numeri qualsiasi a, b risolvere l’equazione di primo grado:
ax +b = 0.
L’algoritmo:leggi(a,b)stampa(-b/a)
non è corretto.
Esempio
![Page 9: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/9.jpg)
Infatti il problema dice che a può essere un numero qualsiasi e, se a fosse zero, si avrebbe un errore a run time poiché la divisione non è definita quando il divisore è zero. In questo caso occorrerà dunque inviare un opportuno messaggio. Un algoritmo corretto è:
leggi(a,b)if (a¹0)
x¬ -b/astampa(x)
else stampa(messaggio)
{ float x,a,b;printf(“inserire i coefficienti di una
equazione di primo grado\n”);printf(”a(!0)=\n“);scanf(“%f”,&a); printf(”b=\n”); scanf(“%f”,&b);if (a!=0) // parentesi graffa necessaria
perché l’istruzione è composta{x= -b/a;printf(”soluzione x =%f\n”,x);} // fine istruzione composta relative
alla condizione (a!=0)else
printf(”l’equazione non è di primo grado”);}
eser2.1
![Page 10: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/10.jpg)
![Page 11: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/11.jpg)
11
Programma per il calcolo dell’area del cerchio che accetta solo input di numeri positivi. // Calcola Area del cerchiomain () {
const float pi=3.1415;float area, raggio;printf("Inserisci Raggio=\n”);scanf(“%f”,&raggio);if (raggio>0)
{area=raggio*raggio*pi;printf("Area =%f\n)”,area);
}else
printf(“Il raggio non può essere negativo “);return 0;
}
Esempio
esercizio4.2.cpp
![Page 12: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/12.jpg)
Vediamo cosa accade quando non conosciamo bene la matematica
a=1
b=a
b*a=a*a
b*a - b*b = a*a - b*b
b*(a – b) = a2 – b2
b*(a – b) =(a+b)*(a – b)
b = (a+b)
1=2
a=1
assurdo
![Page 13: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/13.jpg)
Calcoliamo il massimo tra due numeri a e b
Se a è minore di b allora il massimo è b, altrimenti è a.
Scrittura dell’algoritmo in C:
if (a<b) printf("MASSIMO=%d\n”, b);
elseprintf(”MASSIMO=%d\n”, a);
Supponiamo che a=15 e b=20; quando il computer esegue questa istruzione scriverà “Massimo=20”; se invece a=30 e b=10 scriverà “Massimo=30”.
Esempio
![Page 14: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/14.jpg)
C istruzione di controllo if
Errori tipici di programmazione:
if (N=0) {...}
if (N==0) {...}Confondere = con ==viene sempre
eseguito
if (N==0) ;istruzione;
if (N==0)istruzione;
Terminare if con ;viene eseguito sempre
if (cond)istruzione1;istruzione2;
elseistruzione3;
if (cond) {istruzione1;istruzione2;
} elseistruzione3;
Dimenticare di includere il blocco in { }
Errore di compilazione:Expected “;” before “else”
![Page 15: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/15.jpg)
Per evitare questo errore si può scrivere prima l’espressione e poi la variabile (cosa non consentita con l’assegnazione):
NON si può scrivereif (0=N)
perché il computer segnala un errore, mentre è consentito scrivere
if (0==N)
C istruzione di controllo if
if (N=0) {...}
Errori tipici di programmazione:
![Page 16: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/16.jpg)
IF ……. ELSE
Stampare il voto degli Esercizi
• Se il voto dello studente è maggiore/uguale di 28Visualizza A
• Se il voto dello studente è maggiore/uguale di 25 e minore di 28Visualizza B
• Se il voto dello studente è maggiore/uguale di 22 e minore di 25Visualizza C
• Se il voto dello studente è maggiore/uguale di 18 e minore di 22Visualizza D
•Se il voto dello studente è minore di 18Visualizza non superato
![Page 17: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/17.jpg)
IF ……. ELSE ……… annidati
Si possono inserire IF/ELSE all’interno di altri IF/ELSE
Se il voto dello studente è maggiore di 28Visualizza A
AltrimentiSe il voto dello studente è maggiore di 25
visualizza Baltrimenti
Se il voto dello studente è maggiore di 22visualizza C
altrimentiSe il voto dello studente è maggiore di 18
visualizza D
![Page 18: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/18.jpg)
IF ……. ELSE ……… annidati
if (voto >= 28) printf(“A”);
else{if (voto >= 25)
printf(“B”);else{
if (voto >= 22) printf(“C”);
else{if (voto >= 18)
printf(“D”);}
}}
if (voto >= 28) printf(“A”);
else if (voto >= 25) printf(“B”);
else if (voto >= 22) printf(“C”);
else if (voto >= 18) printf(“D”);
![Page 19: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/19.jpg)
Else pendente
if (x > 5)
if (y > 5)printf(“x e y sono > 5”);
elseprintf(“x è minore di 5”);
Cosa stampa se x=6 e y=7?
![Page 20: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/20.jpg)
C istruzione di controllo if
Se l'istruzione controllata da un if consiste a sua volta in un altro if (istruzioni ifnidificate), ogni eventuale else si riferisce sempre all'if immediatamente superiore (in assenza di parentesi graffe).
Esempio:if (cond1)
if (cond2) istr1; else istr2;
Suggerimento:– Mettere sempre le parentesi anche in caso di istruzioni semplici1) Consente di controllar meglio il risultato di annidamenti di if2) Riduce gli errori in caso di aggiunte di altre istruzioni come
caso dell’if (o dell’else)
no
si
sino
istr2
cond2?
istr1
cond1?
![Page 21: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/21.jpg)
IF o IF……… ELSE?
if (a<b)
printf(”MASSIMO=%d\n”,b);
else printf(”MASSIMO=%d\n,a);
if (a<b)
printf(”MASSIMO=%d\n”,b);
if (b<a)
printf(”MASSIMO=%d\n”,a);
C istruzione di controllo if
![Page 22: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/22.jpg)
C istruzione di controllo if
Se un blocco di istruzioni è controllatoda un if con una congiunzione di due(o più) condizioni (AND logico)
… lo stesso blocco di istruzioni, in modo equivalente, può essere controllato da due (o più) if annidati ciascuno che verifica una delle condizioni
In generale:if (cond1 && cond2 && ... && condN) istr1;
equivale a:if (cond1)
if (cond2)...
if (condN)istruzione;
no
si si
istruzione
cond1 AND cond2?
no
si
sinocond2?
cond1?
istruzione
![Page 23: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/23.jpg)
C istruzione di controllo if
Se un blocco di istruzioni è controllatoda un if con una disgiunzione di due(o più) condizioni (OR logico)
… lo stesso blocco di istruzioni, in modo equivalente, può essere controllato da due (o più) if annidati nel ramo else ciascuno che verifica una delle condizioni
In generale:if (cond1 || cond2 || ... || condN)
istruzione;
equivale a:if (cond1) istruzione;else if (cond2) istruzione;... else if (condN) istruzione;
no
si
istruzione
cond1 OR cond2?
no
si
si
nocond2?
cond1?istruzione
istruzione
![Page 24: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/24.jpg)
C istruzione di controllo if
Esempio.
istr3
istr2
no
no
istr1a>b?
a<b?
noa=b? si
si
si
istr3 istr2
no
noistr1
a>b?
a<b? si
si
if (a>b) istr1;
elseif (a<b)
istr2; else
istr3;
if (a>b) istr1;
if (a<b) istr2;
if (a==b) istr3;
![Page 25: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/25.jpg)
C istruzione di controllo if
Se bisogna effettuare n test distinti ad ognuno dei quali corrisponde una azione alternativa occorre adoperare n-1 else innestati secondo il seguente schema:
if (cond1) istr1;
elseif (cond2)
istr2; else
if (...) ...
elseistrN;
if (cond1) istr1;
else if (cond2) istr2;
else if (...) ...
elseistrN;
no
no
istr1istr2istrN
si
sicond2?
cond1?
![Page 26: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/26.jpg)
C istruzione di controllo if
La nidificazione dell’istruzione if è spesso fonte di errori– Esempio: assegnati tre numeri n1, n2, e n3 riscriverli in modo
ordinato
leggi(n1,n2,n3)if (n1>n2 ):
scambia(n1,n2)else:
if (n1>n3): scambia(n1,n3)
else:if (n2>n3):
scambia(n2,n3)stampa(n1,n2,n3)
Algoritmo
Non funziona perché effettua solo uno scambio, ma in genere può essere necessario più di uno
14,28,18
14,28,18
14,28,18
7,1,5
1,7,5
no
no
n1«n3n2>n3?
si
sin1>n3?
n1>n2?
si
n1«n2 n1«n214,18,28
![Page 27: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/27.jpg)
C istruzione di controllo if
La nidificazione dell’istruzione if è spesso fonte di errori– Esempio: assegnati tre numeri n1, n2, e n3 riscriverli in modo
ordinato
leggi(n1,n2,n3)if (n1>n2 ):
scambia(n1,n2)if (n1>n3):
scambia(n1,n3) if (n2>n3):
scambia(n2,n3)stampa(n1,n2,n3)
Algoritmo 7,1,5
1,7,5
1,7,5
1,5,7
no
no
non2>n3?
n1>n3?
n1>n2?
n2«n3
si
si
si
n1«n3
n1«n3
![Page 28: C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni è controllato da un ifcon una disgiunzione di due (o più) condizioni (OR logico)](https://reader034.vdocuments.site/reader034/viewer/2022042713/5fb2810a1eab144fb44be542/html5/thumbnails/28.jpg)
C istruzione di controllo if
Esercizi1. Determinare se un numero è intero.
Suggerimenti: • Per risolvere il problema pensiamo di confrontare il numero
letto con la sua parte intera: se i due valori sono uguali allora il numero è intero, altrimenti non lo è
• La parte intera si calcola con floor(n)(si deve includere anche il file <math.h>)
2. Determinare se un numero intero è pari.Suggerimenti:• Per risolvere il problema pensiamo di calcolare il resto
modulo 2; se tale resto è zero allora il numero è pari altrimenti non lo è