Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
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
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;
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.
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
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
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
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
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
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
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
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
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
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”
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:
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
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
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”);
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?
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?
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
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
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
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;
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?
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
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
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 è