Questi sono i miei appunti di informatica sviluppati durante i lockdown. Di fatto costituiscono il libro di testo dei miei corsi. La grafica è ispirata a D&D 5e nella speranza di accattivarmi l'interesse dei ragazzi.
Questa parte è adatta ai ragazzi di 1-2° liceo SSA e di 2°-3° ITIS (in particolare ad indirizzo informatico)
2. Contenuti
Introduzione
1. Definizioni e concetti
Il problema
L’esecutore
Tipi di problemi e come risolverli
L’algoritmo (definizione e metodo)
Processi automatici (con esempi)
Come creare un algoritmo
Rappresentazione degli algortimi
2. Le variabili
Cosa sono
Come funzionano
Tipi di variabili
Compatibilità
Costanti
Nomi di variabili e stili
Il ruolo
Operazioni base: assegnazione, calcoli,
confronti
Funzioni
Input-output
3. Primi algoritmi
Dominare la bestia
La tecnica
La cassetta degli attrezzi
Il teorema
Conclusioni
3. Introduzione
iovane apprendista, ti diamo il benvenuto alla nostra scuola di Magia.
Pur essendo affatto diversa dalle grandi scuole di hai sentito parlare,
come quelle di Hogwarts, Ulcaster o Sorcere, nondimeno aprirà la
tua mente ai grandi misteri dell’Universo.
G
Imparerai come dominare i numeri, le parole, e
piegarle al tuo volere. Saprai osservare un
fenomeno, e scoprirne i più reconditi misteri. La
tua scienza sembrerà una magia ai non iniziati, e
questo accrescerà la tua fama e la gloria.
Un lungo e duro lavoro ti aspetta, Mago e
Algoritmista. Andiamo a incominciare!
4. Progresso
La strada sarà lunga e irta d’insidie. La tua mente dovrà rimanere
salda, e la tua determinazione incrollabile. Lo studio e l’esperienza
saranno i tuoi fari, e sotto la guida del tuo mentore raggiungerai vette
inaspettate. Sarà lui a dirti se avrai raggiunto un nuovo livello.
Mago Algoritmista
Livello Titolo Privilegi
0 Apprendista -
1 Prestigiatore Trucchetti
2 Evocatore Problem Solving
3 Teurgo Algoritmi Elementari
4 Taumaturgo Algoritmi avanzati, Complessita
5 Stregone Ricorsione, Greedy Dynamic Programming
6 Incantatore Object Oriented Design e Programming
7 Mago Specializzazioni arcane:
7A Negromante - Analista software
7D Alchimista - Database designer
7E Maliardo - Architetto software
10 Arcimago Tutti
5. Introduzione (seria)
envenuti alla “scuola di algoritmistica”! In questo percorso ci
occuperemo principalmente, appunto, di algoritmi. Scopriremo che
cosa sono, come si costruiscono, come si controllano e si valutano.
Scopriremo come essi sono collegati con un concetto fondamentale
dell’informatica, e non solo, chiamato pensiero computazionale.
Non ci occuperemo più di tanto della codifica, ovvero della
trasformazione dell’algoritmo nel linguaggio di programmazione e
della sua effettiva esecuzione; non perché non sia importante -anzi -
ma perché solleva problemi e richiede soluzioni di natura totalmente
diversa da questa.
B
6. Introduzione (seria)
envenuti alla “scuola di algoritmistica”! In questo percorso ci
occuperemo principalmente, appunto, di algoritmi. Scopriremo che
cosa sono, come si costruiscono, come si controllano e si valutano.
Scopriremo come essi sono collegati con un concetto fondamentale
dell’informatica, e non solo, chiamato pensiero computazionale.
Non ci occuperemo più di tanto della codifica, ovvero della
trasformazione dell’algoritmo nel linguaggio di programmazione e
della sua effettiva esecuzione; non perché non sia importante -anzi -
ma perché solleva problemi e richiede soluzioni di natura totalmente
diversa da questa.
B
8. Partiamo da un problema
Di che si tratta?
Il problema è una situazione che pone delle domande alle quali si devono dare
delle risposte. Risolvere il problema vuol dire uscire dalla situazione.
In matematica e in altre scienze, in generale un problema è un quesito espresso
attraverso un enunciato che, sulla base di dati noti, richiede di determinare dati
non noti che sono derivabili dai primi attraverso calcoli ed elaborazioni.
In informatica questa definizione viene estesa e il concetto di problema può
essere assimilato a quello di compito da svolgere. Dato che in informatica
l’esecutore è fisso (il computer), il problema assume anche il nome di specifica.
Si noti che la specifica deve definire in modo completo e non ambiguo in che
cosa consista il compito da svolgere e non come esso deve essere svolto.
9. L’esecutore
Chi sarebbe?
L’esecutore è quella persona/cosa che si occupa di risolvere materialmente il
problema.
Occorre non perdere mai di vista quali sono le capacità dell’esecutore che dovrà
eseguirlo. Un bambino di 7 anni, un tablet, una drone sono tipi ben diversi di
esecutori - in linea di massima NON sono intercambiabili.
Il computer
Nel nostro caso specifico l’esecutore è un elaboratore elettronico. Tuttavia, le sue
funzioni possono essere svolte anche da una persona, a patto di auto-limitare le
proprie conoscenze e abilità a quelle di un calcolatore e sforzandosi di seguire alla
lettera le istruzioni, senza immaginare cosa la macchina “dovrebbe fare”. Questo
punto di vista servirà moltissimo per verificare la bontà degli algoritmi.
10. Tipi di problemi
Si tratta di un gruppo di problemi il cui metodo
di soluzione è immediatamente apparente
all’esecutore, oppure che può essere scomposto
in passi elementari. Hanno generalmente una
struttura sequenziale o lineare e una volta trovati
la soluzione è la migliore possibile. Tradurre un
algoritmo di questo tipo è un’operazione
semplice e relativamente indolore
Esempi:
● Somma di due numeri
● Lavare i piatti con la lavastoviglie
● Contare quante lettere ci sono un una
parola
● Copiare un file da una posizione a un’altra
● Calcolare l’area di un tronco di cono a base
esagonale
Problemi semplici (o elementari)
Facile o difficile?
La domanda è mal posta: “facile” e
“difficile” sono considerazioni
soggettivee soggetteal cambiamento,
soprattutto dell’esperienza. Per
esempio, risolvere un’equazionedi 2°
grado è impossibile per un bambino
delle elementari,accettabileper uno
studentedelle superiori, banale per un
ingegnere.
La vera questione è “semplice” o
“complesso”, e per complesso si intende
un’attivitàche è composta da una serie
di tantesotto-attività che potremmo
definire “atomiche”. Per esempio:
costruire una casa,iscriversi
all’università,scrivere un programma
come Photoshop sono attività
complesse.La complessità può in certi
casi - ma non sempre - essere
controllata tramite passipiù semplici.
11. Tipi di problemi
Si tratta di un gruppo di problemi il cui metodo
di soluzione non è immediatamente chiaro. La
soluzione può essere trovata, ma è detto che la
prima soluzione sia la migliore - spesso no.
Esempi:
● Trovare una parola in un dizionario
● Mettere in ordine un mazzo di carte
● Trovare la derivata di una funzione
● Trovare la via d’uscita di un labirinto
● Valutare la somiglianza tra due testi
● Assegnare gli studenti nelle stanze di un
dormitorio tenendo presente le loro
preferenze
Problemi Complessi
Questi problemi sono spesso difficili anche da
definire. Trovare la soluzione è molto difficile,
spesso affidata a una IA. Alcuni sono non
risolvibili in un tempo accettabili.
Esempi:
● Riconoscimento vocale
● Vincere a scacchi
● Identificare oggetti in una foto
● Trovare i fattori primi di un numero
● Colorare una mappa con un numero
limitato di colori
Problemi intrattabili
12. Come risolvere un problema?
Un metodo generale
Per prima trova si trova l’algoritmo, quindi si adatta l’algoritmo al computer e, dopo aver
fornito i dati corretti, si ottiene la la soluzione del problema. Fin qui la teoria; ma come
facciamo in pratica? Esiste una metodologia che ci possa aiutare nella soluzione del
problema? Esiste una metodologia generale che ci insegna a costruire algoritmi - una volta
capito bene di che si tratta ? Di fatto abbiamo bisogno di un metaAlgoritmo, ossia un
algoritmo che ci insegna come costruire algoritmi.
E per prima cosa dobbiamo avrer una definizione chiara di cosa sia un algortimo
13. Algoritmo
Definizione
Da sapere
Idealmente a memoria
Una sequenza finita di
istruzioni non ambigue
eseguendo le quali è
possibile risolvere una
classe di problemi in un
tempo finito e
ragionevole.
14. Algoritmo: più in dettaglio
Una sequenza finita di istruzioni non
ambigue eseguendo le quali è possibile
risolvere una classe di problemi in un tempo
finito e ragionevole.
Vediamo di esaminare a fondo la definizione:
Sequenza. Le istruzione sono da esegure
secondo l’ordine indicato
Finita. Non è possibile esegure una lista
infinita di comandi.
Istruzioni non ambigue. Le istruzioni
devono essere chiare e precise, in modo tale
che l’algoritmo possa essere eseguito più
volte ottenendo lo stesso risultato.
Eseguendo. Implica che l’esecutore sia in
grado effettivamente di eseguire l’istruzione.
Classe di problemi. Non ci interessa un
metodo per risolvere un singolo caso, ma una
soluzione per tanti problemi simili.
Finito e ragionevole Se la soluzione è
disponibile solo tra un anno, o un milione di
anni, non è una soluzione accettabile.
Un problema risolvibile tramite algoritmo si
dice anche computabile.
Infatti, da un algoritmo è possibile scrivere un
programma che dirà al computer, passo
dopo passo, esattamente che cosa deve fare.
Il computer esegue meccanicamente ossia
ciascuna istruzione che gli viene fornita e
fornisce (calcola, computa) la soluzione.
15. Il primo
algoritmo
Si trova nel papiro egiziano di
Ahmes, risalente circa al 1650 a.C.
e conservato al British Museum di
Londra. Il papiro contiene un
algoritmo per la moltiplicazione.
Tale algoritmo viene usato tuttora
nei circuiti delle unità
aritmetico/logiche dei calcolatori
elettronici
16. Origini del
Nome
Algoritmo è una storpiatura del
nome del grande matematico
persiano Abū Jaʿfar Muḥammad ibn
Mūsā al-Khwārizmī, padre
dell’algebra
18. Processi automatici
Nella maggior parte dei casi elementari, l’utilizzo di un
computer per risolvere un problema può essere ricondotto a un
modello piuttosto semplice, che chiameremo IPOV, acronimo di
“Input - Processing - Output - Verification”
ELABORAZIONE
INPUT OUTPUT
Verifica
19. Esempio 1 - trovare l’ipotenusa
Input: misura di due cateti
Elaborazione: applicazione del teorema di pitagora
Output: misura dell’ipotenusa
Verifica: inserimento di due triangoli noti.
Teorema di
Pitagora
Duecateti di un
triangolo
rettangolo
Ipotenusa
Verifica Input:3 e 4 → Output::5 Input:3.4 e 5.7 → Output:6.637..
20. Esempio 2 - Spaghetti al sugo
Input: Gli ingredienti
Elaborazione: Ricetta di Giallo Zafferano (con utensili)
Output: Piatto da servire
Verifica: E’ buono?
Ricetta di Giallo
Zafferano
5l Acqua, 400g
spaghetti, olio, aglio,
pomodoro, sale,
pentola
Piatto da servire
Verifica prova di gusto.
21. Il punto
Anche se identificare i dati di input e output può essere talvolta
difficile, è evidente che il punto più delicato è la costruzione
dell’algoritmo.
Purtroppo, non esiste ancora - nè probabilmente mai esisterà -
una “formula magica” che permetta di trovare l’algoritmo che
risolve un dato problema.
Per trovare un algoritmo, occorre mettere a frutto tutte le proprie
conoscenze e competenze: pensiero logico, esperienza,
intuizione e altro ancora.
22. Come creare un algoritmo?
Per creare 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 e
osservare il problema dal punto di vista
di un computer; in altre parole, dobbiamo
applicare il pensiero computazionale
Pensierocomputazionale
Il pensiero computazionaleè l'insieme
dei processi mentali coinvolti nella
formulazione di un problema e della
sua soluzione) in modo tale che un
umano o una macchina possa
effettivamenteeseguire.Ideatoda
Papert e formalizzatoda Wing, è
determinatoda una serie di abilità:
● Decomposizone
● Riconoscimento dei modelli
● Rappresentazionedei dati
● Generalizzazione
● Algoritmi.
Prevede generalementetre fasi,dette
delle “3 A”:
● Astrazione:formulazone del
problema
● Automazione:realizzazionedella
soluzione,
● Analisi: esecuzionee valutazione
della soluzione
23. Procedimento risolutivo
Meta-algoritmo
● 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
● Verificare la soluzione
○ Utilizzare dati di cui è nota la soluzione
○ Utilizzare dati nuovi e verificare la bontà della soluzione
.
24. Comprendere il problema
● Analizzare il testo per identificare le informazioni necessarie
● Riconoscere quali sono i dati (i nomi presenti nel testo sono
ottimi candidati)
● Riconoscere quali sono le operazioni richieste (i verbi
presenti nel testo sono ottimi candidati)
● Identificare le capacità dell’esecutore
● Informarsi (libri, internet)
● Parlare con gli esperti
25. Identificare i dati
● Identificare i dati noti (input)
● Identificare i dati richiesti (output)
● I dati necessari per le operazioni intermedie
Tutti questi dati costituiscono le variabili e costanti del
problema; daremo a ciascuno di essi un nome, un tipo, un ruolo
26. Le operazioni
Dall’analisi del testo del problema, si arriva a stabilire quali
sono le fasi del lavoro e, per ciascuna di esse, quali sono le
operazioni necessarie.
Le operazioni dipendono dalla scelta fatta delle variabili, anche
perché agiscono su di esse, e le modificano.
27. Le operazioni
Ma, soprattutto, la scelta delle operazioni a disposizione dipende
dalle capacità dell’esecutore. Esempio:
“Calcola la radice quadrata di x”
“Sposta il cursore di 2 caratteri verso destra”
“Leggi la temperatura attuale e registrala nella variabile temp”
La prima operazione è valida solo se l’esecutore sa cos’è una
radice quadrata
La secondo richiede che l’esecutore possa spostare il cursore
La terza richiede che l’esecutore sia dotato di una sensore di
temperatura. In certi casi alcune mancanze possono essere
aggirate (per esempio calcolando la radice quadrata a mano); se
non è possibile l’algoritmo non può risolvere il problema
28. Controllo
Oltre alle operazioni, un algoritmo è dotato di forme di controllo
che permettono di
● Eseguire o non eseguire un’istruzione (o un gruppo)
● Ripetere più volte un’istruzione (o un gruppo)
● Definire una nuova istruzione, basandosi su un gruppo di
istruzioni esistenti
● Eseguire istruzioni in casi eccezionali
30. “Scrivere” un algoritmo
Rappresentare un ragionamento non è una delle cose più
semplici del mondo. Nel caso degli algoritmi, i metodi utilizzati
sono raggruppabili in due grandi categorie:
● Rappresentazioni grafiche
● Rappresentazioni testuali
31. Diagrammi di flusso
I Diagrammi di flusso (o
diagramma a blocchi, flow-chart in
inglese) sono probabilmente
l’esempio più famoso.
Prevedono pochissimi elementi:
● Parallelogrammi
(ingresso/uscita dati)
● Quadrati (elaborazione)
● Rombi (scelte)
● Frecce (direzione logica) e
pallini (connettori, inizio/fine)
INPUT-OUTPUT
ELABORAZIONE
DECISIONE
Connettore,
Inizio,
FIne
32. Diagrammi di flusso: critica
Vantaggi
● Intuitivo
● Semplice
● Standard estremamente diffuso
Svantaggi
● Poco pratico
● Non scalabile
● Prono ad errori di lettura.
33. Variante: struttogramma
Noto anche come diagramma di
Nassi–Shneiderman.
Vantaggi e svantaggi simili ai
diagrammi di flusso, ma
considerevolmente meno diffusi.
34. Variante: Diagramma UML
Vantaggi
● Intuitivo
● Permette la gestione di scenari
complessi come parallelismo, eccezioni,
errori, temporizzazione
Svantaggi
● Poco pratico
● Non scalabile
● Meno diffuso del precedente.
35. Ambienti di programmazione
Si tratta di programmi che
permettono di scrivere ed
“eseguire” diagrammi di flusso
come se fossero programmi veri e
propri
Tra gli esempi più noti citiamo
Algobuild (programma italiano,
freemium) e Flowgorithm
(americano, freeware).
Il loro vantaggio è nel ramo
didattico; problemi di
trasferimento di codice
36. Linguaggio naturale
Un metodo molto diffuso consiste nel
descrivere il procedimento utilizzando una
descrizione testuale usando un linguaggio
naturale anche se più schematico.
L’esempio a sinistra mostra un algoritmo che
permette di stabilire quale è il maggiore tra
due triangoli.
Vantaggi
● Non richiede studio
● Comprensione immediata
Svantaggi
● Tende ad essere ambiguo
● Non standard
● Verboso
1. acquisire l’altezza del primo triangolo
2. acquisire la base del primo triangolo
3. Porre in Area1 l’area del primo triangolo
4. acquisire l’altezza del secondo triangolo
5. acquisire la base del secondo triangolo
6. Porre in Area2 calcolare l’area del
secondo triangolo
7. SE Area1>Area2 scrivere “Primo
triangolo maggiore”
8. SE Area1<Area2 scrivere “Secondo
triangolo maggiore”
9. SE Area1=Area2 scrivere “Triangoli
uguali”
37. Pseudocodice
Uno pseudocodice è una via di mezzo tra il
linguaggio naturale e un linguaggio di
programmazione di alto livello. Si usa per
avere una bozza del programma da
sviluppare.
Vantaggi
● Compatto
● Rigoroso
Svantaggi
● Tende ad essere a basso livello
● Non standard
1. Base ← 4
2. Altezza ← 5
3. Area1 ← area(Base,Altezza)
4. Base ← 6
5. Altezza ← 11
6. Area2 ← area(Base,Altezza)
7. if Area1>Area2 :
return “Primo triangolo maggiore”
8. if Area1<Area2:
9. return “Secondo triangolo maggiore”
10. if Area1=Area2:
return “Triangoli uguali”
39. Cosa sono le variabili?
Nella matematica
Una variabile è un simbolo che
rappresenta un numero non definito,
potenzialmente sostituibile con tutti i
possibili numeri.
Serve per scrivere formule e metodi
risolutivi generali (es: equazioni di
secondo grado) o rappresentare
funzioni (es: la parabola)
Nell’informatica
In informatica, una variabile è un
contenitore, associato ad un nome, e
contiene un valore ben preciso.
Nel caso dei programmi, a ogni
variabile è associato uno spazio
fisico (nella RAM) che deve essere
sufficiente a contenerlo.
In molti linguaggi di
programmazione, l’uso di variabili
deve essere dichiarato prima di
essere usato (per riservare la
memoria)
40. Come funzionano?
Potremmo dire che
una variabile
sembra un cestino,
in cui possiamo
inserire alcune
informazioni.
Questo processo è noto
come assegnazione di
valore o semplicemente
assegnazione
Se fate una
assegnazione in un
momento
successivo...
Il valore precedente è
perso per sempre.
Davvero per sempre.
Una variabile contiene
SEMPRE un solo
valore
41. Tipo di una variabile
Proseguendo con la metafora del cestino, dovremmo sapere CHE
COSA dovrà contenere il cestino per fare le cose a modo. Un cestino
per contenere carta è fatto in modo diverso di un cestino per contenere
acqua; come pure un cestino per il pane.
Inoltre “size matters”: un cestino da 2 litri è una cosa, un cestino da 200
litri è ben diverso. Se usate solo cestini piccoli, rischiate
un’inondazione, se usate solo cestini grandi… beh… il vostro
appartamento potrebbe avere dei problemi.
42. Tipi di variabile (primitivi)
● INTERI
Memorizza numeri interi positivi e negativi
● REALI
Memorizza numeri con la virgola (attenti, si usa il punto, seguendo il
modello anglosassone)
● LETTERE
Lettere tipicamente dell’alfabeto latino. Argomento complesso.
● BOOLEANO
Memorizza solo due possibili valori: vero (true,1) o falso (false,0)
43. Variabili scalari (e non)
Le variabili di cui parliamo sono le cosiddette variabili scalari -
prendendo a prestito il termine dal mondo della fisica - e significa che il
valore può essere descritto da un singolo numero. Ovvero, possono
assumere un solo valore del tipo indicato. Sono dette anche variabili
primitive o fondamentali e, come suggerisce il nome, sono le prime che
tratteremo.
Esistono tuttavia altri tipi di variabili, definiti “aggregati” o “composti”.
Si tratta di variabili che possono assumere più valori dello stesso tipo (o
di tipi diversi). Esempi tipici sono le stringhe (per memorizzare le
parole), gli array, i vettori e le liste. Un tipo molto importante sono i
cosiddetti oggetti, che integrano in una variabile non solo i valori ma il
modo per accedervi.
44. Compatibilità
In generale i tipi di variabili NON
sono compatibili tra loro . Non è
possibile assegnate a un INTERO
una PAROLA, no? (pere con pere,
mele con mele)
Certi linguaggi permettono una
limitata forma di compatibilità, per
esempio dal “Piccolo” al “Grande”,
una sorta di promozione
automatica di tipo.
Per cui è in genere possibile
assegnare un INTERO a un
REALE (ma non viceversa).
REALE INTERO
REALE
INTERO
REALE INTERO
45. Costanti
Alcuni linguaggi permettono di avere variabili immutabili, dette
costanti. Aldilà dell’apparente ossimoro, hanno una certa utilità, per
chiarezza e semplicità.
Pensate come calcolare l’area di un cerchio usando una costante
chiamata PIGRECO e un valore come
3.14159265358979323846264338327950288419716939937510582097
49445923078164062862089986280348253421170679.
46. Nomi di variabili: indicazioni
Alcune indicazioni generali
● Variabili a lettera singola sono ammessi
solo per indici (i, j, k) o casi in cui sia
chiaro il loro scopo (es: x come
incognita)
● le variabili normali iniziano sempre con
una minuscola
● nel caso di parola composte si adotta lo
stile-cammello (areaDelCerchio) oppure
lo stile-serpente (area_del_cerchio)
● le costanti sono TUTTE MAIUSCOLE
● variabili di sistema o di librerie iniziano
con un underscore (se possibile)
Una variante è la cosiddetta Notazione
Ungherese, che richiede che il nome inizi
con una descrizione del tipo. Es: sParola,
int64Somma.
Regole
In tutti i linguaggi di programmazione
standard i nomi di variabili DEVONO
iniziare con una lettera (A-Z o a-z), per
distinguerli dai numeri.
POSSONO proseguire con lettere, numeri o
underscore (“_”). Certi linguaggi (C/C++)
permettono di iniziare con l’Underscore.
Nella maggioranza dei casi, i nomi sono
“CASE SENSITIVE” (Ciao è diverso da ciao
e da CIAO).
Esempi: A, Eccezionale16, a_i_u_t_o, 14A
Stile
È buona norma seguire uno stile uniforme,
sia a livello personale, sia a livello di gruppo
di lavoro.
47. Nomen Omen
I nomi della variabili possono essere
estremamente importanti. Specie per la
lettura e la comprensione di un testo o di un
algoritmo.
Questo però spesso cozza con l’intrinseca
pigrizia dell’essere umano e, specificamente,
dei programmatori.
Le variabili dovrebbero avere NOMI
SIGNIFICATIVI. Un programma le cui
variabili sono a,b,c,a1,aa,cc,
cicciolino,birollo non chiariscono nulla e -
anzi - confondono. Risparmiare tre lettere
può causare una gran perdita di tempo nel
futuro.
...ma il tempo che
risparmiate per
scrivere k al posto di
ch, esattamente
come lo impegnate?
48. Il ruolo
Le variabili non vanno utilizzati a caso, ma sempre per uno scopo
preciso. Anche se usare una variabile in più o in meno non ha -
apparentemente - un grande costo,
In linea di massima, se non trovate un ruolo adatto alla variabile che
volete utilizzare….forse la variabile non serve.
Sono stati identificati una decina di ruoli principali delle variabili; per
evitare che restino una pura lettera vuota, li introdurremo gradualmente,
in modo da capirne il loro funzionamento.
50. Assegnazione
La principale operazione che si rende assolutamente necessaria in ogni
algoritmo o programma è l’istruzione di assegnazione. Il suo
significato è che particolare variabile è assegnato un valore, frutto in
genere di un calcolo o di una condizione. Più formalmente, possiamo
dire che una istruzione di assegnazione ha questo formato generale:
<variabile> ← <espressione>
La parte sinistra (detta in inglese lvalue, da left value) è una variabile, e
conterrà il risultato dell’assegnazione.
La parte destra (rvalue, da rvalue) è una espressione (logica o
matematica) che produce un valore compatibile con il tipo di variabile
utilizzato.
51. Assegnazione: calcoli
Operazioni elementari
I simboli che denotano le quattro operazioni
elementari sono:
Per la somma: +
Per la sottrazione: -
Per il prodotto: *
Per la divisione: /
Il meno rappresenta anche l’operazione di
inversione di segno (“meno unario”).
Spesso sono possibili alcune altre operazioni,
come ad esempio l’elevamento a potenza (^)
oppure il resto della divisione (%). Tuttavia,
non tutti i linguaggi di programmazione li
ammettono.
Priorità
È possibile effettuare più operazioni in una
sola volta. In questo caso si segue la seguente
priorità
● Meno unario (per indicare che il numero
è negativo)
● Elevamento a potenza
● Prodotto e divisione
● Somma e sottrazione
In caso di parità di priorità si procede da
sinistra a destra. Bisogna prestare attenzione
perché ogni tanto i risultati non sono quelli
attesi.
Per cui conviene utilizzare le parentesi - solo
quelle tonde!
52. Quiz!
● Quanto valgono le variabili?
X ← 5+4;
Y ← 6*-3-3;
Z ← -60/10/3*2
W ← -60*10/3*2
X ← X +1;
53. Assegnazione: funzioni
Operazioni avanzate
In linea di massima è possibile utilizzare
una vasta gamma di funzioni di ambito
matematico, come ad esempio la radice
quadrata, il valore assoluto,
l’esponenziale e simile.
Le funzioni sono espresse con il nome
(tipicamente in inglese accorciato) e gli
argomenti racchiusi tra parentesi. Esempi
di funzioni:
● sqrt(x) [radice quadrata, square
root]
● abs(x); [valore assoluto, absolute]
● min(x,y); [minimum]
Confronti
Sono possibili operatori che fanno
confronti tra due operandi e ci
restituiscano Vero o Falso. Questi
sono
● Per il maggiore, maggiore o
uguale: >,>=
● Per il minore, minore o uguale:
<, <=
● Uguale: == (talvolta ===,
raramente =)
● Diverso: != (talvolta <>)
54. Input e Output
Contrariamente a quanto si può pensare, non
si tratta di operazioni veramente elementari.
Inserire i dati da una tastiera è un’operazione
complessa che è lasciata in mano a funzioni
specializzate - in molti linguaggi non fa parte
nel nucleo base del linguaggio stesso.
In linea di massima si fa riferimento a
funzioni, che però risultano di tipo un po’
strano, e variano da linguaggio a linguaggio.
Ecco un breve elenco in cui, in vari linguaggi,
si legge la variabile intera a tramite tastiera.
● C: scanf(“%d”,&a)
● C++: cin>>a
● Python: a=input();
● Java: Scanner = new Scanner(
System.in ); a=s.nextInt();
● Javascript: di fatto impossibile.
Per questo motivo, nelle spiegazioni degli
algoritmi, useremo delle indicazioni
generiche come input () o output(A) e, in
molti casi, ignoreremo del tutto l’aspetto
del’input/output
57. Ricapitoliamo
Ci troviamo di fronte a un problema; se siamo stati bravi e attenti,
abbiamo correttamente letto e interpretato il testo e, conseguentemente,
abbiamo identificato i dati di input e di output.
Non ci resta che identificare le operazioni e metterle nell’ordina giusto
e il gioco è fatto.
O no?
In teoria si. In realtà le cose non sono sono mai così semplici - neppure
quando lo sono davvero - perché non siamo infallibili. E le nostre prime
scelte potrebbero non rivelarsi ottimali o corrette.
58. Dominare la bestia
Il processo di scrittura di un algoritmo
assomiglia a quello di addomesticazione di un
animale selvaggio. Si prova con una strada, si
fanno progressi, poi si prova a correggere il tiro,
sinché la “bestia” risulta sotto controllo.
Nello specifico, le operazioni dipendono dalla
scelta fatta delle variabili, anche perché
agiscono su di esse, e le modificano. Allo stesso
modo la scelta delle variabili influenza la scelta
delle operazioni. È processo di retroazione
(feedback) e prima che si possa pervenire ad una
scelta equilibrata e soddisfacente occorre fare
più tentativi.
In generale, in Informatica, la massima “buona
la prima” non funziona: si lavora per
raffinamenti successivi.
Scelta variabili
Scelta
operazioni
59. La tecnica
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; quando il flusso del
ragionamento è stato ben strutturato, anche i
fenomeni più complessi saranno addomesticati e
trasportabili in una logica computazione.
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.
Il punto è proprio quello di rendere espliciti
questi ragionamenti. Per fortuna, l’algoritmista
non è solo: ha a disposizione una serie di
strumenti che, utilizzati correttamente, gli
permettono di trovare le soluzioni più adatte ai
problemi.
60. La cassetta degli attrezzi
La sequenza
Forma più semplice di struttura, indica che le
operazioni devono essere eseguite nell’ordine
indicato.
La selezione
È la struttura in cui il flusso delle istruzioni
può prendere più strade, a seconda del
risultato di una operazione di confronto.
Nella forma più semplice la diramazione è a
due vie (vero/falso) ma sono possibili
diramazioni a più vie
L’iterazione
Struttura che permette di ripetere una o più
istruzioni un certo numero di volte. Si tratta
probabilmente della struttura più complicata
per i novizi.
La decomposizione
E’ la struttura che permette di fare
riferimento a algoritmi noti che risolvono una
parte del problema, senza dover “reinventare
l’acqua calda”
La ricorsione
Forma avanzata della precedente, permette di
richiamare l’algoritmo stesso, in una sorta di
“riciclo infinto”. Decisamente la struttura più
complicata.
61. Il teorema
Tra tutti gli strumenti, che affronteremo gradualmente, i primi tre sono
davvero importanti ed essenziali. Lo dimostra il famoso Teorema di
Böhm-Jacopini che ci dice che:
“Qualunque algoritmo può essere implementato in fase di
programmazione utilizzando tre sole strutture di controllo: la
sequenza, la selezione ed il ciclo (iterazione), opportunamente
combinate tra loro”
Dominando quindi queste tre strutture di controllo, possiamo
potenzialmente scrivere qualsiasi algoritmo.
63. A che punto siamo
Cosa abbiamo visto
In questa prima parte, avete acquisito una
certa quantità di nozioni soprattutto teoriche:
cos’è un algoritmo, cosa sono le variabili, il
teorema di Boehm-Jacopini, un metodo
generale di costruzione degli algoritmi, cenni
sulla loro rappresentazione algoritmi.
Tutto questo, unitamente alle esperienze
pratiche, dovrebbe avervi fornito le basi per
iniziare a lavorare davvero sugli algoritmi.
In altre parole...non siete più semplici
apprendisti, ma potete iniziare la vostra
carriera di “Mago” algoritmista.
Passare di livello
Per poter dire di aver acquisito il passaggio al
1° livello dovreste avere effettuato:
● Almeno 2 riflessioni sulle esercitazioni
● Test sulle conoscenze
● Prova di costruzione di algoritmo
elementare