G. Mecca – Università della Basilicata – mecca@unibas.it
Programmazione Procedurale in Linguaggio C++
Sottoprogrammi Parte 2
Sintassi e Semantica
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Sommario
m
Introduzione
m
Definizione di Funzioni
m
Definizione di Procedure
m
Utilizzo di Sottoprogrammi
ðSintassi per la Chiamata di Funzioni ðSintassi per la Chiamata di Procedure ðSemantica
Sottoprogrammi: Sintassi e Semantica >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Introduzione
m
Sottoprogrammi
ðmoduli in cui è possibile dividere un programma complesso
ðne esistono due forme
m
Funzioni
ðblocchi di istruzioni per calcolare un valore
m
Procedure
ðblocchi di istruzioni per realizzare operazioni complesse
Sottoprogrammi: Sintassi e Semantica >> Introduzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 4
Introduzione
m
Sottoprogrammi definiti dall’utente
ðdel tutto analoghi dal punto di vistadell’utilizzo ai sottoprogrammi predefiniti
m
Sottoprogrammi predefiniti
ðfunzioni predefinite (es: sin())ðprocedure predefinite (es: getline())
m
Differenza fondamentale
ðin più, è necessario definire ilsottoprogramma
Sottoprogrammi: Sintassi e Semantica >> Introduzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Introduzione
m
Programmazione modulare
ðun programma è fatto di vari moduli
m
Modulo
ðsottoprogramma o programma principale
m
Funzionamento
ði moduli si “chiamano” a vicenda
ðe comunicano attraverso il “passaggio dei parametri”
Sottoprogrammi: Sintassi e Semantica >> Introduzione
Introduzione
m Parametro
ðdato “generico” utilizzato nel sottoprogramma ðal momento della chiamata gli viene associato un
argomento (dato “specifico”)
m Parametri standard
ðnon possono essere utilizzati per modificare il valore del corrispondente argomento
m Parametri per riferimento
ðpossono essere utilizzati per modificare il corrispondente argomento
Sottoprogrammi: Sintassi e Semantica >> Introduzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Introduzione
m
Nota
ðesistono terminologie alternative utilizzate sui libri
m
In particolare
ðparametro -> parametro formale ðargomento -> parametro attuale
ðparametro standard -> parametro per valore ðparametro per riferimento -> par per variabile
Sottoprogrammi: Sintassi e Semantica >> Introduzione
ATTENZIONE allo terminologia
utilizzata
G. Mecca - Programmazione Procedurale in Linguaggio C++ 8
Definizione di Funzioni
m
Definizione di una funzione
ðfatta di due partim
Intestazione (o “Prototipo”)
ðfornisce le informazioni necessarie per poter chiamare la funzione in altri moduli
m
Corpo
ðfornisce le informazioni necessarie per poter eseguire la funzione quando viene chiamata
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Definizione di Funzioni
m
Funzione predefinita; es: sin()
m
Per poterla utilizzare devo conoscere
ðil nome della funzione (sin)ðil numero e il tipo degli argomenti (1 argomento di tipo double) >> parametri ðil tipo del risultato restituito (double)
m
Intestazione di una funzione
ðcontiene esattamente queste informazioni
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
Definizione di Funzioni
m
Rispetto ad una funzione predefinita
ðè necessario specificare altre informazioniper poter eseguire la funzione
m
In particolare
ðistruzioni da eseguire per calcolare il valore ðvalore da restituire al termine dell’esecuzione
m
Corpo
ðserve a specificare queste altre informazioni
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Esempio: discriminante
float discriminante (float a, float b, float c) {
float d;
d = b * b – 4 * a * c;
return d;
}
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
nome della funzione
tipo del risultato parametri
intestazione corpo operazioni da eseguire
per calcolare il valore istruzione di ritorno
e valore da restituire
G. Mecca - Programmazione Procedurale in Linguaggio C++ 12
Esempio: giocata
string giocata (int numero) {
string s;
if (numero == 1) { s = "carta";
} else if (numero == 2) { s = "forbici";
} else if (numero == 3) { s = "sasso";
}
return s;
}
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
nome della funzione
tipo del risultato parametri
intestazione corpo operazioni da eseguire
per calcolare il valore valore
da restituire
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Definizione di Funzioni
m
Sintassi
<tipoRisultato> <nome> (<parametri>)
<corpo>
m
Dove
ð<tipoRisultato> è un tipo di dato ð<nome> è un identificatore
ð<corpo> è un blocco di istruzioni ð<parametri> è l’elenco dei parametri
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
Definizione di Funzioni
m
Elenco dei parametri
<tipoP1> <nomeP1>, <tipoP2> <nomeP2>...
m
Dove
ð<tipoP1>, <tipoP2> ... sono tipi di dato
ð<nomeP1>, <nomeP2> ... sono identificatori
m
Nota
ðci sono sottoprogrammi che NON hanno parametri (casi rari); in questo caso si utilizzano le parentesi vuote ()
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Definizione di Funzioni
m
Istruzione return
ðil corpo deve contenerne almeno una
m
Sintassi
return <espressione>;
m
Dove
ð<espressione> deve restituire un valore compatibile con il tipo del risultato
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
NOTA: è consentito specificare una espressione
generica
G. Mecca - Programmazione Procedurale in Linguaggio C++ 16
Definizione di Funzioni
m
Semantica
ðl’esecuzione dell’istruzione return interrompe l’esecuzione della funzione
ðviene calcolato il valore dell’espressione ðil valore viene restituito al modulo chiamante
m
Nota
ðpuò esserci anche più di un’istruzione return ðin punti diversi del sottoprogramma
Sottoprogrammi: Sintassi e Semantica >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Definizione di Procedure
m
Definizione di una procedura
ðanche in questo caso fatta di intestazione e corpo
m
Differenze rispetto alle funzioni
ðnon viene restituito alcun valoreðpuò essere necessario modificare gli argomenti attraverso i parametri
m
Parametri per riferimento
ðsintassi opportuna per segnalarli
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
Definizione di Procedure
m
Procedura predefinita; es: getline()
m
Per poterla utilizzare devo conoscere
ðil nome della procedura (getline)ðil numero e il tipo degli argomenti (1
argomento di tipo istream, 1 argomento di tipo string) >> parametri
ðil fatto che il secondo arg. viene modificato
m
Intestazione di una procedura
ðcontiene esattamente queste informazioni
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
void leggiEquazione (float &a, float &b, float &c) {
cout << "Inserisci i coefficienti dell'equazione \n";
cin >> a;
cin >> b;
cin >> c;
return;
}
Esempio: leggiEquazione
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
nome della procedura
non c’è risultato parametri per riferimento
intestazione corpo operazioni da eseguire
istruzione di ritorno
G. Mecca - Programmazione Procedurale in Linguaggio C++ 20
void nuovaMano( string nome, int& punteggioComputer, int& punteggioGiocatore, int& pareggi ) {
int giocataComputer;
int giocataGiocatore;
int esito;
giocataComputer = generaGiocataComputer();
giocataGiocatore = schermoMenuMano(nome);
esito = controllaEsito(giocataComputer, giocataGiocatore);
schermoEsitoMano(nome,esito,giocataComputer,giocataGiocatore);
if (esito == 1) {
punteggioComputer++;
} else if (esito == 2) { punteggioGiocatore++;
} else { pareggi++;
} return;
}
Esempio: nuovaMano
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Definizione di Procedure
m
Sintassi
void <nome> (<parametri>)
<corpo>
m
Dove
ð<tipoRisultato> è un tipo di dato ð<nome> è un identificatore
ð<corpo> è un blocco di istruzioni ð<parametri> l’elenco dei parametri
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
Definizione di Procedure
m
Parametri standard (o “per valore”)
<tipoPar> <nomePar>
m
Parametri per riferimento
<tipoPar>& <nomePar>
m
Semantica
ði parametri per riferimento possono essere utilizzati per modificare i corrispondenti argomenti
ði parametri standard no
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
ATTENZIONE:
omettere la & è un errore logico molto frequente
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Definizione di Procedure
m
In sintesi
ðle funzioni sono utilizzate per calcolare un valore (non modificano gli argomenti)
ðnormalmente hanno solo parametri standard ðle procedure sono utilizzate per effettuare
operazioni (tra cui modifiche agli argomenti) ðpossono avere sia parametri standard che
per riferimento
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 24
Definizione di Procedure
m
Nota
ðil corpo deve contenere un’istruzione return ðpuò essercene più di una
m
Sintassi dell’istruzione return nelle proc.
return;
m
Infatti
ðin questo caso non è necessario restituire nessun valore (differenza con le funzioni)
Sottoprogrammi: Sintassi e Semantica >> Definizione di Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Utilizzo dei Sottoprogrammi
m
Una volta definiti i sottoprogrammi
ðpossono essere “chiamati” da altri modulim
Terminologia
ðmodulo “chiamante”
ðmodulo “chiamato”
m
Analogo
ðil chiamante chiede un servizio al chiamato ðil chiamato fornisce un servizio al chiamante
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
ATTENZIONE alla differenza tra definire e utilizzare un sottoprogramma
Utilizzo dei Sottoprogrammi
m
Utilizzo delle funzioni
ðesclusivamente all’interno di espressioni, per calcolare valori
m
Utilizzo delle procedure
ðsotto forma di nuove istruzioni
m
In entrambi i casi
ðè necessario specificare gli argomenti
ðche devono corrispondere in numero e tipo ai parametri
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
ATTENZIONE alla differenza tra l’utilizzo delle funzioni
e delle procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Esempio: discriminante
float discriminante (float a, float b, float c) { float d;
d = b*b-4*a*c;
return d;
}
void main() {
float a1, b1, c1;
float a2, b2, c2;
...
if ( discriminante( a1, b1, c1 ) >= 0 ...
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
chiamata della funzione espressione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 28
Esempio: leggiEquazione
void leggiEquazione (float &a, float &b, float &c) { cout << "Inserisci i coefficienti dell'equazione \n";
cin >> a;
cin >> b;
cin >> c;
return;
}
void main() {
float a1, b1, c1;
float a2, b2, c2;
leggiEquazione( a1, b1, c1 );
leggiEquazione( a2, b2, c2 );
...
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
chiamata
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Chiamata di Funzioni
m Sintassi
<nomeFunzione>(<arg1>, <arg2>,...<argn>) m Dove
ð<nomeFunzione> è il nome della funzione ð<arg1>, <arg2>, ...<argn> sono gli argomenti
ðse la funzione non ha parametri si possono omettere le parentesi vuote
m Nota
ðchiamata ammessa solo in un’espressione
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
Espressione:
-istruzione di assegnazione -istruzione di stampa (cout <<) -struttura di controllo (cond.) -istruzioni di ritorno delle funzioni
Chiamata di Funzioni
m
Argomenti
ðespressioni generiche
ðin particolare costanti simboliche o numeriche (es: pigreco oppure 3.14) ðoppure variabili (es: a1)
ðdevono corrispondere in numero e ordinatamente in tipo con i parametri
m
In realtà
ðpossono anche essere a loro volta parametri
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Chiamata di Funzioni
m
Infatti
ðil modulo chiamante può essere un altro sottoprogramma
m
Esempio
float primaRadice (float a, float b, float c) { float x;
x = (-b + sqrt(discriminante(a, b, c)))/(2*a);
return x;
}
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
a, b e c sono i parametri di “primaRadice”
e vengono usati come argomenti per “discriminante”
G. Mecca - Programmazione Procedurale in Linguaggio C++ 32
Chiamata di Funzioni
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
if (discriminante(a1, b1, c1)>= 0) ...
float discriminante(float a, float b, float c) { return b*b-4*a*c;
}
void main() {
float a1, b1, c1, d;
a1 = 2;
b1 = 6;
c1 = 1;
d = discriminante(a1, b1, c1);
cout << discriminante(2, b1 - 1, c1 * 2);
d = discriminante(1,1,discriminante(a1,b1-1,c1*2));
valore: 28 valore: 28 valore: 9
valore: -35 cout << discriminante(‘a’, b1);
discriminante(a1, b1, c1);
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Chiamata di Procedure
m
Sintassi
<nomeProcedura>(<arg1>,<arg2>,...<argn>);
m
Dove
ð<nomeProcedura> è il nome della procedura ð<arg1>, <arg2>, ...<argn> sono gli argomenti
m
Nota
ðla chiamata deve essere un’istruzione a sè stante terminata da ;
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
ATTENZIONE alla differenza con la chiamata
di funzione
Chiamata di Procedure
m
Argomenti da modificare
ðassociati a parametri per riferimento ðdevono essere effettivamente valori
modificabili
ðovvero devono corrispondere ad uno spazio di memoria il cui valore sia modificabile
ðnon possono essere costanti numeriche ðnon possono essere costanti simboliche ðnon possono essere espressioni complesse
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Chiamata di Procedure
m
Argomenti da modificare
ðsolo due opzioni ammissibilim
Prima opzione
ðl’argomento è una variabile del modulo chiamante
m
Seconda opzione
ðl’argomento è un parametro del sottoprogramma chiamante
ðsi tratta di uno spazio nella memoria (>>)
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 36
Chiamata di Procedure
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
leggi (a1, b1, c1);
void leggiEquazione(float& a,float& b,float& c){...}
float a1, b1, c1, x, y;
leggi (a1, x, y);
leggi (a1 * 2, 3, y);
void main() { leggi (y, z, w);
float y, z, w;
leggi (x, y, z);
void prova (float x) {
a1 = leggi(x, y, c1) }
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Chiamata di Procedure
m
ATTENZIONE: Errore frequente
ðnon è necessario specificare il tipo degli argomenti nella chiamata
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
if (discriminante(a1, b1, c1) >= 0 ...
if (discriminante(float a1, float b1, float c1 )>=0...
leggiEquazione(a1, b1, c1);
leggiEquazione(float a1, float b1, float c1);
Chiamata di Sottoprogramma
m
Semantica
ðsi interrompe il modulo chiamante
ðavviene il “passaggio dei parametri” (>>) ðcomincia l’esecuzione del corpo del
sottoprogramma
ðquando viene incontrata l’istruzione return, l’esecuzione del corpo termina
ðtermina l’effetto del passaggio dei parametri ðriprende l’esecuzione del modulo chiamante
Sottoprogrammi: Sintassi e Semantica >> Utilizzo dei Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Riassumendo
m
Sottoprogrammi
ðDichiarazione e utilizzo
m
Dichiarazione
ðIntestazione ðCorpom
Utilizzo (Chiamata)
ðChiamata di funzione ðChiamata di proceduraSottoprogrammi: Sintassi e Semantica >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 40
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.