Storia del C e C++ Linguaggio C Fondamenti di Informatica C++: Introduzione, Introduzione, Tipi di Dato Fondamentali, Fondamentali, Variabili 1972, nato come evoluzione di due linguaggi 9 BCPL e B – Lingaggi senza nozione di “tipo di dati” dati” (Lettere J-Z) Dennis Ritchie (Bell Laboratories) Linguaggio di sviluppo di Unix Indipendente dall’ dall’Hardware 9 Portabilità Portabilità Prof. Francesco Lo Presti 1989: standard approvato 1990: pubblicato standard ANSI e ISO 9 ANSI/ISO 9899: 1990 Storia del C e C++ // //Programma Programmadi diEsempio Esempio Inizio anni ‘80: Bjarne Stroustrup (Bell Laboratories) Estensione del C Fornisce funzionalità funzionalità per la programmazione orientata agli oggetti C++: Introduzione 4 Hello, World! #include #include<iostream> <iostream> using usingnamespace namespacestd; std; 9 Oggetti: Oggetti: componenti software riusabili – Modellano entità entità del mondo reale 9 Programmi objectobject-oriented – Migliore stile di programmazione – Facilità Facilità nel modificare/correggere programmi 2 Un Primo Esempio Linguaggio C++ C++: Introduzione int intmain( main()){{ cout cout<<<<"Hello, "Hello,World!\n"; World!\n"; return return0; 0; }} LinguaggioLinguaggio-Ibrido 9 Si può usare uno stile CC-like 9 Si può usare uno stile ObjectObject-oriented 9 Si possono usare entrambi gli stili C++: Introduzione 3 Un Primo Esempio // //Programma Programmadi diEsempio Esempio #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain( main()){{ cout cout<<<<"Hello, "Hello,World!\n"; World!\n"; return return0; 0; Un Primo Esempio // //Programma Programmadi diEsempio Esempio Righe Righeche cheiniziano inizianocon con// //vengono vengono considerate consideraterighe righedidicommento. commento.Non Non hanno nessun effetto sul programma hanno nessun effetto sul programma #include #include<iostream> <iostream> Direttive. Direttive.Le Lefrasi frasiche cheiniziano inizianocon conilil simbolo simbolocancelletto cancelletto(#) (#)sono sonodirettive direttive per perililpreprocessore preprocessoredel delcompilatore. compilatore.La La direttiva direttivainclude includerichiede richiedel’inclusione l’inclusionedel del file iostream.h che contiene le file iostream.h che contiene le dichiarazioni dichiarazionidelle delleoperazioni operazionibasilari basilarididi I/O I/Odefinite definitenella nellalibreria libreriastandard standard using usingnamespace namespacestd; std; int intmain( main()){{ cout cout<<<<"Hello, "Hello,World!\n"; World!\n"; return return0; 0; La Lafunzione funzionemain maine’e’ililpunto puntoda dacui cuiinizia inizia l’esecuzione l’esecuzionedidiun unprogramma programmaC++ C++ }} }} Definizione Definizionedidifunzione: funzione: main( main() )restituisce restituisceun unvalore valoreintero intero return returnXXfa faterminare terminarelalafunzione funzioneee restituisce restituisceililvalore valoreXX tipo tiporestituito restituitonome nomefunzione funzione(lista (listaarg arg) ){ { istruzioni istruzioni Le Fasi della Programmazione 1. Scrittura del programma 2. File oggetto 5 // //Programma ProgrammadidiEsempio Esempio Costante Costantestringa stringa int intmain() main() {{ }} L’effetto L’effettodell’operatore dell’operatore<<<<e’e’quella quelladidi inserire inserireuna unasequenza sequenzadidicaratteri caratteri (“Hello, (“Hello,World!\n”) World!\n”)nel nelflusso. flusso. Stringa: Stringa:una unasequenza sequenzadidicaratteri caratteri racchiusi racchiusitra travirgolette virgolette“”“” \n: \n:Escape EscapeSequence Sequence newline newline––andare andareaacapo capo Ogni Ogniistruzione istruzionetermina terminacon conun un punto puntoeevirgola virgola; ; C++: Introduzione 6 Ambiente Integrato di Programmazione #include #include<iostream> <iostream> using usingnamespace namespacestd; std; Compilazione del codice sorgente 3. Codice sorgente cout coute’e’ililflusso flussostandard standarddidioutput outputdel del C++ C++(di (disolito solitoindirizzato indirizzatoallo alloschemo). schemo). Costante Costantenumerica numerica(intero) (intero) }} C++: Introduzione IInomi nomidel delprogramma programmaappartengono appartengonoallo allo spazio spaziodei deinomi nomistd std IDE (Integrated (Integrated Development Environment) Environment) cout cout<<<<"Hello, "Hello,World!\n"; World!\n"; return return0;0; Ambiente per la stesura, compilazione e debugging di programmi Collegamento (linking (linking)) “Collega” Collega” il codice oggetto con il codice delle librerie 9 Librerie contengono il codice delle funzioni invocate dal programma 4. Codice eseguibile Caricamento ed Esecuzione Codice Sorgente Compilatore Programma Oggetto Librerie Linker Programma Eseguibile C++: Introduzione 7 Useremo DEVDEV-Cpp (disponibile anche sul sito del corso) C++: Introduzione 8 …oppure 1. …oppure Scrivere il codice usando un semplice editor di testo 2. E.g., E.g., Blocco Note C++: Introduzione 9 …oppure 3. Compilare il file sorgente da linea di comando g++ -o hello hello.cpp C++: Introduzione 10 Errori Eseguire il programma da linea di comando hello Errori di Sintassi: Sintassi: Errori a tempo di compilazione Il codice sorgente viola le regole di sintassi // //Programma Programmadi diEsempio Esempio #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain( main()){{ cout cout<<<<"Hello, "Hello,World!\n World!\n;; return return00 }} C++: Introduzione 11 C++: Introduzione 12 Errori Il Ciclo Modifica-Compila-Debug Modifica del Programma Errori Logici: Logici: Errori a tempo di esecuzione Inizio Il programma non svolge il compito desiderato // //Programma Programmadi diEsempio Esempio Compilazione #include #include<iostream> <iostream> Errori di Compilazione using usingnamespace namespacestd; std; int intmain( main()){{ Test del Programma cout cout<<<<"Hell, "Hell,World!\n”; World!\n”; return return0; 0; }} Errori a runtime C++: Introduzione Un Programma che Elabora Numeri #include #include<iostream> <iostream> using usingnamespace namespacestd; std; FineC++: Introduzione 13 Un Programma che Elabora Numeri #include #include<iostream> <iostream> using usingnamespace namespacestd; std; Total value = 1.23 int intmain() main() {{ int intmain() main() {{ int intpennies pennies==8;8; int intdimes dimes==4;4; int intpennies pennies==8;8; int intdimes dimes==4;4; int intquarters quarters==3;3; int intquarters quarters==3;3; Dichiarazione Dichiarazionedidivariabili variabili Operatore Operatoredidiassegnazione assegnazione Costante numerica (virgola mobile) double doubletotal total==pennies pennies**0.01 0.01++dimes dimes**0.10 0.10 Costante numerica (virgola mobile) ++quarters quarters**0.25; 0.25;/* /*valore valoretotale totaledelle dellemonete monete*/ */ double doubletotal total==pennies pennies**0.01 0.01++dimes dimes**0.10 0.10 ++quarters * 0.25; /* valore totale quarters * 0.25; /* valore totaledelle dellemonete monete*/ */ }} 14 cout cout<<<<"Total "Totalvalue value==""<<<<total total<<<<"\n"; "\n"; return 0; return 0; }} cout cout<<<<"Total "Totalvalue value==""<<<<total total<<<<"\n"; "\n"; return 0; return 0; Sintassi Sintassialternativa alternativaper peri icommenti commenti commento */ /* /* commento */ C++: Introduzione 15 C++: Introduzione 16 Costanti Una costante è una qualsiasi espressione che ha un valore prefissato Decimali: Esadecimali 9 Si premette 0x 75 75 75 75 -23 -23 -23 -23 0x4b 0x4b 75 75 I letterali che rappresentano caratteri sono racchiusi da carattere apice (‘ (‘) Sequenze di letterali che rappresentato stringhe sono racchiusi da tra due caratteri doppio apice (“ (“) Numeri in virgola mobile Numeri con parte frazionaria e/o fattore esponenziale 3.1456 3.1456 3.1456 3.1456 6.02e23 6.02e23 23 6.02·10 6.02·1023 1.6e-19 1.6e-19 -19 1.6·10 1.6·10-19 Variabili Le variabili sono spazi di memoria, identificati da un nome, nome, che possono conservare valori di un determinato tipo Ciascuna variabile deve essere definita indicandone tipo e nome Una variabile puo’ puo’ contenere soltanto valori del suo stesso pennies tipo dimes Nella definizione di una variabile, variabile, e’ possibile assegnarle un valore quarters iniziale total Caratteri ‘x’, ‘T’,’1’ Stringhe “Salve gente” gente”, “Hello, Hello, World” World”, “”, “”, “x” Numeri interi, Numeri in virgola mobile, Caratteri, Stringhe Numeri Interi Costanti C++: Introduzione 17 C++: Introduzione 18 I Nomi delle Variabili …… int intpennies pennies==8;8; Identificatore: Identificatore: sequenza di lettere, numeri e simbolo di int intdimes dimes==4;4; int quarters int quarters==3;3; sottolineatura “_” …… Deve iniziare con una lettera 9 5pennies non va bene Memoria Non puo’ puo’ essere una parola o simbolo riservato del linguaggio Non puo’ puo’ contenere spazi 9 return non va bene 9 Pen nies non va bene Nomi validi 8 4 3 Case sensitive: maiuscole e minuscole vengono considerate diverse 1.23 C++: Introduzione pippo, pippo, pluto, pluto, ciao5, salve_a_tutti E’ bene scegliere nomi che descrivano adeguatamente il contenuto della variabile 19 Pippo e pippo sono due variabili diverse C++: Introduzione 20 Dichiarazione di variabili Dichiarazione di variabili Prima di usare una variabile occorre dichiararla specificando a quale tipo di dato essa appartenga Sintassi nomeTipo nomeTiponomeVariabile nomeVariabile;; nomeTipo nomeTiponomeVariabile nomeVariabile==espressione espressione;; Definire una nuova variabile nomeVariabile, di tipo nomeTipo, ed eventualmente assegnarle il valore …… iniziale espressione Altrimenti la variabile ha un valore iniziale indefinito Una volta dichiarate le variabili possono essere usate nel programma all’ all’interno del loro campo di validita’ validita’ (scope) Tratteremo questo aspetto in seguito E’ possibile dichiare piu’ piu’ variabili contemporaneamente indicando una sola volta il tipo nomeTipo nomeTiponomeVariabile1 nomeVariabile1, ,…, …,nomeVariabileN nomeVariabileN; ; nomeTipo nomeTiponomeVariabile1 nomeVariabile1==espressione1 espressione1, ,…, …,nomeVariabileN nomeVariabileN==espressioneN espressioneN; ; int intpennies pennies==8;8; int dimes int dimes==4;4; …… int intpennies pennies==8,8,dimes dimes==4,4,quarters quarters==3;3; double doubletotal total==pennies pennies**0.01 0.01++dimes dimes**0.10 0.10 int intquarters quarters==3;3; double doubletotal total==pennies pennies**0.01 0.01++dimes dimes**0.10 0.10 ++quarters quarters**0.25; 0.25;/* /*valore valoretotale totaledelle dellemonete monete*/ */ ++quarters quarters**0.25; 0.25;/* /*valore valoretotale totaledelle dellemonete monete*/ */ C++: Introduzione 21 …… …… L’Assegnazione C++: Introduzione 22 L’Assegnazione Abbiamo visto come i programmi usino le variabili per memorizzare i valori da elaborare e i risultati dell’ dell’elaborazione Le variabili sono posizioni in memoria che possono conservare valori di un determinato tipo Il valore memorizzato in una variabile puo’ puo’ essere inizializzato, inizializzato, ma anche modificato durante l’esecuzione di un programma Il cambiamento del valore di una variabile si ottiene con un enunciato di assegnazione #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain() main() {{ int intpennies pennies==8;8; double doubletotal= total=pennies*0.01; pennies*0.01; int intdimes dimes==4;4; total=total+ total=total+dimes dimes**0.10; 0.10; int intquarters quarters==3;3; total=total+ total=total+quarters quarters**0.25; 0.25; }} C++: Introduzione 23 total totalviene vienedefinito definitoed ed inizializzato inizializzato total totalviene vienemodificato modificato cout cout<<<<"Total "Totalvalue value==""<<<<total total<<<<"\n"; "\n"; return 0; return 0; C++: Introduzione 24 L’Assegnazione L’Assegnazione Sintassi …… nomeVariabile nomeVariabile==espressione espressione; ; total=total+ total=total+quarters quarters**0.25; 0.25; …… …… Calcola Memoria total=total+ total=total+quarters quarters**0.25; 0.25; total+ 1.23 1.23 **0.25 total+quarters quarters 0.25 …… Calcola il valore di espressione e memorizza il risultato nella posizione di memoria assegnata alla variabile nomeVariabile L’assegnazione è un particolare tipo di espressione pennies 8 dimes 4 quarters 3 total C++: Introduzione C++: Introduzione E’ possibile usare la direttiva #define del preprocessore per dare un nome ad una costante Ovunque viene usato l’l’identificatore, identificatore, il preprocessore provvederà provvederà a sostuirlo con la costante #define #defineid_costante id_costante costante costante double doubletotal=pennies*0.01; total=pennies*0.01; …… total=total+ total=total+quarters quarters**0.25; 0.25; #define #definePI PI3.14142 3.14142 …… La dichiarazione specifica il tipo, l’l’assegnazione no Una variabile puo’ puo’: 26 Costanti Definite (#define) Non confondere la dichiarazione di una variabile con un enunciato di assegnazione 1.23 0.48 25 Assegnazione o Dichiarazione? Memorizza il risultato in total double doubleraggio=1; raggio=1; double area=raggio*raggio*PI; double area=raggio*raggio*PI; essere definita una volta sola Essere aggiornata quante volte si vuole C++: Introduzione 27 …… double doubleraggio=1; raggio=1; double doublearea=raggio*raggio*3.14142; area=raggio*raggio*3.14142; #define non è una istruzione C++ ma una direttiva per il preprocessore C++: Introduzione 28 Costanti Dichiarate Comunicazione da Console Usando il prefisso const si possono dichiarare delle costanti appartenenti ad un determinato tipo esattamente allo stesso modo in cui si dichiarano le variabili; La console è l’interfaccia base del calcolatore Composta da: …… const constdouble doublelire_per_euro=1937,26; lire_per_euro=1937,26; Tastiera: Tastiera: unità unità standard di input Video: Video: unità unità standard di output double doublevalore_in_euro=15,36; valore_in_euro=15,36; double doublevalore_in_lire=valore_in_euro*lire_per_euro; valore_in_lire=valore_in_euro*lire_per_euro; …… Sintassi const constnome_tipo nome_tiponome_variabile nome_variabile==espresssione espresssione Costanti dichiarate sono delle variabili il cui valore non può essere modificato devono pertanto essere inizializzate al momento della loro creazione C++: Introduzione 29 Comunicazione da Console 1. 2. C++ le operazioni di input ed output di un programma vengono gestire da due flussi di dati (stream ): (stream): cin per l’l’input (normalmente assegnato alla tastiera) cout per l’l’output (normalmente diretta al video) 30 Output (cout) In C++ l’l’output si effettua applicando l’l’operatore di inserimento << al flusso cout. cout. << inserisce il valore alla sua destra nel flusso di dati alla sua sinistra He llo 23 co ut 7.5 Sono definiti inoltre altri due flussi – cerr e clog – il cui scopo è quello di segnalare eventuali messaggi di errore Usando questi due flussi un programma può interagire con un utente mostrando messaggi sullo schermo e ricevendo l’input da parte dell’ dell’utente dalla tastiera C++: Introduzione cin Programma C++ o cia H Costante Stringa Frase Frasedi dioutput output cout cout<<<<“Frase “Frasedi dioutput”; output”; Costante Numero 120 120 cout cout<<<<120; 120; Variabile cout cout<<<<x; x; 32 C++: Introduzione 31 valore valoredi dixx C++: Introduzione 32 Output (cout) L’operatore di inserzione << può essere usato più più volte nella stessa frase cout cout<<<<“Salve” “Salve”<<<<““aa““<<<<“tutti”; “tutti”; Input (cin) Salve Salveaatutti tutti Sintassi int intnumero numero cout espr.11<<<<……<<<<espr. espr.nn;; cout<<<<espr. cin cin>>>>numero; numero; Per andare a capo bisogna inserire nel flusso il carattere speciale newline ‘\n’ cout cout<<<<“Prima “Primafrase”; frase”; cout cout<<<<“Seconda “Secondafrase”; frase”; cout cout<<<<“Prima “Primafrase\n”; frase\n”; cout cout<<<<“Seconda “Secondafrase”; frase”; L’input viene elaborato da cin solo dopo aver premuto il tasto invio Il valore (costante) introdotto deve essere dello stesso tipo della variabile 9 Altrimenti lo stream cin fallisce – Tralasciamo per ora la gestione di queste situazioni Prima Primafrase frase Seconda Secondafrase frase 33 C++: Introduzione Input (cin) 34 Esempio L’operatore di inserzione >> può essere usato più più volte nella stessa istruzione #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain() main() {{ cin cin>>>>aa>>>>b; b; Il programma attende che l’l’utente digiti un numero e prema il tasto “invio” invio”. Prima PrimafraseSeconda fraseSecondafrase frase C++: Introduzione In C++ l’l’input si effettua applicando l’l’operatore di estrazione >> al flusso cin. cin. L’ L’operatore deve essere seguito dalla variabile in cui si deve memorizzare il valore da leggere Sintassi int intx,y; x,y; cout cout>>>>“Inserire “Inserireililprimo primonumero\n”; numero\n”; cin var.11>>>>……>>>>var. var.nn;; cin>>>>var. cin cin>>>>x;x; cout cout>>>>“Inserire “Inserireililsecondo secondonumero\n”; numero\n”; L’utente deve fornire valori di tipo appropriato, uno per variabile I valori devono essere separati da uno o più più caratteri spazio/tabulazione/newline spazio/tabulazione/newline int intmain() main() {{ int intx,y; x,y; cout cout>>>>“Inserire “Inserirei idue duenumeri numerida dasommare sommare \n”; \n”; cin cin>>>>xx>>>>y;y; int intsomma=x+y; somma=x+y; cin cin>>>>y;y; int intsomma=x+y; somma=x+y; }} C++: Introduzione #include #include<iostream> <iostream> using usingnamespace namespacestd; std; 35 cout cout<<<<“Somma= “Somma=""<<<<somma somma<<<<"\n"; "\n"; return 0; return 0; }} cout cout<<<<“Somma= “Somma=""<<<<somma somma<<<<"\n"; "\n"; return 0; return 0; C++: Introduzione 36 Esempio Input (cin) #include #include<iostream> <iostream> using usingnamespace namespacestd; std; cout cout<<<<"How "Howmany manypennies penniesdo doyou youhave? have?";"; int intcount; count; cin cin>>>>count; count; total total==count count**0.25 0.25++total; total; }} 2 -4 \n cin 3 \n 6 \n 2 \n -4 \n -4 -4 o una loro combinazione 37 C++: Introduzione 38 Tipo di Dato Fondamentali in C++ L’input da tastiera è bufferizzato I caratteri digitati sono raggruppati tra loro e l’l’input viene elaborato quando si preme il tasto invio cin cin>>>>a; a; 33 cout cout<<<<““Secondo Secondonum. num.“;“;cin cin>>>>b; b; 66 cout cout<<<<““Terzo Terzonum. num.“;“; 22 cin cin>>>>c; c; cout cout<<<<““Quarto Quartonum. num.“;“; cin cin>>>>d; d; 6 22 Input (cin) cout cout<<<<““Primo Primonum. num.”;”; 3 oppure su righe succesive 66 cin 33 return return0;0; C++: Introduzione uno dopo l’l’altro separati da spazi/tab spazi/tab 336622-4 -4 cout cout<<<<"Total "Totalvalue value==""<<<<total total<<<<"\n"; "\n"; cout cout<<<<"How "Howmany manynickels nickelsdo doyou youhave? have?";"; cin cin>>>>count; count; E’ possibile inserire i dati cout cout<<<<"How "Howmany manyquarters quartersdo doyou youhave? have? ";"; cin cin>>>>count; count; double doubletotal total==count count**0.01; 0.01; I valori devono essere separati da uno o più più caratteri spazio/tabulazione/newline spazio/tabulazione/newline cin cin>>>>aa>>>>bb>>>>cc>>>>d; d; cin cin>>>>count; count; total total==count count**0.10 0.10++total; total; int intmain( main() ) {{ total total==count count**0.05 0.05++total; total; …… …… cout cout<<<<"How "Howmany manydimes dimesdo doyou youhave? have?";"; -4 -4 Nome byte char 1 Carattere o intero di 8 bit Signed: Signed: -128… 128…127 Unsigned: Unsigned: 0… 0…255 short/ byte 1 Intero di 8 bit Signed: Signed: -128… 128…127 Unsigned: Unsigned: 0… 0…255 long 4 Intero di 32 bit 336622-4 -4 C++: Introduzione 39 Intervallo Signed: Signed: -2147483648… 2147483648…2147483647 Unsigned: Unsigned: 0… 0…4294967295 Intero. La sua lunghezza dipende dalla dimensione di una parola (word) usata dal sistema. Nei sistemi a 32 bit è di 32 bit int Che succede digitando direttamente? Descrizione float 4 Numero in virgola mobile a singola precisione ±3.4· 3.4·10±38 double 8 Numero in virgola mobile a doppia precisione ±1.7· 1.7·10±308 bool 1 Valori booleani true e false C++: Introduzione 40 Numeri interi in C++ In C++ tutti i tipi di dati fondamentali per numeri interi usano internamente la rappresentazione in complemento a due In C++ tutti i tipi di dati fondamentali per numeri in virgola mobile usano internamente una rappresentazione binaria codificata dallo standard internazionale IEEE 754 float (32bit), double (64 bit) La divisione con divisore zero non è un errore se effettuata tra numeri in virgola mobile byte, int, int, long le condizioni di overflow nelle operazioni aritmetiche non vengono segnalate Numeri in virgola mobile in Java si ottiene semplicemente un risultato errato L’unica operazione aritmetica tra numeri interi che genera un’ un’errore è la divisione per zero C++: Introduzione 41 Errori di arrotondamento C++: Introduzione 42 Arrotondamento Gli errori di arrotondamento sono un fenomeno naturale nel calcolo in virgola mobile eseguito con un numero finito di cifre significative se il dividendo è diverso da zero, il risultato è infinito (con il segno del dividendo) se anche il dividendo è zero, il risultato è indeterminato, cioè cioè non è un numero, e viene usata la codifica speciale NaN (Not a Number) Number) …… double doubleff==4.35; 4.35; cout cout<<<<setprecision(10) setprecision(10)<<<<f; f; …… calcolando 1/3 con due cifre significative, si ottiene 0,33 moltiplicando 0,33 per 3, si ottiene 0,99 e non 1 Siamo abituati a valutare questi errori pensando alla rappresentazione dei numeri in base decimale, ma i computer rappresentano i numeri in virgola mobile in base binaria e a volte si ottengono dei risultati inattesi C++: Introduzione Il numero 4,35 non ha una rappresentazione esatta nel sistema binario, proprio come 1/3 non ha una rappresentazione esatta nel sistema decimale 43 4.349999905 4,35 viene rappresentato con un numero appena inferiore a 4,35 C++: Introduzione 44 Assegnazioni con Conversione Assegnazioni con Conversione …… double doublef; f; int intpennies=3; pennies=3; f=pennies; f=pennies; …… …… double doublef=2.3; f=2.3; int intpennies; pennies; pennies=f; pennies=f; …… In un’ un’assegnazione, il tipo di dati dell’ dell’espressione e della variabile a cui la si assegna devono essere compatibili se i tipi non sono compatibili, il compilatore genera un messaggio di warning I tipi non sono compatibili se provocano una possibile perdita di informazione durante la conversione L’assegnazione di un valore di tipo numerico intero ad una variabile di tipo numerico in virgola mobile non può provocare perdita di informazione C++: Introduzione In questo caso si ha perdita di informazione, perché perché la parte frazionaria di un valore in virgola mobile non può essere memorizzata in una variabile di tipo intero 45 C++: Introduzione Operatore Esplicito di Conversione (casting) Aritmetica Ci sono casi in cui si vuole effettivamente ottenere la conversione di un numero in virgola mobile in un numero intero Lo si fa segnalando al compilatore l’ l’intenzione esplicita di accettare l’l’eventuale perdita di informazione, mediante un “cast” cast” …… …… double doublef=2.3; f=2.3; double doublef=2.3; f=2.3; int intpennies; pennies; int intpennies; pennies; pennies= pennies=(int) (int)f; f; pennies=static_cast<int> pennies=static_cast<int>f; f; …… …… addizione e sottrazione: + moltiplicazione e divisione: * / Le operazioni di moltiplicazione e divisione hanno precedenza su addizione e sottrazione a+b/2 a+b/2 C++: Introduzione C++ supporta le quattro operazioni elementari a+(b/2) a+(b/2) E’ possibile usare coppie di parentesi tonde per indicare in quale ordine valutare le sottosottoespressioni (a+b)/2 (a+b)/2 47 46 (a+b)/2 (a+b)/2 C++: Introduzione 48 Aritmetica: Divisione Se uno dei due operandi è un numero floating point, point, il risultato e’ e’ un numero floating point 7.0/4.0 7.0/4.0 7/4.0 7/4.0 7.0/4 7.0/4 11 Funzione Inclusione del file di intestazione <cmath> int intx;x; cout cout<<<<“Inserire “Inserireun unnumero numero\n”; \n”; cin cin>>>>x;x; double doubleradice=sqrt(x); radice=sqrt(x); }} C++: Introduzione 50 C++: Introduzione 52 Funzioni Matematiche using usingnamespace namespacestd; std; int intmain() main() {{ Si dice che la funzione restituisce (return) il valore calcolato 49 Per invocare le funzioni matematiche bisogna includere il file di intestazione <cmath <cmath>> #include #include<iostream> <iostream> #include #include<cmath> <cmath> Calcola il valore della funzione nome_funzione con argomenti/parametri espr1,…,esprn Esempio Sintassi nome_funzione nome_funzione((espr1 espr1,,…, …,esprn esprn)) 33 C++: Introduzione Le funzioni C++ saranno studiate in dettaglio in seguito double doublex; x; cin cin>>>>x; x; cout cout<<<<sqrt(x); sqrt(x); 1.75 1.75 L’operatore modulo % restituisce il resto della divisione tra interi 7%4 7%4 Operazioni più più complesse, e.g., e.g., la radice quadrata, il logaritmo vengano realizzare tramite funzioni Se entrambi gli operando sono interi, il risultato è un intero 7/4 7/4 Funzioni Matematiche sqrt(x) sqrt(x) radice quadrata di x pow(x,y) pow(x,y) xy sin(x) sin x cos(x) cos x tan(x) tan(x) tan x exp(x) exp(x) ex log(x) logaritmo naturale loge(x), x>0 log10(x) cout cout<<<<“Radice “Radicequadrata= quadrata=""<<<<radice radice<<<<"\n"; "\n"; return return0;0; C++: Introduzione 51 Descrizione logaritmo decimale log10(x) ceil(x) ceil(x) il più più piccolo numero intero ≥x floor(x) floor(x) il più più grande numero intero ≤x fabs(x) fabs(x) valore assoluto di x Caratteri Classi In C++ una classe e’ un tipo di dato definito dall’ dall’utente Tipo: Tipo: rappresentazione concreta di un concetto Il tipo char permette di memorizzare un carattere con codifica ASCII ad 8 bit char charx=‘a’,y; x=‘a’,y; y=‘b’; y=‘b’; char è un tipo compatibile con int (eredità (eredità del C) corrisponde ad un byte valore=numero binario corrispodente alla codifica ASCII del carattere ‘a’ ha codifica 01100001, codifica binaria di 97 …… char charx=‘a’; x=‘a’; int inta=x; a=x; cout cout<<<<a; a; …… 1. 97 2. 3. 4. C++: Introduzione tipo int e’ la rappresentazione (approssimata) approssimata) di un numero intero tipo double e’ e’ la rappresentazione (approssimata) approssimata) di un numero reale In C++ e’ e’ possibile definire nuovi tipi per rappresentare concretamente: concretamente: Stringhe Impiegati Conto in Banca … 53 C++: Introduzione Classi Stringhe In C++ una classe e’ un tipo di dato definito dall’ dall’utente Una classe e’ caratterizzata da: da: 1. Dati (Attributi) Attributi) Stringa: Sequenza di caratteri 2. funzioni membro una particolare stringa, un particolare impiegato, etc. Insieme delle funzioni membro accessibili dall’ dall’esterno C++: Introduzione #include #include<iostream> <iostream> #include <string> #include <string> using usingnamespace namespacestd; std; int main() int main() bisogna includere il file di {{ intestazione <string <string>> string stringnome; nome; Dichiarazione, Assegnazione, string frase=“Inserire string frase=“Inserireun unnome\n”; nome\n”; input ed output simili ai tipi cout >> frase; cout >> frase; numerici cin cin>>>>nome; nome; Il tipo string è il primo esempio cout cout<<<<“Ciao “Ciao""<<<<nome nome<<<<"\n"; "\n"; di classe che incontriamo in C++ Interfaccia Pubblica “Hello” Hello”, “a”, “” I doppi apici non fanno parte della stringa Per usare le stringhe in C++ attributi Oggetto e’ e’ un’ un’istanza di una classe Funzioni (Comportamento) racchiusa tra doppi apici 54 55 stringhe in C++ sono oggetti in C il tipo string non esiste 9 in C stringhe sono array di caratteri return return0; 0; }} C++: Introduzione 56 Stringhe Stringhe Funzioni membro della classe string 1. funzione membro length( length( ) saluto.length() saluto.length() restituisce la lunghezza della stringa (numero di caratteri) …… int intx; x; string stringsaluto=“Ciao saluto=“CiaoMondo\n”; Mondo\n”; x=saluto.lenght( x=saluto.lenght();); cout cout<<<<saluto saluto<<<<““èèlunga lunga““<<<<xx<<<<““caratteri\n”; caratteri\n”; …… C++: Introduzione i a o 1 2 3 58 4 M o n d o \n 5 6 7 8 9 10 Concatenazione di Stringhe: Operatore + …… string stringnome=“Harry”; nome=“Harry”; string stringcognome=“Potter” cognome=“Potter” string stringmago=nome mago=nome++““ ““++cognome; cognome; cout cout<<<<mago; mago; …… ao aoM M Il simbolo dell’ dell’operatore di concatenazione è identico a quello dell’ dell’operatore di addizione Almeno una delle due stringhe deve essere una variabile stringa la posizione dei caratteri nelle stringhe viene numerata a partire partire da 0. Perché Perché? il secondo parametro è la quantità quantità di caratteri (consecutivi) da estrarre C++: Introduzione Harry HarryPotter Potter il primo parametro è la posizione del primo carattere che si vuole estrarre C++: Introduzione Stringhe …… string stringsaluto=“Ciao saluto=“CiaoMondo\n”; Mondo\n”; string stringporzione=saluto.substr(2,4); porzione=saluto.substr(2,4); cout cout<<<<porzione; porzione; …… C Si dice che la funzione restituisce (return) il valore calcolato 57 restituisce una sottostringa 0 Calcola il valore della funzione membro funzione_membro con argomenti/parametri espr1,…,esprn e espressione (parametro implicito) funzione membro substr(primo substr(primo carattere,lunghezza) Sintassi espressione espressione.funzione_membro .funzione_membro((espr1 espr1,,espr2 espr2,…, ,…,esprn esprn)) Stringhe 2. Invocazione di una funzione membro 59 C++: Introduzione 60 Classe Impiegato Classe Impiegato Esempio Capitolo 3 (Employee) Rappresentazione di un Impiegato 1. Attributi Costruzione Sintassi 2. nome_classe nome_classe((parametri_costruzione parametri_costruzione);); name, salary Comportamento Costruzione Accesso al nome, stipendio Variazione dello stipendio Distruzione string get_name( ) Employee(“Fantozzi, Employee(“Fantozzi,Ugo”, Ugo”,2000); 2000); Employee Employee name double get_salary( ) void set_salary(double ) Crea una variabile oggetto della classe nome_classe usando i parametri parametri_costruzione per inizializzarlo name salary “Fantozzi, “Fantozzi,Ugo” Ugo” 2000 2000 salary C++: Introduzione 61 C++: Introduzione Classe Impiegato Classe Impiegato Dichiarazione variabile oggetto Sintassi oggetto della classe nome_classe usando i parametri parametri_costruzione per inizializzarlo fantozzi= file di intestazione classe Employee using usingnamespace namespacestd; std; #include #include“ccc_empl.h” “ccc_empl.h” int intmain( main()) {{ Employee Employeefantozzi(“Fantozzi, fantozzi(“Fantozzi,Ugo”, Ugo”,2000); 2000); Employee Employeefantozzi=Employee(“Fantozzi, fantozzi=Employee(“Fantozzi,Ugo”, Ugo”,2000); 2000); Employee fantozzi(“Fantozzi, Ugo”, 2000); Employee fantozzi(“Fantozzi, Ugo”, 2000); Definisce una nuova variabile Esempio #include #include<iostream.h> <iostream.h> nome_classe nome_classenome_variabile=nome_classe nome_variabile=nome_classe((parametri parametri costruzione costruzione);); nome_classe nome_classenome_variabile nome_variabile((parametri parametricostruzione costruzione);); 62 double doublenuovo_stipendio=fantozzi.get_salary( nuovo_stipendio=fantozzi.get_salary()-100; )-100; Employee fantozzi.set_salary(nuovo_stipendio); fantozzi.set_salary(nuovo_stipendio); name salary “Fantozzi, “Fantozzi,Ugo” Ugo” 2000 2000 C++: Introduzione }} 63 cout cout<<<<“Il “Ilnuovo nuovostipendio stipendiodel deldipendente dipendente““<<<<fantozzi.get_name( fantozzi.get_name();); cout cout<<<<““èè““<<<<fantozzi.get_salary( fantozzi.get_salary())<<<<“\n”; “\n”; C++: Introduzione 64