fondamenti di informatica
parte 3
appunti per il D.U. in Ingegneria
Informatica, di Telecomunicazioni
e di Meccanica, a.a. 2000-2001
di
anna maria carminelli gregori
fondamenti di informatica 1 parte
3 D.U.
1
Struttura dei programmi
Gia’ nei programmi presentati si possono notare
parti differenti, composte da frasi di commento,
dichiarazioni e definizioni, comandi esecutivi.
I commenti servono come documentazione
del programma, essenziale per far capire a chi
lo legge cosa fa il programma e come lo fa;
le dichiarazioni e definizioni permettono al
compilatore di interpretare e tradurre tutte le
frasi del programma correttamente come
appare negli esempi indicati nel seguito.
fondamenti di informatica 1 parte
3 D.U.
2
Dichiarazioni e comandi (frasi,
istruzioni) di tipo esecutivo
Le dichiarazioni relative alle funzioni, per es. servono
per segnalare al compilatore le funzioni create dal
programmatore e usate nella parte esecutiva del prg.
il loro tipo e quello dei loro argomenti se presenti. Si
tratta di dichiarazioni simili a quelle che sono nei file
header. Con tali indicazioni il compilatore riconosce e
traduce le funzioni che incontra successivamente.
Con le frasi “esecutive” infine si esprime l’ algoritmo:
il compilatore traduce ogni frase nel numero di
istruzioni del linguaggio macchina, necessario e
sufficiente per la sua corretta esecuzione.
fondamenti di informatica 1 parte
3 D.U.
3
A proposito delle funzioni
Qualcuno e’ tentato di scrivere in C o C++ i
programmi alla maniera dei programmi Pascal
dove la funzione principale (ossia il main) si
pone alla fine dell’ intero programma facendola
precedere dalle altre funzioni. In tal modo si
possono omettere le dichiarazioni delle funzioni
dato che il compilatore le riconosce via via che
le incontra.
In C e C++ e’ bene NON seguire questo
metodo.
fondamenti di informatica 1 parte
Perche’ ?
3 D.U.
4
Impostazione scorretta con
2 possibili tipi di errore
Il primo tipo e’ che ogni funzione puo’ attivare
anche funzioni definite successivamente e
quindi, se non dichiarate, ignote al compilatore
che non le sa riconoscere;
il secondo riguarda la modularita’ tipica del C,
C++ che permette di compilare separatamente
le varie funzioni (per es. su file diversi come le
funzioni di libreria). Cio’ e’ realizzabile (cfr.+oltre)
solo se si dichiarano inizialmente al compilatore le
funzioni che il programma
richiede.
fondamenti di informatica 1 parte
3 D.U.
5
C++: Definizione di Variabili
Come gia’ indicato, il corpo di ogni funzione C e
C++ ha frasi dichiarative (che possono porsi
nella parte dichiarativa iniziale) ed esecutive,
col significato di istruzioni, comandi (che
producono la parte esecutiva). Comunque, in
ogni funzione deve essere presente la
dichiarazione (in C++ si dice definizione)
delle variabili usate con il loro nome (o
identificatore) ed il loro tipo, PRIMA o
“contemporaneamente”
al loro uso.
fondamenti di informatica 1 parte
3 D.U.
6
Perche’ ?
La definizione di ogni variabile ha lo scopo
di indicare al compilatore di prenotare
spazio in C.M.
Quanto spazio? Dipende dal tipo di dato
che la variabile dovra’ identificare e
contenere.
Il tipo di dato determina la codifica del
dato: fixed, floating, char ...
fondamenti di informatica 1 parte
3 D.U.
7
Gli Identificatori del C e C++
sono associati alle entita’ del linguaggio
come: variabili, costanti, funzioni, tipi derivati
(vedere avanti).
Regole di composizione: ogni identificatore
deve iniziare con un carattere alfabetico (o
con l’ underline _ , ma quest’ ultimo e’
pertinente agli identificatori del Sistema);
internamente puo’ contenere caratteri
alfanumerici ed anche l’ underline _ , ma
non lo spazio bianco.
fondamenti di informatica 1 parte
3 D.U.
8
Totale liberta’ di scelta ?
… quasi ! In ogni linguaggio esistono alcune
parole riservate (keyword) con significato
preciso per il compilatore del linguaggio e
quindi non usabili come identificatori normali.
Ecco le parole riservate comuni al C e C++
 auto
default
float
register
struct
while
break
do
for
return
switch
case
char
double else
goto
if
short signed
typedef union
const
enum
int
sizeof
unsigned
continue
extern
long
static
void
In C++ ce ne sono
ancora
una ventina:
fondamenti di
informatica 1 parte
3 D.U.
9
keywords
 asm
