Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 3 Istruzioni di Assegnazione versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – [email protected] – Università della Basilicata Elementi di Base: Assegnazioni >> Sommario Sommario Introduzione Istruzioni di Assegnazione in C++ Compatibilità tra i Tipi Espressioni in C++ Operandi e Operatori Funzioni Predefinite Valutazione delle Espressioni G. Mecca - Programmazione Procedurale in Linguaggio C++ 2 Elementi di Base: Assegnazioni >> Introduzione Introduzione Assegnare un valore ad una variabile primo modo: istruzione di assegnazione secondo modo: lettura del valore da un dispositivo esterno (es: tastiera o file) Istruzioni di assegnazione funzionalità essenziale di ogni linguaggio servono ad effettuare calcoli e a conservare i risultati nelle variabili G. Mecca - Programmazione Procedurale in Linguaggio C++ 3 Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione Istruzione di Assegnazione in C++ Due elementi principali variabile (parte sinistra) espressione (parte destra) Esempio: cerchio = raggio * raggio * pigreco; Intuitivamente: calcola il valore dell’espressione e lo assegna alla variabile G. Mecca - Programmazione Procedurale in Linguaggio C++ 4 Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione Istruzione di Assegnazione Sintassi <nomeVariabile> = <espressione>; Dove <nomeVariabile> è un identificatore = è l’operatore di assegnazione <espressione> è una formula per il calcolo di un valore (>>) G. Mecca - Programmazione Procedurale in Linguaggio C++ 5 Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione Istruzione di Assegnazione Semantica attenzione: il simbolo di uguale non deve essere inteso come un simbolo di equazione l’istruzione ha una precisa semantica Semantica “operazionale” descrive le operazioni effettuate dal processore per eseguire l’istruzione per interpretare le istruzioni è necessario attenersi alla semantica operazionale G. Mecca - Programmazione Procedurale in Linguaggio C++ 6 Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione Istruzione di Assegnazione Semantica “operazionale” dell’assegnazione 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 7 Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione Istruzione di Assegnazione Esempi: int b = a = a = b = a, b, c; 1; b * 3; a + 1; c ; // *nb* Memoria RAM ... #1000 a 129384 34 #1001 b 234 1 56321 #1002 c 56321 #1003 #1004 ... ATTENZIONE: dopo aver cambiato il valore di b con b=c il valore di a NON cambia G. Mecca - Programmazione Procedurale in Linguaggio C++ 8 Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi Compatibilità tra i Tipi 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; G. Mecca - Programmazione Procedurale in Linguaggio C++ 9 Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi Compatibilità tra i Tipi Caso b il tipo del risultato dell’espressione è diverso dal tipo della variabile i due tipi sono tipi numerici (interi o reali) In questo caso avviene una conversione implicita del valore dell’espressione l’assegnazione viene effettuata comunque G. Mecca - Programmazione Procedurale in Linguaggio C++ 10 Elementi di Base: Assegnazioni >> Compatibilità di Tipi Conversione dei Valori Numerici Il valore dell’espressione è convertito nel tipo della variabile Due possibili tipi di conversione Troncamento: conversione da un tipo più generale ad un tipo meno generale es: valore float per variabile intera Ampliamento: caso contrario es: valore intero per variabile float G. Mecca - Programmazione Procedurale in Linguaggio C++ 11 Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi Esempi Troncamento int a; a = 2.32; a = .12e+4; // il valore di a è 2 // il valore di a è 1200 Ampliamento float c; double d; c = 10; // il valore di c è 0.1E+2 d = 1; // il valore di d è 0.1E+1 G. Mecca - Programmazione Procedurale in Linguaggio C++ 12 Elementi di Base: Assegnazioni >> Espressioni Espressioni in C++ Formule per il calcolo di un valore composte di operandi e operatori Operandi costanti variabili Operatori operatori predefiniti funzioni predefinite G. Mecca - Programmazione Procedurale in Linguaggio C++ 13 Elementi di Base: Assegnazioni >> Espressioni Espressioni Supponendo int a, b; const float pigreco = 3.14; Esempi di espressioni a + b * 34 + pigreco a + exp(b)/12 a 18 pigreco G. Mecca - Programmazione Procedurale in Linguaggio C++ ATTENZIONE: stiamo facendo esempi di espressioni, non di istruzioni complete 14 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Predefiniti Operatori aritmetici tipo intero tipo reale Operatori booleani tipo bool Operatori di confronto per tutti i tipi G. Mecca - Programmazione Procedurale in Linguaggio C++ 15 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori aritmetici Tipo Intero operatori: +, - , * operatore / (divisione intera), % (modulo) Operandi e risultato di tipo intero esempio: int j = i = j = i,j; i + 1; 22 / 6; // NOTA: i è uguale a 3 22 % 6 // j è uguale a 4 G. Mecca - Programmazione Procedurale in Linguaggio C++ 16 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori aritmetici Tipo Reale operatori: +, - , *, / 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 17 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori aritmetici Due operatori particolari su interi e reali ++ incremento; a++ coincide con a = a+1 -- decremento; a-- coincide con a = a-1; Esempio: float x; x = 1; y x++; // y--; // int y; = 2; equivalente a x = x + 1 equivalente a y = y - 1; G. Mecca - Programmazione Procedurale in Linguaggio C++ 18 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori aritmetici 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 Esempio: float x; int y; x = 1; y = 2; x += y; // equivalente a x = x + y G. Mecca - Programmazione Procedurale in Linguaggio C++ 19 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Booleani Operatori su valori di tipo bool servono a combinare valori vero/falso Operatore AND: && vero se entrambi gli operandi sono veri Operatore OR: || vero se almeno uno degli operandi è vero Operatore NOT: ! vero se l’unico operando è falso G. Mecca - Programmazione Procedurale in Linguaggio C++ 20 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Booleani Utilizzo nella verifica di “condizioni” strutture di controllo (>>) Per descrivere i risultati degli operatori booleani, si utilizzano le tabelle di verità risultato dell’operatore in corrispondenza di tutti i possibili valori degli operandi G. Mecca - Programmazione Procedurale in Linguaggio C++ 21 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Booleani Tabella di verità dell’operatore && (AND) op1 op2 op1 && op2 false false false false true false true false false true true true G. Mecca - Programmazione Procedurale in Linguaggio C++ 22 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Booleani Tabella di verità dell’operatore || (OR) op1 op2 op1 || op2 false false false false true true true false true true true true G. Mecca - Programmazione Procedurale in Linguaggio C++ 23 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori Booleani Tabella di verità dell’operatore ! (NOT) op1 !op1 false true true false G. Mecca - Programmazione Procedurale in Linguaggio C++ 24 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori di confronto Operatori: ==, !=, >, >=, <, <= confrontano due operandi di tipo compatibile restituiscono un valore booleano Supponendo int a, b; float p1, p2; a = 1; b = 2; p1 = 3.41; p2 = 5.0 Le seguenti sono espressioni valide: a == b a != b p1 >= p2 // restituisce false // restituisce true // restituisce false G. Mecca - Programmazione Procedurale in Linguaggio C++ 25 Elementi di Base: Assegnazioni >> Espressioni >> Operatori Operatori di confronto L’ordinamento tra i valori alfanumerici è basato sui codici ASCII lessicografico (cifre, maiuscole, minuscole) Supponendo: char let1, let2, let3; let1 = ‘c’; let2 = ‘V’; let3 = ‘A’; Le seguenti sono espressioni valide: let1 < let2 let3 < let2 let1 < ‘2’ // restituisce false // restituisce true // restituisce false G. Mecca - Programmazione Procedurale in Linguaggio C++ 26 Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite Funzioni Predefinite Funzioni ad argomenti interi e risultato intero valore assoluto di x: abs(x) Esempio int num = - 3; int x; x = abs(num); // x vale 3 G. Mecca - Programmazione Procedurale in Linguaggio C++ 27 Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite Funzioni Predefinite 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) G. Mecca - Programmazione Procedurale in Linguaggio C++ 28 Elementi di Base: Assegnazioni >> Espressioni >> Valutazione Valutazione delle Espressioni Determinare il valore di una espressione regole complesse Bisogna tenere in conto Precedenza degli operatori Associatività degli operatori Utilizzo delle parentesi Conversione implicita di tipo G. Mecca - Programmazione Procedurale in Linguaggio C++ 29 Elementi di Base: Assegnazioni >> Espressioni >> Valutazione Precedenza degli Operatori Funzioni predefinite, NOT booleano !, ++, - Operatori moltiplicativi: *, /, % Operatori additivi: +, Operatori di relazione: <, >, <=, >= Operatori di uguaglianza-disuguaglianza: ==, != AND booleano: && OR booleano: || Assegnazione: = G. Mecca - Programmazione Procedurale in Linguaggio C++ 30 Elementi di Base: Assegnazioni >> Espressioni Valutazione delle Espressioni Associatività gli operatori con lo stesso livello di precedenza vengono valutati normalmente da sinistra verso destra esistono operatori associativi a destra Utilizzo delle parentesi le parentesi alterano l’ordine di valutazione attenzione: solo parentesi tonde es: a + b + c rispetto ad a + (b + c) G. Mecca - Programmazione Procedurale in Linguaggio C++ 31 Elementi di Base: Assegnazioni >> Espressioni Valutazione delle Espressioni In concreto le regole sono difficili da ricordare Regola ATTENZIONE: solo parentesi tonde pragmatica utilizzare sempre le parentesi per essere sicuri dell’ordine di valutazione Esempio annoCorso == 1 && matricola > 15687 (annoCorso == 1) && (matricola > 15687) ((annoCorso == 1) && (matricola > 15687)) G. Mecca - Programmazione Procedurale in Linguaggio C++ 32 Elementi di Base: Assegnazioni >> Espressioni Espressioni: Esempi ATTENZIONE errore frequente Il compilatore stampa un avviso int i, j, k; Warning W8060 H:\tmp\expr.cpp 16: bool b; Possibly incorrect assignment in function main() float f; i = 3; j = 7; k vale 48 k = (i * 17) – ((193 % 19) * exp(0)); k vale 127 k = ((4 / i) * 127) / cos(0); b vale false b = (i + j) < 10; b = ((i < j) || (i == 7)) && (j != 10); b vale true b = (i = 7) && (i > 2); b vale true b = (i == 7) && (i > 2); b vale false f vale 3 f = (i + j) / 3; f vale 3.3333 f = (i + j) / 3.0; G. Mecca - Programmazione Procedurale in Linguaggio C++ 33 Elementi di Base: Assegnazioni >> Sommario Riassumendo Istruzioni di assegnazione <variabile> = <espressione> semantica “operazionale” (ATTENZIONE) compatibilità tra tipi (ATTENZIONE) Espressioni operandi operatori funzioni predefinite G. Mecca - Programmazione Procedurale in Linguaggio C++ 34 Elementi di Base: Assegnazioni >> Un Semplice Programma 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; } G. Mecca - Programmazione Procedurale in Linguaggio C++ >> 35 Ringraziamenti Ringraziamenti Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela ([email protected]), a cui va il mio ringraziamento. G. Mecca - Programmazione Procedurale in Linguaggio C++ 36 Termini della Licenza Termini della Licenza This work is licensed under the Creative Commons AttributionShareAlike 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. 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. G. Mecca - Programmazione Procedurale in Linguaggio C++ 37