Fondamenti Di Programmazione: Materiale Didattico Di Supporto Alle Lezioni Del Corso Di
Fondamenti Di Programmazione: Materiale Didattico Di Supporto Alle Lezioni Del Corso Di
Fondamenti Di Programmazione: Materiale Didattico Di Supporto Alle Lezioni Del Corso Di
Fondamenti di Programmazione
...
• oppure su Amazon
Orario
Lu Ma Me Gi Ve Sa
Analisi Algebra Analisi
8:30/9:30 Mat. I Lineare Mat. I
Fond. di
Algebra Analisi Progr. Algebra Analisi Mat. 0
9:30/10:30 Lineare Mat. I (teoria) Lineare Mat. I Corso C
Fond. di Fond. di Fond. di
Progr. Progr. Progr. Analisi Analisi Mat. 0
10:45/11:45 (teoria) (teoria) (teoria) Mat. I Mat. I Corso C
Fond. di Fond. di
Progr. Progr. Analisi Analisi Algebra Mat. 0
11:45/12:45 (teoria) (teoria) Mat. I Mat. I Lineare Corso C
14:00/15:00
Fond. di
Progr.
15:00/16:00 (LAB)
Fond. di
Progr.
16:00/17:00 (LAB)
Argomenti del corso
Concetti di base della programmazione
Concetto di algoritmo. Il calcolatore come esecutore di algoritmi. Linguaggi di
programmazione ad alto livello. Sintassi e semantica di un linguaggio di programmazione.
Metodologie di programmazione strutturata. Principi fondamentali di progetto e sviluppo di
semplici algoritmi.
Rappresentazione dell’informazione
Rappresentazione dei caratteri, dei numeri naturali, dei numeri interi e dei numeri reali.
Programmare in C
Tipi fondamentali. Istruzioni semplici, strutturate e di salto. Funzioni. Ricorsione. Riferimenti
e puntatori. Array. Strutture e unioni. Memoria libera. Visibilità e collegamento. Algoritmi di
ricerca e di ordinamento.
Programmare in C++
Classi. Operatori con oggetti classe. Altre proprietà delle classi. Classi per l’ingresso e per
l’uscita.
Esempi di algoritmi:
1
Calcolatore elettronico come risolutore di problemi
2
Algoritmo (1)
1. Operazioni sequenziali
Realizzano una singola azione. Quando l’azione è terminata passano all’operazione
successiva.
2. Operazioni condizionali
Controllano una condizione. In base al valore della condizione, selezionano
l’operazione successiva da eseguire.
3. Operazioni iterative
Ripetono l’esecuzione di un blocco di operazioni, finchè non è verificata una
determinata condizione.
3
Algoritmo (2)
risultati
dati
esecutore
4
Algoritmo (3)
5
Algoritmo (4)
Calcolo del massimo di un insieme
- scegli un elemento come massimo provvisorio max
- per ogni elemento i dell’insieme:
se i>max eleggi i come nuovo massimo provvisorio max
- il risultato è max
Algoritmi equivalenti
hanno lo stesso dominio di ingresso
hanno lo stesso dominio di uscita
in corrispondeza degli stessi valori del dominio di ingressso producono gli
stessi valori del dominio di uscita
7
Algoritmo (6)
Algoritmo 1
• Calcola l’insieme A dei divisori di M
• Calcola l’insieme B dei divisori di N
• Calcola l’insieme C dei divisori comuni
• il massimo comun divisore è il massimo divisore contenuto in C
8
Algoritmo (7)
Algoritmo
• ripeti finché (M != N):
se M > N, sostituisci a M il valore M-N
altrimenti sostituisci a N il valore N-M
- il massimo comun divisore corrisponde a M (o a N)
9
Algoritmo (8)
Efficienza:
– un algoritmo è efficiente se perviene alla soluzione del compito cui è
preposto nel modo più veloce possibile, compatibilmente con la sua
correttezza.
10
Programmazione
La formulazione testuale di un algoritmo in un linguaggio comprensibile ad un
calcolatore è detta PROGRAMMA.
11
Linguaggi di Programmazione (1)
Si può stabilire quali sono gli elementi linguistici primitivi, quali sono le frasi
lecite e se una frase appartiene al linguaggio.
12
Linguaggi di Programmazione (2)
13
Definizione di linguaggio
Alfabeto V (lessico)
- insieme dei simboli con cui si costruiscono le frasi
Universo linguistico V*
- insieme di tutte le frasi (sequenze finite) di elementi di V
Linguaggio L su alfabeto V
- un sottoinsieme di V*
14
Grammatiche
15
Grammatica BNF (1)
GRAMMATICA BNF (Backus-Naur Form) è una grammatica le cui regole di
produzione sono della forma
X
one of // "one of " è un costrutto del metalinguaggio
A
X
one of
A1 A2 ... An // unica regola che indica l’alternativa fra A1, …, An
16
Grammatica BNF (2)
G = <V, VN, P, S>
frase
soggetto verbo
articolo nome
il lupo mangia .
Albero sintattico: albero che esprime il processo di derivazione di una frase
usando una data grammatica
Esistono programmi per generare analizzatori sintattici per linguaggi descritti con
BNF
18
Altro esempio: una grammatica per generare numeri interi (1/2)
Come sono fatti i numeri interi?
Così:
5898
-30
76
-234
Come si fa a dare un procedimento per generare tutti i numeri interi possibili corretti?
19
Altro esempio: una grammatica per generare numeri interi (2/2)
20
Che aspetto avrà la grammatica per il linguaggio C++?
Diamo ora un piccolo assaggio di come potrebbe essere fatta una grammatica
per il linguaggio C++ (la daremo più avanti)
int main(){
istruzione-seq
}
istruzione-seq
one of
istruzione istruzione-seq|opt
istruzione
one of
definizione // int a = 3;
selezione // if (a == 5) ...
iterazione // while (a < 10 ) ...
21
Il più semplice programma C++
22
Struttura del generico programma C++
<istruzione 1>
<istruzione 2>
...
<istruzione n>
return 0;
}
Un programma C++ sorgente è una sequenza di caratteri che deve essere salvata
su disco come file di testo, assegnandogli un nome
Esempio:
programma1.cpp // è importante usare l’estensione .cpp per i sorgenti C++
23
Sintassi e semantica
Scrivere un programma sintatticamente corretto non implica che il programma
faccia quello per cui è stato scritto
3) esecuzione
26
I tre passi su CLion: Editing, Compilazione ed Esecuzione
27
Laboratorio di C++ basato su CLion
Durante il primo laboratorio verrete assistiti nella:
28
Rappresentazione dell’Informazione (1/2)
29
Rappresentazione dell’Informazione (2/2)
Esempio: n=2.
00
01
10
11
30
Calcolatore e Informazione
dispositivi di conversione
testo
disegni IN
sequenze
immagini OUT di bit
numeri
musica
...
Calcolatore
31
Rappresentazione del testo (1/2)
Sequenze Caratteri
00110000 0 01000011
00110001 1 01100001
00110010 2 01110010
... ... 01101111
00111001 9 00100000
... ... 01100001
01000001 A 01101110 Caro amico,
01000010 B 01101001
01000011 C 01100011
... ... 01101111
01100001 a 00101100
01100010 b
... ...
32
Rappresentazione del testo (2/2)
33
Rappresentazione dei numeri naturali (1/14)
Base dieci
Cifre: 0, 1, 2, 3, 4, 6, 7, 8, 9
Rappresentazione posizionale
(123)dieci significa 1102 + 2101 + 3100
Base due
Cifre: 0, 1
Rappresentazione posizionale
34
Rappresentazione dei numeri naturali (2/14)
BASE CIFRE
due 01
cinque 01234
otto 01234567
sedici 0123456789ABCDEF
35
Rappresentazione dei numeri naturali (3/14)
p-1
Ν = a i β = a p-1 β + a p-2 β
i p-1 p-2 2
+ ...+ a 2 β + a1 β + a 0
i=0
36
Rappresentazione dei numeri naturali (4/14)
20 1
21 2
Osservazione 1:
22 4
La rappresentazione in base due di una qualunque
23 8
24 16
potenza di due si può ottenere immediatamente
25 32 utilizzando un uno seguito da p zeri, se p è la potenza:
26 64
27 128
2p (10000)due
28 256 p
29 512
Osservazione 2: Con dieci bit in base due si possono generare 1 kilo sequenze distinte di bit
(per la precisione, 1024 disposizioni con ripetizione).
Una memoria RAM con 234 celle di memoria avrà 16 Giga locazioni (memoria da 16 Giga Byte)
37
Rappresentazione dei numeri naturali (5/14)
Sequenze Sequenze
di simboli di simboli
(in base ) (in base 10)
ap-1ap-2 …a1a0 N?
6568 6 ·8 2 + 5 ·8 1 + 6 · 8 0 430
A0316 10 ·16 2 + 0 ·16 1 + 3 ·16 0 2563
11012 1 ·2 3 + 1 ·2 2 + 0 ·2 1 + 1 ·2 0 13
38
Rappresentazione dei numeri naturali (6/14)
Sequenze Sequenze
di simboli di simboli
(in base ) (in base 10)
ap-1ap-2 …a1a0 N
39
Rappresentazione dei numeri naturali (7/14)
fine
(10111)due
a4a3a2a1a0
40
Rappresentazione dei numeri naturali (8/14)
Inizio q0 = N
QUOZIENTE RESTO
q0 = N -
div
q1 = q0 / a0
div
q2 = q1 / a1
div
q3 = q2 / a2
div
q4 = q3 / a3
div
q5 = q4 / a4
div
q6 = q5 / a5
q7 = 0 a6
fine
N = a6 · 6 + a5 · 5 + a4 · 4 + a3 · 3 + a2 · 2 + a 1 · 1 + a0 · 0
42
Rappresentazione dei numeri naturali (10/14)
43
Rappresentazione dei numeri naturali (11/14)
A = 1111111111111111 (65535)
B = 1111111111111111 (65535)
11111111111111110 (131070)
44
Rappresentazione dei numeri naturali (12/14)
1
Da base X a base Y
Rappresentazioni
Numeri base X
Naturali
2 Rappresentazioni
base Y
46
Rappr. Naturali - Cambio di base (14/14)
(FFE4)sedici
(657)otto (A03)sedici
( 110 101 111 )due (1010 0000 0011)due (1111 1111 1110 0100)due
47
Numeri Interi (1/14)
a=+3 => segno_a = 0, ABS_a = 011 (naturale 3 rappresentato su 3 cifre) => A=0011
a= -3 => segno_a = 1, ABS_a = 011 (naturale 3 rappresentato su 3 cifre) => A=1011
48
Numeri Interi (2/14)
49
Numeri Interi (3/14)
0,1
4
A a
0 0000 +0
1 0001 +1
2 0010 +2 Rappresentazione di interi
3 0011 +3
in modulo e segno su
4 0100 +4
5 0101 +5 calcolatore con p=4 bit
6 0110 +6
7 0111 +7
8 1000 -0
9 1001 -1
10 1010 -2 numero negativo bit più significativo
11 1011 -3 della rappresentazione uguale a 1
12 1100 -4
13 1101 -5 (zero rappresentato due volte)
14 1110 -6
15 1111 -7
50
Numeri Interi (4/14)
[-(2p-1-1),+2p-1-1]
•p = 4 [-7,+7]
•p = 8 [-127,+127]
•p = 16 [-32767,+32767]
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia
rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati.
Ad esempio:
tentando di rappresentare a=-9 su p=4 bit, si ottiene:
A=(segno_a, ABS_a), dove segno_a=1 e ABS_a = 9
ma il naturale 9 (1001) non è rappresentabile su 3 bit!!
51
Numeri Interi (5/14)
dove sia ABS_a che (duep-ABS_a) sono rappresentati in base due come numeri naturali
su p bit.
Ad esempio, per p = 4 si ha:
a = 0 => ABS_a = 0, e il naturale 0 ha rappr. 0000 su 4 bit => A = 0000
a = 1 => ABS_a = 1, e il naturale 1 ha rappr. 0001 su 4 bit => A = 0001
a = 7 => ABS_a = 7, e il naturale 7 ha rappr. 0111 su 4 bit => A = 0111
a = -1 => ABS_a = 1, 16-1=15, dove il naturale 15 ha rappr. 1111 su 4 bit => A = 1111
a = -2 => ABS_a = 2, 16-2=14, dove il naturale 14 ha rappr. 1110 su 4 bit => A = 1110
a = -8 => ABS_a = 8, 16-8=8, dove il naturale 8 ha rappr. 1000 su 4 bit => A = 1000
NB: La rappresentazione in complemento a 2 è anche detta in complemento alla base. Infatti lo
stesso procedimento può essere generalizzato per rappresentare interi in basi diverse da due.
52
Numeri Interi (6/14)
a = (ap-1 == 0) ? +A : -(duep-A)
53
Numeri Interi (7/14)
0,1
4
A a
0 0000 0
1 0001 +1
Rappresentazione di interi
2 0010 +2 in complemento a due su
3 0011 +3 calcolatore con p=4 bit
4 0100 +4
5 0101 +5
6 0110 +6 Anche in questo caso:
7 0111 +7
8 1000 -8 numero negativo bit più significativo
9 1001 -7 della rappresentazione uguale a 1
10 1010 -6 Inoltre, a differenza della
11 1011 -5 rappresentazione in modulo e segno,
12 1100 -4 non viene sprecata nessuna
13 1101 -3 rappresentazione (lo zero è
14 1110 -2 rappresentato una volta sola)
15 1111 -1
54
Numeri Interi (8/14)
55
Numeri Interi (9/14)
Terza Rappresentazione: rappresentazione con bias
Trasformazione a => A
Sia a (es. a=+3, a=-3, …) il numero intero che si vuole rappresentare in
rappresentazione con bias su p bit. La rappresentazione A (es. 1010, 0100, …) di a è
data da:
A = ap-1…a0 = a + (2p-1 - 1)
dove a+(2p-1 - 1) è supposto essere non negativo e dunque viene rappresentato come
un naturale su p bit. La quantità (2p-1 - 1) è detta bias e A = a + bias
Ad esempio, per p = 4 si ha:
a = 0 => 0+(24-1-1) = 7, e il naturale 7 ha rappr. 0111 su 4 bit => A = 0111
a = 1 => 1+(24-1-1) = 8, e il naturale 8 ha rappr. 1000 su 4 bit => A = 1000
a = 8 => 8+(24-1-1) = 15, e il naturale 15 ha rappr. 1111 su 4 bit => A = 1111
a = -1 => -1+(24-1-1) = 6, e il naturale 6 ha rappr. 0110 su 4 bit => A = 0110
a = -2 => -2+(24-1-1) = 5, e il naturale 5 ha rappr. 0101 su 4 bit => A = 0101
a = -7 => -7+(24-1-1) = 0, e il naturale 0 ha rappr. 0000 su 4 bit => A = 0000
NB1: questa rappresentazione è anche detta rappresentazione con polarizzazione
NB2: come si vedrà nelle prossime slides, questa rappresentazione viene
utilizzata nella rappresentazione dei numeri reali in virgola mobile
56
Numeri Interi (10/14)
NB: Lo zero viene rappresentato una sola volta (come accade in compl. a 2).
57
Numeri Interi (11/14)
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia
rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati.
58
Numeri Interi (12/14)
59
Numeri Interi (13/14)
-2 1110
+1 compl. 0001 Sommatore per
a due naturali
1111
-1
60
Numeri Interi (14/14)
7+5=12 0 1 1 1 + (+7)
0 1 0 1 = (+5) 7-1=6 0 1 1 1 + (+7)
------------------------------ 1 1 1 1 = (-1)
1 1 0 0 (-4) overflow! ------------------------------
1 0 1 1 0 (+6) corretto!
-6 -8 = -14 1 0 1 0 + (-6)
1 0 0 0 = (-8)
-------------------------------
1 0 0 1 0 (+2) overflow!
61
Numeri Reali
Sottoinsieme Sequenze
discreto dei Numeri di bit
Razionali
Overflow Overflow
Underflow
62
Numeri Reali – Virgola fissa (1/5)
Si usa un numero fisso di bit per la parte intera ed un numero fisso di bit per
la parte frazionaria.
Siano p i bit per rappresentare r: f per la parte frazionaria e (p-f) i bit la parte
intera:
p-f -1
p-f -1 1 f
a β =a
i 0
R = ap-f-1…a0 a-1...a-f r i p-f -1
β + ...+ a 0 β a β
-1
... a -f β
i=-f
parte
frazionaria
Esempio: +1110.01 in base due vale +14.25 in base dieci
NB: La virgola non si rappresenta
La parte intera I(r) si rappresenta con le tecniche note
Per la parte frazionaria si usa il procedimento seguente:
63
Numeri Reali – Virgola fissa(2/5)
f0 = F(r)
Se f0 ≠ 0 eseguire la seguente procedura iterativa:
f-1 = F( f0 * 2 ) a-1 = I( f0 * 2 )
f-2 = F( f-1 * 2 ) a-2 = I( f-1 * 2 )
...
fino a che f-j è uguale a zero oppure si è raggiunta la precisione
desiderata
Esempio:
p = 16 e f = 5
r = +331,6875
64
Numeri Reali – Virgola fissa(3/5)
QUOZIENTE RESTO
331 -
165 1
82 1
41 0
20 1
10 0
5 0
2 1
1 0
0 1
65
Numeri Reali – Virgola fissa(4/5)
F I
f-1=F(0.6875*2=1.375)=0.375 a-1=I(1.375)=1
f-2=F(0.375*2=0.75)=0.75 a-2=I(0.75)=0
f-2=F(0.75*2=1.5)=0.5 a-3=I(1.5)=1
f-3=F(0.5*2=1.0)=0 a-4=I(1.0)=1
66
Numeri Reali – Virgola fissa(5/5)
ERRORE DI TRONCAMENTO F I
f-1=F(0.3*2=0.6)=0.6 a-1=I(0.6)=0
f-2=F(0.6*2=1.2)=0.2 a-2=I(1.2)=1
Rappresentare r = 2.3 con f = 6. f-3=F(0.2*2=0.4)=0.4 a-3=I(0.4)=0
f-4=F(0.4*2=0.8)=0.8 a-4=I(0.8)=0
f-5=F(0.8*2=1.6)=0.6 a-5=I(1.6)=1
f-6=F(0.6*2=1.2)=0.2 a-6=I(1.2)=1
67
Numeri Reali – Virgola mobile(1/10)
Notazione Scientifica
r m e m = mantissa; e = esponente
L’intervallo di rappresentabilità è fissato dal numero di cifre
dell’esponente.
L’accuratezza è determinata dal numero di cifre della mantissa.
Se ne sceglie una in particolare, che verrà
Diverse rappresentazioni
chiamata forma normalizzata,in modo da
3.14 0.314 10+1 31.4 10-1 avere una rappresentazione unica
68
Numeri Reali – Virgola mobile(2/10)
+1.11001·due+11 … … +111001·due-10
(alcune possibili rappresentazioni in virgola mobile)
69
Numeri Reali – Virgola mobile(3/10)
70
Numeri Reali – Virgola mobile(4/10)
Esempio 1
R = {1,10011,1110100101} rappresenta il numero reale negativo con:
f = F/2G = F/2dieci = 0.1110100101
e = E -(2K-1 - 1) = +10011 – (+01111) = +100 (bias=quindici)
Esempio 2
R = {0,01111,0000000001} rappresenta il numero reale positivo:
f = F/2M = 1/2G = due-dieci=0.0009765625
e = E -(2K-1 - 1) = 01111-01111 = 15-15=0
71
Numeri Reali – Virgola mobile(5/10)
72
Numeri Reali – Virgola mobile(6/10)
73
Numeri Reali – Virgola mobile(7/10)
74
Numeri Reali – Virgola mobile(8/10)
75
Numeri Reali – Virgola mobile(9/10)
76
Numeri Reali - Virgola mobile (10/10)
half precision
r1 r2
0+=2-15 +∞ 2+17
0+=2-127 +∞ 2+129
0
single precision
77