G. Mecca – Università della Basilicata – mecca@unibas.it
Programmazione Procedurale in Linguaggio C++
Sottoprogrammi Parte 3
Passaggio dei Parametri
versione 2.3
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
2
Sommario
m
Passaggio dei Parametri
m
Simulazione
m
Casi Particolari
m
Rapporto tra Funzioni e Procedure
m
Linee Guida per la Scelta dei Parametri
m
Errori Frequenti
Sottoprogrammi: Sintassi e Semantica >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Passaggio dei Parametri
m
Parametro
ðspazio nella memoria
m
Memoria per un modulo di programma
ðmemoria per le costanti locali (già discussa) ðmemoria per le variabili locali (già discussa) ðmemoria per i parametrim
Memoria relativa ai parametri
ðgestita in modo diverso dalle variabili
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
Passaggio dei Parametri
m
Semantica
ðal passaggio dei parametri, viene riservata la memoria per i parametri
ðad ogni parametro standard viene riservato uno spazio corrispondente al suo tipo
ðad ogni parametro per riferimento viene riservato uno spazio adatto a contenere un indirizzo della memoria
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
ATTENZIONE alla semantica operazionale
del passaggio dei parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Passaggio dei Parametri
m
Semantica (continua)
ða ciascun parametro viene associato l’argomento corrispondente nella chiamata ðnello spazio di memoria di ciascun parametro
standard viene copiato il valore dell’argomento corrispondente
ðnello spazio di memoria di ciascun parametro per riferimento viene copiato l’indirizzo di memoria dell’argomento corrispondente
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
6
Passaggio dei Parametri
m
Semantica (continua)
ðterminato il passaggio dei parametri, comincia l’esecuzione del corpo del sottoprogramma
ðviene riservata eventuale memoria per costanti e variabili locali
ðvengono eseguite le istruzioni
ðle operazioni sulle costanti e sulle variabili locali vengono effettuate in modo ordinario
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Passaggio dei Parametri
m
Semantica (continua)
ðle operazioni effettuate sui parametri
standard vengono effettuate accedendo allo spazio di memoria relativo
ðviceversa, per effettuare un’operazione sul parametro per riferimento:
ðviene prelevato l’indirizzo dell’argomento ðl’operazione viene effettuata direttamente
sullo spazio di memoria dell’argomento
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
Passaggio dei Parametri
m
Semantica (continua)
ðl’esecuzione del corpo termina non appena viene incontrata l’istruzione return
ðal termine dell’esecuzione la memoria assegnata al sottoprogramma viene
completamente rilasciata e si perde traccia dei dati relativi (costanti, variabili e parametri) ðricomincia l’esecuzione del modulo
chiamante
Sottoprogrammi: Sintassi e Semantica >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Simulazione
le1. void leggiEquazione
(float &a, float &b, float &c) {
le2. cout << “Coefficienti ? ";
le3. cin >> a;
le4. cin >> b;
le5. cin >> c;
le6. return;
le7. }
m1. void main() {
m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. float x1, y1, x2, y2;
m5. leggiEquazione(a1, b1, c1);
m6. leggiEquazione(a2, b2, c2);
m7. if (...)
Sottoprogrammi: Sintassi e Semantica >> Simulazione
xxx
#112
xxx
#111
xxx
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
xxx c2
#105
xxx b2
#104
xxx a2
#103
xxx c1
#102
xxx b1
#101
xxx a1
#100
a b c
#100
#101
#102
Coefficienti ? 2 5 2 2 5 2
10
Simulazione
le1. void leggiEquazione
(float &a, float &b, float &c) {
le2. cout << “Coefficienti ? ";
le3. cin >> a;
le4. cin >> b;
le5. cin >> c;
le6. return;
le7. }
m1. void main() {
m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. float x1, y1, x2, y2;
m5. leggiEquazione(a1, b1, c1);
m6. leggiEquazione(a2, b2, c2);
m7. if (...)
Sottoprogrammi: Sintassi e Semantica >> Simulazione
#102
#112
#101
#111
#100
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
xxx c2
#105
xxx b2
#104
xxx a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
a b c
#103
#104
#105
Coefficienti ? 1 2 1 1 2 1
Coefficienti ? 2 5 2
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Simulazione
d1. float discriminante
(float a, float b, float c) {
d2. float d;
d3. d = b*b-4*a*c;
d4. return d;
d5. }
m1. void main() { ... ...
m7. if (discriminante(a1,b1,c1)>=0
&& discriminante(a2,b2,c2)>=0){
m8. x1=primaRadice(a1,b1,c1);
m9. y1=secondaRadice(a1,b1,c1);
...
Sottoprogrammi: Sintassi e Semantica >> Simulazione
xxx
#113
#105
#112
#104
#111
#103
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
1 c2
#105
2 b2
#104
1 a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
a b c
2 5 2 d
memoria riservata a discriminante parametri variabile locale 9
Simulazione
d1. float discriminante
(float a, float b, float c) {
d2. float d;
d3. d = b*b-4*a*c;
d4. return d;
d5. }
m1. void main() { ... ...
m7. if (discriminante(a1,b1,c1)>=0
&& discriminante(a2,b2,c2)>=0){
m8. x1=primaRadice(a1,b1,c1);
m9. y1=secondaRadice(a1,b1,c1);
...
Sottoprogrammi: Sintassi e Semantica >> Simulazione
9
#113
2
#112
5
#111
2
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
1 c2
#105
2 b2
#104
1 a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
a b c
1 2 1
d 0
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Simulazione
d1. float discriminante
(float a, float b, float c){
d2. float d;
d3. d = b*b-4*a*c;
d4. return d;
}
pr1. float primaRadice
(float a, float b, float c){
pr2. float x;
pr3. x=(-b+sqrt(discriminante(a,b,c)))/
(2*a);
pr4. return x;
}
m1. void main() { ... ...
m7. if (discriminante(a1,b1,c1)>=0
&& discriminante(a2,b2,c2)>=0){
m8. x1=primaRadice(a1,b1,c1);
m9. y1=secondaRadice(a1,b1,c1);
Sottoprogrammi: Sintassi e Semantica >> Simulazione
xxx
#117
xxx
#116
xxx
#115
xxx
#114
xxx
#113
xxx
#112
xxx
#111
xxx
#110
...
...
...
xxx x1
#106
1 c2
#105
2 b2
#104
1 a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
a b c
2 5 2
x -0.5
a b c
2 5 2
d 9
-0.5
14
Simulazione
m1. void main() { m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. float x1, y1, x2, y2;
m5. leggiEquazione(a1, b1, c1);
m6. leggiEquazione(a2, b2, c2);
m7. if (discriminante(a1, b1, c1)>=0 &&
discriminante(a2, b2, c2)>=0) { m8. x1 = primaRadice(a1, b1, c1);
m9. y1 = secondaRadice(a1, b1, c1);
m10. x2 = primaRadice(a2, b2, c2);
m11. y2 = secondaRadice(a2, b2, c2);
m12. stampaRadici(a1, b1, c1, x1, y1);
m13. stampaRadici(a2, b2, c2, x2, y2);
m14. if ((x1==x2) || (x1==y2) ||
(y1==x2) || (y1==y2))
m15. cout << “Esistono radici comuni \n";
m16. else
m17. cout << “Non esistono radici comuni \n";
m18. } else
m19. cout << "Non tutte le radici sono reali \n";
m20. }
Sottoprogrammi: Sintassi e Semantica >> Simulazione
...
...
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
-0.5 x1
#106
1 c2
#105
2 b2
#104
1 a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
-2 -1 -1
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Simulazione
m
Riassumendo
ði parametri standard sono spazi di memoria che si comportano in modo molto simile alle variabili
ði parametri per riferimento sono solo
“intermediari” (servono a fare da tramite tra il processore e i corrispondenti argomenti) ðin particolare, consentono di effettuare
modifiche sugli argomenti
Sottoprogrammi: Sintassi e Semantica >> Simulazione
Simulazione
m Inoltre, sulla base della semantica descritta
ðdovrebbe essere chiaro che possono esserci dati diversi con lo stesso nome in moduli diversi
ðtra questi dati non c’è nessuna relazione, visto che corrispondono in generale a spazi diversi della memoria
ðl’unica forma di associazione tra dati diversi viene stabilita durante l’esecuzione dei sottoprogrammi relativi attraverso il passaggio dei parametri
Sottoprogrammi: Sintassi e Semantica >> Simulazione
ATTENZIONE ai nomi dei parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Simulazione
Sottoprogrammi: Sintassi e Semantica >> Simulazione
void leggiEquazione (float &a, float &b, float &c) { cout << "Inserisci i coefficienti dell'equazione \n";
cin >> a;
cin >> b;
cin >> c;
return;
}
float primaRadice (float a, float b, float c){
float x;
x=(-b+sqrt(discriminante(a,b,c)))/(2*a);
return x;
}
float secondaRadice (float a, float b, float c){
float x;
x=(-b-sqrt(discriminante(a,b,c)))/(2*a);
return x;
}
Spazi diversi nella memoria
Spazi diversi nella memoria
18
Simulazione
m
Esempio: il parametro “a”
ðce ne sono diversi nei vari sottoprogrammi ðil fatto che si chiamino allo stesso modo
dipende dal fatto che nei vari sottoprogrammi rappresentano la stessa informazione (il primo coefficiente dell’equazione)
ðma non devono necessariamente chiamarsi allo stesso modo (es: potrebbero chiamarsi w, y, v, ...)
Sottoprogrammi: Sintassi e Semantica >> Simulazione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19 Sottoprogrammi: Sintassi e Semantica >> Simulazione
void leggiEquazione (float &w, float &b, float &c) { cout << "Inserisci i coefficienti dell'equazione \n";
cin >> w;
cin >> b;
cin >> c;
return;
}
float discriminante (float primoCoeff, float b, float c){
float d;
d=(-b+sqrt(discriminante(primoCoeff,b,c)))/(2*primoCoeff);
return d;
}
float primaRadice (float v, float b, float c){
float x;
x=(-b + sqrt(discriminante(v, b, c))) / (2 * v);
return x;
}
void main() {
float a1, b1, c1;
leggiEquazione(a1, b1, c1);
if (discriminante(a1, b1, c1) >= 0 ) {...}
}
Questo codice è perfettamente corretto, anche se meno leggibile del precedente
Casi Particolari
m
Argomenti per un parametro standard
ðespressione genericaðin particolare: una costante, una variabile, una parametro del modulo chiamante
m
Argomenti per un par. per riferimento
ðdeve essere un dato corrispondente ad unospazio della memoria di valore modificabile ðuna variabile oppure un parametro del
modulo chiamante
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Casi Particolari
m
Casi particolari
ðun parametro del modulo chiamante può essere utilizzato come argomento nella chiamata di un sottoprogramma
ðbisogna stabilire un’associazione tra il parametro del modulo chiamante ed il parametro del sottoprogramma chiamato ðse i parametri sono entrambi standard non
c’e’ problema
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
22
Casi Particolari
m
Casi particolari
ðè necessario prestare attenzione al caso in cui ci siano parametri per riferimento
ðla filosofia è la solita: i parametri per riferimento non fanno altro che da intermediari per rintracciare il vero argomento
ðle operazioni (incluso il passaggio dei
parametri) avvengono con il vero argomento
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Esempio
ln1. void leggiNumero (float &x) { ln2. cout << “Immetti valore: “;
ln3. cin >> x;
ln4. return;
}
le1. void leggiEquazione
(float &a, float &b, float &c){
le2. leggiNumero(a);
le3. leggiNumero(b);
le4. leggiNumero(c);
le5. return;
}
m1. void main() { m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. leggiEquazione(a1, b1, c1);
m5. leggiEquazione(a2, b2, c2);
m6. ...
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
xxx
#113
xxx
#112
xxx
#111
xxx
#110
...
...
...
xxx c2
#105
xxx b2
#104
xxx a2
#103
xxx c1
#102
xxx b1
#101
xxx a1
#100
a b c
#100
#101
#102
x #100
l’argomento a è solo un intermediario tra il parametro x e la variabile a1;
l’indirizzo usato è quello di a1 il valore letto viene assegnato direttamente alla variabile a1
2
Casi Particolari
m
Un caso interessante
ðche cosa succede quanto un parametro per riferimento del modulo chiamante (es: a) viene utilizzato come argomento per un parametro standard del sottoprogramma chiamato (es: x) ?
ðquale valore viene copiato nello spazio di memoria del parametro standard x ?
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Esempio
ln1. void stampaNumero (float x) { ln2. cout << “Valore: “;
ln3. cout << x;
ln4. return;
}
le1. void leggiEquazione
(float &a, float &b, float &c){
le2. cin >> a;
le3. stampaNumero(a);
... ...
return;
}
m1. void main() { m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. leggiEquazione(a1, b1, c1);
m5. leggiEquazione(a2, b2, c2);
m6. ...
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
xxx
#113
xxx
#112
xxx
#111
xxx
#110
...
...
...
xxx c2
#105
xxx b2
#104
xxx a2
#103
xxx c1
#102
xxx b1
#101
xxx a1
#100
a b c
#100
#101
#102
x 2
l’argomento a è solo un intermediario tra il parametro x e la variabile a1;
il valore copiato è quello di a1 il valore stampato è quello della variabile a1
2
26
Casi Particolari
m
Ricapitolando
ðle funzioni normalmente hanno parametri standard (ma possono averne per riferim.to) ðl’effetto rilevante è quello di calcolare un
risultato e restituirlo al modulo chiamante ðle procedure hanno parametri standard e
parametri per riferimento
ðtra gli effetti rilevanti ci sono le modifiche agli argomenti associati a par. per riferimento
Sottoprogrammi: Sintassi e Semantica >> Casi Particolari
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Rapporto tra Funzioni e Procedure
m
Tecnicamente parlando
ðle funzioni non sono strettamente indispensabili
ðl’effetto di ogni funzione può essere simulata da una procedura equivalente
m
Idea
ðsostituire il risultato della funzione con un parametro per riferimento
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
Esempio: discriminante
void calcolaDiscriminante
(float a, float b, float c, float& d) { d = b*b-4*a*c;
return;
}
void main() {
float a1, b1, c1;
float a2, b2, c2;
float x1, y1, x2, y2;
float d1, d2;
calcolaDiscriminante(a1, b1, c1, d1);
calcolaDiscriminante(a2, b2, c2, d2);
if (d1 >= 0 && d2 >=0) { ...
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
al termine dell’esecuzione il valore calcolato dal sottoprogramma
è contenuto nello spazio di memoria della variabile d1
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Rapporto tra Funzioni e Procedure
m
Un ulteriore esempio
ðuno schermo che presenta all’utente un menu
ðed acquisisce un comando numerico
m
Due versioni equivalenti
ðint schermoMenu();
ðvoid schermoMenu(int &scelta);
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
30
Rapporto tra Funzioni e Procedure
int schermoMenu() { int scelta;
cout << “1. Continua” << endl;
cout << “2. Esci” << endl;
cout << “Effettua la tua scelta” << endl;
cin >> scelta;
while ((scelta < 1) || (scelta > 2)) { cout << “Errore” << endl;
cin >> scelta;
}
return scelta;
}
void main() {
int sceltaUtente;
sceltaUtente = schermoMenu();
if (sceltaUtente == 1) {...}
}
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
la funzione restituisce un valore (1 oppure 2)
il programma principale attribuisce il valore allo spazio di memoria della
variabile sceltaUtente
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Rapporto tra Funzioni e Procedure
void schermoMenu(int& scelta) { cout << “1. Continua” << endl;
cout << “2. Esci” << endl;
cout << “Effettua la tua scelta” << endl;
cin >> scelta;
while ((scelta < 1) || (scelta > 2)) { cout << “Errore” << endl;
cin >> scelta;
} return;
}
void main() {
int sceltaUtente;
schermoMenu(sceltaUtente);
if (sceltaUtente == 1) {...}
}
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
in questo caso la procedura modifica direttamente il valore dello spazio di memoria
della variabile sceltaUtente
Rapporto tra Funzioni e Procedure
m
Linea guida
ðè opportuno utilizzare una funzione ogni volta che il sottoprogramma ha come unica funzione quello di “calcolare” un valore singolo e restituirlo (es: discriminante) – maggiore leggibilità
ðse il sottoprogramma svolge anche altre operazioni (es: stampa del menu) è possibile scegliere l’una o l’altra versione
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Rapporto tra Funzioni e Procedure
m
In alcuni casi
ðè possibile utilizzare le procedure anche per calcoli specifici
m
Esempio tipico
ðuna funzione che deve restituire due valori contemporaneamente
ðla cosa più semplice è surrogarla con una procedura con due parametri per riferimento
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
34
Rapporto tra Funzioni e Procedure
m
Esempio
ðcalcolo delle radici reali di un’equazione ðdue possibili alternative
m
Due funzioni
float primaRadiceReale(float a,float b,float c);
float secondaRadiceReale(float a,float b,float c)
m
Una procedura con due param. per rif.
void calcolaRadici(float a, float b, float c float &x1, float &x2);
Sottoprogrammi: Sintassi e Semantica >> Rapporto tra Funzioni e Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Linee Guida per la Scelta dei Param.
m
Parametri di un sottoprogramma in sintesi
ðtutti i dati che il sottoprogramma ha bisognodi conoscere per funzionare (par. standard) ðtutti i dati che il sottoprogramma deve
modificare (par. per riferimento)
m
Sulla base di questo
ðè possibile ottenere delle linee guida su come scegliere i parametri
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
Linee Guida per la Scelta dei Param.
m
Per cominciare
ðchiarire bene la funzione del sottoprogramma in esame
ðquale problema deve risolvere ðsu quali dati deve operare ðquali risultati deve produrre
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Linee Guida per la Scelta dei Param.
m
Parametri della tipologia 1
ðdati che il sottoprogramma deve conoscere ðchiarire quali sono i dati che il sottoprogr.
deve conoscere per funzionare ðe che devono provenire dal modulo
chiamante
m
Esempio n. 1 di dati da conoscere
ðdati da stampare sullo schermoðint schermoMenuPrincipale(string nome);
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
38
Linee Guida per la Scelta dei Param.
m
Esempio n. 2 di dati da conoscere
ðdati da utilizzare per effettuare calcolið float discriminante(float a, float b, float c);
m
Esempio n. 3 di dati da conoscere
ðdati da utilizzare per effettuare verificheð void schermoLeggiPuntataDadi (
int postaDisponibile, int &puntata)
ðpostaDisponibile serve a convalidare il valore della puntata letta da tastiera
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Linee Guida per la Scelta dei Param.
m
Esempio n. 4 di dati da conoscere
ðdati da passare ad altri sottoprogrammiðvoid gioca (string nome);
ðin questo caso, nella morra cinese gioca non utilizza direttamente il nome
ðma è necessario che lo conosca per passarlo ad altri sottoprogrammi (gli schermi
successivi)
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
Linee Guida per la Scelta dei Param.
m
Parametri della tipologia 2
ðdati che il sottoprogramma deve modificare ðe le cui modifiche devono essere visibili
all’esterno (dati utilizzati in altri moduli)
m
Esempio n.1 di dati da modificare
ðdati il cui valore viene letto da un flusso di ingresso
ðvoid leggiEquazione(float &a, float &b, float &c);
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 41
Linee Guida per la Scelta dei Param.
m
Esempio n.2 di dati da modificare
ðdati che il sottoprogramma deve modificare a seconda della logica applicativa
ðvoid nuovaPartita(string nome, int& vittorieComputer, int& vittorieGiocatore);
m
Attenzione
ðun dato può ricadere anche in entrambe le tipologie (da conoscere e da modificare)
Sottoprogrammi: Sintassi e Semantica >> Linee Guida per i Parametri
42
Errori Frequenti
m
Errori frequenti nell’utilizzo dei parametri
ðspecificare un numero troppo alto diparametri per un sottoprogramma >>
utilizzo di parametri inutili
ðomettere la & per parametri che devono essere per riferimento >>
parametro standard al posto di parametro per riferimento
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
G. Mecca - Programmazione Procedurale in Linguaggio C++ 43
Errori Frequenti
m
Sulla base di quanto detto
ðè opportuno utilizzare un parametro esclusivamente se è indispensabile ðbisogna evitare parametri inutili
m
Utilizzo di parametri inutili
ðcomplicano la lettura del programma ðaumentano il livello di accoppiamento ðfacilmente introducono errori
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
Esempio di Parametro Inutile
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;
float d;
...
if (discriminante(a1, b1, c1, d) >= 0 ...
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
d dovrebbe essere una variabile locale
G. Mecca - Programmazione Procedurale in Linguaggio C++ 45
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 di Parametro Inutile
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
giocataComputer dovrebbe essere
una variabile locale
46
Errori Frequenti
m
Omettere la &
ðATTENZIONE: grave errore frequente ðperché omettere la & è un errore ? ðperché il parametro viene considerato
standard (per valore)
ðle modifiche vengono fatte direttamente sullo spazio di memoria del parametro
ðal termine la memoria viene rilasciata e si perde traccia delle modifiche
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
G. Mecca - Programmazione Procedurale in Linguaggio C++ 47
Errori Frequenti
le1. void leggiEquazione
(float a, float &b, float &c) {
le2. cout << “Coefficienti ? ";
le3. cin >> a;
le4. cin >> b;
le5. cin >> c;
le6. return;
le7. }
m1. void main() {
m2. float a1, b1, c1;
m3. float a2, b2, c2;
m4. float x1, y1, x2, y2;
m5. leggiEquazione(a1, b1, c1);
m6. leggiEquazione(a2, b2, c2);
m7. if (...)
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
xxx
#112
xxx
#111
xxx
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
xxx c2
#105
xxx b2
#104
xxx a2
#103
xxx c1
#102
xxx b1
#101
-34256 a1
#100
a b c
-34256
#101
#102
Coefficienti ? 2 5 2 2
5 2
Errori Frequenti
m
Viceversa
ðutilizzare una & dove non serve è meno grave (non altera il funzionamento)
ðtutti i parametri potrebbero essere per riferimento (es: FORTRAN)
m
Si tratta però di un errore logico
ðrende meno chiaro e leggibile il codice ðconsente di introdurre modifiche nondesiderate al valore del parametro
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
G. Mecca - Programmazione Procedurale in Linguaggio C++ 49
Errori Frequenti
d1. float discriminante
(float &a, float &b, float &c) {
d2. float d;
d3. d = b * b – 4 * a * c;
d4. return d;
d5. }
m1. void main() { ... ...
m7. if (discriminante(a1,b1,c1)>=0
&& discriminante(a2,b2,c2)>=0){
m8. x1=primaRadice(a1,b1,c1);
m9. y1=secondaRadice(a1,b1,c1);
...
Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti
xxx
#113
xxx
#112
xxx
#111
xxx
#110
xxx y2
#109
xxx x2
#108
xxx y1
#107
xxx x1
#106
1 c2
#105
2 b2
#104
1 a2
#103
2 c1
#102
5 b1
#101
2 a1
#100
a b c
#100
#101
#102
d 9
// a = 5;
e se per errore li sottoprogramma contenesse una istruzione di modifica ?
50
Riassumendo
m Passaggio dei parametri
ðsemantica operazionale delle chiamate ðparametri standard
ðparametri per riferimento
m Rapporto tra Funzioni e Procedure
m Casi Particolari
m Linee Guida per la Scelta dei Parametri
m Errori Frequenti
ðATTENZIONE
Sottoprogrammi: Sintassi e Semantica >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 51
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.