• Non ci sono risultati.

C istruzione di assegnazione

N/A
N/A
Protected

Academic year: 2021

Condividi "C istruzione di assegnazione"

Copied!
28
0
0

Testo completo

(1)

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

(2)

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 str[] a

2 3,14

c i a o \0

variabili

valori

31.2 3.0 1 4

r2 = 2 + n1;

31.2 7.4 1 4

r1 = n2 * r1;

5.2 7.4 1 4

r2 = r1 + 2.2;

5.2 3.14 1 4

r1 = 5.2;

? 3.14 1 4

n2 = n1*n2+1;

? 3.14 1 3

n1 n2

int n1=1, n2=3;

r1 r2

? 3.14

float r1, r2=3.14;

(3)

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-value l-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.

(4)

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

(5)

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

(6)

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?

istruzioneA istruzioneB

si

(7)

Se la condizione determina l’esecuzione di 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

no cond?

IstruzioneN

cond? si no

IstruzioneA1

IstruzioneAN IstruzioneB1

IstruzioneBM

(8)

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

(9)

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/a stampa(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

(10)
(11)

11

Programma per il calcolo dell’area del cerchio che accetta solo input di

numeri positivi

.

// Calcola Area del cerchio main () {

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

(12)

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

(13)

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

else

printf(”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

(14)

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;

istruzione3;else

if (cond) { istruzione1;

istruzione2;

} else istruzione3;

Dimenticare di includere il blocco in { }

Errore di compilazione:

Expected “;” before “else”

(15)

Per evitare questo errore si può scrivere prima l’espressione e poi la variabile (cosa non consentita con l’assegnazione):

NON si può scrivere

if (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:

(16)

IF ……. ELSE

Stampare il voto degli Esercizi

• Se il voto dello studente è maggiore/uguale di 28 Visualizza A

• Se il voto dello studente è maggiore/uguale di 25 e minore di 28 Visualizza B

• Se il voto dello studente è maggiore/uguale di 22 e minore di 25 Visualizza C

• Se il voto dello studente è maggiore/uguale di 18 e minore di 22 Visualizza D

•Se il voto dello studente è minore di 18

Visualizza non superato

(17)

IF ……. ELSE ……… annidati

Si possono inserire IF/ELSE all’interno di altri IF/ELSE

Se il voto dello studente è maggiore di 28 Visualizza A

Altrimenti

Se il voto dello studente è maggiore di 25 visualizza B

altrimenti

Se il voto dello studente è maggiore di 22 visualizza C

altrimenti

Se il voto dello studente è maggiore di 18

visualizza D

(18)

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

(19)

Else pendente

if (x > 5)

if (y > 5)

printf(“x e y sono > 5”);

else

printf(“x è minore di 5”);

Cosa stampa se x=6 e y=7?

(20)

C istruzione di controllo if

Se l'istruzione controllata da un if consiste a sua volta in un altro if (istruzioni if nidificate), 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 semplici 1) Consente di controllar meglio il risultato di annidamenti di if 2) Riduce gli errori in caso di aggiunte di altre istruzioni come

caso dell’if (o dell’else)

no

si no si istr2

cond2?

istr1 cond1?

(21)

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

(22)

C istruzione di controllo if

Se un blocco di istruzioni è controllato

da 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 no si

cond2?

cond1?

istruzione

(23)

C istruzione di controllo if

Se un blocco di istruzioni è controllato

da 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 no

cond2?

cond1?

istruzione

istruzione

(24)

C istruzione di controllo if

Esempio.

istr3 istr2 no

no

istr1 a>b?

a<b?

noa=b? si si si istr3 istr2 no

no

istr1 a>b?

a<b? si si

if (a>b) istr1;

else

if (a<b) istr2;

else

istr3 ; if (a>b)

istr1;

if (a<b) istr2;

if (a==b)

istr3;

(25)

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;

else

if (cond2) istr2;

else

if (...) ...

else

istrN ;

if (cond1) istr1;

else if (cond2) istr2;

else if (...) ...

else

istrN;

no

no

istr1 istr2

istrN

si cond2? si

cond1?

(26)

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«n3 n2>n3?

si

n1>n3? si n1>n2?

si

n1«n2 n1«n2 14,18,28

(27)

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

no n2>n3?

n1>n3?

n1>n2?

n2«n3 si

si si

n1«n3 n1«n3

(28)

C istruzione di controllo if

Esercizi

1. 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 è

Riferimenti

Documenti correlati

non identifica in modo univoco l’evento corrispondente ma, così come nella statistica descrittiva si aveva solo l’interesse a conoscere la distribuzione di

Come il nome di un array equivale a un puntatore, così un array di puntatori equivale a un puntatore a puntatore (con in più l’allocazione della memoria puntata, come nel caso di

Se le costanti e le variabili sono tutte dello stesso tipo allora anche il valore dell’espressione sarà dello stesso tipo. Se tutte le grandezze presenti nell’espressione sono di tipo

• si ha un fading alla Rice in presenza di un termine dominante (in genere cammino LOS, o cammino LOS + cammino riflesso sul terreno) e numerosi cammini che &#34;perturbano&#34;

• Un puntatore contiene l’indirizzo della locazione di memoria assegnata ad una variabile (che conterrà i valori di tale variabile).. • Si dice che il puntatore ‘punta’

Alla fine della sperimentazione, i risultati positivi degli alunni hanno rivelato non solo una maggiore disinvoltura nella lingua straniera, ma anche la proposta

 Ciascun numero sarà immagazzinato in una piccola porzione di memoria detta variabile costituita da un certo numero di byte.  A ogni variabile il programmatore dà un nome

 Quando un tipo è dichiarato con typedef su strutture aggregate anonime (struct e union senza tag), le variabili di quel nuovo tipo sono considerate dello stesso tipo.