c istruzione di assegnazione - unina.it · c istruzione di controllo if se un blocco di istruzioni...

28
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 variabile r-value è (il valore di) una qualsiasi espressione con tipo standard uguale o implicitamente convertibile nel tipo di l-value In C++ l’istruzione di assegnazione è una espressione (di assegnazione) il cui valore è r-value Esempio: a = b; n = n + 1; r-value l-value

Upload: others

Post on 14-Aug-2020

8 views

Category:

Documents


0 download

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)
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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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 è