Program. Mod A - Cap. 1
prof. Burattini
1
ALCUNE INFORMAZIONI PRELIMINARI
Docente: Ernesto Burattini
e-mail: [email protected]
RICEVIMENTO STUDENTI GIOVEDI’ ORE 8.30-10.30
(Dip. Fisica 2M16)
Durata del corso: dal 26/09/2006 al 22/12/2006
Program. Mod A - Cap. 1
prof. Burattini
2
Libro di testo consigliato:
G. Criscuolo, F. Tramontano –
Introduzione alla programmazione. Algoritmi iterativi in C++.
Ed. Manna
Altri libri di testo :
Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione, ed. Apogeo
Tucker A.B., Bernat A.P., Bradley W.J., Cupper R.D., Scragg G.W. – Fundamentals
of computing I, McGraw-Hill
Program. Mod A - Cap. 1
prof. Burattini
3
SVOLGIMENTO DEL CORSO
LEZIONI
ESAME SCRITTO
ESAME ORALE
PRENOTAZIONE ESAMI OBBLIGATORIA
LABORATORIO
DI
PROGRAMMAZIONE
Program. Mod A - Cap. 1
prof. Burattini
4
EVENTUALI CAMBI DI GRUPPO VANNO
FATTI SECONDO LA NORMATIVA
ILLUSTRATA SUL SITO DELLA FACOLTA’
www.scienzeinfo.unina.it
Program. Mod A - Cap. 1
prof. Burattini
5
Ultima osservazione
E’ obbligatorio scrivere in
ITALIANO
Program. Mod A - Cap. 1
prof. Burattini
6
Programmazione MOD.A gruppo G3
Questi appunti sono solo di supporto ai libri di testo e non li
sostituiscono in alcun modo.
La maggior parte degli esempi sono tratti dal libro di testo
Gli appunti e informazioni varie sono reperibili sul sito
http://people.na.infn.it/~ernb/programmazione mod.a-C++
Inviare esercizi svolti, osservazioni, note o problemi all’indirizzo
[email protected]
Program.
Mod A - Cap. 1
NON RISPONDO
A MESSAGGI
ANONIMI!!!
prof. Burattini
7
PROGRAMMA DEL CORSO
• Introduzione al C++
• Introduzione alla programmazione
• Procedure e funzioni
• Le strutture di controllo
• Introduzione agli stream
• Gli array a una o più dimensioni
Program. Mod A - Cap. 1
Testi:
prof. Burattini
……………………………………………………...
8
Program. Mod A - Cap. 1
prof. Burattini
9
Program. Mod A - Cap. 1
prof. Burattini
10
BREVE STORIA
• ABACO
500 a.C.
x10000 ... x100 x10 x1
x5
x1
Program. Mod A - Cap. 1
prof. Burattini
11
Istruzioni per l’uso
A partire da destra
Per ogni colonna
- stabilisci il fattore di colonna
(1 per la prima, 10 per la seconda, etc.)
- moltiplica la somma degli anelli del lato superiore
accanto alla sbarra per 5
- somma al numero ottenuto al passo precedente il
numero di anelli della parte inferiore accanto
alla sbarra
- moltiplica la somma precedente per il fattore di colonna
- fai la somma dei risultati ottenuti precedentemente
(1*5+4)*1
=
9
(1*5+3)*10
=
80
(0*5+1)*100
=
100
(0*5+0)*1000
=
0
(0*5+3)*10000
(0*5+2)*100000
=
=
30000
200000
(1*5+2)*1000000
=
7000000
TOTALE
=
7230189
Program. Mod A - Cap. 1
prof. Burattini
12
Alcune buone letture
Ettore Picutti - Sul numero e la sua storia Feltrinelli Universale Economica
Simon Singh - L’ultimo teorema di Fermat
Denis Guedj - Il teorema del pappagallo
Hans M. Enzensberger - Il mago dei numeri
Program. Mod A - Cap. 1
prof. Burattini
13
Pascal (1623-1662)
Program. Mod A - Cap. 1
prof. Burattini
14
Pascalina (1642)
Realizzata da Blaise PascalProgram.
a 19Mod
anni
per aiutare il padre contabile.
A - Cap. 1
15
prof. Burattini
Program. Mod A - Cap. 1
prof. Burattini
16
• LEIBNIZ (1676-1716) Macchina Aritmetica
• VAUCANSON (1709-1782) Anatra meccanica
• VON KEMPLEN (1734-1804) Giocatore di scacchi
• GEORGE BOOLE (1815-1864) Algebra Booleana
Program. Mod A - Cap. 1
prof. Burattini
17
CHARLES BABBAGE (1792-1871)
Program. Mod A - Cap. 1
prof. Burattini
18
SISTEMI LOGICI E
FORMALIZZAZIONE DEL
RAGIONAMENTO
•
•
•
•
FREGE - 1879
WHITEAD & RUSSEL - 1925-27
CHURCH - 1936
TURING - 1950
Program. Mod A - Cap. 1
prof. Burattini
19
CALCOLATORE
dal latino classico calculus = sassolino
dal latino medievale calculare = spostare sassi
COMPUTER
dal latino medievale computare = tagliare
ALGORITMO
Da Abu Ja’far Mohammed ibn Mûsâ al-Khowârizmî
Padre di Ja’far, Mohammed, figlio di Moses, nato a Khowârizmî
Autore del libro: Kitab al jabr w’al-mukabala
Regole di sostituzione e riduzione
Program. Mod A - Cap. 1
prof. Burattini
20
Program. Mod A - Cap. 1
prof. Burattini
21
Program. Mod A - Cap. 1
prof. Burattini
22
CPU
Unità
logico
aritmetica
Unità
di
controllo
dati
INPUT
istruzioni
Memoria principale
OUTPUT
Memoria secondaria
Program. Mod A - Cap. 1
prof. Burattini
23
TELECAMERA
PORTA MIDI
MONITOR
SCHEDA VIDEO
PER CATTURARE
IMMAGINI
MOUSE
HD
SCHEDA
AUDIO
SCHEDA
VIDEO
MICROFONO
RAM
CD-ROM
FD
STAMPANTE
HD ESTERNO
TASTIERA
ALTOPARLANTI
CPU
SCANNER
Program. Mod A - Cap. 1
prof. Burattini
TASTIERA MIDI
24
PER MEMORIZZARE LA PAROLA PASCAL NELLA MEMORIA
PRINCIPALE E’ NECESSARIO TRASFORMARE OGNI
CARATTERE IN SEQUENZE DI 0 E 1 E METTERE OGNUNO DI
ESSO IN UN INDIRIZZO DI MEMORIA.
INDIRIZZO
BINARIO
CARATTERE
CODICE
14322
0011011111110010
P
01010000
14323
0011011111110011
A
01100001
14324
0011011111110100
S
01110011
14325
0011011111110101
C
01100011
14326
0011011111110110
A
01100001
14327
0011011111110111
L
01101100
Codice ASCII
Program. Mod A - Cap. 1
prof. Burattini
25
0
1
BIT
0
1
0
0
0
1
0
1
BYTE
Program. Mod A - Cap. 1
prof. Burattini
26
CODICE ASCII
(American Standard Code for Information Interchange)
Program. Mod A - Cap. 1
prof. Burattini
27
LA RAPPRESENTAZIONE DEI NUMERI
Un generico numero N in base p è rappresentato da una sequenza
di cifre
an , an -1,……………, a1 , a0
dove ciascun ai rappresenta un numero compreso fra 0 e p-1, an è
la cifra più significativa e a0 la meno significativa.
Program. Mod A - Cap. 1
prof. Burattini
28
SISTEMA DECIMALE
N p  a n  p  a n1  p
n
n 1
n
 ...............  a1  p  ao  p   ai  p
