G. Mecca – mecca@unibas.it – Università della Basilicata
Programmazione Procedurale in Linguaggio C++
Elementi di Base Parte 3
Istruzioni di Assegnazione
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Sommario
m
Introduzione
m
Istruzioni di Assegnazione in C++
m
Compatibilità tra i Tipi
m
Espressioni in C++
ðOperandi e Operatori ðFunzioni Predefinite
ðValutazione delle Espressioni
m
L’Operatore di Cast
Elementi di Base: Assegnazioni >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Introduzione
m
Assegnare un valore ad una variabile
ðprimo modo: istruzione di assegnazione ðsecondo modo: lettura del valore da undispositivo esterno (es: tastiera o file)
m
Istruzioni di assegnazione
ðfunzionalità essenziale di ogni linguaggio ðservono ad effettuare calcoli e a conservare i
risultati nelle variabili
Elementi di Base: Assegnazioni >> Introduzione
Istruzione di Assegnazione in C++
m
Due elementi principali
ðvariabile (parte sinistra) ðespressione (parte destra)m
Esempio:
cerchio = raggio * raggio * pigreco;
m
Intuitivamente:
ðcalcola il valore dell’espressione e lo assegna alla variabile
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Istruzione di Assegnazione
m
Sintassi
<nomeVariabile> = <espressione>;
m
Dove
ð<nomeVariabile> è un identificatore ð= è l’operatore di assegnazione
ð<espressione> è una formula per il calcolo di un valore (>>)
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
Istruzione di Assegnazione
m
Semantica
ðattenzione: il simbolo di uguale non deve essere inteso come un simbolo di equazione ðl’istruzione ha una precisa semantica
m
Semantica “operazionale”
ðdescrive le operazioni effettuate dal processore per eseguire l’istruzione
ðper interpretare le istruzioni è necessario attenersi alla semantica operazionale
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Istruzione di Assegnazione
m
Semantica “operazionale” dell’assegnaz.
ðviene calcolato il valore dell’espressione a partire dai valori delle costanti e delle variabili ðse il valore risultante è compatibile con il tipo della variabile, viene assegnato alla variabile (ovvero: il valore viene scritto nello spazio di memoria associato alla variabile)
ðaltrimenti si genera un errore
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
Istruzioni di Assegnazione
m
Calcolo del valore dell’espressione
ðil processore applica gli operandi aglioperatori
ðprelevando gli opportuni valori dalla memoria (costanti simboliche, variabili)
m
Nota sul calcolo dell’espressione
ðil calcolo viene effettuato utilizzando registri di lavoro interni al processore
ðe non modifica il valore degli operandi
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Istruzione di Assegnazione
m
Esempi:
int a, b, c;
b = 1;
a = b * 3;
a = abs(-2) + 5;
a = a + 1;
b = c ; // *nb*
Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione
...
#1004
#1003
#1002
#1001
#1000 ...
Memoria RAM
b a
c
129384 234 56321
3
ATTENZIONE: dopo aver cambiato il valore di b con l’ istruzione b = c il valore di a NON cambia
(NON si tratta di equazioni matematiche)
Processore
R1 R2 1
3 2 7 78
56321
8
Compatibilità tra i Tipi
m
Caso a
ðil tipo del risultato dell’espressione è lo stesso della variabile
ðes: int a, b;
b = 10;
a = b * 12 - 34;
ðes: float a, b;
b = 10.1;
a = b * 12.0 / 34;
Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Compatibilità tra i Tipi
m
Caso b
ðil tipo del risultato dell’espressione è diverso dal tipo della variabile
ði due tipi sono tipi numerici (interi o reali)
m
In questo caso
ðavviene una conversione implicita del valore dell’espressione
ðl’assegnazione viene effettuata comunque
Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi
Compatibilità tra i Tipi
m
Il valore dell’espressione è convertito nel tipo della variabile
m
Due possibili tipi di conversione
ðAmpliamento: conversione da un tipo meno generale ad un tipo più generale
es: valore intero per variabile float
ðTroncamento: caso contrario al precedente es: valore float per variabile intera
Elementi di Base: Assegnazioni >> Compatibilità di Tipi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Compatibilità tra i Tipi
m
Ampliamento
float c; double d;
c = 10; // il valore di c è 0.1E+2 d = 1; // il valore di d è 0.1E+1 m
Troncamento
int a;
a = .12e+4; // il valore di a è 1200 a = 2.32; // il valore di a è 2
Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi
ATTENZIONE il troncamento produce una perdita
di valore
Espressioni
m
Formule per il calcolo di un valore
ðcomposte di operandi e operatorim
Operandi
ðcostanti ðvariabilim
Operatori
ðoperatori predefiniti ðfunzioni predefinite
Elementi di Base: Assegnazioni >> Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Espressioni
m
Supponendo
int a, b;
const float pigreco = 3.14;
m
Esempi di espressioni
a + b * 34 + pigreco a + exp(b)/12
a 18
pigreco
Elementi di Base: Assegnazioni >> Espressioni
ATTENZIONE:
stiamo facendo esempi di espressioni, non di
istruzioni complete
Operatori Predefiniti
m
Operatori aritmetici
ðtipo interoðtipo reale
m
Operatori booleani
ðtipo boolm
Operatori di confronto
ðper tutti i tipiElementi di Base: Assegnazioni >> Espressioni >> Operatori
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Operatori aritmetici
m
Tipo Intero
ð operatori: +, - , *
ð operatore / (divisione intera), % (modulo)
m
Operandi e risultato di tipo intero
ð esempio:int i,j;
j = i + 1;
i = 22 / 6; // NOTA: i è uguale a 3 j = 22 % 6 // j è uguale a 4
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
Operatori aritmetici
m
Tipo Reale
ð operatori: +, - , *, /
m
Operandi e risultato di tipo reale
ð esempio:float x,y;
x = y * 3.14 + 0.33e+2;
y = 22.0 / 6.0; //NOTA: y vale 3.66667 y = 22.0 / 6; //NOTA: y vale 3.66667
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Operatori aritmetici
m
Due operatori particolari su interi e reali
ð ++ incremento; a++ coincide con a = a+1 ð -- decremento; a-- coincide con a = a-1;m
Esempio:
float x; int y;
x = 1; y = 2;
x++; // equivalente a x = x + 1 y--; // equivalente a y = y - 1;
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
Operatori aritmetici
m
Altre forme di assegnazione compatta
ð+= a+=b coincide con a = a+bð-= a-=b coincide con a = a-b ð*= a*=b coincide con a = a*b ð/= a/=b coincide con a = a/b
m
Esempio:
float x; int y;
x = 1; y = 2;
x += y; // equivalente a x = x + y
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Operatori Booleani
m
Operatori su valori di tipo bool
ðservono a combinare valori vero/falso
m
Operatore AND: &&
ðvero se entrambi gli operandi sono veri
m
Operatore OR: ||
ðvero se almeno uno degli operandi è vero
m
Operatore NOT: !
ðvero se l’unico operando è falso
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
Operatori Booleani
m
Utilizzo
ðnella verifica di “condizioni”
ðstrutture di controllo (>>)
m
Semantica degli operatori booleani
ðsi descrive attraverso le tabelle di verità ðrisultato dell’operatore in corrispondenza ditutti i possibili valori degli operandi
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Operatori Booleani
m
Tabella di verità dell’operatore && (AND)
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
false true
false
true true
true
false false
true
false false
false
op1 && op2 op2
op1
Operatori Booleani
m
Tabella di verità dell’operatore || (OR)
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
true true
false
true true
true
true false
true
false false
false
op1 || op2 op2
op1
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Operatori Booleani
m
Tabella di verità dell’operatore ! (NOT)
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
false true
true false
!op1 op1
ATTENZIONE:
gli operatori booleani non cambiano il valore degli operandi a cui si applicano
Esempio:
bool a, b;
a = true;
b = !a; // a continua ad // essere true
Operatori di confronto
m
Operatori: ==, !=, >, >=, <, <=
ðconfrontano due operandi di tipo compatibile ðrestituiscono un valore booleano
m
Supponendo
int a, b; float p1, p2;
a = 1; b = 2; p1 = 3.41; p2 = 5.0;
Le seguenti sono espressioni valide:
a == b // restituisce false a != b // restituisce true p1 >= p2 // restituisce false
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Operatori di confronto
m
L’ordinamento tra i valori alfanumerici è
ðbasato sui codici ASCIIðlessicografico (cifre, maiuscole, minuscole)
m
Supponendo:
char let1, let2, let3;
let1 = ‘c’; let2 = ‘V’; let3 = ‘A’;
Le seguenti sono espressioni valide:
let1 < let2 // restituisce false let3 < let2 // restituisce true let1 < ‘2’ // restituisce false
Elementi di Base: Assegnazioni >> Espressioni >> Operatori
Funzioni Predefinite
m
Funzioni ad argomenti interi e risultato intero
ðvalore assoluto di x: abs(x)
m
Esempio
int num = - 3;
int x;
x = abs(num); // x vale 3
Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Funzioni Predefinite
m
Funzioni ad arg. numerici e risultato reale
ðradice quadrata di x: sqrt(x)ðvalore assoluto di x: fabs(x)
ðelevamento a potenza xy : pow(x,y) ðesponenziale ex: exp(x)
ðseno di x: sin(x) ðcoseno di x: cos(x)
ðarcotangente di x: atan(x)
Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite
Valutazione delle Espressioni
m
Determinare il valore di una espressione
ðregole complessem
Bisogna tenere in conto
ðprecedenza degli operatori ðassociatività degli operatori ðutilizzo delle parentesi ðconversione implicita di tipoElementi di Base: Assegnazioni >> Espressioni >> Valutazione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Precedenza degli Operatori
m Funzioni predefinite, NOT booleano !, ++, --
m Operatori moltiplicativi: *, /, %
m Operatori additivi: +, -
m Operatori di relazione: <, >, <=, >=
m Operatori di uguaglianza-disuguaglianza: ==, !=
m AND booleano: &&
m OR booleano: ||
m Assegnazione: =
Elementi di Base: Assegnazioni >> Espressioni >> Valutazione
m
Associatività
ðgli operatori con lo stesso livello di
precedenza vengono valutati normalmente da sinistra verso destra
ðesistono operatori associativi a destra
m
Utilizzo delle parentesi
ðle parentesi alterano l’ordine di valutazione ðattenzione: solo parentesi tonde
ðes: a + b + c rispetto ad a + (b + c)
Elementi di Base: Assegnazioni >> Espressioni
Valutazione delle Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
m
In concreto
ðle regole sono difficili da ricordare
m
Regola pragmatica
ðutilizzare sempre le parentesi per essere sicuri dell’ordine di valutazione
m
Esempio
annoCorso == 1 && matricola > 15687 (annoCorso == 1) && (matricola > 15687) ((annoCorso == 1) && (matricola > 15687))
Elementi di Base: Assegnazioni >> Espressioni
Valutazione delle Espressioni
ATTENZIONE:
solo parentesi tonde
Espressioni: Esempi
int i, j, k;
bool b;
float f;
i = 3; j = 7;
k = (i * 17) – ((193 % 19) * exp(0));
k = ((4 / i) * 127) / cos(0);
b = (i + j) < 10;
b = ((i < j) || (i == 7)) && (j != 10);
b = (i = 7) && (i > 2);
b = (i == 7) && (i > 2);
f = (i + j) / 3;
f = (i + j) / 3.0;
Elementi di Base: Assegnazioni >> Espressioni
k vale 48 k vale 127 b vale false b vale true
f vale 3 f vale 3.3333 b vale true ATTENZIONE
errore frequente Il compilatore stampa un avviso Warning W8060 H:\tmp\expr.cpp 16:
Possibly incorrect assignment in function main()
b vale false
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Operatore di Cast
m
Una postilla sulla valutazione delle espr.
ðogni dato trattato dal processore ha un tipo ðalcuni valori possono essere considerati di
tipi diversi
m
Esempio: il numero 1
ðvalore di tipo bool ðvalore di tipo int ðvalore di tipo float ðvalore di tipo doubleElementi di Base: Assegnazioni >> Operatore di Cast
ATTENZIONE al concetto di cast
Operatore di Cast
m
In questi casi
ðil valore può essere soggetto a conversioni di tipo
m
Conversioni di tipo
ðconsistono nella trasformare la
rappresentazione in memoria del valore ðche da quel momento è considerato di tipo
diverso rispetto al suo tipo originale
Elementi di Base: Assegnazioni >> Operatore di Cast
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Operatore di Cast
m
Normalmente
ðle conversioni di tipo vengono effettuate automaticamente dal processore
ðtroncamenti e ampliamenti
m
Ma
ðè indispensabile fare attenzione a queste trasformazioni automatiche
Elementi di Base: Assegnazioni >> Operatore di Cast
Operatore di Cast
m
Un esempio
ðil calcolo della media aritmetica dei valori di un insieme di numeri interi
ðsupponiamo che sia data la somma ed il numero di valori dell’insieme
ðvogliamo calcolarne la media aritmetica ðesempio: se la somma è 22 e i valori sono
3, la media vale 7.33333
Elementi di Base: Assegnazioni >> Operatore di Cast
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Operatore di Cast
m
Un esempio
int sommaValori = 22;
int numeroValori = 3;
float media;
media = sommaValori / numeroValori;
cout << media;
Elementi di Base: Assegnazioni >> Operatore di Cast
in questo caso:
- viene calcolata la divisione intera (es: 22 / 3 = 7) - il risultato intero viene ampliato a float (da 7 a 7.0) - il valore ampliato viene assegnato a media (7.0) di conseguenza il risultato stampato non è quello atteso
7
Operatore di Cast
m
Per risolvere il problema
ðI soluzione: dichiaro sommaValori come variabile di tipo float (inappropriato) ðII soluzione: costringo il processore a
trasformare sommaValori in un float prima della divisione >> operazione di cast
m
Operazione di “Cast”
ðchiede esplicitamente di trasformare la rappresentazione e il tipo di un valore
Elementi di Base: Assegnazioni >> Operatore di Cast
G. Mecca - Programmazione Procedurale in Linguaggio C++ 41
Operatore di Cast
m
Operatori di Cast
ðl’operazione viene realizzata attraverso opportuni operatori unari
ðun operatore per ciascun tipo
m
Esempio
ðes: float x; bool b;
x = (float) 1;
b = (bool) x;
Elementi di Base: Assegnazioni >> Operatore di Cast
dato di tipo int, valore 1 dato di tipo float, valore 1.0 dato di tipo bool, valore true
Operatore di Cast
m
Sintassi
ð(<tipo>)<valore>
m
Semantica
ðil processore trasforma la rappresentazione in memoria del <valore> nella
corrispondente rappresentazione del <tipo>
specificato
ðil risultato dell’applicazione dell’operatore di cast è un valore del <tipo> specificato
Elementi di Base: Assegnazioni >> Operatore di Cast
G. Mecca - Programmazione Procedurale in Linguaggio C++ 43
Operatore di Cast
m
Nel nostro esempio
int sommaValori = 22;
int numeroValori = 3;
float media;
media = ((float)sommaValori) / numeroValori;
cout << media;
Elementi di Base: Assegnazioni >> Operatore di Cast
7.3334
in questo caso:
- il valore di sommaValori viene ampliato a float (da 22 a 22.0) - viene calcolata la divisione decimale (7.3334)
in questo caso il risultato è corretto
Operatore di Cast
m
Attenzione
ðl’operatore ha priorità molto alta ðattenzione all’ordine di applicazione
Elementi di Base: Assegnazioni >> Operatore di Cast
media = ((float)sommaValori)/numeroValori;
cout << media;
media = (float)sommaValori/numeroValori;
cout << media;
7.3334 7.3334
media = (float)(sommaValori/numeroValori);
cout << media; 7
media = (float)sommaValori/(float)numeroValori;
cout << media; 7.3334
G. Mecca - Programmazione Procedurale in Linguaggio C++ 45
Riassumendo
m
Istruzioni di assegnazione
ð<variabile> = <espressione>ðsemantica “operazionale” (ATTENZIONE) ðcompatibilità tra tipi (ATTENZIONE)
m
Espressioni
ðoperandi, operatori, funzioni predefinite
m
Cast
Elementi di Base: Assegnazioni >> Sommario
Elementi di Base: Assegnazioni >> Un Semplice Programma
// Calcolo della superficie del cerchio
#include <iostream.h>
void main() { // Dichiarazioni
const float pigreco = 3.14;
int raggio;
float cerchio, circonf;
// Operazioni
cout << “Immetti la lungh. del raggio” << endl;
cout << “(deve essere un numero intero)” << endl;
cin >> raggio;
cerchio = raggio * raggio * pigreco;
circonf = 2 * pigreco * raggio;
cout << “La circonferenza misura: “ << circonf << endl;
cout << “Il cerchio ha superficie: “ << cerchio << endl;
}
Un Semplice Programma
G. Mecca - Programmazione Procedurale in Linguaggio C++ 47
Ringraziamenti
m Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela
(mariasamela@tiscali.it), a cui va il mio ringraziamento.
Ringraziamenti
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.