catch class
delete friend
handle
inline
new operator private protected public
template this
throw
try
unsigned virtual
volatile
Nota: non esistono parole riservate come
array e pointer nonostante entrambe le
entita’ siano realizzabili in C e C++ . La loro
creazione avviene usando altri costrutti tipici
del linguaggio.
Da qui in poi le keyword saranno scritte in
fondamenti di informatica 1 parte
grassetto.
3 D.U.
10
Tipi di dati
Tutti i linguaggi di programmazione hanno alcuni tipi
di dati predefiniti (fondamentali); in C e C++ sono:
int per variabili di tipo intero (di almeno 2 byte);
float “ “
“ “ floating-point (almeno 4byte);
char “ “
“ “ carattere (1byte x car.);
double “ “
“ “ float, ma in doppia precisione
,
ossia di almeno 8 byte.
Questi sono tipi standard. Oltre a questi tipi di dati
fondamentali, in C e C++ ci sono gli indirizzi di
variabili (meglio: di posizioni di C.M. dove si trovano i
dati identificati dalle variabili).
fondamenti di informatica 1 parte
3 D.U.
11
Il C++ e’ a forte tipizzazione
ossia ad ogni entita’ del linguaggio e’
associato un tipo di dato che ne determina lo
spazio di memoria necessario e il possibile uso
(per es. aritmetica intera o floating-point ? cfr.
Parte 1)
Oltre ai tipi fondamentali predefiniti, in C++ si
possono definire tipi di dato derivati ottenuti
dai tipi fondamentali con vari meccanismi per
manipolare oggetti complessi: matrici, solidi
tridimensionali, numeri complessi ….
fondamenti di informatica 1 parte
3 D.U.
12
Definizioni: es. in programmi
E:/carmin/duinf2000/program1-2
Tutte le variabili utilizzate nei C++ program (o
function) in fase di costruzione devono essere
definite per garantirne l’ allocazione in
memoria: non usarle senza definizione !
La definizione puo’ avere la forma seguente:
tipo nomi di variabili separate da virgola: es.
int i, j, k, leo, lilla;
float x, y, z, sup, inf, set1;
Nota: il tipo intero puo’ essere anche indicato
come short int,fondamenti
longdi informatica
int, 1unsigned.
parte
3 D.U.
13
Inizializzazione delle var. in
unostamp.cpp-quastamp.cpp
Puo’ avvenire in 3 modi (cfr. fasi traduz. Parte2):
1) alla definizione: es. int a = 7; e’ il
compilatore che pone il valore 7 nella zona di
memoria identificata dalla variab. a (fase di
compilazione);
2) con una frase di assegnazione: es. int a;
e all’ inizio della parte esecutiva del programma
a=7; frase di assegnazione eseguita durante l’
esecuzione del programma (fase di esecuzione);
3) con frase di lettura
di un valore da porre in a
fondamenti di informatica 1 parte
3 D.U.
14
(ancora fase di esecuzione).
Riflessione
Fra le 3 possibilita’ quale scegliere ?
La scelta dipende dalle condizioni, pero’ la
definizione di a come variabile significa che il
suo valore e’ soggetto a cambiare nel corso
del programma (altrimenti cosa sarebbe ???!)
Inizializzarla a 7 significa che al primo giro del
programma il suo valore deve essere 7 e
quindi se e’ il compilatore ad inizializzarla si
risparmia tempo in fase esecutiva.
fondamenti di informatica 1 parte
3 D.U.
15
Il progetto di unostamp.cpp
e’ praticamente indicato nelle frasi di
documentazione del programma, ma quale
puo’ essere il suo diagramma di flusso ???!
MODIFICHE SUGGERITE: usare gli operatori
aritmetici del linguaggio ossia:
+ addizione - sottrazione - cambio segno
* moltiplicazione / divisione
%resto
per modificare i contenuti delle variabili per
es. come segue:
fondamenti di informatica 1 parte
3 D.U.
16
Modifiche di unostamp.cpp in
program2: esaminare tutto
Avendo definito:
i = 12345;
si puo’ modificare il suo contenuto cosi’:
i = -i;
// e visualizzare i oppure:
i = i*2;
// “ “
“ ed anche:
i = i+1; // “ “
“ ed anche:
i = i / 3; // “ “
“ “ “
i = i % 4; // in i verra’ posto il resto della
divisione fra l’ intero i e l’ intero 4 da
fondamenti di informatica 1 parte
3 D.U.
visualizzare.
17
Espressioni aritmetiche
Alla destra dell’ operatore di assegnazione puo’
esserci per esempio un’ espressione aritmetica,
formata da variabili e costanti collegate tra loro
da operatori aritmetici che il compilatore
considera con le priorita’ seguenti:
- (cambio segno)
* / %
+ =
fondamenti di informatica 1 parte
3 D.U.
18
Nota : left-right dell’
operatore di assegnazione =
C e C++ nella loro precisione, indicano sempre
2 valori lvalue ed rvalue associati alle variabili
di tipo int e float con il significato di:
lvalue: indirizzo della locazione di memoria
identificata dalla variabile
rvalue: contenuto della locazione di memoria
identificata
Scrivendo: i = i+1; alla destra (right) di = (op.
di assegnazione) e’ usato rvalue di i ossia per
es. 12345; alla sinistra (left) e’ usato lvalue di
i ossia il suo indirizzo.
fondamenti di informatica 1 parte
3 D.U.
19
La valutazione
di ogni espressione, procede secondo la
priorita’ degli operatori presenti e se essi hanno
la stessa priorita’ da sinistra a destra. Il valore
cosi’ ottenuto e’ “assegnato alla variabile posta
alla sinistra” dell’ operatore di assegnazione.
Ossia, ad assegnazione avvenuta, la zona di
memoria identificata dalla variabile (dal suo
lvalue) conterra’ il valore (rvalue) calcolato dell’
espressione
NOTA: nelle espressioni si possono usare parentesi
tonde (anche annidate) per modificare la priorita’
1 parte
degli operatori. fondamenti di3 informatica
D.U.
20
Ma sono tutte accessibili le
variabili ?
Quando la definizione delle variabili viene fatta
all’ esterno di tutte le funzioni, le variabili sono
dette globali: ad esse si puo’ accedere con
qualunque istruzione di una qualsiasi funzione
componente l’ intero programma C o C++.
Invece se le variabili sono definite all’ interno di
una funzione sono dette locali alla funzione:
ad esse si puo’ accedere solo dall’ interno della
funzione (es. in leggisec.cpp, ma ... +avanti).
fondamenti di informatica 1 parte
3 D.U.
21
Costanti = “invariabili”
Le entita’ fisse del linguaggio sono le costanti:
per es. “buonasera” e’ una costante tipo testo
(stringa delimitata da “); altra costante di tipo
numerico floating-point e’ 3.1415923 usata in
unostamp.cpp (controllare). Ci sono poi
costanti di tipo intero in base 10 (per es. 365),
in base 8 (per es. 077 col valore ottale
preceduto da zero), in base 16 (per es. 0xff
oppure 0Xff oppure 0XFF col valore
esadecimale preceduto da zero e da X o x).
fondamenti di informatica 1 parte
3 D.U.
22
Altre costanti
di tipo carattere delimitate da ‘(per es.’a’ o ‘\n’ =
line feed) Chi e’ line feed ? Nel codice ASCII e’ il
decimo carattere con significato di andare a capo.
Altri caratteri speciali:’\0’ NUL=fine stringa; ‘\g’
BEL=bip; ‘\t’ horizontal tab; altri …
usare il programma ripeleg.c per vedere le
codifiche ASCII di tutti i caratteri … provare anche
CTRL Z ...
NOTA: anche una costante puo’ essere identificata
da un identificatore e avere un tipo, preceduto da
const.
fondamenti di informatica 1 parte
3 D.U.
23
L’ esempio in leggisec.cpp
mette in luce anche la globalita’ e la localita’
dell’ ambiente di una funzione o programma.
L’ ambiente locale si intende formato da tutte le
entita’ dichiarate e definite dentro la funzione.
In leggisec.cpp l’ ambiente locale al main si
compone della sola const char* benvenuto
che e’ usabile, visibile solo all’ interno del
main, mentre la const char* bene e le var. car
e num esterne al main e a tutte le altre funzioni
formano l’ ambiente globale e sono visibili e
usabili in ogni funzione.
fondamenti di informatica 1 parte
3 D.U.
24
Scope di un’ entita’
Scope puo’ essere tradotto con raggio d’
azione e significa l’ insieme di codice in cui
una variabile o una costante e’ visibile e
quindi usabile in modo corretto.
=> lo scope dell’ ambiente globale
comprende il main, le funzioni, tutto il codice
che sta sullo stesso file del main;
=> lo scope dell’ ambiente locale si
esaurisce nella funzione di appartenenza.
fondamenti di informatica 1 parte
3 D.U.
25
( … ma a chi giova la
modularita’ dei programmi ?
Il problema della globalita’ e della localita’ delle
variabili di un programma non esisterebbe se il
programma non fosse strutturato a moduli, ma
monoblocco: pero’ questo modello non va.
 Esempi di programmi monoblocco sono i primi ed il prg.
monocod.cpp che effettua le stesse cose del programma
codifibl.cpp che invece e’ strutturato a moduli.
Dagli esempi elementari appare poco la convenienza
della modularita’ che diventa essenziale se
aumenta la complessita’ dei programmi.
Di tutto cio’ si parlera’ +avanti.)
fondamenti di informatica 1 parte
3 D.U.
26
Una pausa di riflessione
Uno degli scopi del corso e’ imparare a
programmare usando il linguaggio C++.
Ossia l’ accento va su imparare a programmare.
Per questo e’ necessario capire come deve
essere fatto un programma e la lettura e analisi
di programmi scritti da altri aiuta a capirlo.
L’ organizzazione a moduli dei programmi vuole
evidenziare le funzionalita’ di ogni programma:
lettura dati, loro elaborazione, stampa risultati.
Di cio’ bisogna ricordarsi quando si scrive un
fondamenti di informatica 1 parte
programma.
3 D.U.
27
La riflessione termina con un
nuovo programma in C++
da fare usando le sole frasi finora presentate.
Progetto logico: il prg. deve:
leggere 2 valori interi da assegnare alle
variabili Base e Altezza e visualizzarli;
calcolare le aree del rettangolo, triangolo
(Base * Altezza/2) del quadrato costruito sulla
Base e del quadrato costruito sull’ Altezza;
visualizzare le aree.
 Fare un programma monoblocco ed uno strutturato a moduli
