Il primo algoritmo
problema
Facciamo
fare al computer il seguente lavoro:
data una lista cartacea di numeri interi positivi
che possono rappresentare diversi dati, ad esempio
supponiamo che siano i voti di tutti gli studenti di una classe
determinare
il voto medio della classe.
Come risolvere il problema ?
La
soluzione del precedente problema viene realizzata
per mezzo di un procedimento di pensiero chiamato
“ALGORITMO”
Si studia come realizzare l’algoritmo per risolvere il
problema dato
Quindi si adatta l’algoritmo al computer
Il computer esegue l’algoritmo
Si ottiene la soluzione del problema
Algoritmo e metodologia di un algoritmo
Anzitutto, prima
di passare all’azione vera e propria,
bisogna riflettere un attimo per vedere se esiste una
metodologia che ci possa aiutare nella soluzione del
problema
Esiste una metodologia generale che ci insegna a
costruire algoritmi ?
Che cosa è un algoritmo
Che cosa è una metodologia di un algoritmo ?
Una metodologia è un metaAlgoritmo, ossia un algoritmo
di un algoritmo
che ci insegna come costruire algoritmi.
Definizione di algoritmo
Un
algoritmo è un programma di un computer che
calcola qualcosa
È una sequenza finita di istruzioni, usate per il calcolo e
l’elaborazione dei dati
È una lista di azioni, istruzioni ben definita per eseguire
un compito
È un insieme di fasi con un ordine preciso eseguite l’uno
dopo l’altra per fare un determinato lavoro
È un insieme ordinato di step non ambigui, eseguibili ,
completabili in un tempo finito
Qualche osservazioni sulla definizione
Si
può pensare ad una condizione chi violi la definizione
di algoritmo? Ad esempio esistono dei casi in cui
la sequenza delle istruzioni non è finita ?
il calcolo non possa terminare in un periodo di tempo finito ?
La
risposta è si.
Può accadere che ci sia un blocco di istruzioni che vengano
ripetute per sempre perché la condizione di uscita dalla
iterazione non è mai soddisfatta (per un errore di
programmazione)
Pertanto anche se il numero delle istruzioni è finito, alcune di
esse sono ripetute indefinitamente perché niente permette
l’interruzione del processo
Perché scrivere un algoritmo ?
Per
comandare il computer di fare qualcosa, bisogna
scrivere un programma.
Scrivere un programma significa dire al computer, passo
dopo passo, esattamente che cosa deve fare.
Il computer per fornire la soluzione ad un problema,
esegue meccanicamente il programma, ossia ciascuna
istruzione che gli viene fornita.
Significato di algoritmo
Quando
dite al computer che cosa deve fare, dovete pure
decidere come deve farlo
Ecco che, nel progettare “il come”, nasce l’algoritmo del
computer
L’algoritmo è la tecnica fondamentale utilizzata per far si
che un lavoro sia svolto dal computer.
Atteggiamento mentale per affrontare un
algoritmo
Per
fare un algoritmo occorre spezzare, frantumare,
analizzare, decomporre il lavoro da fare o il
compito/attività da eseguire in tante piccole parti o
semplici attività/istruzioni
Lo scopo è quello di individuare delle fasi del lavoro e in
quale sequenza devono essere eseguite per portare a
termine il lavoro o compito assegnato
Occorre creare una procedura di lavoro
Algoritmo dell’algoritmo: procedimento
risolutivo
Comprendere il problema
Identificare i dati noti
Identificare le operazioni
Identificare le incognite del problema
Costruire la soluzione del problema
Stabilire quali sono le fasi da eseguire
Stabilire la sequenza di queste fasi
Comprendere il problema
Comprendere il problema:
Analisi testuale per identificare le informazioni
necessarie
Saper riconoscere quali sono i dati esaminando i nomi del testo
saper riconoscere quali sono le operazioni richieste dal problema
esaminando i verbi del testo
Intervistare
gli esperti del dominio del problema per
comprendere il significato dei dati e delle operazioni
I dati del problema
I
dati del problema
Quelli noti di input
Quelli incogniti di output
Quelli che servono per fare operazioni intermedie di supporto
al lavoro
Tutti
questi dati costituiscono le variabili e costanti del
problema.
A ciascuna di esse attribuiamo
un nome,
un tipo di dati (intero, booleano, stringa, carattere,…)
Le operazioni
Dall’analisi
del testo del problema, con l’intervista degli
esperti, con un procedimento di decomposizione
funzionale si arriva a stabilire quali sono le fasi del lavoro
e per ciascuna di esse quali sono le sue operazioni.
Le operazioni dipendono dalla scelta fatta delle variabili,
anche perché agiscono su di esse, e le modificano
Retroazione
La scelta delle variabili
influenza la scelta delle
operazioni
La scelta delle operazioni
influenza la scelta delle
variabili
C’è chiaramente una
retroazione e prima che si
possa pervenire ad una scelta
equilibrata e soddisfacente
occorre fare più tentativi
D’altra parte questo si riflette
nella programmazione che è
sicuramente iterativa e
incrementale
Scegli variabili
Scegli operazioni
La cassetta degli strumenti
La
cassetta degli strumenti per lavorare su di un
algoritmo contiene quattro strumenti principali:
La sequenza di istruzioni
L’alternativa
La iterazione
La ricorsione
Forma mentis di un creatore di algoritmi
Lo sforzo mentale di soluzione del problema è collegato non solo
all’individuazione dei dati e delle operazioni su di esse, ma anche
soprattutto nel cercare di scoprire le iterazioni o le ricorsioni che
facilitino la meccanizzazione della soluzione.
Bisogna tenere la soluzione del problema ben stretta nel proprio
pugno
Questo risultato si ottiene ricercando ossessivamente blocchi di
istruzioni ripetitive per applicargli l’iterazione o quando necessita la
ricorsione
Quando tutto il liquido del ragionamento è strutturato con
opportune iterazioni, riusciamo a contenerlo tutto e si riesce a
ridurre l’estensione di processi complessi
Questi fenomeni complessi ristrutturati con l’iterazione sono
facilmente addomesticabili e sono così trasportabili su di un computer
per essere meccanizzati.
La tecnica dell’algoritmo
L’utilizzo
di blocchi di istruzioni ripetitive influenza, a sua
volta, la scelta delle variabili e per contraccolpo anche la
scelta delle operazioni
Ne consegue che la tecnica più importante nel costruire
un algoritmo è l’uso dei costrutti di iterazione e di
ricorsione
Ragionamenti intuitivi mentali
Nell’ideare
un algoritmo torna utile anche pensare ai
ragionamenti intuitivi che facciamo mentalmente
per risolvere alcuni problemi
Talvolta la costruzione di un algoritmo si può avvalere
di questi ragionamenti
Si tratta proprio di rendere espliciti questi
ragionamenti
renderli
concreti
ancorandoli con i costrutti dell’algoritmo
Costruiamo il primo algoritmo
Supportati
da questo bagaglio di strumenti e di
suggerimenti possiamo cimentarci nella costruzione
del nostro primo algoritmo
Per fare questo ci atteniamo alla sequenza di fasi che
emergono dall’algoritmo dell’algoritmo
Applichiamo questo procedimento risolutivo al
problema del calcolo della media di una lista di
numeri che abbiamo enunciato all’inizio della
presentazione
Prepariamo tutti i materiali del problema:
dati in input
Anzitutto ci occorre la lista dei
numeri
Abbiamo la lista cartacea allegata,
sotto la forma di una tabella
Di questa tabella l’analisi testuale
del testo del problema ci dice che
ci occorre solo la colonna dei voti
La colonna dei voti sono i dati
noti, ossia l’input all’algoritmo
nome studente
Bianchi
Rossi
Tizio
Bianchi
Caio
Sempronio
Rossi
Bianchi
Tizio
Mario
Bianchi
Sempronio
Qui
Rossi
Quo
Tizio
Quo
Qua
Rossi
Bianchi
Mario
Qua
Qui
Sempronio
Mario
Bianchi
Tizio
Rossi
Sempronio
classe
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
IIIAL
materia
Italiano
Matematica
Storia
Inglese
Storia
Sc. Informatiche
Sc. Informatiche
Sc. Elettriche
Inglese
Matematica
Sc. Informatiche
Italiano
Storia
Sc. Elettriche
Italiano
Sc. Meccaniche
Sc. Informatiche
Sc. Meccaniche
Matematica
Sc. Meccaniche
Sc. Elettriche
Inglese
Storia
Sc. Elettriche
Italiano
Sc. Informatiche
Matematica
Inglese
Sc. Elettriche
data
17/09/08
17/09/08
17/09/08
18/09/08
18/09/08
22/09/08
22/09/08
22/09/08
25/09/08
25/09/08
25/09/08
25/09/08
01/10/08
01/10/08
02/10/08
02/10/08
02/10/08
02/10/08
02/10/08
02/10/08
03/10/08
03/10/08
03/10/08
03/10/08
03/10/08
03/10/08
06/10/08
06/10/08
06/10/08
voto
6
5
7
6
5
7
8
4
6
6
7
5
6
5
6
5
7
9
3
5
5
6
6
6
7
6
5
2
9
Analisi testuale: dati di ouptut
In
questo esempio,
essendo il testo del
problema molto breve e
semplice, è facile ricavare
quali sono i dati incogniti,
ossia in output
Il voto medio della
classe
data una lista cartacea di numeri interi positivi
che possono rappresentare diversi dati, ad
esempio
supponiamo che siano i voti di tutti gli
studenti di una classe
determinare il voto medio della classe.
Intervistare gli esperti
Fare
una media di numeri è il lavoro da eseguire
Intervistiamo un esperto del dominio del problema, un
matematico statistico.
Egli ci dice che l’operazione della media è:
1
media
N
Quindi
N
voto
i 1
i
dobbiamo fare due operazioni
La somma di tutti i voti da 1 a al numero complessivo dei voti N
Dividere questa somma per il numero complessivo dei voti N
Le operazioni
In
questo caso, determinata la soluzione del problema
con una formula matematica, ne consegue che le
operazioni da eseguire sono due operazioni aritmetiche:
Somma
Divisione
Gli
operandi (i dati) della somma
sono i singoli valori dei voti
Gli
operandi ( i dati) della divisione sono la somma totale
dei voti e il numero complessivo dei voti
La fasi dell’algoritmo somma
Possiamo
individuare due fasi di lavoro
Sommatoria di tutti i voti
Calcolo della media matematica della sommatoria
La
prima fase è un’attività ripetitiva
Qui si può vedere quale è l ragionamento intuitivo mentale
Nel caso in cui noi facciamo a memoria questo calcolo
esplicitando la nostra attività:
Dedichiamo una cella della nostra memoria
Sommiamo il primo numero a questa zona di memoria
Continuiamo a sommare i numeri successivi alla medesima cella di
memoria finchè tutti i numeri sono terminati
Contiamo quanti sono i numeri sommati
Alla fine dividiamo la somma complessiva per il numero complessivo
dei numeri
Revisione delle operazioni
1.
2.
3.
Somma dei voti
Conteggio del numero dei voti
Divisione della somma per il conteggio del numero dei
voti
Le prime due operazioni sono ripetitive ed avvengono
nella prima fase dell’algoritmo
La terzo operazione è un’unica istruzione che viene
eseguita in una seconda fase del lavoro,al termina della
prima fase
Stesura dell’algoritmo
Si
legge un voto alla volta
Si incrementa una sommatoria parziale
Si incrementa il contatore dei numeri
Si ripete questo blocco di istruzioni finchè ci sono
numeri nella lista cartacea
Quando i numeri sono terminati la sommatoria parziale
è la sommatoria S di tutti i voti della lista
Il contatore è la somma N del numero di tutti i voti
Si divide la sommatoria totale per il numero totale dei
voti N e si ottiene media=S/N il risultato desiderato,
ossia la media dei voti
Soluzione alternativa
Avremmo
anche potuto caricare tutti i voti della lista ciascuno
in una sua area di memoria
Quindi avremmo potuto fare un’unica istruzione di somma
sommando contemporanemente tutti i numeri
Contare il totale dei numeri della lista cartacea
Ed infine calcolare la media dei voti come prima
Tuttavia questa seconda soluzione non comporta l’utilizzo
della iterazione e ci piace di meno perché l’operazione di
somma cambia al variare del numero dei voti da sommare
Invece il sistema iterativo non muta con il numero dei voti da
sommare ed è quindi preferibile al precedente metodo
Quale è la soluzione di algoritmo preferibile
?
Quando
per fare un algoritmo ho diverse possibilità
Occorre scegliere quelle che non devo cambiare al mutare di
dati nozionistici, quali il numero dei dati o il valore di questi
dati
Le soluzioni che utilizzano blocchi di istruzioni ripetitivi con
l’ausilio di costrutti tecnici quali iterazione e ricorsione sono
particolarmente simpatici perché resistono alle modifiche
indotte dal mutato ambiente nozionistico
Inoltre queste soluzioni sono preferibili, come già detto,
perché spesso sono le uniche a consentire di dominare il
liquido e sfuggente ragionamento della nostra mente
Per concretizzare l’algoritmo è utile un
disegno (il flowchart)
L’inizio e la fine dell’algoritmo
lo rappresentiamo con una
forma geometrica ovale
Un’operazione di input e di
output con un
parallelogrammo
Un’operazione interna con un
rettangolo
Una domanda con un rombo
Il collegamento tra queste
forme geometriche tramite
frecce orientate che
rappresentano il verso della
sequenza delle istruzioni
Inizio/fine
Input/output
calcolo
domanda
Le variabili del nostro algoritmo
Leggiamo
dalla lista cartacea un numero alla volta
Occorre una cella di memoria per memorizzare il numero
letto, chiamiamola “numero”
Occorre una cella di memoria per memorizzare la
sommatoria parziale, chiamiamola “somma”
Occorre una cella per calcolare il numero dei voti,
chiamiamola “contaVoti”
Occorre una cella di memoria per calcolare la media dei voti,
chiamiamola “media”
Occorre individuare un costrutto di iterazione
Il flowchart della media dei voti
MediaVoti
Leggo
voto
somma= somma + voto
contaVoti=contaVoti+1
si
altri
voti ?
media=somma/contaVoti
scrivi media
fine
Scrittura dell’algoritmo in pseudoItaliano
MediaVoti
ripeti finchè ci sono voti nella lista
leggi
voto
aggiungi voto a somma
Incrementa di uno contaVoti
dividi somma per contaVoti ed assegna il risultato a media
scrivi media
fine
Scrittura dell’algoritmo in un linguaggio di
programmazione ( C language )
#include <stdio.h>
int voto;
int somma;
int contaVoti;
void calcolaMedia(){
numero=0;
◦
somma=0;
◦
contaVoti=0;
◦
while (numero!=99999){
◦
printf(“digita il numero, se non ci sono altri numeri digita 99999”);
scanf(“%d”,&numero);
if (numero is not numeric)
continue;
somma=somma+numero;
contaVoti=contaVoti+1;
}
media=somma/contaVoti;
printf(“la media dei voti = ,%d”,media);
}
main() {
calcolaMedia();
}
Modi di scrittura di un algoritmo
Ci
sono diversi modi per scrivere un algoritmo:
Un disegno con il flowchart
Un linguaggio naturale (pseudo inglese/italiano…)
Un linguaggio di programmazione
In questo caso occorre aggiungere degli elementi di dettaglio affichè
l’algoritmo sia eseguibile dal computer
Definizione di variabili
Azzeramento di variabili
Un costrutto per l’iterazione da scegliere tra quelli disponibili nel linguaggio di
programmazione usato
Una condizione per controllare l’uscita dall’iterazione
Delle istruzioni per la lettura e la scrittura dei dati
Fine della
prima
lezione sugli
algoritmi
AlKhwarizmi