SlideShare a Scribd company logo
1 of 64
GUIDA DEL PERFETTO
ALGORITMISTA
Prof. Marcello Missiroli prof.missiroli@gmail.com
I - Apprendistato
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
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!
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
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
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
Volume I
PARTE 1
Definizioni e concetti
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.
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.
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.
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
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
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.
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.
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
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
Il metodo
Section explanation
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
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..
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.
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.
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
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
.
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
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
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.
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
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
Rappresentazione degli
algoritmi
Trascrivere il pensiero
“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
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
Diagrammi di flusso: critica
Vantaggi
● Intuitivo
● Semplice
● Standard estremamente diffuso
Svantaggi
● Poco pratico
● Non scalabile
● Prono ad errori di lettura.
Variante: struttogramma
Noto anche come diagramma di
Nassi–Shneiderman.
Vantaggi e svantaggi simili ai
diagrammi di flusso, ma
considerevolmente meno diffusi.
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.
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
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”
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”
Volume I
PARTE 2
Le variabili
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)
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
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.
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)
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.
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
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.
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.
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?
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.
Operazioni base
Section explanation
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.
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!
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;
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 <>)
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
Volume I
PARTE 3
Primi algoritmi
Applicare il metodo
Section explanation
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.
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
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.
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.
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.
Conclusoni
Section explanation
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
Credits
TEXT
Il primo algoritmo, Silvano Natalizi
ART
Player Handbook Wallpaper, Bard, Goblin Battle, Cleric, Dungeon of the mad mage - ©
Wizard of the Coast.
Barbaro: Tajuru Beastmaster BY Greg-Opalinski

More Related Content

What's hot

Elaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlabElaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlabprofman
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding   elaboratoAlgoritmo probabilistico di tipo montecarlo per il list decoding   elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding elaboratodanielenicassio
 
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Luca Marignati
 
AIMOOC 2.1 - Alan Turing - Vincenzo Fano
AIMOOC 2.1 - Alan Turing - Vincenzo FanoAIMOOC 2.1 - Alan Turing - Vincenzo Fano
AIMOOC 2.1 - Alan Turing - Vincenzo FanoAlessandro Bogliolo
 
Algoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingAlgoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingdanielenicassio
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioniMajong DevJfu
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)STELITANO
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 

What's hot (18)

Elaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlabElaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlab
 
Algoritmi
Algoritmi Algoritmi
Algoritmi
 
Flow chart
Flow chartFlow chart
Flow chart
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding   elaboratoAlgoritmo probabilistico di tipo montecarlo per il list decoding   elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
 
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
 
AIMOOC 2.1 - Alan Turing - Vincenzo Fano
AIMOOC 2.1 - Alan Turing - Vincenzo FanoAIMOOC 2.1 - Alan Turing - Vincenzo Fano
AIMOOC 2.1 - Alan Turing - Vincenzo Fano
 
1 Programmazione
1   Programmazione1   Programmazione
1 Programmazione
 
Algoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingAlgoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decoding
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
L'algoritmo
L'algoritmoL'algoritmo
L'algoritmo
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)
 
Programmazione
ProgrammazioneProgrammazione
Programmazione
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 

Similar to Guida del perfetto Algoritmista I

Introduzione al coding
Introduzione al codingIntroduzione al coding
Introduzione al codingPaolo Righetto
 
Modulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictModulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictAndreina Concas
 
Coding e pensiero computazionale
Coding e pensiero computazionaleCoding e pensiero computazionale
Coding e pensiero computazionaleGiovanniFabio
 
Il pensiero computazionale
Il pensiero computazionaleIl pensiero computazionale
Il pensiero computazionaleLivio Lucia
 
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmicoAlumni Mathematica
 
Matematica, un approccio algoritmico
Matematica, un approccio algoritmicoMatematica, un approccio algoritmico
Matematica, un approccio algoritmicoStefano Franco
 
coding_competenze_computazionali.pdf
coding_competenze_computazionali.pdfcoding_competenze_computazionali.pdf
coding_competenze_computazionali.pdfLaura Antichi
 
Strumenti E Tecniche
Strumenti E TecnicheStrumenti E Tecniche
Strumenti E Tecnichelab13unisa
 
Computational thinking - Il pensiero computazionale
Computational thinking - Il pensiero computazionaleComputational thinking - Il pensiero computazionale
Computational thinking - Il pensiero computazionaleRaffaele Micelotta
 
concetti chiave coding.pdf
concetti chiave coding.pdfconcetti chiave coding.pdf
concetti chiave coding.pdfLaura Antichi
 

Similar to Guida del perfetto Algoritmista I (20)

Algoritmi
AlgoritmiAlgoritmi
Algoritmi
 
Introduzione al coding
Introduzione al codingIntroduzione al coding
Introduzione al coding
 
Modulo 1 - Dispensa
Modulo 1 - DispensaModulo 1 - Dispensa
Modulo 1 - Dispensa
 
Pensiero smart!
Pensiero smart!Pensiero smart!
Pensiero smart!
 
Che problema i problemi!
 Che problema i problemi!  Che problema i problemi!
Che problema i problemi!
 
Modulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictModulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ict
 
02 algo programmi
02 algo programmi02 algo programmi
02 algo programmi
 
Manuale python
Manuale pythonManuale python
Manuale python
 
Coding e pensiero computazionale
Coding e pensiero computazionaleCoding e pensiero computazionale
Coding e pensiero computazionale
 
Il problema dei problemi di Pietro di Martino
Il problema dei problemi di Pietro di MartinoIl problema dei problemi di Pietro di Martino
Il problema dei problemi di Pietro di Martino
 
Il pensiero computazionale
Il pensiero computazionaleIl pensiero computazionale
Il pensiero computazionale
 
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico
"Come è piccolo il mondo" - Seminario: Matematica, un approccio algoritmico
 
Matematica, un approccio algoritmico
Matematica, un approccio algoritmicoMatematica, un approccio algoritmico
Matematica, un approccio algoritmico
 
Presentazione,
Presentazione,Presentazione,
Presentazione,
 
Presentazione
PresentazionePresentazione
Presentazione
 
coding_competenze_computazionali.pdf
coding_competenze_computazionali.pdfcoding_competenze_computazionali.pdf
coding_competenze_computazionali.pdf
 
Strumenti E Tecniche
Strumenti E TecnicheStrumenti E Tecniche
Strumenti E Tecniche
 
Computational thinking - Il pensiero computazionale
Computational thinking - Il pensiero computazionaleComputational thinking - Il pensiero computazionale
Computational thinking - Il pensiero computazionale
 
concetti chiave coding.pdf
concetti chiave coding.pdfconcetti chiave coding.pdf
concetti chiave coding.pdf
 
Corso Java - Introduzione
Corso Java - IntroduzioneCorso Java - Introduzione
Corso Java - Introduzione
 

More from Marcello Missiroli

More from Marcello Missiroli (20)

Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Variabili
VariabiliVariabili
Variabili
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
 
Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
 
Corso Moodle: perché?
Corso Moodle: perché?Corso Moodle: perché?
Corso Moodle: perché?
 
Il sistema binario
Il sistema binarioIl sistema binario
Il sistema binario
 
Routing dinamico
Routing dinamicoRouting dinamico
Routing dinamico
 
Investire nelle user story
Investire nelle user storyInvestire nelle user story
Investire nelle user story
 

Recently uploaded

Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiorevaleriodinoia35
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaStefano Lariccia
 
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaCON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaRafael Figueredo
 
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.giuliofiorerm
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldivaleriodinoia35
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaStefano Lariccia
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativovaleriodinoia35
 

Recently uploaded (10)

Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiore
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
 
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla CresimaCON OCCHI DIVERSI - catechesi per candidati alla Cresima
CON OCCHI DIVERSI - catechesi per candidati alla Cresima
 
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
RICERCA_SUGLI ANFIBI PER LA PRIMA MEDIA.
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldi
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativo
 

Guida del perfetto Algoritmista I

  • 1. GUIDA DEL PERFETTO ALGORITMISTA Prof. Marcello Missiroli prof.missiroli@gmail.com I - Apprendistato
  • 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”
  • 38. Volume I PARTE 2 Le variabili
  • 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
  • 64. Credits TEXT Il primo algoritmo, Silvano Natalizi ART Player Handbook Wallpaper, Bard, Goblin Battle, Cleric, Dungeon of the mad mage - © Wizard of the Coast. Barbaro: Tajuru Beastmaster BY Greg-Opalinski