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
Scarica

Fondamenti di Informatica