sabato 19 giugno 2021

Approccio sistematico ai problemi

Nell'informatica, gli algoritmi si possono progettare utilizzando due approcci; l'approccio top-down e l'approccio bottom-up.
Nell'approccio top-down, il problema complesso viene suddiviso in sotto problemi. Di contro, l'approccio dal basso inizia con l'affrontare la risoluzione di problemi elementari che combinati insieme possono contribuire a risolvere il problema complesso.
Non si deve mai perdere di vista che lo scopo di un algoritmo è quello di gestire dati organizzati in strutture, usandoli per risolvere un problema o una famiglia di problemi. 
In altre parole, un algoritmo viene utilizzato per eseguire operazioni su dati organizzati all'interno di strutture di dati più o meno complesse.
Nell'approccio top-down, un algoritmo complesso viene quindi suddiviso in piccole parti chiamate moduli in un processo noto come modularizzazione
La modularizzazione riduce in modo significativo le complicazioni della progettazione di un algoritmo e rende il processo più semplice da progettare e implementare.
La programmazione modulare è la tecnica di progettazione e scrittura di un programma sotto forma di funzioni distinte l'una dall'altra e indipendenti. 

Definizione di approccio top-down
L'approccio top-down divide fondamentalmente un problema o un algoritmo complesso in più parti più piccole (moduli). Questi moduli sono ulteriormente scomposti fino a quando il modulo risultante è il programma talmente semplice da risolvere che non può essere ulteriormente scomposto.
Il flusso di controllo in questo approccio è sempre verso il basso. L'approccio top-down è implementato in linguaggi di programmazione come il C utilizzando funzioni.

Definizione di approccio bottom up (dal basso verso l'alto)
L'approccio dal basso verso l'alto funziona in modo opposto rispetto al precedente. Inizialmente, include la progettazione delle parti più fondamentali che vengono poi combinate per creare il modulo di livello superiore. Questa integrazione viene ripetuta fino a quando non viene ottenuto l'algoritmo richiesto.

Linguaggi procedurali di programmazione come Fortran, COBOL e C seguono un approccio dall'alto verso il basso. Al contrario, linguaggi di programmazione orientati agli oggetti come C ++, Java, C #, Perl, Python rispettano l'approccio dal basso verso l'alto.



Vediamo un semplice esempio di problema risolto con approccio top-down

Problema:
Giacomo compera 6 quaderni e 4 penne, Giovanni il suo gemello, 3 quaderni uguali a quelli di Giacomo e 4 penne. Spendono rispettivamente, 12,20 euro e 7,70 euro.
Quanto costa una penna?

Soluzione:
L’obiettivo (risultato) finale da raggiungere è il costo di una penna. Porrò a questo punto, in alto su di un foglio, la casella finale. 

A questo punto devo chiedermi come posso ottenere questo dato. Se conoscessi il costo totale delle penne e sapendo che sono 4 quelle acquistate (da uno dei due gemelli), potrei ricercare il costo unitario.
Sotto alla casella obiettivo pongo allora due caselle, una per il costo totale e una per la quantità. L’operatore sarà quello di divisione.
Ho già una casella dato, il numero delle penne, che pertanto non è figlia di nessun altro risultato intermedio. Dovrò solo procedere per la casella del costo totale delle penne. 

Devo a questo punto interrogarmi su come ottenere il costo delle sole penne, visto che sono stati acquistati sia quaderni sia penne. Ora chiunque io scelga (Giovanni o Giacomo) sarà facile determinare il costo delle penne togliendo alla spesa totale la spesa sostenuta per i quaderni. L’operatore sarà il segno di sottrazione.
Anche in questo caso una delle caselle contiene un dato del problema e quindi non avrà altre ramificazioni sottostanti. 

A questo punto devo chiedermi come ottenere la spesa totale sostenuta per i quaderni e così via.
Conclusa la definizione del diagramma si procede alla sua compilazione, facendo i calcoli a ritroso.








Share: