Il primo algoritmo
Lezione per la classe III
dell’Istituto Tecnico Industriale
settembre 2015
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
i =1
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 <iostream>
} 
using namespace std;
} 
int voto;
} 
int somma;
} 
int contaVoti;
} 
void calcolaMedia(){
◦ 
numero=0;
◦ 
somma=0;
◦ 
contaVoti=0;
◦ 
while (numero!=99999){
– 
cout << “digita il numero, se non ci sono altri numeri digita 99999”;
– 
cin >> numero;
– 
if (numero is not numeric)
– 
continue;
– 
somma=somma+numero;
– 
contaVoti=contaVoti+1;
}
media=somma/contaVoti;
cout << “la media dei voti = “ << 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