fondamenti di informatica 1 parte
(funzioni).
3 D.U.
28
Il tipo puntatore
appare nell’ esempio della stringa di leggisec.cpp
const char* benvenuto = “sono una stringa
per il main”. In C o C++ una stringa di caratteri
delimitata da 2 virgolette viene memorizzata
con una costante stringa formata da una
successione di caratteri (codice ASCII): essa
termina col carattere ‘\0’ che e’ inserito
automaticamente dal compilatore. Nell’esempio
l’ indirizzo del primo carattere e’ posto dal
compilatore in benvenuto che e’ il puntatore
fondamenti di informatica 1 parte
alla stringa.
3 D.U.
29
Puntatori
La loro importanza specialmente per il C++ e’
notevole.
Il puntatore indica un indirizzo di C.M. ed e’
rappresentato simbolicamente da una freccia.
Una variabile di tipo puntatore e’ destinata a
identificare e contenere solo indirizzi.
Per indicare al compilatore che la variabile e’
di tipo puntatore non si usa una nuova parola
riservata, ma il tipo del valore puntato
seguito da un asterisco e dal nome del
puntatore: es.fondamenti
char*
benvenuto
di informatica
1 parte
3 D.U.
30
Esempi delle varie codifiche
Scrivendo: int kika = 5; si definisce kika come
una variabile intera e si inizializza con 5. Un
puntatore ad un intero si definisce: int *pk;
col significato che pk puo’ contenere solo
indirizzi di variabili intere; con char *pl; si
definisce pl come un puntatore a carattere (per
es. come benvenuto) e cosi’ via.
Inizializzare un puntatore non e’ cosi’ semplice
come inizializzare un intero: per farlo si puo’
usare l’ operatore unario & col significato di
fondamenti di informatica 1 parte
indirizzo di
3 D.U.
31
Esempi degli operatori & e *
Avendo: int kika = 5, j;

