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