G. Mecca – Università della Basilicata – mecca@unibas.it
Programmazione Procedurale in Linguaggio C++
Sottoprogrammi Parte 1 Introduzione
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
2
Sommario
m
Panoramica
m
Progetti di Riferimento
m
Radici delle Equazioni di II Grado
m
Introduzione ai Sottoprogrammi
ðIntuizione sulla Semanticam
La Morra Cinese
m
Programmazione Modulare
Sottoprogrammi: Introduzione >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Panoramica
m
Istruzioni viste finora
m
Istruzioni di base
ðdichiarazioni (costanti e variabili, tipi) ðassegnazioni (espressioni)
ðlettura e stampa (console e file)
m
Strutture di controllo
ðistruzioni condizionali (if-then-else, if-then) ðistruzioni iterative o cicli (while, for)
Panoramica
m
In effetti
ðcon queste istruzioni è possibile risolvere problemi arbitrariamente complessi
m
Però
ðla programmazione è macchinosa e complessa
ðè difficile manutenere il codice
m
Nel seguito del corso
ðtecniche per migliorare la qualità dei progr.
Sottoprogrammi: Introduzione >> Panoramica
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Panoramica
m
In questa parte del corso
ðcome dividere un programma in più “moduli”, detti sottoprogrammi
ðtecnica fondamentale della programmazione per gestire la complessità dei programmi ðalla base delle metodologie di
programmazione (cioè del metodo per
affrontare la soluzione di problemi complessi) ðe di altri tipi di programmazione (es: POO)
Sottoprogrammi: Introduzione >> Panoramica
6
Progetti di Riferimento
m
Radici delle equazioni di II grado
ðun problema relativamente semplice(utilizzato a scopo didattico)
ðrisolvibile anche senza sottoprogrammi
m
La Morra Cinese
ðproblema decisamente più complesso ðdi fatto non risolvibile senza utilizzare i
sottoprogrammi
Sottoprogrammi: Introduzione >> Progetti di Riferimento
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Radici di Equazioni di II Grado
m
Specifica
ðdate due equazioni di secondo grado della forma ax2 + bx + c = 0
ðcalcolare le eventuali radici reali
ðverificare se le due equazioni hanno radici reali comuni
m
Si tratta di un problema semplice
ðrisolvibile anche senza sottoprogrammiequazioni0.cpp >>
Radici di Equazioni di II Grado
m
Difetti della soluzione
ðil codice è spesso ripetutoðse dovessi passare da 2 a 3 equazioni, sarebbe necessario triplicare il codice
m
Problema
ðquesto rende il programma difficile da verificare e manutenere
ðse ci sono errori, devono essere corretti in punti diversi del programma (es: radici)
Sottoprogrammi: Introduzione >> Radici di Equazioni di II Grado
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Radici di Equazioni di II Grado
m
Idealmente
ðvorrei scrivere una volta sola il codice per le varie operazioni da ripetere
ðe poterlo eseguire di volta in volta su
argomenti diversi (ovvero equazioni diverse)
m
Esempio n. 1
ðcalcolo del discriminante
ðvorrei calcolarlo come se ci fosse una funzione predef. apposita (“discriminante”)
Sottoprogrammi: Introduzione >> Radici di Equazioni di II Grado
10
Radici di Equazioni di II Grado
m
Esempio n. 2
ðlettura dei coefficienti di un’equazione
ðesiste un’istruzione per leggere dalla tastiera numeri e lettere (cin >> ) ed una per leggere dalla tastiera stringhe (getline)
ðvorrei poter effettuare la lettura dei
coefficienti come se esistesse un’istruzione predefinita apposita (“leggiEquazione”)
m
A questo servono i sottoprogrammi
Sottoprogrammi: Introduzione >> Radici di Equazioni di II Grado
equazioni1.cpp >>
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Introduzione ai Sottoprogrammi
m
Esistono due categorie di sottoprogrammi
m
Funzioni
ðservono a definire nuove funzioni per effettuare calcoli non previsti dalle funzioni predefinite
m
Procedure
ðservono a definire nuove istruzioni per eseguire operazioni non previste dalle istruzioni predefinite
Introduzione ai Sottoprogrammi
m
Struttura di un’applicazione
ðfatta di vari “moduli”m
Modulo
ðun sottoprogramma (funzione o procedura) ðoppure il programma principale (un
particolare sottoprogramma da cui comincia l’esecuzione dell’applicazione)
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Introduzione ai Sottoprogrammi
m
Per usare i sottoprogrammi
ðbisogna per cominciare “definirli”ðe poi utilizzarli
m
Definizione di un sottoprogramma
ðdescrive il comportamento delsottoprogramma
m
Utilizzo di un sottoprogramma
ð“chiamata” del sottoprogramma in un altro modulo dell’applicazione
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
14
Introduzione ai Sottoprogrammi
m
Idea fondamentale
ðun sottoprogramma è un blocco di istruzioni ðprevede una serie di “parametri” su cui
eseguire le operazioni specificate (i parametri rappresentano “dati generici” del
sottoprogramma)
ðai parametri possono essere associati in ogni esecuzione “argomenti” diversi (ovvero “dati specifici” su cui effettuare concretamente le operazioni)
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Introduzione ai Sottoprogrammi
m
Dati nel programma principale
ðfinora i dati erano esclusivamente costanti e variabili
m
Dati nei sottoprogrammi
ðcostantiðvariabili
ðparametri: dati speciali che hanno un legame con argomenti esterni
Def. della Funzione “discriminante”
float discriminante (float a, float b, float c) {
float d;
d = b*b-4*a*c;
return d;
}
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
nome della funzione
tipo del risultato parametri
il sottoprogramma lavora su 4 dati:
- una variabile di tipo float d - tre dati di tipo float chiamati a,b,c istruzione di ritorno
La definizione è fatta di:
-un’intestazione -un corpo
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Uso della Funzione “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 &&
discriminante(a2, b2, c2) >= 0) { ...
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
prima chiamata seconda chiamata
argomenti della I chiamata argomenti della II chiamata
18
void leggiEquazione (float &a, float &b, float &c) {
cout << "Inserisci i coefficienti dell'equazione \n";
cin >> a;
cin >> b;
cin >> c;
return;
}
Def. della Procedura “leggiEquazione”
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
nome della procedura
non c’è risultato parametri per modifiche
il sottoprogramma lavora su tre dati di tipo float chiamati a,b,c attraverso cui è possibile modificare i corrispondenti argomenti
istruzione di ritorno
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Uso della Procedura “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);
...
prima chiamata seconda chiamata
argomenti della I chiamata argomenti della II chiamata
Introduzione ai Sottoprogrammi
m
Attenzione
ðoltre ai parametri, ogni sottoprogramma ha i suoi dati “locali”
ðcostanti locali ðvariabili locali
m
Dati Locali di un Modulo
ðdati dichiarati all’interno del modulo
ði dati sono “privati” e non utilizzabili dagli altri moduli del programma
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Intuizione sulla Semantica
m
Intuizione sulla semantica
ðquando viene incontrata una “chiamata” del sottoprogramma, si interrompe l’esecuzione del programma
ðavviene il “passaggio dei parametri” (>) ðsi avvia l’esecuzione del sottoprogramma ðal termine dell’esecuzione del
sottoprogramma riprende l’esecuzione del programma
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
22
Intuizione sulla Semantica
m
Passaggio dei parametri: intuizione
ðprima di iniziare l’esecuzione delsottoprogramma, viene creata una
“identificazione” tra parametri e argomenti ðl’esecuzione del sottoprogramma avviene
sulla base dell’identificazione creata (operazioni fatte coi parametri diventano operazioni fatte con i corrispond. argomenti) ðl’identificazione termina al termine
dell’esecuzione del sottoprogramma
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Esempio: leggiEquazione
le1. void leggiEquazione (float &a, float &b, float &c) { le2. cout << "Inserisci i coefficienti dell'equazione \n";
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 ( discriminante(a1, b1, c1) >= 0 && ... { m8. ...
Esempio: discriminante
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() {
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 && ... { m8. ...
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Intuizione sulla Semantica
m
Una visione astratta della chiamata
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
main
2 5 2
a1 b1 c1
discriminante
a b c d discriminante(a1, b1, c1)
2 5 2 9
modulo chiamante contiene la chiamata
del sottoprogramma (richiesta di elaborazione)
modulo chiamato contiene il codice
da eseguire (servizio di elaborazione)
26
Intuizione sulla Semantica
m
Questo processo ha delle sottigliezze
ðche approfondiremo nel seguitoðes: come modificare il valore di un argomento nel sottoprogramma ?
m
Parametro per riferimento
ðparametro attraverso il quale è possibile modificare il valore dell’argomento
ðin questi casi, prima del parametro, è necessario specificare la &
Sottoprogrammi: Introduzione >> Introduzione ai Sottoprogrammi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Intuizione sulla Semantica
m
Vantaggi dei sottoprogrammi
ðil codice viene scritto una sola volta ðe utilizzato tutte le volte che serveðsemplificano la lettura e la manutenzione del programma
m
Ma c’è anche un vantaggio metodologico
ðsuggeriscono un metodo per affrontare lascrittura di programmi complessi
La Morra Cinese
m Specifica
ð e’ necessario scrivere un programma per consentire ad un giocatore di giocare partite di Morra Cinese contro il computer ð ogni partita è fatta di varie mani. Vince la partita chi vince per
primo 3 mani
ð in ciascuna mano i due giocatori giocano scegliendo un oggetto tra “carta”, “forbici”, “sasso”; la “carta” batte il “sasso”; le “forbici”
battono la “carta”; il “sasso” batte le “forbici”; se i due giocatori giocano lo stesso oggetto si verifica un pareggio
ð durante una partita, il programma visualizza il punteggio ð il giocatore deve poter interrompere la partita in qualsiasi
momento
ð il programma deve tenere traccia delle partite vinte dal computer e di quelle vinte dal giocatore e visualizzare la situazione su richiesta
Sottoprogrammi: Introduzione >> La Morra Cinese
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
La Morra Cinese
m
Soluzione
ðè il primo programma che interagisce con l’utente proponendo varie opzioni e
attendendo che vengano fatte scelte (es:
operazione da effettuare, oggetto da giocare) ðnel caso di programmi con interfaccia basata
sulla console (non grafica) si usa una tecnica standard: il menu con comandi numerici
Sottoprogrammi: Introduzione >> La Morra Cinese
morraCinese1.cpp
30
La Morra Cinese
m
Il programma è abbastanza complesso
ðpiù di 200 righe di codiceð15 sottoprogrammi (10 procedure e 5 funzioni)
m
NOTA
ði sottoprogrammi sono usati per lo più una sola volta
ðma sono stati fondamentali per lo sviluppo del codice (sviluppo “guidato” dai sottoprog.)
Sottoprogrammi: Introduzione >> La Morra Cinese
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
La Morra Cinese
m
Tecnicamente però
ðil problema è risolvibile anche senza utilizzare sottoprogrammi
ðun unico programma di circa 160 istruzioni ðstrutture di controllo estremamente nidificate
(7 livelli di nidificazione)
m
In pratica
ðdifficilissimo da scrivere ðimpossibile da manutenere
morraCinese0.cpp
La Morra Cinese
m
Infatti
ði programmi richiedono continue modifiche ðle specifiche cambiano continuamente
m
Esempio: la morra cinese
ðl’interazione con l’utente nella prima versione è macchinosa (troppe scelte inutili)
ðinoltre sarebbe utile una forma di
visualizzazione grafica degli oggetti giocati
Sottoprogrammi: Introduzione >> La Morra Cinese
morraCinese4.cpp
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
La Morra Cinese
m
In sintesi quindi
ði sottoprogrammi sono un elemento fondamentale della programmazione
ðda questo momento in poi programmeremo solo con i sottoprogrammi (anche per
problemi semplici)
m
In particolare
ðapprofondiremo le tecniche della
“programmazione modulare”
Sottoprogrammi: Introduzione >> La Morra Cinese
34
Programmazione Modulare
m
Idea
ðun programma è fatto di moduli che si
“chiamano” a vicenda
ðil programma principale è uno dei moduli (un particolare sottoprogramma da cui comincia l’esecuzione)
m
La metodologia associata
ðbasata sull’uso di sottoprogrammi
ðscomposizione del problema in sottoproblemi
Sottoprogrammi: Introduzione >> Programmazione Modulare
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Programmazione Modulare
m
Metodo per scegliere l’algoritmo
ðl’algoritmo viene concepito per “raffinamenti successivi”
ðsi parte dividendo il problema complessivo in sottoproblemi più semplici e immediatamente identificabili
ðpoi si applica lo stesso metodo
successivamente a ciascun sottoproblema
Esempio: La Morra Cinese
m
Programma principale
ðpasso n.1: inizia il gioco e acquisisci il nome ðpasso n.2: gioca le partite
ðpasso n.3: fine gioco e stampa il saluto
m
Per ognuno dei passi (sottoproblemi)
ðun sottoprogrammaðin alcuni casi è necessario ripetere il procedimento
Sottoprogrammi: Introduzione >> Programmazione Modulare
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Esempio: La Morra Cinese
void main() { string nome;
inizioGioco(nome); // per il passo 1 gioca(nome); // per il passo 2 schermoFinale(nome); // per il passo 3 }
Sottoprogrammi: Introduzione >> Programmazione Modulare
38
Esempio: La Morra Cinese
m
Passo n.2: procedura “gioca”
ðfinchè l’utente vuole andare avanti
ðpasso n.2.1: visualizza il menu e leggi scelta ðse l’utente sceglie una nuova partita
– passo 2.2: nuova partita
ðaltrimenti se l’utente vuole i punteggi – passo 2.3: visualizza i punteggi ðaltrimenti se l’utente vuole uscire
– interrompi il ciclo
Sottoprogrammi: Introduzione >> Programmazione Modulare
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Esempio: La Morra Cinese
void gioca(string nome) {
int vittorieComputer=0, vittorieGiocatore=0;
int scelta;
bool continua=true;
while (continua) {
schermoMenuELeggiScelta(scelta);
if (scelta == 1) {
nuovaPartita(nome, vittorieComputer,vittorieGiocatore);
} else if (scelta == 2) {
schermoVittorie(nome, vittorieComputer,vittorieGiocatore);
} else if (scelta == 3) { continua = false;
} } return;
}
Programmazione Modulare
m
Cosa bisogna sapere sui sottoprogrammi
ðcome si definiscono (come si creano):sintassi e semantica della definizione di sottoprogrammi
ðcome si utilizzano: sintassi e semantica delle chiamate
m
In particolare
ðla parte delicata è il meccanismo attraverso cui i sottoprogrammi “comunicano” tra di loro
Sottoprogrammi: Introduzione >> Programmazione Modulare
G. Mecca - Programmazione Procedurale in Linguaggio C++ 41
Riassumendo
m Sottoprogrammi
ðelemento fondamentale della programmazione
m Funzioni
ðblocchi di istruzioni per il calcolo di un valore
m Procedure
ðblocchi di istruzioni per realizzare operazioni varie
m Meccanismo Fondamentale
ð“passaggio dei parametri”
m Programmazione Modulare
Sottoprogrammi: Introduzione >> Sommario
42
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.