Programmazione Procedurale in Linguaggio C++

Documenti analoghi
Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Informatica Applicata

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

cout << "Inserisci un numero:" << endl; cin >> n; ris = n*2; cout << "Il doppio di " << n << " e " << ris << endl;

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Laboratorio di Algoritmi e Strutture Dati

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercitazione 3. Espressioni booleane I comandi if-else e while

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Introduzione ai Calcolatori Elettronici

Il problema dello zaino

Programmazione Procedurale in Linguaggio C++

L ELABORATORE ELETTRONICO!

Dall analisi alla codifica (1)

PROGRAMMAZIONE: Le strutture di controllo

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Il primo programma C++

Strutture come parametri di funzioni

Programmazione Orientata agli Oggetti in Linguaggio Java

ITI M. FARADAY. Programmazione a. s

Elaboratore Elettronico

Assegnazione di una variabile

Unità A1 Funzioni MODULO Java 2

Università degli Studi di Verona. Algoritmie Diagrammidiflusso. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

L ELABORATORE ELETTRONICO

Programmazione Orientata agli Oggetti in Linguaggio Java

PROGRAMMAZIONE: La selezione

20/10/2014 M. Nappi/FIL 1

Come scrivere bene codice? (1 di 1)

Implementazione dell albero binario in linguaggio C++

Esercizi di Algoritmi e Strutture Dati

Tecnologie di Sviluppo per il Web

Transcript:

Programmazione Procedurale in Linguaggio C++ Sottoprogrammi Parte 5 Metodologia di Sviluppo - a versione 2.3 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca Università della Basilicata mecca@unibas.it Sottoprogrammi: Metodologia di Sviluppo >> Sommario Sommario Metodologia per Raffinamenti Esempio: Indovina il Numero Esempio: 2

Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Passi per la scrittura di programmi effettuare l analisi delle specifiche scegliere l algoritmo scrivere il codice sorgente compilare e correggere gli errori sintattici verificare e correggere gli errori logici I passi cruciali algoritmo, codice sorgente e verifica 3 Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Tecnica per raffinamenti successivi individuare (preliminarmente) una strategia di dichiarazioni per la rappresentazione dei dati partire dalla specifica del problema complessivo e sviluppare il main() individuare una prima divisione sommaria del problema in passi (sottoproblemi) supporre di disporre di un sottoprogramma per ciascun passo 4

Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Tecnica per raffinamenti successivi (cont.) definire il prototipo del sottoprogramma (modalità di comunicazione con l esterno) a questo punto è possibile scrivere una prima versione del codice del main() usando sottoprogrammi che non esistono aggiungendo scheletri vuoti dei sottoprogrammi mancanti è già possibile compilare ed eseguire il codice per verificare 5 Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Tecnica per raffinamenti successivi (cont.) per completare la soluzione, è necessario scrivere il corpo dei sottoprog. mancanti in alcuni casi il sottoprogramma è sufficientemente semplice da procedere per scrittura diretta del codice in altri casi il sottoprogramma viene visto come un sottoproblema da affrontare e si riapplica il metodo 6

Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Tecnica per raffinamenti successivi (cont.) quando devo sviluppare il sottoprogramma p() divido il suo svolgimento in sottopassi individuo un sottoprogramma p1()... pn() per ciascun passo e ne definisco i prototipi scrivo il corpo di p() supponendo di usare i nuovi sottoprogrammi compilo e verifico rapidamente il codice ripeto ulteriormente il procedimento 7 Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Approccio dall alto ( top-down ) l approccio procede da problemi più generali a problemi via via più specifici Utilizzo di tecniche note dal basso attenzione però ad individuare tutte le volte che è possibile procedere per scrittura diretta tipico caso: tecniche algoritmiche notevoli bisogna riconoscere l applicabilità della tecnica e programmarla senza risvilupparla 8

Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Problema generale main() Sottoproblema n. 1 p1() Sottoproblema n. 2 p2() Sottoproblema n. 3 p3() Sottoproblema n. 1.1 p11() Sottoproblema n. 3.1 Sottoproblema n. 1.2 p12()... Scrittura diretta del codice Tecnica algoritmica nota 9 Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Caratteristica dell approccio la tecnica suggerita è centrata sulla scrittura del codice il procedimento viene applicato lavorando direttamente sul codice sorgente si alternano fasi di riflessione sulla strategia a fasi di scrittura del codice a fasi di verifica incrementale del codice scritto (codice e test) 10