1
o
i 0
58710  5 10  8 10  7 10
2
Program. Mod A - Cap. 1
prof. Burattini
1
0
29
i
SISTEMA BINARIO
n
N p  a n  p n  a n1  p n1  ...............  a1  p1  ao  p o   ai  p i
i 0
1010112 
5
4
3
2
1
0
1  2  0  2 1  2  0  2 1  2 1  2 
(32  8  2  1)10  4310
4310 
1
0
4  10  3  10
Program. Mod A - Cap. 1
prof. Burattini
30
CONVERSIONE DECIMALE BINARIO
43 : 2 = 21
21 : 2 = 10
10 : 2 = 5
5 :2= 2
2 :2= 1
1 :2= 0
con resto di 1
con resto di 1
con resto di 0
con resto di 1
con resto di 0
con resto di 1
43 = 101011
Program. Mod A - Cap. 1
prof. Burattini
31
SOFTWARE
Programmi
applicativi
Utilities - file system,
editor, …….
Compilatore
Linguaggi di
programmazione
Sistema Operativo
HARDWARE
Program. Mod A - Cap. 1
prof. Burattini
32
HARD DISK
C:DATI.TXT
La directory
I file
Program. Mod A - Cap. 1
prof. Burattini
33
PROGRAMMA
Una sequenza di istruzioni che il calcolatore esegue per
produrre i risultati richiesti per la soluzione di un dato
problema.
Program. Mod A - Cap. 1
prof. Burattini
34
LINGUAGGIO DI PROGRAMMAZIONE
Un insieme di simboli, parole, regole usate per istruire
il calcolatore.
Linguaggio macchina: il reale linguaggio attraverso il quale il
calcolatore esegue le istruzioni di un programma.
Linguaggio Assembler: un linguaggio che usa specifiche istruzioni
per indicare al calcolatore le operazioni da eseguire le azioni da
intraprendere, è dipendente dal calcolatore usato.
Linguaggio di alto livello: un linguaggio che possiede istruzioni e
regole vicine ai linguaggi naturali ed è indipendente dal calcolatore
usato.
Program. Mod A - Cap. 1
prof. Burattini
35
PROGRAMMA SORGENTE
Programma scritto in un linguaggio di alto livello
PROGRAMMA OGGETTO
Risultato della compilazione di un programma sorgente
Program. Mod A - Cap. 1
prof. Burattini
36
CICLO DI VITA DI UN PROGRAMMA
Problema
Algoritmo di risoluzione
Programma
Program. Mod A - Cap. 1
prof. Burattini
37
Problema: disegnare poligoni in un piano.
X e Y sono numeri interi relativi.
Supponiamo la penna sia alzata
Istruzioni:
INPUT X,Y
abbassa la penna
ruota verso destra di y gradi
vai avanti di x quadretti
vai indietro di x quadretti
L’insieme delle istruzioni necessarie per disegnare il quadrato di lato 10 in figura è detto
algoritmo.
Se pensiamo che il braccio che porta la penna sia localizzato in modo che la penna sia in A e
che sia alzata, possiamo assegnare il seguente algoritmo:
1. INPUT lato
2. abbassa la penna
3. vai avanti di lato quadretti
4. ruota verso destra di 90 gradi
5. vai avanti di lato quadretti
6. ruota verso destra di 90 gradi
7. vai avanti di lato quadretti
8. ruota verso destra di 90 gradi
9. vai avanti di lato quadretti Program. Mod A - Cap. 1
38
prof. Burattini
10. ruota verso destra di 90 gradi
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
vai avanti di 10 quadretti
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
INPUT lato
abbassa la penna
vai avanti di 10 quadretti
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
ruota verso destra di 90 gradi
vai avanti di 10
quadretti
A
ruota verso destra di 90 gradi
vai avanti di 10 quadretti
A
abbassa la penna
Program. Mod A - Cap. 1
prof. Burattini
39
UN PO’ DI STORIA
Il C++ è l'evoluzione naturale del C, il quale a sua volta discende da
due linguaggi, il BCPL e il B.
Il BCPL fu sviluppato nel 1967 da Martin Richards per scrivere sistemi
operativi e compilatori.
II linguaggio C si sviluppò dal B grazie a Dennis Ritchie, presso i Bell
Laboratories.
Il C fu noto inizialmente come linguaggio di sviluppo per sistemi
operativi. Oggi la maggior parte dei sistemi operativi sono scritti in C
e/o in C++.
Il C è oggi disponibile sulla maggior parte dei computer ed è
indipendente dall'hardware.
Nel 1990 si è giunti ad una definizione di standard per il C nota come
ANSI/ISO 9899:1990.
Program. Mod A - Cap. 1
prof. Burattini
40
Esegue alcune direttive prima della
compilazione ad esempio l’inclusione nel
programma di file esterni
Program. Mod A - Cap. 1
prof. Burattini
41
Il compilatore GNU C++ e Dev-Cpp
GNU C++ è un dialetto del linguaggio ad alto livello C++ funzionante
sotto i sistemi operativi Windows e Linux. Un suo ambiente di
sviluppo è il Dev-Cpp, disponibile gratuitamente, e funzionante sotto
il sistema operativo Windows. Il linguaggio GNU C++ ha una parte
di istruzioni in comune agli altri dialetti del C++ in commercio,
perché sviluppato secondo le direttive ANSI (American National
Standards Institute) .
Per ottenere gratuitamente il Dev-Cpp è sufficiente andare sul sito
www.bloodshed.net
scaricare l’ultima versione in formato exe, lanciarlo scegliendo la lingua
e lasciando il resto inalterato.
Program. Mod A - Cap. 1
prof. Burattini
42
Program. Mod A - Cap. 1
prof. Burattini
43
Struttura di un programma
Regole semantiche: insieme di regole che permettono di dare un
significato alle istruzioni di un linguaggio di programmazione.
Processo: una o più istruzioni codificate in un dato linguaggio che
permettono al calcolatore di fornire il risultato richiesto.
Oggetto: una o più locazioni di memoria dove vengono memorizzati
i valori a cui si farà riferimento nel corso del programma.
Program. Mod A - Cap. 1
prof. Burattini
44
ELEMENTI DI UN PROGRAMMA C++
// usato per introdurre commenti su un solo rigo
Es.
// calcola la circonferenza del cerchio
Per i commenti su più linee, è necessario utilizzare il simbolo
/* all’inizio del commento e */ alla fine
Es.
/* questo è un commento
su più linee*/
Direttive al preprocessore e al compilatore
Intestazione del programma
main()
{
Blocco di istruzioni
}
Program. Mod A - Cap. 1
prof. Burattini
45
Direttive al preprocessore e al compilatore
#include <nome file header> avverte il preprocessore di includere un
file header
#include <iostream> associa la libreria che gestisce l’input e l’output
dei tipi standard verso file o verso opportuni dispositivi di
ingresso e uscita come stampante, schermo, tastiera.
#include <cstdlib> associa un file che permette l’uso di alcuni
comandi del sistema operativo (in questo caso MSDOS) di
cui è un esempio l’istruzione finale :
system(“pause”)
che lascia il sistema in attesa che si prema un tasto per continuare
Program. Mod A - Cap. 1
prof. Burattini
46
using namespace std utilizza gli identificatori della libreria standard
(es. cin e cout) senza ulteriori specifiche.
Il namespace è una direttiva d’uso ed è un meccanismo fornito dal
C++ per raggruppare dati e funzioni nello spazio dei nomi.
Senza using namespace std il compilatore non riconosce i nomi cin e
cout; per farli riconoscere si può anche utilizzare il nome completo che
utilizza il namespace std ed il risolutore del campo d’azione :: (due
punti doppi)
std::cin std::cout. (dichiarazioni di uso)
In sostanza la direttiva d’uso sta per
“quando s’intende usare la libreria standard, si deve poter riferirsi ad un
qualsiasi processo o oggetto di tale libreria digitandone il nome (cout) e
non il nome completo (std::cout)”.
Program. Mod A - Cap. 1
prof. Burattini
47
Intestazione del programma
identazione
main()
{
Blocco di istruzioni necessarie alla soluzione del problema anche detta
istruzione composta
}
Rappresenta il processo principale del programma
Program. Mod A - Cap. 1
prof. Burattini
48
//Calcola la circonferenza
// consentono di scrivere i commenti
include i file
#include <iostream>
iostream gestisce le istruzioni di I/O
#include <cstdlib>
cstdlib gestisce funzioni del sistema: la pausa.
using namespace std;
namespace indica lo spazio dei nomi utilizzabili,
std=standard
int main ()
Il programma inizia con
int main ()
{
{ parentesi aperta
const float pi=3.1415;
Dichiarazioni di variabili: le variabili del profloat circonf,raggio;
gramma, raggio e circonf sono numeri reali;
pi è una costante
cout << "Inserisci Raggio="; Scrive su video ciò che appare tra “ ..” e NON
va a capo.
cin >> raggio;
Attende che si inserisca un dato (il raggio).
circonf=2*pi*raggio;
Istruzione di assegnazione: tutto ciò che appare a
destra del simbolo = viene calcolato ed inserito
nella variabile a sinistra
cout << "circonferenza ="
Scrive su video ciò che appare tra virgolette ed
<<circonf<<endl;
il valore contenuto nella variabile circonf; con
endl va a capo
system("pause");
Attende che si prema un tasto qualsiasi.
}
FINE del programma :
} parentesi graffa
chiusa
Program. Mod A - Cap. 1
prof. Burattini
49
Program. Mod A - Cap. 1
prof. Burattini
50
int
Program. Mod A - Cap. 1
prof. Burattini
51
COMPONENTI DI UN PROGRAMMA C++
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
OPERATORI
SIMBOLI
Program. SPECIALI
Mod A - Cap. 1
prof. Burattini
52
PAROLE RISERVATE
Termini che non possono essere adoperati dal programmatore solo
come previsto dal linguaggio.
Esempi:
main : indica che il testo che segue rappresenta il codice
sorgente del programma.
const : sono associate ad oggetti del programma.
float: sono associate ad oggetti del programma.
Program. Mod A - Cap. 1
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
OPERATORI
SIMBOLI SPECIALI
N.B. LE PAROLE RISERVATE sono
in GRASSETTO IN Dec-Cpp.
prof.messe
Burattini
53
IDENTIFICATORI
Rappresentano il nome di un oggetto o di un processo.
Standard o riservati
esempio
cin per rappresentare il file standard di input (tastiera,..)
cout per rappresentare il file standard di output (monitor,..)
Non standard
esempio
pi è definito nel nostro esempio come costante
raggio è definito nel nostro esempio come variabile
Program. Mod A - Cap. 1
prof. Burattini
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI54
SIMBOLI SPECIALI
OGGETTI STANDARD
COSTANTI (const)
Costanti con nome : un valore costante a cui si può
far riferimento attraverso il suo identificatore e non può variare nel
corso del programma.
Esempio
const float pi=3.1415;
Program. Mod A - Cap. 1
prof. Burattini
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
SIMBOLI SPECIALI
55
VARIABILE
un oggetto che può assumere diversi valori nel corso
dell’elaborazione.
Esempio
circonf, raggio
TIPO
insieme dei valori che una variabile può assumere e contemporaneamente l’insieme delle operazioni che si possono effettuare su variabili di
quel tipo.
Program. Mod A - Cap. 1
prof. Burattini
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
SIMBOLI SPECIALI
56
TIPI STANDARD
int ------- numeri interi ----------------- 435
float --- numeri reali semplice precisione----- 3.1416
double --- numeri reali doppia precisione------- 7.1416934523
char ------- caratteri ----------------- a
boolean ----- valori vero o falso ------------ vero
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
SIMBOLI SPECIALI
Program. Mod A - Cap. 1
prof. Burattini
57
I tipi interi con segno supportati dal C++ standard sono
1) char 2) short int (o short) 3) int
4) long int (o long)
Si ha la possibilità di rappresentare solo i numeri positivi (unsigned) o
sia i positivi che i negativi (signed).
Può apparire strano vedere il tipo char nella lista degli interi, ma i
caratteri sono rappresentati come interi compresi tra -128 e 127 o
tra 0 e 255; la scelta del tipo segnato o non segnato dipende dal
compilatore. L’istruzione cin>>ch dove ch è una variabile di tipo
char, accetta un carattere ASCII in ingresso, ma il carattere è
memorizzato come un intero nel computer.
il tipo char occupa un solo byte;
il tipo short occupa almeno due byte;
il tipo int occupa almeno tanti byte quanti ne occorrono per memorizzare il tipo short;
il tipo long occupa almeno quattro byte e non meno di quanti ne
occorrono per memorizzare
il tipo int.
Program. Mod A - Cap. 1
58
prof. Burattini
I tipi reali supportati dal C++ standard sono
1) float
2) double
3) long double
il tipo float occupa quattro byte;
il tipo double occupa almeno otto byte e non meno del tipo float;
il tipo long double occupa almeno otto byte e non meno di quanti ne occorrono per
memorizzare il tipo double.
La funzione sizeof applicata ad un tipo restituisce la sua lunghezza in byte.
Il file da includere <limits.h> (o <climits>) contiene tutti i valori minimi e massimi
degli interi: per esempio il minimo valore intero è contenuto in INT_MIN, il
massimo in INT_MAX.
Il file header <cfloat> contiene i limiti dei tipi float, double e long double.
Costante
Descrizione
FLT_MIN
Minimo valore float
FLT_MAX
Massimo valore float
DBL_MIN
Minimo valore double
DBL_MAX
Massimo valore double
LDBL_MIN
Minimo
double
valore
LDBL_MAXProgram.
Massimo
valore
Mod A - Cap.
1
double
prof. Burattini
Long
Long
59
COSTANTI
Sono le occorrenze di valori costanti in un programma.
Possono essere nominate ad
Esempio
const float pi=3.1415
oppure anonime, per le quali cioè non è stato dichiarato un
nome.
Esempio
cout << “Inserisci raggio”
Program. Mod A - Cap. 1
prof. Burattini
PAROLE RISERVATE
IDENTIFICATORI
COSTANTI
ESPRESSIONI
SIMBOLI SPECIALI
60
ESPRESSIONI
Rappresentano il valore che si ottiene applicando opportune
operazioni ben definite ad uno o più operandi che possono essere
costanti o variabili.
In una espressione le operazioni vengono indicate con particolari
simboli detti operatori.
Sono unari gli operatori che agiscono su un solo operando,
binari quelli che agiscono su due operandi.
aritmetici (+ , - , * , /)
PAROLE RISERVATE
IDENTIFICATORI
LETTERALI
ESPRESSIONI
SIMBOLI SPECIALI
logici (or , and , not)
Program. Mod A - Cap. 1
prof. Burattini
61
Operazione
Simbolo
algebrico
Simbolo
in C++
Espressione
algebrica
Espressione
in C++
Addizione
+
+
a+b
a+b
Sottrazione
-
-
a-b
a-b
Moltiplicazione
x
*
ab
a*b
Divisione
:
/
a:b
a/b
mod
%
a mod b
a%b
Modulo
Program. Mod A - Cap. 1
prof. Burattini
62
SIMBOLI SPECIALI
Uno o anche due caratteri consecutivi che sono usati per scopi
particolari come ad esempio
il punto e virgola (;) che serve ad indicare la fine di una istruzione,
le parentesi graffe ({ })che indicano inizio e fine di una istruzione
composta,
la virgola (,) che è usata come separatore.
PAROLE RISERVATE
IDENTIFICATORI
LETTERALI
ESPRESSIONI
SIMBOLI SPECIALI
Program. Mod A - Cap. 1
prof. Burattini
63
DICHIARAZIONI
Dichiarazione di costante
Ha la seguente sintassi:
const type identificatore = valore
dove const è una parola riservata, segue type che è il nome del tipo
assegnato alla costante, il nome della costante, il simbolo = e il
valore assegnatole. Le prime due parole possono anche essere
invertite tra loro.
const float pi=3.1415
Dichiarazione di variabile
Occorre far precedere al nome della variabile il nome del suo tipo.
Si possono dichiarare contemporaneamente più variabili dello
stesso tipo separandole con una virgola. Ad esempio:
float r1,r2,media;
E’ possibile assegnare un valore iniziale ad una variabile usando
l’operatore di assegnazione . Ad esempio:
Program.
Mod A - Cap. 1
64
int
i,j=1,somma;
prof. Burattini
REGOLA
E’ sempre consigliabile dichiarare tutte le costanti e le
variabili nella parte iniziale del programma (o della function
che le utilizza).
In questo modo chi legge il programma sa dove reperire le
informazioni sul tipo delle variabili e delle costanti.
Program. Mod A - Cap. 1
prof. Burattini
65
Le variabili hanno un nome (l’identificatore),
un tipo (tipi base: interi, reali, caratteri, booleani)
una dimensione (che dipende dal tipo),
un valore che varia nel corso del programma
un indirizzo nella memoria del computer in cui si trova il suo valore .
Il tipo int occupa 2 byte
Il tipo float prevede 4 byte,
Il tipo double ha invece una dimensione di 8 byte.
Il tipo boolean 1 byte
Il tipo char occupa un 1 byte
I caratteri sono rappresentati attribuendo loro un codice numerico
(codice ASCII), ad esempio il codice attribuito alla lettera A è 65.
All’interno di un programma una costante di tipo carattere deve essere
sempre racchiusa tra due apici, ad esempio:
‘r’, ‘^’, ‘@’.
L’indirizzo può essere conosciuto inserendo l’operatore & (detto
operatore di indirizzo) davanti alla variabile; esempio:
Program. Mod A - Cap. 1
66
&raggio.
prof.
Burattini
Se le costanti e le variabili sono tutte dello stesso tipo allora anche
il valore dell’espressione sarà dello stesso tipo.
Se tutte le grandezze presenti nell’espressione sono di tipo
numerico, anche se diversi, sarà il compilatore ad effettuare tutte le
opportune conversioni di tipo.
Ad esempio se le variabili n, f, d sono rispettivamente di tipo int,
float e double allora nell’espressione (n+f)*d, n è convertito a
float, successivamente la somma n+f è convertita a double per
poter effettuare la moltiplicazione con d (conversione implicita).
Nel C++ sono permesse anche espressioni del tipo n+car +b dove n
è un intero, car un carattere e b una variabile booleana.
Se ad esempio n vale 4, car è la lettera A e b vale true, il valore
dell’espressione sarà 4+65+1=70. L’uso di espressioni contenenti
variabili numeriche e non numeriche non è in genere consigliabile
e può dare luogo in un programma ad errori che sono difficili da
Program. Mod A - Cap. 1
67
individuare.
prof. Burattini
REGOLA
Non adoperare espressioni in cui sono presenti variabili di tipo
diverso.
Program. Mod A - Cap. 1
prof. Burattini
68
Espressione booleana semplice: è rappresentata da un confronto
tra i valori di due espressioni. La forma sintattica di una espressione
booleana semplice è la seguente:
espressione1 op espressione2
dove op è un operatore relazionale.
L’espressione booleana assume il valore true (vero) se il valore di
espressione1 è nella relazione op con il valore di espressione2 .
Operatore relazionale
<
Minore di
<=
Nell’esempio si suppone che le variabili assumono
i seguenti valori:
a=3 ; b=5 ; c1=’E’ ; c2=’G’ ;
a<b
3<5
Vero
Minore o uguale di
a+3<=b
6<=5
Falso
==
Uguale a
c1==c2
‘E’==’G’
Falso
!=
Diverso da
c1!=c2
‘E’!=’G’
Vero
>=
Maggiore o uguale di
‘a’>=c1
‘a’>=’E’
Vero
>
Maggiore di
3>7
69
Falso
Program. Mod
A - Cap. 1
a>b+2
prof. Burattini
Esercizi
Valutare le seguenti espressioni in C++
38/12 + 38%12
(15*11)/(3*11)
15*11/11*3
(23-5)/3/6
36/6%6
Program. Mod A - Cap. 1
prof. Burattini
70
Le istruzioni di I/O standard: cin, cout, printf
La forma generale di una istruzione per la lettura da tastiera di n
variabili x1 x2 …xn è la seguente:
cin>>x1>>x2>>…>>xn ;
allorchè il cursore lampeggia per effetto di questa istruzione
l’utente dovrà immettere uno dopo l’altro il valore delle
corrispondenti variabili, ognuno separato dall’altro da almeno
uno spazio vuoto (blank) e premere il tasto Invio.
I caratteri immessi sono inviati in un buffer di ingresso che
rappresenta l’area di memoria dell’oggetto cin (canale di
input).
Program. Mod A - Cap. 1
prof. Burattini
71
L’ operatore di estrazione >> provvede ad estrarli nel modo
seguente:
Per ogni variabile x che si deve leggere:
Ignora eventuali blank, e/o caratteri di tab iniziali e newline
(che indicheremo rispettivamente con ъ, \t,\n) mano a mano che
li preleva.
Preleva tutti i caratteri successivi che formano una sequenza
lecita per il tipo di variabile corrispondente.
Si arresta al primo carattere non lecito.
La sequenza di caratteri letti è codificata nella corrispondente
sequenza di zeri e di uno (che dipende dal tipo della variabile) e
quest’ultima è inserita nell’indirizzo di memoria corrispondente
alla variabile.
Program. Mod A - Cap. 1
72
prof. Burattini
ESEMPIO
Supponiamo che base e altezza siano due variabili di tipo float.
Eseguendo l’istruzione
cin >> base>>altezza;
il computer estrae un valore corretto dai caratteri digitati da tastiera
finché non incontra il primo carattere spazio: tale valore verrà associato
alla variabile base.
Ad esempio, se si digita
15.2 ъ12.2[INVIO]
il computer provvederà a porre 15.2 nell’indirizzo di memoria relativa
alla variabile base e 12.2 in quello relativo alla variabile altezza.
Program. Mod A - Cap. 1
prof. Burattini
73
REGOLA
Far precedere ogni istruzione di lettura da un opportuno messaggio
che fornisca informazioni sull’input che ci si aspetta.
Program. Mod A - Cap. 1
prof. Burattini
74
La forma generale di una istruzione di lettura tramite cout (canale di
output) è la seguente:
cout<<espr1<<espr2<<…<<esprn;
dove espr1,espr2,…,esprn sono espressioni che all’atto
dell’esecuzione dell’istruzione sono valutate e poi inviate al
dispositivo standard di uscita, il monitor del personal computer,
tramite l’operatore di inserzione <<.
Tutti i dati di output si scrivono sulla stessa linea, l’uno di seguito
all’altro.
Ad esempio l’istruzione:
cout<<”Area= ”<<area;
ordina di inviare il contenuto dei dati che appaiono a destra (il valore
letterale “Area= ” ed il contenuto della variabile area) sul monitor.
Per portare il cursore sulla riga successiva si può:
1) includere il carattere speciale di fine riga \n, in una stringa
costante, come “Salve mondo!
\n”Mod A - Cap. 1
Program.
prof. Burattini
2) inserire l’identificatore speciale,
endl.
75
ESEMPIO
Per far comparire sul monitor i valori delle variabili base, altezza su
due linee separate si possono utilizzare le seguenti istruzioni:
cout << “Base triangolo: “ << base << endl;
cout << “Altezza triangolo: “ << altezza << endl;
Si noti che le variabili base e altezza rappresentano in queste
istruzioni il loro valore (right value) mentre nell’istruzione:
cin>>base>>altezza
rappresentano il loro indirizzo (left value).
Le seguenti istruzioni:
cout << “Salve! \n”;
cout << “Come va? \n”;
genereranno il seguente output:
Salve!
Come va?
Program. Mod A - Cap. 1
prof. Burattini
76
REGOLA
E’ opportuno che al termine di una istruzione di stampa il cursore
sia situato all’inizio della linea successiva
Program. Mod A - Cap. 1
prof. Burattini
77
Sequenza di escape
Descrizione
\n
Carattere di fine linea (è inserito premendo il tasto
Invio)
\t
Posiziona il cursore del video sulla tabulazione
successiva (tasto TAB)
\a
Emette un beep
\r
Posiziona il cursore all’inizio della linea corrente
\b
Il cursore ritorna indietro di un carattere (tasto
Backspace)
\\
Stampa la barra inversa
\”
Stampa le doppie virgolette
Program. Mod A - Cap. 1
prof. Burattini
78
Sequenza di escape
Le sequenze di escape sono utili anche per scrivere sul monitor dei
caratteri particolari quali la stessa barra inversa (\) o le doppie
virgolette (“).
Per esempio, per far scrivere sul monitor la frase seguente,
Stampiamo questi due simboli \ e “
contenente la barra inversa e le doppie virgolette dobbiamo assegnare
la seguente istruzione
cout<<”Stampiamo questi due simboli \\ e \””
Ricordiamo che le costanti stringa devono essere racchiuse tra doppi
apici mentre le costanti carattere tra apici semplici.
Program. Mod A - Cap. 1
prof. Burattini
79
Per l’output formattato abbiamo due metodi fondamentali di cout
cout.width(ampiezza);
cout.precision(cifre);
dove ampiezza e cifre sono due interi che rappresentano,
• l’ampiezza totale messa a disposizione della variabile
• il numero massimo di cifre che possono essere visualizzate.
Queste istruzioni devono precedere ogni ordine di stampa sul monitor, cioè ogni
variabile che deve essere stampata deve essere preceduta dal rispettivo ordine di
formattazione. Per esempio, se
A=12.342 e B=1234.657
le istruzioni
cout.width(10);
cout.precision(8);
cout<<A<<endl;
cout<<B<<endl;
stamperanno sul video
eser1.3
12.342
1234.657
per cui solo il valore di A sarà stampato con un’ampiezza totale di 10 caratteri e
con una precisione di 8 cifre complessive (a partire da destra); il valore di B sarà
Mod(le
A - cifre
Cap. 1 sono scritte a partire da sinistra).
80
stampato con la formattazioneProgram.
standard
prof. Burattini
L’istruzione printf(), ha una forma diversa che meglio si presta ad
un output formattato. L’istruzione corrispondente alla seguente
cout << "Area ="<<area<<endl;
utilizzando printf è
printf(“Area =%10.2f\n”,area);
dove il valore letterale “Area =” rimane invariato,
la stringa di formattazione, inizia con il simbolo %, è data da
%10.2f/n
dove
% è il simbolo di inizio formattazione
10 indica l’ampiezza di campo, 2 il numero di decimali
f indica che si deve scrivere un numero decimale
\n è l’ordine di andare a capo.
eser1.3b
Program. Mod A - Cap. 1
prof. Burattini
81
Per esempio, con questa formattazione,
printf(“Area =%10.2f\n”,area);
I valori di area 62.847 e 128.54 verrebbero scritti in questo modo
62.85 arrotondato per eccesso alla seconda cifra decimale
128.54
L’istruzione printf possiede diverse modalità di formattazione; nella
tabella successiva ne riportiamo le più significative (il carattere ъ
rimpiazza lo spazio vuoto).
Program. Mod A - Cap. 1
prof. Burattini
82
Formattazione in printf
Carattere
Tipo argomento da convertire
Esempio
Stampa
ъъъъ4532
d, i
int diventa intero decimale con printf(“%8d”, 4532)
segno
u
int diventa
senza segno
X, x
int diventa intero esadecimale printf(“%5X”, 255)
senza segno
s
char stampa una stringa
printf(“%10.5”,
ъъъъъъciao
“ciao”)
10 è l’ampiezza di campo
5 l’ampiezza massima della
stringa
f
double diventa reale
printf(“%8f”, -5.32)
intero
decimale printf(“%8d”, -532)
Program. Mod A - Cap. 1
prof. Burattini
ъъъъъ-532
ъъъFF
ъъъъ-5.32
83
Osserviamo che
cout.width
cout.precision
possono utilizzare anche delle variabili mentre
printf
può servirsi soltanto di numeri per formattare un dato;
se il numero di cifre n richiamate in cout.precision(n) è inferiore al
numero di cifre significative, allora il valore viene espresso in
notazione esponenziale; per esempio, se n=3 e si deve stampare
123456 il computer mostrerà a video 1.23 e05;
cout possiede molte altre istruzioni che consentono una gestione
completa della formattazione a scapito della semplicità;
printf consente una formattazione semplice ed efficace, anche se
Program. Mod A - Cap. 1
84
non molto ricca;
prof. Burattini
ESEMPIO
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
int main() {
double a=sqrt(5), b=12345678;
int conta=6;
cout.width(20);
cout.precision(conta);
cout<<a<<” “<<b<<endl;
printf(“a=%3.8f b=%12f\n”,a,b);
}
system("pause");
}
Program. Mod A - Cap. 1
prof. Burattini
85
Program. Mod A - Cap. 1
prof. Burattini
86
Program. Mod A - Cap. 1
prof. Burattini
87
In C++ non esiste il concetto di tastiera, disco, monitor, stampante;
questi dispositivi sono raggruppati secondo due tipologie:
dispositivi di input;
dispositivi di output;
In generale avremo
dispositivo di input >>x1>>…>>xn;
che va inteso come:
i valori estratti dal dispositivo di input sono immessi come valore
nelle variabili che seguono l’operatore >>
mentre
dispositivo di output << espr1<<…<<esprn
va letto come:
i valori delle singole espressioni sono inseriti successivamente nel
dispositivo di output.
Program. Mod A - Cap. 1
prof. Burattini
88
Ad esempio se si intende inviare dei dati sulla stampante occorre
scrivere la seguente dichiarazione di tipo :
ofstream stampante(“prn”);
ed adoperare stampante al posto di cout. Ad esempio:
stampante<<”Area= ”<<area;
Occorre però includere il file <fstream> in cui il tipo ofstream è
definito
Program. Mod A - Cap. 1
prof. Burattini
89
Program. Mod A - Cap. 1
prof. Burattini
90
Esempi di algoritmi
Determinare il passaggio dalla numerazione decimale alla binaria.
Prendiamo in considerazione il numero 25 e dividiamolo per 2 più
volte: ogni volta il quoziente viene sempre diviso per 2 finché
l’ultimo quoziente è minore del divisore e diverso da zero (e quindi
1).
Il numero in base 2 cercato è uguale all’ultimo quoziente seguito da
tutti i resti presi in ordine inverso (le cifre evidenziate in neretto):
25 : 2
1 12 : 2
0 6:2
0 3:2
1 1
11001
Program. Mod A - Cap. 1
prof. Burattini
91
ALGORITMO PER IL MASSIMO COMUN DIVISORE
(MCD)
Si trovi il MCD tra i numeri
93217
e
1843
•Si cercano i fattori primi del primo numero
•Si cercano i fattori primi del secondo numero
•Si cercano i fattori primi comuni a entrambi i numeri
Program. Mod A - Cap. 1
prof. Burattini
92
Ricerca
Fattori
Primi
NUMERI
PRIMI
2
3
5
7
11
13
17
19
23
29
31
93217
46608,5
31072,33
18643,4
13316,71
8474,273
7170,538
5483,353
4906,158
4052,913
3214,379
3007
n°
PASSI
1
2
3
4
5
6
7
8
9
10
11
3007
31
97
93217=31 x 31 x 97
Program. Mod 27
A - Cap. 1
TOTALE OPERAZIONI
prof. Burattini
1
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
97
3,129032
2,621622
2,365854
2,255814
2,06383
1,830189
1,644068
1,590164
1,447761
1,366197
1,328767
1,227848
1,168675
1,089888
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1593
Ricerca
Fattori
Primi
NUMERI
PRIMI
2
3
5
7
11
13
17
19
1843
921,5
614,333
368,6
263,286
167,545
141,769
108,412
97
n°
PASSI
1
2
3
4
5
6
7
8
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
1843=19 x 97
TOTALE OPERAZIONI
97
5,1053
4,2174
3,3448
3,129
2,6216
2,3659
2,2558
2,0638
1,8302
1,6441
1,5902
1,4478
1,3662
1,3288
1,2278
1,1687
1,0899
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
26
Program. Mod A - Cap. 1
prof. Burattini
94
Massimo Comune Divisore
Fattori Primi di
93217 = 31*31*97
Fattori Primi di
1843 = 19*97
Il MCD tra 93217 e 1843 è
Numero di passi totale = 27+26 = 53
Program. Mod A - Cap. 1
prof. Burattini
95
ALGORITMO DI EUCLIDE
M
N
R
R
R’
MCD=
Program. Mod A - Cap. 1
prof. Burattini
R’
R’
96
ALGORITMO DI EUCLIDE PER IL MASSIMO COMUN DIVISORE
(300 A.C.)
Siano m ed n due numeri naturali e supponiamo sia m>n
•1
Si divide m per n
•2
Se il resto è zero allora n è il MCD tra m e n.
•3
Se il resto è diverso da zero torna al primo
passo scambiando m con n e n con r (cioè
dividi n per r)
Program. Mod A - Cap. 1
prof. Burattini
97
ESEMPIO
MCD tra 93217 e 1843
m
93217
1843
1067
776
291
194
n
1843
1067
776
291
194
97
m/n
50
1
1
2
1
2
r
N° passi
1067
1
776
2
291
3
194
4
97
5
0
6
Program. Mod A - Cap. 1
prof. Burattini
98
ALGORITMO
Insieme di regole che,
eseguite in un ordine
prestabilito permettono di risolvere un dato
problema (se la soluzione esiste) o di comunicare
l’assenza di soluzione (se questa non esiste), in un
numero finito di passi.
Program. Mod A - Cap. 1
prof. Burattini
99
PROPRIETA’ DI UN ALGORITMO
• Finitezza - Un algoritmo deve sempre terminare dopo un numero
finito di passi
• Precisione - Ogni passo dell’algoritmo deve essere definito con
precisione e non in maniera ambigua
• Input - Un algoritmo può avere molti input come non averne
nessuno
• Output - Un algoritmo deve produrre almeno un dato
• Eseguibilità - Ogni istruzione deve essere sufficientemente semplice
da poter essere eseguita da una persona usando penna e
carta in un tempo finito.
Program. Mod A - Cap. 1
prof. Burattini
100
•1
RAPPRESENTAZIONE DI UN ALGORITMO
pseudo-codice
Si divide m per n
•2
Se il resto è zero allora n è il MCD tra m e n.
•3
Se il resto è diverso da zero torna al primo passo
scambiando m con n e n con r (cioè dividi n per r)
•1
[Cerca il resto] Dividi m per n e sia r il resto
•2
[Il resto è uguale a zero?] Se r=0 allora n è la risposta. Fine
•3
[Scambia] Poni m  n, n  r ; torna al passo 1.
Program. Mod A - Cap. 1
prof. Burattini
101
DIAGRAMMA DI FLUSSO
Input
Cerca il resto
Il resto è uguale a zero?
Scambia
No
Si
Fine
Program. Mod A - Cap. 1
prof. Burattini
102
Esercizi
Scrivere in pseudo codice i due algoritmi per trasformare
numeri decimali in numeri binari.
Scrivere in pseudo codice l’algoritmo per effettuare
l’addizione con l’abaco.
Scrivere in pseudo codice un algoritmo che genera tutte
le possibili combinazioni di 0 e1 per N variabili.
Program. Mod A - Cap. 1
prof. Burattini
103
Soluzione esercizi Cap. 1
Conversione Decimale/Binario metodo successive divisioni.
Dichiarazioni
Sia N il numero intero decimale da trasformare in binario
Sia Q il quoziente intero di N per 2
Sia R il resto della divisione
Sia B la stringa che rappresenta il numero binario essa viene riempita da destra
verso sinistra (inizialmente è vuota)
[Controllo Iniziale] Se N=0 allora aggiungi 0 a sinistra di B e fermati.
[Controllo Fine Procedura] Se N=1 allora aggiungi 1 a sinistra di B e fermati.
[Costruisci B]
[Dividi] Poni in Q N/2 e in R  N - Q*2
[Aggiorna B] Aggiungi a sinistra di B il valore di R : B  R+B
[Scambia] N  Q . Ripeti il processo
Program. Mod A - Cap. 1
prof. Burattini
104
Soluzione esercizi Cap. 1
Conversione Decimale/Binario metodo potenze di 2.
DICHIARAZIONI
Sia N il numero intero decimale da trasformare in binario
Sia P la potenza a cui due deve essere elevato affinchè meglio approssimi per difetto N
Sia D la differenza tra N e 2P
Sia B una stringa di K zeri, con K sufficientemente grande
[Controllo Fine Procedure] Se N=0 allora fermati.
[Costruisci B]
[Calcola P] Poni in P la parte intera del log2(N)
[Aggiorna B] Contando da destra sostituisci lo 0 di B con 1 nella posizione P+1
[Calcola D] D  N - 2P
[Scambia] N  D. Ripeti il processo
Program. Mod A - Cap. 1
prof. Burattini
105
1
2
Program. Mod A - Cap. 1
prof. Burattini
8
2
6
7
4
9
106
+
Soluzione esercizi Cap. 1
Addizione usando un abaco
DICHIARAZIONI
Supponiamo che l’abaco abbia k aste.
Sia N il primo addendo e M il secondo addendo.
Rappresentiamo N=nk….n3n2n1 , M=mh….m3m2m1
Sia Q il quoziente di una cifra di N o M per 5
Sia R il resto della divisione precedente
[Rappresentazione di N]
[Dividi] Dividi n1 per 5. Sia Q  n1/5 e R  n1 - Q*5
[Sposta la palline] Prendi Q palline della parte superiore e prendi R palline della parte
inferiore e spostale al centro.
[Ripeti i passi precedenti ] Ripeti i passi precedenti per la seconda e terza, … la k-ma asta.
[Somma M]
[Dividi] Dividi la cifra corrente di m1 per 5. Sia Q  m1/5 e R  m1 - Q*5
[Aggiungi] Aggiungi Q palline alla parte superiore. Se il numero totale di palline è uguale a
due riporta le palline il alto e sposta al centro una pallina della parte inferiore
della prima asta a sinistra.
[Ripeti i passi precedenti ] Ripeti i passi precedenti per la seconda, terza, …, h-ma asta.
Program. Mod A - Cap. 1
prof. Burattini
107
Generazione di tutte le possibili combinazioni di 1 e 0 per N variabili
DICHIARAZIONI
Sia N il numero di variabili
Sia C un numero intero posto inizialmente a 0.
[Controlla Fine Elaborazione] Se C = 2N - 1 allora finisci.
[Converti in binario] Chiama la procedura DECBIN(C) per convertire C in binario
[Mostra] Scrivi C
[Incrementa il contatore] Poni C  C + 1
[Ricomincia] Ritorna al passo iniziale.
Program. Mod A - Cap. 1
prof. Burattini
108
Editor
Preprocessor
HD
HD
Compiler
HD
Linker
HD
Loader





HD
CPU
Program. Mod A - Cap. 1
prof. Burattini

Crea i programma e memorizza
su HD
Esegui il codice
Crea il codice oggetto e
memorizza su HD
Collega il codice oggetto con le
librerie, crea a.out e memorizza
su HD
Carica nella memoria primaria
il programma
La CPU esegue sequenzialmente
le istruzioni memorizzando nella
109ottenuti
memoria primaria i dati
Program. Mod A - Cap. 1
prof. Burattini
110
Scarica

ppt