• Non ci sono risultati.

Programmazione Procedurale in Linguaggio C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Procedurale in Linguaggio C++"

Copied!
26
0
0

Testo completo

(1)

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

(2)

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 parametri

m

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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 uno

spazio della memoria di valore modificabile ðuna variabile oppure un parametro del

modulo chiamante

Sottoprogrammi: Sintassi e Semantica >> Casi Particolari

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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 bisogno

di 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

(19)

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

(20)

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

(21)

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 di

parametri 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

(22)

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

(23)

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

(24)

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 non

desiderate al valore del parametro

Sottoprogrammi: Sintassi e Semantica >> Errori Frequenti

(25)

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

(26)

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.

Riferimenti

Documenti correlati

Concetti Introduttivi: Linguaggi &gt;&gt; Ciclo di Vita di un Programma.. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Controllo: Conclusioni &gt;&gt; Convenzioni di Stile.. Mecca - Programmazione Procedurale in Linguaggio C++ 11. Convenzioni

il sottoprogramma lavora su tre dati di tipo float chiamati a,b,c attraverso cui è possibile modificare i corrispondenti argomenti. istruzione

ðil numero e il tipo degli argomenti (1 argomento di tipo double) &gt;&gt; parametri ðil tipo del risultato restituito (double). m Intestazione di

ðDefinizione di Funzioni ðDefinizione di Procedure ðChiamata di Funzioni ðChiamata di Procedure ðPassaggio dei Parametri ðProgrammazione Modulare. Termini

Strutture di Dati: Lista &gt;&gt; Rappresentazione con Record e Array. ATTENZIONE ai

Strutture di Dati: Lista &gt;&gt; Inserimenti e Cancellazioni. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Dati: Lista &gt;&gt; Gestione dei File. i conta il numero di valori prelevati dal