Fondamenti di Informatica
Problemi, algoritmi e programmi
Carmine Dodaro, Università della Calabria
Problem solving
Problema
Un problema, comunemente inteso, è un ostacolo che rende difficile raggiungere un determinato obiettivo o soddisfare una certa esigenza, frapponendosi tra la volontà dell’individuo e la realtà oggettiva.
Problem solving:
Da Wikipedia: “Un’attività finalizzata all’analisi e alla risoluzione dei problemi usando tecniche e metodi generici o ad hoc”.
In informatica la soluzione si ottiene formulando un processo automatico.
Problema: la moneta falsa
Problema: abbiamo 3 monete di cui 1 è falsa. Le monete false sono identiche nell’aspetto alle monete reali ma hanno un peso leggermente diverso (non sappiamo se maggiore o minore). Avendo a disposizione una bilancia a due piatti, quante pesate sono necessarie per essere sicuri di capire qual è la moneta falsa?
Problema: la moneta falsa
Problema: abbiamo 9 monete di cui 1 è falsa. Le monete false sono identiche nell’aspetto alle monete reali ma hanno un peso inferiore. Avendo a disposizione una bilancia a due piatti, quante sono le pesate minime necessarie per trovare la moneta falsa?
Soluzione: 2 pesate.
I passi del problem solving
Risolvere un problema richiede un percorso tra diverse fasi:
Problem solving e informatica
Algoritmi e programmi
Algoritmo
Definizione Treccani:
“Algoritmo (ant. algorismo) s. m. [dal lat. mediev. algorithmus o algorismus, dal nome d’origine, al-Khuwārizmī, del matematico arabo Muḥammad ibn Mūsa del 9° sec. (così chiamato perché nativo di Khwarizm, regione dell’Asia Centrale)].
Algoritmo
Definizione classica:
Una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce a un ben determinato risultato in un tempo finito.
Da questa definizione emergono delle proprietà degli algoritmi:
Algoritmo: input, output ed esecuzione
Un algoritmo riceve in input dei dati in ingresso e produce come output dei dati in uscita.
L’esecuzione di un algoritmo consiste nell’applicare i passi elementari nell’ordine specificato dall’algoritmo a partire dai dati in input. Al termine dell’esecuzione dell’algoritmo, si ottiene l’output del programma.
Chi esegue un algoritmo? In generale, è una macchina astratta che è capace di eseguire le azioni specificate dall’algoritmo.
Dati
Risultati
Algoritmo
Esecutore
Algoritmi (funzionalmente) equivalenti
Un algoritmo può essere visto come una funzione da un dominio in ingresso (input) a un dominio in uscita (output).
Due algoritmi si dicono equivalenti quando:
Efficienza degli algoritmi
Gli algoritmi possono anche essere classificati in base alla loro efficienza, che si misura in base al tempo impiegato per risolvere il problema e allo spazio di memoria occupato durante l’esecuzione.
In generale, il concetto di tempo si misura in termini di passi (istruzioni elementari) dell’algoritmo e non in termini di tempo effettivo di calcolo.
Dall’algoritmo al computer
I processori dei computer sono composti da circuiti elettronici in grado di riconoscere ed eseguire solo un numero limitato di istruzioni semplici, che tipicamente sono del tipo:
Il linguaggio macchina permette di utilizzare queste istruzioni per codificare un programma.
Linguaggio macchina
Chi progetta i computer deve decidere quali istruzioni includere nel proprio linguaggio macchina. Tipicamente, si tende a progettare dispositivi con istruzioni semplici per ridurre i costi.
Tuttavia, questo fa sì che sia abbastanza complicato utilizzare questo linguaggio per codificare i programmi. Per risolvere questo problema in genere si definisce un insieme di istruzioni più comodo da usare rispetto a quelle predefinite.
Queste istruzioni formano un linguaggio che si trova a un livello di astrazione più alto rispetto al linguaggio macchina. A questo punto, per poter essere eseguite dal computer, le istruzioni scritte nel linguaggio più alto devono essere in qualche modo convertite nel linguaggio macchina.
Esistono due tecniche principali: compilazione e interpretazione.
Compilazione e interpretazione
La compilazione prevede che le istruzioni scritte in un linguaggio di alto livello vengano convertite, in una fase iniziale, in istruzioni equivalenti scritte nel linguaggio macchina.
L’interpretazione invece prevede che venga scritto un programma in linguaggio macchina, chiamato interprete, che accetta in input istruzioni del linguaggio ad alto livello. Questo programma poi si occupa di processare ed eseguire le istruzioni del linguaggio ad alto livello convertendole di volta in volta con la sequenza di istruzioni equivalenti scritte nel linguaggio macchina.
La differenza principale tra le due tecniche è che nella compilazione le istruzioni vengono convertite all’inizio del processo, mentre nel caso dell’interpretazione vengono convertite man mano.
Multi-livelli
In generale, è possibile definire una gerarchia (dove sono presenti diversi strati o livelli) di linguaggi. Dove ogni linguaggio a un livello superiore utilizza quello del livello precedente come base.
In generale, il linguaggio che si trova a un livello più basso è quello più semplice come insieme di istruzioni ma più difficile da utilizzare, mentre i linguaggi ai livelli più alti sono più complessi come insieme di istruzioni ma sono più semplici da utilizzare.
È importante osservare che chi scrive in un linguaggio ad alto livello non deve, in genere, preoccuparsi dei livelli sottostanti o di come le istruzioni vengano convertite (attraverso compilazione o interpretazione). Tuttavia, conoscere come funzionano i vari livelli è importante per capire il reale funzionamento del computer e, soprattutto, in alcune applicazioni specifiche.
Linguaggi di programmazione
Come visto, il linguaggio macchina è poco pratico per scrivere dei programmi.
Per questo motivo, sono nati i linguaggi di programmazione, che sono dei linguaggi a più alto livello che permettono di scrivere delle istruzioni che poi vengono convertite in modo automatico in linguaggio macchina.
Esistono diversi linguaggi di programmazione:
Dall’algoritmo al programma
Codifica: fase di scrittura di un algoritmo attraverso un insieme ordinato di frasi (“istruzioni”), scritte in un determinato linguaggio di programmazione, che specificano le azioni da compiere.
Metodo risolutivo: fase in cui si pensa a come risolvere il problema in termini di passi elementari.
Il programma viene convertito in linguaggio macchina: tramite compilazione oppure attraverso un interprete che esegue il codice.
Problema
Algoritmo
Programma
Linguaggio macchina
Introduzione alla programmazione
Prima di parlare di un linguaggio di programmazione vero e proprio, possiamo anche provare con un “gioco”: https://studio.code.org/s/express-2024/lessons/1/levels/2.
Python
Python
Python è un linguaggio di programmazione di alto livello.
Tra i vantaggi di Python troviamo:
Python: esecuzione
Editor
Controllo sintattico e traduzione
Python Virtual Machine
Byte Code
Rileva errori di sintassi
Rileva errori di esecuzione
Output
Codice
Interprete
Idea intuitiva:
Input dell’utente
Tipologie di errori
Errori di sintassi
Errori di esecuzione
Errori logici
Python: scrittura del codice
Per scrivere il programma si può usare un editor di testo o un ambiente di sviluppo integrato:
Per eseguire il codice si usa l’interprete Python: guida sul sito del corso.
Prima di partire...
Alcuni concetti importanti prima di iniziare a scrivere il codice:
Vediamo nel dettaglio!
Per le lezioni su Python useremo un notebook realizzato su google colab e disponibile a questo link: notebook python.