int *pk; si puo’ porre: pk = & kika;
assegnando cosi’ a pk l’ indirizzo di kika.
A questo punto pk identifica kika che a sua
volta identifica la zona di memoria contenente
5: c’e una sorta di catena ! Quindi per ritrovare
5 si puo’ usare kika, ma anche usare pk purche’
preceduto dall’ operatore * che attiva un’
operazione di indirezione sul puntatore pk
permettendo l’ accesso al valore puntato 5.
Quindi sono “equivalenti”: j = kika; j = *pk;
=> => a j e’ assegnato
5 1 parte
fondamenti di informatica
3 D.U.
32
11000
1004
100A
Pk 1004
Kika 100A
0000000000000101
C.M.
Schemino dello stato di C.M. dopo:
kika = 5;
pk = &kika;
Addr.16
fondamenti di informatica 1 parte
3 D.U.
33
Esempi
delle varie codifiche per tipi diversi sono in
codifiche che e’ un programma in varie forme.
La prima e’ monocod.cpp che e’ la versione
monoblocco del programma ed e’ subito da
vedere e capire tramite i commenti inseriti.
Poi ci sono le versioni strutturate a blocchi con
l’uso di funzioni che si vedranno piu’ avanti.
Per introdurre l’ uso di funzioni ci sono i
programmi leggipri.cpp e leggisec.cpp anche se
le funzioni li’ presentate lavorano su variabili
globali. Vedere E:/carmin/duinf2000/program2
e E:/carmin/duinf2000/ program3.
fondamenti di informatica 1 parte
3 D.U.
34
Printf: un esempio delle
funzioni di libreria del C
E’ gia’ stata usata e come appare evidente dal
suo uso ed effetto, si tratta di una funzione
della libreria Lib del C ossia di un segmento
di codice (che permette di usare il video per
visualizzazioni) e quindi puo’ essere eseguito
piu’ volte nel corso del programma. Questo
segmento di codice e’ stato isolato dai
Sistemisti della Borland ed il suo prototipo e’
disponibile nel file “header” <stdio.h> del C.
fondamenti di informatica 1 parte
3 D.U.
35
Un altro esempio di funzione
dichiarata in string.h del C++
e’ la function strcat che permette di
concatenare 2 stringhe (cfr. leggiter.cpp)
In leggiter.cpp si vogliono porre 2 stringhe una
di seguito all’ altra: questo lo fa la funzione
strcat usando i puntatori alle due stringhe che
sono passati alla funzione come suoi argomenti.
Nel programma leggiqua.cpp invece appare la
funzione elabora di tipo int e con un tipo char
come argomento: e’ il modo GIUSTO di scrivere
funzioni diverso fondamenti
dai ….di informatica 1 parte
3 D.U.
36
primi esempi di funzioni void
scritti come esempi di funzioni per strutturare
bene i PROGRAMMI come leggipri e leggisec.
Queste sono le funzioni: void leggi(), void
elabora(), void scrivi(), void attendi().
Si tratta di funzioni create dall' utente che
lavorano su variabili globali (uso dell’
ambiente globale): non hanno ne’ argomenti
ne’ tipo (sono indicate come void).
Si tratta di un uso improprio delle funzioni e dei
sottoprogrammi in generale, adottato nei
primi esempi soltanto per evidenziare le
componenti funzionali
di1 parte
un programma.
fondamenti di informatica
3 D.U.
37
Indipendenza delle funzioni
La funzione o sottoprogramma in genere e’ lo
strumento che ha permesso lo sviluppo di
quantita’ enormi di software (esempio tipico le
librerie) e deve lavorare indipendentemente
dall' ambiente globale e dal programmma che
lo attiva (per capire almeno in parte tutto cio’
cfr. monocod.cpp e codifibl.cpp)
Per essere indipendente, il sottoprogramma ha
bisogno di variabili e strutture dati in generale,
per identificare i dati su cui deve lavorare al suo
fondamenti di informatica 1 parte
interno.
3 D.U.
38
Sottoprogrammi parametrici
Il sottoprogramma per identificare e scambiare dati
con l’esterno usa il meccanismo degli argomenti
(dichiarati nella sua intestazione) che prendono il
nome di parametri formali. Le frasi componenti il
suo corpo utilizzano questi parametri formali.
Quando il sottoprogramma e’ attivato per es. dal main
i parametri formali diventano il veicolo di trasporto
delle informazioni che il main vuole comunicare al
sottoprogramma e/o ricevere da questo.
(Nel corpo del sottoprogramma possono essere usate
anche altre variabili e strutture dati con compiti
provvisori e circoscritte al solo sottoprogramma:
queste appartengono all’ ambiente LOCALE al
di informatica
1 parte
sottoprogr. definitofondamenti
e usabile
solo
al suo interno.)
3 D.U.
39
(… ma, perche’
sottoprogrammi ? )
La motivazione del nome sta nel loro uso. Si
tratta in generale di programmi (software) che
vanno in esecuzione solo se vengono attivati o
richiamati da altri programmi.
Anche il main program va in esecuzione solo se
qualcuno lo chiama, ma costui puo’ essere solo
l’ utente o il S.O. non una qualsiasi funzione
definita ad un livello a lui sottostante.
Invece qualsiasi sottoprogramma sottostante il
main, puo’ attivare gli altri ed anche se’ stesso,
(ricorsione !!!) ma
non il main!
fondamenti di informatica 1 parte
3 D.U.
40
Compiti dei sottoprogrammi
Il programma che chiama o attiva un
sottoprogramma perche’ effettui il compito per
cui e’ stato costruito (per es. visualizzare una
variabile), deve fornire al sottoprogramma i dati
da elaborare (per es. la variabile da
visualizzare).
Cio’ viene effettuato nella frase di attivazione
specificando, dopo il nome del sottoprogramma
e tra parentesi tonde, i nomi dei dati al posto
dei parametri formali: questi si dicono
parametri effettivi e sostuiscono i parametri
formali tramite un
meccanismo
Hard-Soft.
fondamenti di informatica 1 parte
3 D.U.
41
Funzioni & Procedure
Se il sottoprogramma e’ una funzione il risultato
di uscita e’ affidato al nome della funzione
stessa. Ossia in ogni Funzione il NOME e’ il
veicolo di attivazione e di trasporto del
risultato in essa calcolato.
Se il sottoprogramma e’ piu’ generale (tipo
procedura Pascal) il NOME e’ il veicolo di
attivazione, ma i risultati di uscita possono
essere posti nei parametri formali purche’ sia
usato il passaggio
per indirizzo (cfr.+avanti).
fondamenti di informatica 1 parte
3 D.U.
42
funzioni e procedure: esempi
Le funzioni del C o C++ sono monodrome ossia
restituiscono un singolo valore, come in
matematica y=log(x), e quindi il nome della
funzione (che e’ un identificatore come quello
delle variabili) puo’ identificare il risultato.
Le procedure del C o C++ iniziano e sono
attivabili come le funzioni, ma restituiscono
alcuni valori ad es. somma, media e varianza di
un gruppo di dati: 3 valori che non possono
essere identificati da una sola entita’, ma da 3
che quindi devono essere poste tra i parametri
fondamenti di informatica 1 parte
di scambio.
3 D.U.
43
I motivi per l' introduzione
dei sottoprogrammi. 1)
1) Si inserisce una sola volta il codice del
sottoprogramma (per es. la printf e’ un pezzo
di codice di circa 1000 istruzioni che se si
dovessero scrivere al posto del richiamo printf
.... porterebbero i programmini di stampa a
lunghezze grandiose!) Cio provoca:
RIDUZIONE di codice sorgente ed
eseguibile con conseguente maggior
velocita’ di esecuzione.
fondamenti di informatica 1 parte
3 D.U.
44
I motivi per l' introduzione
dei sottoprogrammi. 2) 3)
2) Il proprio sottoprogramma una volta
scritto in modo appropriato, risulta
indipendente da qualsiasi programma e
puo’ essere utilizzato tante volte e da tanti
programmi. (INDIPENDENZA)
3) Un sottoprogramma realizzato da
professionisti ad alto livello (e quindi in modo
ottimale !!) puo’ venire usato da milioni di
utenti e milioni di volte. (OTTIMALITA’)
fondamenti di informatica 1 parte
3 D.U.
45
I motivi per l' introduzione
dei sottoprogrammi. 4)
4) I meccanismi di attivazione e le rigide regole
di utilizzo del sottoprogramma, di cui solo il
nome ed i tipi dei parametri formali sono
visibili all' esterno, permettono PULIZIA
CONCETTUALE E SOSTANZIALE nella
costruzione di software: cio’ significa che con
l'uso corretto dei sottoprogrammi si ottiene un
codice di buona qualita’, facile interpretazione
ed uso. E' il primo passo verso la chiarezza e
facilita’ di documentazione che sono gli obiettivi
dell' Ingegneria fondamenti
del Software.
di informatica 1 parte
3 D.U.
46
Meccanismi Hardware
L' importanza di questi benefici ha fatto si’ che
tutti gli elaboratori, fin dalla prima generazione,
contengano istruzioni macchina per eseguire l'
attivazione, il richiamo di un sottoprogramma.
Questa in linguaggio macchina e’ realizzata
tramite un salto dal MODULO chiamante a
quello chiamato lasciando pero’ MEMORIA del
punto di ritorno a cui diventa possibile tornare
dopo aver eseguito il modulo attivato. Queste
istruzioni pero’ riguardano il linguaggio
macchina che sara’ trattato in seguito (cenni in
fondamenti di informatica 1 parte
parte 5).
3 D.U.
47
Frasi di “va e torna”
Semplificando si tratta di istruzioni macchina di
salto al sottoprogramma chiamato e di
ritorno al (sotto)programma chiamante. Ma
nei linguaggi avanzati come il C, C++, Fortran,
Pascal l’ attivazione di sottoprogrammi ha frasi
diverse. Qui interessano le frasi del C e C++
per la definizione dei moduli e la loro
attivazione che il Compilatore traduce nelle
opportune istruzioni macchina di salto a e
ritorno da sottoprogramma.
fondamenti di informatica 1 parte
3 D.U.
48
Definizione del modulo
funzione in C e C++
La definizione inizia con l’ intestazione (prima
frase) nel modo seguente:
[type] function name (arguments list)
{declarations;
 function body (with the arguments)
 [return[(expression)];]
/* type function = type expression */
}
La funzione che NON usa il suo nome per
restituire valori e’ di tipo void ( => procedura),
49
le altre di tipo int, float, … ecc.
Esempio di funzione:
(leggiqua.cpp)
int elabora (char carattere)
/*in questa intestaz. la lista degli argomenti e’ di un
solo argomento se no sarebbero separati da virgole */
{
 int n; //variabile locale di elabora
 n=(int) carattere;
 return(n); /* oppure return n che e’ int
come elabora: elabora diventa il veicolo per
restituire il valore calcolato. Invece per funzioni
di tipo void niente
return */
fondamenti di informatica 1 parte
}
3 D.U.
50
Regole del C e C++
Un sottoprogramma (subroutine) non puo’
essere attivato se non e’ stato dichiarato all’
inizio: la dichiarazione si effettua indicando il
seguente prototipo del sottoprogramma:
[type] subroutine name (type argument);
NOTA: tipo non nome !! es. per le funzioni:
int elabora (char); per le procedure: void
calcola(int, float*,float*); o anche
float valcalcol(int, int*, float*);
I parametri effettivi e formali del sottoprogr.
devono corrispondere in numero e tipo agli
argomenti indicati
nel prototipo.
fondamenti di informatica 1 parte
3 D.U.
51
Riflessione
Quando si usera’ una procedura come void
calcola(int, float*, float*)
e quando si usera’ una procedura come float
valcalcol(int, int*, float*)
e quando si usera’ una procedura come int
valori(int*, float*,float, float)
??? (Vedere anche gli esercizi proposti in diapo66.)
A queste domande sara’ +facile rispondere
dopo la descrizione del trasporto_valori.
fondamenti di informatica 1 parte
3 D.U.
52
Attivazione in C e C++
Chi attiva il sottoprogramma?
qualsiasi altro [sotto]programma: il main
per es. ma non solo il main, anche le altre
funzioni si possono attivare tra loro.
Come si attiva un sottoprogramma?
scrivendo nel programma chiamante il nome
del sottoprogramma seguito dai parametri
effettivi separati da virgola e racchiusi tra
parentesi tonde.
fondamenti di informatica 1 parte
3 D.U.
53
Funzionamento
Quando l'istruzione contenente l’ attivazione
viene eseguita il controllo delle operazioni
passa dal programma chiamante al
prg.chiamato che viene eseguito
o fino alla fine
o fino al primo return. (....ce ne possono essere
piu’ di uno!)
In C, C++ (a differenza di altri linguaggi come
il Pascal) le funzioni non possono essere
innestate una dentro l' altra: sono tutte allo
stesso livello che si puo’ considerare
sottostante il livello del main. => E’ impossibile
attivare il main da
un suo sottoprogramma!
fondamenti di informatica 1 parte
3 D.U.
54
Funzionamento e regole
Al main il controllo delle operazioni arriva all'
inizio (per es. dal S.O.); dal main passa al
primo sottoprogramma chiamato; da questo
puo’ passare ad un altro sottoprogramma o
tornare al main per effetto di un return o della
fine del sottoprogramma stesso, e cosi’ via.
Gli argomenti presenti nell’ intestazione del
sottoprogramma (i parametri formali) sono
nomi di variabili separati da virgole e preceduti
dal tipo. Per scrivere il corpo del sottoprogr. si
usano i suoi parametri formali (ricordare l’ uso
dei parametri %1 %2 %3 … dei file batch !) I
parametri effettivi devono corrispondere in
numero, ordine e tipo ai parametri formali che
sostituiscono all’fondamenti
attivazione.
di informatica 1 parte
3 D.U.
55
Visibilita’
SOLO il NOME del sottoprogramma ed il TIPO
dei suoi parametri formali sono VISIBILI al
main e (naturalmente!) al sottoprogramma:
rappresentano l' INTERFACCIA del sottoprogr. !
INVISIBILI all' esterno del sottoprogr. sono i
NOMI delle variabili locali e dei parametri
formali del sottoprogr.: meccanismo di
PROTEZIONE. CONSEGUENZA:=>Variabili del
sottoprogram. con lo stesso nome di quelle del
main sono diverse.
fondamenti di informatica 1 parte
3 D.U.
56
Il trasporto_valori tra moduli
non si basa sul nome
dei parametri formali, ma sulla loro posizione !!
Il passaggio dei parametri effettivi da
chiamante a chiamato puo’ avvenire:
1) per valore: non sono le variabili ad essere
trasferite, ma il loro CONTENUTO (rvalue) che
e’ copiato nel parametro formale corrispondente
Da cio’ segue che i valori delle variabili del
programma chiamante non vengono modificati
dall' attivita’ del sottoprogram. che lavora sui
suoi parametri formali contenenti una copia dei
parametri effettivi. E’ il passaggio standard,
fondamenti di informatica 1 parte
3 D.U.
57
ma...
Il passaggio per valore e’ un
MECCANISMO pulito, ma sprecone:
duplicazione di variabili ! Se venisse applicato
anche a tabelle (array) di 10000 e piu’ elementi
ci sarebbe uno spreco enorme di memoria… Si
ottiene nel modo descritto dall’ esempio:
es. prototipo: int elabora (char);
 intestazione (prima frase del sottoprogramma):
int elabora (char carattere)
 attivazione (nel prg. chiamante): num=elabora (car);
con: carattere = parametro formale di elabora; car e
num = variabili definite da: char car; int num; nel
prg. chiamante. fondamenti di informatica 1 parte
3 D.U.
58
Il passaggio di parametri
2) per indirizzo: non sono le variabili ad
essere trasferite, ma il loro INDIRIZZO che e’
copiato nel parametro formale corrispondente.
Da cio’ segue: il sottoprogramma lavora sempre
sui suoi parametri formali, ma questi ora
contengono gli indirizzi delle variabili (i loro
lvalue) e quindi l' attivita’ del sottoprogram.
puo’ modificare l' originale e/o inserire dati!
ogni modifica si riflette sull' originale! E’ un
MECCANISMO meno pulito, ma non duplica
variabili! In C efondamenti
C++di informatica
e’ obbligatorio
per array.
1 parte
3 D.U.
59
Il passaggio per indirizzo
si ottiene nel modo descritto dall’ esempio:
es. prototipo: int cambia ( char *); // l’ argom.
e’ un puntatore a carattere
 intestazione: int cambia (char * puntacar) // il
parametro formale puntacar e’ un puntatore a char
 attivazione: num = cambia(&car);
con le var. car e num definite nel prg. chiamante da:
char car; int num; e con &car indirizzo di car indirizzo
copiato nel param. puntacar di tipo puntatore a char.
In C++ c’e’ anche il passaggio per riferimento
concettualmente simile
a quello per indirizzo.
fondamenti di informatica 1 parte
3 D.U.
60
I/O di un sottoprogramma
Il passaggio di parametri evidenzia il ruolo dei
parametri stessi: un sottoprogramma per
lavorare deve ricevere in ingresso i dati da
elaborare e deve restituire in uscita i risultati
prodotti. (NOTARE CHE questo principio vale per
ogni tipo di programma o sottoprogramma ! Si
vedra’ che anche il main ha possibili argomenti.)
Tra i parametri si distinguono dunque quelli di
ingresso e quelli di uscita, di Input e di Output: i
primi sono i valori dati e sono passati di norma
per valore, i secondi
per indirizzo: sono i risultati
fondamenti di informatica 1 parte
3 D.U.
61
REMEMBER
In ogni Funzione il NOME e’ il veicolo della sua
attivazione e di trasporto del risultato in essa
calcolato.
Esempi in program3: leggiqua, leggiqui, codifibl, codifich
In ogni Procedura il NOME e’ il veicolo della sua
attivazione: il trasporto dei risultati in essa
calcolati e’ generalmente affidato a parametri
passati per indirizzo.
Esempi in program4: Scambio, Cambia1, ed anche
cambiapr, camfunz e cambia.h
(es. compilazione Separata =>)
fondamenti di informatica 1 parte
3 D.U.
62
Perche’ compilazione separata?
ogni modulo compilato separatamente diventa
un’ unita’ a se’ stante attivabile da qualsiasi
altro modulo. Si puo’ compilare ogni programma
e sottoprogramma su un file a se’ stante anche se e’
bene compilare insieme quelli che fanno parte
di una libreria, come per es. in camfunz.cpp.
Nell’ esempio (cambiapr.cpp, camfunz.cpp, cambia.h), i
sottoprogrammi in camfunz.cpp possono essere
attivati non solo dal main a cui erano legati in
partenza, ma da qualunque altro programma o
sottoprogramma che li voglia usare. Per farlo
basta includervi fondamenti
cambia.h e aggiungerli nel project
di informatica 1 parte
relativo.
3 D.U.
63
header file
Si considerino le differenze tra Cambia1 e cambiapr:
in Cambia1 sono inclusi gli header file stdio.h e
iostream.h, mentre in cambiapr e’ incluso solo
cambia.h che pero’ contiene l’ inclusione di stdio.h
di iostream.h e le dichiarazioni dei moduli usati
come void leggi(&int,&int); ...scrivi…, etc.
 cambia.h si puo’ intendere come un file header
