Dal problema al programma, gli algoritmi

DAL PROBLEMA AL PROGRAMMA
1. I PROBLEMI E LA LORO SOLUZIONE
L'uomo, per affrontare gli innumerevoli problemi postigli dallo sviluppo della civiltà, si è avvalso della scienza e
della tecnica, i cui destini si sono sempre intrecciati. Infatti, la tecnica richiede alla scienza la formulazione di
teorie allo scopo di spiegare fatti e fenomeni, mentre, d'altra parte, la scienza deve utilizzare le
apparecchiature tecniche atte alla realizzazione di esperimenti o alla verifica pratica di fenomeni previsti da
studi teorici.
Gli elaboratori elettronici rappresentano indubbiamente uno dei risultati più importanti raggiunti grazie a
questa collaborazione e oggi, attraverso il loro uso, è possibile risolvere problemi di qualunque natura
(matematica, fisica, biologica, economica, ecc.) purché, dopo averne individuato le caratteristiche salienti, si
possa stabilire un procedimento atto a renderlo comprensibile all'elaboratore.
Si tratta quindi di arrivare alla realizzazione di un programma, espresso da una successione finita di
operazioni elementari, che consenta di risolvere il problema.
Le fasi del procedimento che è necessario seguire per arrivare alla stesura di un programma sono:
l'analisi del problema;
la descrizione dell'algoritmo;
la verifica della correttezza dell'algoritmo;
la codifica dell'algoritmo nel linguaggio di programmazione;
la verifica del programma.
In questo capitolo svilupperemo i primi tre punti, rimandando la trattazione delle fasi ai successivi moduli.
I primi tre punti sono inoltre presenti sempre per qualsiasi problema (non è detto infatti che si debba tradurre
per forza un algoritmo in un programma su elaboratore elettronico).
2. ANALISI DEL PROBLEMA
Per poter effettuare un'analisi completa del problema, da cui dipende in buona parte la riuscita del
programma, è essenziale che il problema venga
formulato in modo preciso, indicando tutti gli elementi necessari per procedere alle scelte operative.
La fase dell'analisi, il cui scopo è individuare i procedimenti risolutivi e
adottare quello ritenuto più adatto, consiste nel definire:
i dati di ingresso o iniziali;
i dati di uscita o risultati;
i legami esistenti tra i dati di ingresso e quelli di uscita;
Questa fase è necessaria qualsiasi problema venga affrontato. Risulta di notevole importanza se i problemi da
risolvere sono poi da elaborare su calcolatori elettronici o tradurre in linguaggi di programmazione.
3. L’ALGORITMO RISOLUTIVO.
L'algoritmo, termine che rappresenta la contrazione e deformazione del nome del matematico arabo Al
Khawarismi, costituisce quindi il prodotto finale dell'analisi del problema. Esso conta svariate definizioni ma
quella che maggiormente si avvicina all'attuale accezione è quella data dal matematico Markov:
"Qualsiasi insieme di regole che definisca un procedimento di calcolo destinato ad ottenere un certo risultato
partendo da determinati dati iniziali".
L'algoritmo deve quindi individuare le istruzioni che consentano di definire le operazioni da eseguire sui dati
iniziali per produrre i dati finali o risultati. È opportuno precisare che l'analisi di un dato problema non conduce
ad un unico algoritmo ma si potrà trovare una soluzione al problema se esiste almeno un algoritmo risolutivo.
Esistono infatti problemi che non trovano soluzione ed è importante notare che il fatto che esistano soluzioni
per uno o più casi particolari non significa necessariamente che il problema è risolubile.
D'altra parte non esistono metodi che consentano di individuare l'algoritmo risolutivo di problemi non ancora
risolti ma sono comunque facilmente individuabili tecniche algoritmiche che permettono di risolvere alcune
situazioni particolari in modo molto semplice riducendo quindi, almeno in parte, le difficoltà che emergono ogni
qualvolta ci si appresta a risolvere dei nuovi problemi.
In definitiva quindi, se il problema ammette delle soluzioni, generalmente esiste più di un algoritmo risolutivo il
quale deve soddisfare alle regole seguenti:
l'algoritmo deve essere finito e concludersi dopo un numero definito di istruzioni;
le varie istruzioni che compongono l'algoritmo non devono permettere interpretazioni ambigue;
in presenza di dati di ingresso si deve specificare il campo di applicazione;
l'algoritmo deve fornire dei risultati;
tutte le operazioni previste devono poter essere effettivamente eseguite e ciò deve avvenire in un tempo finito.
Facendo riferimento ad un semplice esempio matematico, vediamo ora di evidenziare quanto detto sopra.
1
Esempio 1
Oggetto: dati due numeri interi A e B, individuare il procedimento che consente la determinazione del loro
prodotto.
a)
Analisi
Definizione dei dati di ingresso e di uscita (risultati)
Dati di ingresso: sono costituiti dai valori dei due numeri assegnati, indicati con A e B.
Dati di uscita: il prodotto di A e B che chiameremo C
Relazioni: prodotto
b)
Descrizione algoritmo
1) Inizio;
2) introdurre i numeri A e B;
3) Fare il prodotto A*B e metterlo in C;
4) Stampare il risultato C;
5) Fine;
Nell' esempio 1 sono state divise in passi le operazioni da svolgere. Come detto precedentemente è di
notevole importanza dare un inizio e una fine all'algoritmo, altrimenti non sarebbe una sequenza e chi lo deve
interpretare non potrebbe tradurlo in linguaggio di programmazione.
4. DIAGRAMMI A BLOCCHI
La tecnica che utilizza i diagrammi a blocchi consente di mettere in evidennza la sequenza con cui le
operazioni devono essere eseguite. Si utilizza infatti una mappa di flusso (flow-chart) che permette di seguire
con facilità il percorso delle informazioni e/o operazioni all'interno dell'elaboratore.
Nella stesura di un diagramma a blocchi è bene attenersi ad alcune regole che consentono di interpretare
agevolmente il diagramma stesso e che siano conosciute a livello internazionale. Le principali sono riportate
nel seguente elenco:
- si devono utilizzare i simboli grafici indicati in fig. 1;
- il flusso delle informazioni (rappresentato con frecce che uniscono i blocchi) deve procedere dall'alto verso il
basso e/o da sisinstra a destra;
- le linee di flusso NON si possono intersecare;
- è necessario distinguere grandezze costanti (cioè che mantengono lo stesso valore in tutto il programma) da
grandezze variabili, che viceversa variano il loro valore durante le esecuzioni successive;
PRINC IPALI SIMBOLI
ELABORAZIONE
INIZIO - FINE
DECISIONE
INPUT-OUTPUT
CO NNESSIONE
ALTRI SIMBOLI
SALVATAGGIO
DISPLAY
DOCUMENTO
ITERAZIONE
fig. 1
In relazioni a tali regole il diagramma a blocchi dell'esempio 1 si traduce come riportato in figura 2.
2
INIZIO
INTRODUCI
A, B
C=A* B
STAMPA C
FINE
fig. 2
Esempio 2
Oggetto: dati due numeri interi A e B, individuare il procedimento che consente la determinazione del loro
rapporto (divisione).
a)
Analisi
Definizione dei dati di ingresso e di uscita (risultati)
Dati di ingresso: sono costituiti dai valori dei due numeri assegnati, indicati con A e B.
Dati di uscita: il rapporto di A e B che chiameremo C
Relazioni: rapporto (divisione)
b)
Descrizione algoritmo
1) Inizio;
2) introdurre i numeri A e B;
3) Fare il rapporto A/B e metterlo in C;
4) Stampare il risultato C;
5) Fine;
c)
verifica correttezza algoritmo
L'algoritmo è corretto per tutti i numeri A e B tranne che per B=0: per tale valore, infatti, la divisione non può
essere effettuata. Occorre quindi, dopo l'introduzione di A e B, verificare se B=0, ciò si traduce nel seguente
algoritmo:
1) Inizio;
2) introdurre i numeri A e B;
3) se B=0 ritornare al punto 1 altrimenti proseguire;
4) Fare il rapporto A/B e metterlo in C;
5) Stampare il risultato C;
6) Fine;
Il diagramma a blocchi si traduce nella fig.3.
INIZIO
INTROD UCI
A, B
SI
B=0?
NO
C=A/B
STA MPA C
FINE
fig. 3
3
Il blocco di verifica o condizione ci permette quindi di verificare se dei termini o delle grandezze assumono
valori che noi non desideriamo, a tale condizione assoceremo azioni preventive di controllo affinché non si
producano risultati errati.
L'algoritmo non è il solo per la soluzione del problema, ma può essere modificato e arricchito a piacere da chi
programma: ad esempio si possono visualizzare messaggi di errore tramite blocchi di uscita, o terminare il
programma senza tornale all'inizio, ecc.
Esempio 3
Oggetto: definire e descrivere un algoritmo che permetta di ricavare il peso netto dati il peso lordo e la tara e
consenta di stampare e salvare il risultato su floppy.
a)
Analisi
Definizione dei dati in ingresso e di uscita (risultati)
Dati in ingresso: PL=peso lordo, T=tara;
Dati in uscita: PN=peso netto;
Relazioni: PN=PL-T
b)
Descrizione algoritmo
1) Inizio;
2) introdurre i numeri PL e T;
3) se PL o T sono uguali a zero segnala errore e vai al punto 1;
4) eseguire l'operazione PN=PL-T;
5) Stampare il risultato PN;
6) salvare su floppy il risultato;
6) Fine;
Il diagramma a blocchi si traduce nella fig.4.
INIZIO
INTRODUCI
PL, T
P L<O?
"P L DEVE
ES SERE >0"
T<0?
"T DEVE
ES SERE >0"
PN=PL-T
PN
PN
FINE
fig. 4
4
ESERCIZI
1) Definire e descrivere un algoritmo che permetta di effettuare una telefonata.
2) Definire e descrivere un algoritmo che permetta di effettuare un rifornimento di benzina.
3) definire e descrivere un algoritmo che elenchi le operazioni svolte al mattino dalla sveglia fino all'arrivo a
scuola. Introdurre anche condizioni "particolari"
4) Definire e descrivere un algoritmo che permetta di ricavare la retribuzione netta di un operaio conoscendo
la retribuzione oraria, il numero di ore di lavoro e le trattenute. I dati in ingresso devono essere tutti maggiori di
zero (altrimenti generare un segnale di errore), il risultati devono essere salvati.
5) Definire e descrivere un algoritmo che permetta di ricavare un cateto di un triangolo rettangolo conoscendo
ipotenusa e l'altro cateto.
6) Definire e descrivere un algoritmo che permetta di ricavare lo spazio percorso da un corpo di massa m
sottoposto ad accelerazione uniforme a dopo un tempo T.
7) Definire e descrivere un algoritmo che permetta di calcolare l'area di un rettangolo date le due dimensioni
dei lati.
8) Definire e descrivere un algoritmo che permetta di valutare se dati due numeri sono uguali o no.
9) Definire e descrivere un algoritmo che permetta dati due numeri A e B di stamparli in ordine crescente.
10) Definire e descrivere un algoritmo che permetta di ordinare in ordine crescente 3 numeri A, B e C.
5