Sottoprogrammi: Metodologia di Sviluppo >> Metodologia Metodologia per Raffinamenti Riscontri frequenti e incrementali compilare frequentemente il codice scritto per intercettare precocemente gli errori sintattici eseguire il codice non appena si raggiungono punti stabili (es: lettura e stampa oppure soluzioni intermedie) per intercettare precocemente eventuali errori logici 11 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero Specifica il calcolatore acquisisce il nome del giocatore il calcolatore sceglie un numero a caso compreso tra 1 e 100 il giocatore deve indovinare il numero facendo dei tentativi; ad ogni tentativo, se il numero è corretto, il giocatore vince; altrimenti il calcolatore risponde con un suggerimento che può essere Prova con un numero più alto oppure Prova con un numero più basso il calcolatore tiene traccia del numero di tentativi effettuati dal giocatore in qualsiasi momento il giocatore deve poter interrompere la partita e visualizzare il numero da indovinare 12

Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero Analisi delle specifiche dati di ingresso: nome del giocatore e sequenza dei tentativi dati di uscita: messaggi del computer e numero di tentativi effettuati Domanda: come interrompere la partita? prima soluzione: un menu apposito presentato ogni volta (poco usabile) seconda soluzione: valore 0 per il tentativo Algoritmo e codice (>>> scrittura del prog.) 13 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero Riassumiamo il metodo I iterazione: Programma principale passo n.1: inizia il gioco e acquisisci il nome passo n.2: gioca le partite Per ognuno dei passi (sottoproblemi) un sottoprogramma in alcuni casi è necessario ripetere il procedimento 14

Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero #include <iostream.h> void schermolegginome(string &nome); void gioca(string nome); void main() { string nome; schermolegginome(nome); // per il passo 1 gioca(nome); // per il passo 2 15 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero schermolegginome scrittura diretta gioca applico di nuovo il metodo II iterazione: gioca passo 2.1: genera il numero passo 2.2: gestisci tentativi 16

Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero int generanumero(); void gestiscitentativi(string nome, int numero); void gioca(string nome) { int numero; numero = generanumero(); gestiscitentativi(nome, numero); 17 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero generanumero scrittura diretta III iterazione: gestiscitentativi finchè l utente vuole andare avanti passo 2.2.1: acquisisci il tentativo se il tentativo è uguale a 0 interrompi il gioco passo 2.2.2: visualizza lo schermo di partita interrotta altrimenti se il tentativo è uguale al numero passo 2.2.3: visualizza lo schermo di vittoria altrimenti passo 2.2.4: analizza il tentativo e stampa l esito 18

Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero //...prototipi omessi per ragioni di spazio void gestiscitentativi(string nome, int numero) { int giocata; int tentativi = 0; bool continua = true; while (continua) { giocata = schermotentativo(nome, tentativi); if (giocata == 0) { continua = false; schermointerruzione(nome, numero, tentativi); else { tentativi++; if (giocata == numero) { continua = false; schermoindovinato(nome, tentativi); else { schermoesitogiocata(nome, numero, giocata); return; 19 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero schermotentativo scritura diretta schermointerruzione scrittura diretta schermoindovinato scrittura diretta schermoesitogiocata scrittura diretta 20

Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero Tenere traccia dei tentativi effettuati un classico problema di conteggio risolvibile con una tecnica algoritmica notevole: utilizzo di una variabile contatore riapplico la tecnica standard senza riprogettarla ma semplicemente limitandomi ad adattarla al contesto applicativo specifico (tentativi) 21 Sottoprogrammi: Metodologia di Sviluppo >> Indovina il Numero Indovina il Numero In sintesi quindi il metodo guida il programmatore dall inizio alla fine della scrittura del codice applicato sistematicamente consente di produrre abbastanza facilmente la soluzione consente di ottenere riscontri rapidi su errori sintattici ed errori logici e facilita la correzione 22

Specifica siano dati due rettangoli nel piano cartesiano si supponga che i due rettangoli abbiano i lati paralleli agli assi cartesiani analizzare i rettangoli e stampare il quadrante in cui sono contenuti verificare se i due rettangoli hanno una sovrapposizione (una parte di piano che cade in entrambi i rettangoli) se sì, stampare l area della superficie comune 23 Esempi rettangoli nel I quadrante in questo caso c è una superficie comune di area pari a 12 cm 2 I rettangolo a cavallo tra più quadranti II rettangolo nel I quadrante in questo caso non c è superficie comune 24

Analisi della specifica è fondamentale l ipotesi semplificativa per cui i lati sono paralleli agli assi il problema principale è che i rettangoli possono essere in uno qualsiasi dei quadranti e le posizioni reciproche possono essere varie (disgiunti, parz. sovrapp., tot. sovrapp.) la casistica è abbastanza ampia 25 Analisi della specifica (continua) ambiguità: nell analisi del quadrante bisogna stabilire come considerare gli assi soluzione: stabiliamo di considerare gli assi come parte dei quadranti positivi nel caso in cui il rettangolo non sia in un unico quadrante stamperemo un messaggio generico Rettangolo tra più quadranti 26

Strategia per la rappresentazione dei dati ci sono vari modi per rappresentare un rettangolo in questo caso utilizzeremo le coordinate di due dei vertici ogni rettangolo sarà rappresentato con 4 variabili reali 2 coordinate del vertice in basso a sinistra 2 coordinate del vertice in alto a destra 27 Esempi rettangolo 1: (1, 2) (7, 6) rettangolo 2: (3, 1) (8, 5) rettangolo 1: (-2, 3.5) (3, 5.5) rettangolo 2: (2, 1) (6.2, 3) 28

>>> scrittura del programma Per la scrittura del codice utilizzeremo il metodo individuazione di un modulo da scrivere (main o sottoprogramma) divisione in sottoproblemi (fase di progetto) scelta di un sottoprogramma per ciascun sottoproblema scrittura del modulo supponendo di avere a disposizione i sottoprogrammi compilazione e verifica parziale ripetizione dei passi precedenti per ulteriori moduli 29 Programma Principale: I Raffinamento passo 1: leggi i dati dei rettangoli passo 2: stampa i dati dei rettangoli passo 3: analizza i quadranti passo 4: trova la superficie comune passo 5: stampa il risultato 30

void leggidatirettangolo(float &x1,float &y1,float &x2,float &y2); void stampadatirettangolo(float x1, float y1, float x2, float y2); void stampaquadrante(float x1, float y1, float x2, float y2); float areasovrapposizione(float x1,float y1,float x2,float y2, float x3,float y3,float x4,float y4); void stamparisultato(float superficie); NOTA: tutte le procedure sono schermi (il nome è abbreviato) void main() { float x1, y1, x2, y2, x3, y3, x4, y4; float superficie; leggidatirettangolo(x1, y1, x2, y2); leggidatirettangolo(x3, y3, x4, y4); stampadatirettangolo(x1, y1, x2, y2); stampaquadrante(x1, y1, x2, y2); stampadatirettangolo(x3, y3, x4, y4); stampaquadrante(x3, y3, x4, y4); superficie = areasovrapposizione(x1,y1,x2,y2,x3,y3,x4,y4); stamparisultato(superficie); 31 II Raffinamento passo 1: procedura leggirettangolo > scrittura diretta del codice passo 2: procedura stamparettangolo > scrittura diretta del codice passo 3: procedura stampaquadrante > applico iterativamente il procedimento passo 4: funzione areasovrapposizione > applico iterativamente il procedimento passo 5: stampa il risultato > scrittura diretta del codice 32

Come al solito in generale scrivo prima il codice del modulo chiamante e poi quello dei moduli chiamati stabilisco un accordo relativo alla chiamata prima ancora di avere deciso i dettagli del codice accordo: nome del modulo, numero e tipo dei parametri, eventuale tipo del risultato 33 Passo 3: stampaquadrante passo 3.1: trova il quadrante del vertice in basso a sinistra passo 3.2: trova il quadrante del vertice in alto a destra se sono nello stesso quadrante stampa il quadrante altrimenti stampa Rettangolo tra quadranti diversi 34

int quadrante(float x, float y); void stampaquadrante(float x1, float y1, float x2, float y2){ int q1, q2; q1 = quadrante(x1, y1); q2 = quadrante(x2, y2); cout << "----------------------------------------\n"; if (q1 == q2) { cout << "Rettangolo nel quadrante n. " << q1 << "\n"; else { cout << "Rettangolo a cavallo tra quadranti diversi \n"; cout << "----------------------------------------\n"; return; 35 Passo 3.1: quadrante il passo 3.1 e il passo 3.2 richiedono la stessa funzione dato un punto, deve restituire un numero intero corrispondente al quadrante è possibile scrivere direttamente il codice analizzando il valore dell ascissa e dell ordinata 36

int quadrante(float x, float y) { int q; if (x >= 0 && y >= 0) { q = 1; else if (x < 0 && y >= 0) { q = 2; else if (x < 0 && y < 0) { q = 3; else { q = 4; return q; 37 Passo 4: areasovrapposizione si tratta di calcolare effettivamente l area della sovrapposizione In effetti la sovrapposizione, se c è, è un rettangolo posso pensare di calcolarne separatamente la base e l altezza e poi calcolarne l area 38

Di conseguenza dovrei calcolare l eventuale sovrapposizione tra le due basi l eventuale sovrapposizione tra le due altezze 39 Passo 4: areasovrapposizione passo 4.1: trova la lunghezza dell eventuale sovrapposizione tra le basi passo 4.2: trova la lunghezza dell eventuale sovrapposizione tra le altezze se entrambe le lunghezze sono positive calcola il prodotto restituisci il prodotto calcolato altrimenti restituisci 0 40

In realtà il passo 4.1 e il passo 4.2 corrispondono a ripetere due volte la stessa operazione trovare la sovrapposizione tra due segmenti è un problema unidimensionale: dati due generici segmenti su un asse, trovare la lunghezza dell event. segmento comune la prima volta i segmenti sono le basi la seconda volta i segmenti sono le altezze 41 Quindi utilizzerò un unica funzione lunghezzasegmentocomune che lavora su due segmenti ogni segmento è rappresentato dalle coordinate dei due estremi su un asse -2 0 2 4 6 8 I caso: segmento 1: (-1, 3) segmento 2: (6, 8) II caso: segmento 1: (-1, 5) segmento 2: (3, 8) 42

float lunghezzasegmentocomune (float z1, float z2, float z3, float z4); float areasovrapposizione(float x1,float y1,float x2,float y2, float x3,float y3,float x4,float y4) { float sovrapposizionebasi; float sovrapposizionealtezze; float area = 0; sovrapposizionebasi = lunghezzasegmentocomune(x1,x2,x3,x4); sovrapposizionealtezze =lunghezzasegmentocomune(y1,y2,y3,y4); if (sovrapposizionebasi > 0 && sovrapposizionealtezze > 0) { area = sovrapposizionebasi * sovrapposizionealtezze; return area; 43 III Raffinamento è necessario scrivere la funzione lunghezzasegmentocomune Soluzione n.1 analisi caso per caso estremamente difficile da scrivere (casistica molto ampia) 44

Soluzione n.2 analizzando il problema, è possibile trovare una formula compatta che risolve il problema dati due segmenti di estremi z1-z2 e z3-z4 calcoliamo le lungh.: L1= z2-z1, L2= z4-z3 calcoliamo la coordinata di valore più basso INF = min(z1, z3) calcoliamo la coordinata di valore più alto SUP = max(z2, z4) 45 Soluzione n.2 (continua) calcoliamo L = (L1 + L2) - SUP - INF se L>0, i due segmenti hanno una porzione comune di lunghezza L Intuizione I caso: L1=5, L2=2, INF=1, SUP=8 L=5+2-8-1 =0 II caso: L1=4, L2=2, INF=-1, SUP=8 L=4+2-8+1 =-3 II caso: L1=6, L2=5, INF=-1, SUP=8 L=6+5-8+1 =2-2 0 2 4 6 8 46

Vantaggio della formula funziona in tutti i possibili casi (coordinate positive o negative, segmenti disgiunti, parzialmente o totalmente sovrapposti, ecc.) il codice è estremamente compatto soluzione elegante ma si tratta di un algoritmo per nulla scontato richiede capacità di analisi e conoscenza della geometria 47 A questo punto il problema è praticamente risolto è necessario utilizzare una funzione per il calcolo del minimo > scrittura diretta è necessario utilizzare una funzione per il calcolo del massimo > scrittura diretta la funzione lunghezzasegmentocomune può essere scritta come segue 48

float minimo(float a, float b); float massimo(float a, float b); float lunghezzasegmentocomune (float z1, float z2, float z3, float z4){ float lunghezza1, lunghezza2; float estremoinferiore, estremosuperiore; float lunghezza; lunghezza1 = fabs(z2-z1); lunghezza2 = fabs(z4-z3); estremoinferiore = minimo(z1, z3); estremosuperiore = massimo(z2, z4); lunghezza = lunghezza1 + lunghezza2 - fabs(estremosuperiore - estremoinferiore); return lunghezza; 49 Una volta completata la scrittura è necessario verificare la correttezza Verifica è necessario costruire un insieme di dati di test per effettuare le verifiche devono rappresentare tutti o pressoché tutti i casi significativi ogni volta che il programma viene modificato, è necessario ripetere tutte le verifiche 50

Una porzione dei dati di test >> rettangoli1.cpp rettangolo 1: (1, 2) (7, 6) rettangolo 1: (-2, 3.5) (3, 5.5) rettangolo 2: (3, 1) (8, 5) rettangolo 2: (2, 1) (6.2, 3) sovrapposizione: 12 cm 2 sovrapposizione: 0 51 Sottoprogrammi: Metodologia di Sviluppo >> Sommario Riassumendo Metodologia suggerita per raffinamenti successivi approccio iterativo e centrato sulla scrittura del codice 52

Termini della Licenza Termini della Licenza 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. 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. 53