“personalizzato”: deve essere incluso in cambiapr
e in camfunz per indicare al compilatore i prototipi
di tutti i sottoprogrammi usati.
 cambiapr e camfunz sono
cosi’
compilabili
separatamente.
fondamenti
di informatica
1 parte
3 D.U.
64
Project
Per indicare poi al linker che il programma e’
strutturato su alcuni file contenenti il main e i
sottoprogrammi occorre costruire il project.
Questo e’ un file con extension prj contenente i
nomi di tali file. Per costruirlo porsi sul menu’
alto del compilatore sotto Project e fare clik su
Open Project. Si apre la finestra con i nomi
dei file prj: dare al nuovo project un nome che
apparira’ su una nuova finestra in basso. Un clik
su Add item di Project e un altro clik sui file
che si vogliono inserire fa costruire il project
Un clik su Run manda in esecuzione il project
aperto: ad esecuzione conclusa Close Project
65
Esercizi e ...
Scrivere un programma in C++ in cui la
funzione elaborativa consiste nella lettura e
somma di 3 valori numerici (letti da Input). Il
totale restituito dalla funzione elaborativa deve
essere visualizzato. I valori numerici possono
essere interi o Floating_point. Scrivere un altro
programma ove, letti 2 valori float, la funzione
elabora calcoli le somme per difetto e per
eccesso dei 2 valori e le restituisca al main.
 ….e se i valori numerici fossero 100 ?
