C istruzione di assegnazione - unina.it · C istruzione di controllo if Se un blocco di istruzioni...

Preview:

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 è

Recommended