• Non ci sono risultati.

Programmazione Procedurale in Linguaggio C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Procedurale in Linguaggio C++"

Copied!
21
0
0

Testo completo

(1)

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 Semantica

m

La Morra Cinese

m

Programmazione Modulare

Sottoprogrammi: Introduzione >> Sommario

(2)

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

(3)

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

(4)

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 sottoprogrammi

equazioni0.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

(5)

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 >>

(6)

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

(7)

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 del

sottoprogramma

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

(8)

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

(9)

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

(10)

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

(11)

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 del

sottoprogramma, 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

(12)

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

(13)

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

(14)

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 la

scrittura 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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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.

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 numero e il tipo degli argomenti (1 argomento di tipo double) &gt;&gt; parametri ðil tipo del risultato restituito (double). m Intestazione di

Sottoprogrammi: Metodologia di Sviluppo &gt;&gt; Tecniche di Test e

ð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