….e se il numero dei valori numerici fosse
fondamenti di informatica 1 parte
incognito ?
3 D.U.
66
Elaborazione ciclica
(iterativa)
Le domande precedenti servono ad introdurre
le frasi iterative che permettono di realizzare
cicli ossia di ripetere una frase o un blocco di
frasi (nell’ es. precedente: lettura e somma di
valori numerici in numero variabile).
Le frasi sono:
for …; while … ; do … while;
Seguono sintassi e diagrammi di while … ; do
… while; e per fondamenti
il fordi informatica
…; quale
diagramma ?
1 parte
3 D.U.
67
La sintassi
di un tipo di frase stabilisce la forma generale,
il costrutto cui occorre attenersi nello scrivere
frasi di quel tipo.
Per il for la sintassi e’ la seguente:
for(<espress.1>;<espress.2>;<espress.3>) <frase>;
dove: <espress.1> inizializza la var. di controllo del
ciclo; <espress.2> condizione di fine ciclo;

<espress.3> incrementa la var. di controllo del
ciclo; <frase> e’ la singola istr. o il blocco di istruzioni
da ripetere. Esempi in tutte le versioni di codifiche.
fondamenti di informatica 1 parte
3 D.U.
68
Il for si usa quando il numero
di ripetizioni e’ noto: esempio
int somma =0, inc =3, max =23, i;
for (i=0; i<max; i=i+1) somma = somma+inc;
cout << “\nla somma e’: “ << somma;
L’ addizione di inc a somma e’ ripetuta max volte
In C e C++ ogni espressione del tipo i=i+1; si
puo’ scrivere con i++; (analogamente i--;) le
espressioni del tipo somma = somma+inc; si
possono scrivere con somma += inc;
(analogamente x*=n; invece di x=x*n; e cosi’
pure le altre operazioni.)
fondamenti di informatica 1 parte
3 D.U.
69
Sintassi e significato del
while … esempi in while1-2
while (<Condizione>) <Frase>
fintantoche’ la condizione e’ vera la frase viene
eseguita: si esce dal ciclo passando alla
FraseSucc. quando la condizione diventa falsa;
si utilizza quando non si conosce il numero di
ripetizioni da effettuare, per es. conoscendo
che x >0 ma non quanto vale si puo’ scrivere:
while (x >0) {cout<<“\nx ancora>0”; x--; }
la condiz. e’ esaminata prima dell’ esecuzione
fondamenti di informatica 1 parte
della frase.
3 D.U.
70
Sintassi e significato del
do ... while
do <Frase> while (<Condizione>)
la frase viene eseguita per tutto il tempo che la
condizione e’ vera: si esce dal ciclo quando la
condizione diventa falsa.
si utilizza quando non si conosce il numero di
ripetizioni da effettuare, per es. conoscendo
che x >1 ma non quanto vale si puo’ scrivere:
do {cout<<“\nx ancora>0”; x--; } while (x >0)
la condiz. e’ esaminata dopo l’ esecuzione della
frase: ecco perche’
nell’ es. deve essere x>1.
fondamenti di informatica 1 parte
3 D.U.
71
Diagramma di:
while(Condiz.)
{Frase}
False
Condiz.
True
Frase
Diagramma di:
do{Frase} while
(Condiz.)
Frase
True
Condiz.
False
FraseSucc.
FraseSucc.
fondamenti di informatica 1 parte
3 D.U.
72
Ripensando al ciclo del DOS ...
Operazioni svolte:
1) Accensione & bootstrapping
2) Ricerca e caricamento DOS
3) Esecuzione di autoexec.bat (visionarlo !!)
4) Prompt e attesa di un comando
6) Esecuzione del comando
7) Ritorna a 4)
4) 6) 7) => CICLO INFINITO !!!
fondamenti di informatica 1 parte
3 D.U.
73
UN CICLO INFINITO
come si scrive in C o in C++ ? …..
La frase 7) Ritorna a 4) potrebbe essere scritta
con un goto quattro; con quattro posto come
etichetta della frase 4) ossia cosi’:
quattro: Esegui(prompt); //qui quattro = label

Aspetta(comando);

Esegui(comando);

goto quattro;
...ma il goto NON E’ una frse BEN VISTA dai...
“Programmatori Strutturati” ! Meglio usarla
solo per andarefondamenti
a segnalare
errori …. e allora?
di informatica 1 parte
3 D.U.
74
Risposte possibili ed … altro
1) For (;;)
2) while (1) { ... }
3) do { ... } while (1)
… ma perche’ ?? RIFLETTERE !
… e poi avendo alcuni cicli infiniti nel
proprio programma invece di ripetere per
ogni ciclo una delle 3 frasi cosa si puo’
fare ? Ricordare #define ….
ES. #define forever
For (;;)
fondamenti di informatica 1 parte
3 D.U.
75
Elaborazione condizionale
La condizione che appare nella frase while e’
tipica delle scelte che intervengono nello
svolgimento di programmi.
Una scelta permette di interrompere la
sequenzialita’ delle operazioni: in base al
valore della condizione un blocco di frasi puo’
essere eseguito o no; tra 2 blocchi puo’
essere scelto uno per l’esecuzione e saltato l’
altro; ci puo’ anche essere un annidamento di
scelte…
fondamenti di informatica 1 parte
3 D.U.
76
Scelte e frase if … sintassi,
significato ed esempi
if (< condizione >) frase1;
se la condizione e’ vera esegui la frase1 che puo’
essere semplice o composta; es. di frase semplice:
if (n>0) cout << “n e’ positivo”;
if (< condizione >) frase1; else frase2;
se la condizione e’ vera esegui Frase1, altrimenti
esegui Frase2; poi prosegui con la Frase in sequenza,
come indicato nel diagramma seguente.
es. if (n>0) cout << “n e’ positivo”; else
cout << “n e’ minore
o =0”;
fondamenti di informatica 1 parte
3 D.U.
77
Diagramma: if(condiz.) {Frase1}
else {Frase2}
Condiz.
False
True
Frase1
Frase2
Frase

… se manca l’else la freccia da Frase1 porta a Frase2
Esempi in program5: if1.cpp e while1 - while2.cpp
fondamenti di informatica 1 parte
3 D.U.
78
Frasi if annidate: selezione
multlipla, ma ...
if (< condizione 1>) <frase 1>;
else if (< condizione 2>) <frase 2>;
else if (< condizione 3>) <frase 3>;
…..
else if (< condizione n>) <frase n>;
else frase n+1; // qui puo’ andare male …
Ricordare che <frase i> e’ una singola istr. o
in generale un blocco di istruzioni: segue
esempio … mafondamenti
usaredi informatica
con cautela
if annidati !!!
1 parte
3 D.U.
79
Esempio con operatori !=
(diverso) e == (uguale)
{ // ricordare: EOF = CTRL-Z per il DOS
char c;
while ((c=getchar()) != EOF)
 if (c==‘a’) cout<< “ primo carattere\n”;
 else if (c==‘b’) cout<< “secondo car.\n”;
 else if (c==‘c’) cout<< “terzo car. \n”;
 else if (c>‘c’) cout “carattere imprevisto\n”;
} //vedere prg. if1.cpp in program5, ma meglio
usare switch. fondamenti di informatica 1 parte
3 D.U.
80
Operatori relazionali
== il primo operando e’ uguale al
secondo
!= “ “
“
“ diverso dal
“
> “ “
“
“ maggiore del “
>= “ “
“
““
o uguale al “
< “ “
“
“ minore del
secondo
<= “ “
“
““
o uguale al “
ATT.ne operatore di uguaglianza: NON
confonderlo con
l’ operatore
fondamenti
di informatica 1 parte di assegnazione!!
3 D.U.
81
Selezione multipla e frase
switch: sintassi ed esempio
switch (<espressione>)
{ case <costante 1>: <frase 1>; break;
 case <costante 2>: <frase 2>; break;
 ...
case <costante n>: <frase n>; break;
default: <frase>
}
Ricordare che <frase i> e’ una singola istr.
o in generale fondamenti
un blocco
di istruzioni
di informatica 1 parte
3 D.U.
82
Significato anche di default e
break: prg. switch1-switch5
E’ calcolata (<espressione>) che ha la funzione
di selettore e deve essere integrale (int o char)
se il risultato e’ il valore <costante i> viene
eseguita la <frase i> associata e quindi break
fa uscire dal blocco di switch; se mancasse
break verrebbero eseguite tutte le frasi
seguenti la i-esima: un perdi-tempo assurdo !
Invece se il risultato non corrisponde ad alcuna
<costante i> viene eseguita la frase associata a
default: questa e’ una clausola opzionale, ma
fondamenti di informatica 1 parte
comoda.
3 D.U.
83
Esercizio
Utilizzando la frase switch …. case rifare
il programma richiesto alla diapo 28 con le
funzioni scritte per calcolare le aree di
alcune figure geometriche inserendo pero’
anche una funzione di scelta che chieda
all’ utente quale area vuole e restituisca al
main l’indicazione ottenuta. Il main deve
quindi attivare solo la funzione che calcola
l’area voluta e visualizzarla.
fondamenti di informatica 1 parte
3 D.U.
84
Scarica

fondinf1.3