Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019

Pagina creata da Federico Leoni
 
CONTINUA A LEGGERE
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Fondamenti di Informatica
 CdL: Ing. Meccanica e Ing. Gestionale
 Docente: Lorenzo Seidenari
 lorenzo.seidenari@unifi.it

 Lorenzo Seidenari
 Assistant Professor
 http://www.micc.unifi.it/seidenari
 lorenzo.seidenari@unifi.it

 1
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Interessi Scientifici
Visual Recognition

Deep Learning

Interessi Scientifici
 Intelligenza artificiale
 Finzione

 Realtà

 2
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

AI: Applicazioni
 Image Enhancement

 AI: Applicazioni
 Autonomous Driving

 3
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Autonomous Driving@UNIFI
 DINFO e DIEF collaborano allo sviluppo del veicolo
 Formula Student
 Firenze Race Team sta costruendo il nuovo veicolo
 autonomo

Autonomous Driving@UNIFI
 ETH@Zurich Vincitori dell’ultima edizione FSAE

 4
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

 Fondamenti di
 Informatica

Orario delle Lezioni

 5
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Ricevimento e Materiali
• Lunedi dalle 14:30 alle 15:30

• Viale Morgagni 65 presso MICC piano seminterrato

• Chiamare dal citofono il 1395

• Materiali didattici su MOODLE :https://e-l.unifi.it

 Comunicazioni tramite MOODLE! Iscrivetevi!

Modalità d’esame
L'esame si compone di una prova scritta e una orale.
• La prova scritta consiste in alcuni elaborati di programmazione e nella eventuale discussione di
 contenuti del programma.
• La prova scritta è svolta su carta A4. Al termine, viene presentata e discussa la soluzione.
 Successivamente i candidati ricevono la fotocopia del loro elaborato.
• Per accedere alla prova orale, il candidato deve correggere il proprio elaborato,riportando le
 correzioni/variazioni in maniera visibile (i.e. uso di penna rossa) sulla fotocopia.
• Il candidato deve anche realizzare il programma corretto e funzionante che corregge l'elaborato e
 lo completa facendone un programma autocontenuto.
• Il candidato deve infine fornire una autovalutazione del proprio elaborato, in base al valore
 attribuito a ciascuna parte della prova, alla discussione della soluzione, all'esperienza acquisita
 nella correzione e realizzazione effettiva del programma.

 6
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Svolgimento Esame

• La prova orale può essere sostenuta a partire dalla settimana seguente alla prova scritta, non
 oltre la prova scritta successiva.

• La prova orale inizia con la discussione dell'elaborato, e prosegue eventualmente con
 l'approfondimento di tutti i contenuti del programma.

Informatica?
• Informatica: Informazione
 automatica
Deriva dalla contrazione di due termini e riguarda la trattazione automatizzata delle informazioni
(con l’uso di calcolatori...). Termine coniato nl 1968 da Philippe Dreyfus: infor(mation)(auto)matique

• Computer Science: termine che si utilizza nel mondo anglosassone.

Studio dei fondamenti teorici dell'informazione, della sua computazione a livello logico e delle
tecniche pratiche per la sua implementazione e applicazione tramite calcolatori elettronici.

 7
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Finalità del Corso
• Capacità di formalizzare problemi in modo che siano aggredibili tramite algoritmi.

• Capacità di implementare algoritmi tramite il linguaggio C
 • Comprendere la sintassi e la semantica di un linguaggio di programmazione.
 • Tradurre un ‘pensiero computazionale’ in una sequenza di istruzioni corrette sintatticamente
 e semanticamente.
 • Comprendere l’esecuzione di un programma e di conseguenza saper localizzare errori di
 programmazione (DEBUGGING)
 • Stimare il costo di esecuzione di un algoritmo

• Alla fine del corso saprete programmare.

Programmare un calcolatore
Perché Imparare?

 8
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Programmare un calcolatore
Perché Imparare?

Sviluppatori sono parte di qualunque team di
progettazione prodotto.

Fondamentale conoscere la programmazione e i
problemi relativi all’informatica per interagire al
meglio.

Software è alla base di qualunque ottimizzazione
della produzione industriale.

Programmare un calcolatore
Perché Imparare?

Programmare sviluppa capacità logiche e di
problem solving.

Imparare ad affrontare un problema complesso di
programmazione vi espone ad una metodologia
generale di sviluppo processi e gestione progetti
complessi.

 9
Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
01/03/2019

Programma del Corso

Rappresentazione Il Linguaggio C
Introduzione al linguaggio C Il linguaggio C
 o Tipi, variabili e costanti o Tipi variabili e costanti
 o Operatori ed espressioni o Operatori ed espressioni
 o Istruzioni o Puntatori
Rappresentazione dei dati o Array
 o Numeri o Istruzioni
 o Interi senza segno o Funzioni
 o Caratteri o Dati strutturati
 o Interi con segno
Elementi di sintassi di un linguaggio
Elementi di architettura degli elaboratori
Compilazione e assemblaggio di un programma

Programma del Corso

Strutture dati e algoritmi elementari Costo di esecuzione e complessità
Liste Il modello di costo
 o Rappresentazione in forma sequenziale La complessità di un algoritmo
 o Rappresentazione in forma collegata con Algoritmi di ordinamento su vettori
 array e indici
 o Rappresentazione collegata con puntatori o Sequential-sort
 o visita, inserimento, cancellazione Algoritmi di ricerca
Cenni sugli alberi o Binary search
 o Alberi
 o Alberi binari di ricerca: i) Visita in forma
 ricorsiva; ii) Ricerca; iii) Inserimento ordinato

 10
01/03/2019

Programma del Corso

Excel
Operazioni/Formule di base
 o(Filtri, Somma, Media, Max e Min, creazione
 formule semplici, ...)
 o Analisi dati: Tabelle e Grafici
 o Creazione e Uso di Macro

Conoscenza Dichiarativa
• Sino ad oggi siete entrati principalmente in contatto con un tipo di conoscenza detta
 proposizionale o dichiarativa
 Def. = , ∀ ∈ ℝ+ ⋅ = , ∈ ℝ+
 La radice di x è un numero z che moltiplicato per se stesso da x.
• Ci dice cosa è una radice quadrata ma non ci dice COME calcolarla.

• Se voglio calcolare z= 25

• Potrei provare per tentativi:
 z=1->x=1, z=2->x=4, z=3->x=9, z=4->x=16, z=5->x=25!

 11
01/03/2019

Conoscenza Imperativa
• La conoscenza dichiarativa riguarda ciò che è vero e ciò che non lo è. Si possono combinare le
 dichiarazioni per ottenerne di nuove (e.g. sillogismo)
• Non ci aiuta a calcolare i risultati.
• Questo corso si focalizza sulla conoscenza procedurale o imperativa.

• Ovvero avendo in mente un modello matematico del nostro problema, qual è la sequenza di passi
 necessaria a calcolare il risultato che desideriamo?

Tornando all’esempio di prima...
• Se voglio calcolare z= e sapendo che cerco z tale che z*z=x; se x=25
 1. Tiro ad indovinare 0 = 3
 2. Controllo se va bene: 0 ⋅ 0 = 9 (no!)
 3. Modifico il mio tentativo 1 = 4 [aggiungo 1]
 4. Riparto da 1.
• Sembra funzionare...
 • Da che valore 0 si parte?
 • Che succede se x=2.1?
• Il metodo per estrarre una radice quadrata fu inventato da Erone (II secolo d.C.)

 12
01/03/2019

Tornando all’esempio di prima...
• Metodo di Erone per approssimare z = .

 0 = ∈ + inizializzo il mio valore ad un numero positivo
 1. SE: ⋅ = termina.
 1 
 2. +1 =
 2
 +
 
 3. Vai a 1.
• Proviamo!

Tornando all’esempio di prima...
• Metodo di Erone per approssimare z = .

 0 = ∈ + inizializzo il mio valore ad un numero positivo
 1. SE: | ⋅ − | < termina.
 1 
 2. +1 =
 2
 +
 
 3. Vai a 1.
• Proviamo!

 13
01/03/2019

Calcolo di radice di 2 (1.41421...)
 0 = 1 Init
( 0 ⋅ 0 = 1, = 1) Check

 1 2 3
 1 = 1+ = = 1.5 Update
 2 1 2
 1 ⋅ 1 = 2.25, = 0.25 Check

 1 2 2.25+2 4.25
 2 = 1.5 + = = = 1.41 Update
 2 1.5 3 3
( 2 ⋅ 2 = 1.9881, = 0.0119) Check
...

Conoscenza Imperativa
• Abbiamo appena usato un ‘ALGORITMO’
• DEFINIZIONE: Un algoritmo è un procedimento che risolve un problema attraverso un numero
 finito di passi elementari.
• Si può pensare ad un algoritmo come ad una ricetta.
• Elementi fondamentali:
 • Istruzioni
 • Controllo del flusso della computazione (in che ordine eseguire le istruzioni)
 • Condizione di terminazione (l’algoritmo deve terminare...)
 • Input (o pre-condizioni)
 • Output (o post-condizioni)

 14
01/03/2019

Torniamo nuovamente all’esempio
 0 = ∈ +
 1. SE: ⋅ − < ℇ termina. Condizione di terminazione
 1 
 2. +1 = 2
 +
 Istruzioni
 3. Vai a 1.
 Controllo del flusso
Precondizioni: x=2, z=1,err=1

Postcondizioni: x=2, z=1.41,err=0.01

Torniamo nuovamente all’esempio
 0 = ∈ +
 Condizione di terminazione
 1. SE: ⋅ = termina.
 1 
 2. +1 = 2 zn + Istruzioni
 3. Vai a 1.
 Controllo del flusso

 15
01/03/2019

Esempi di Algoritmi
• Preparare un piatto di pasta

• Assemblare un mobile

Esempi di Algoritmi
• Trovare il minimo di una funzione

• Trovare il Massimo Comune Divisore

 16
01/03/2019

Esecuzione degli algoritmi
• Per ottenere dei vantaggi reali dalla definizione di un algoritmo per la risoluzione di un certo
 problema occorre una macchina in grado di eseguirlo.

• Un bravo ingegnere elettronico o meccanico potrebbe pensare ad una macchina in grado di
 eseguire i passi dell’algoritmo così da eseguire i calcoli.

Calcolatori non programmabili

• Un calcolatore non programmabile è costruito all’unico scopo di implementare un algoritmo (e.g. radici
 quadrate).

• Non può essere usato per nessun altro scopo in quanto le istruzioni sono codificate direttamente nella
 sua struttura.

 17
01/03/2019

Calcolatori non programmabili
• La calcolatrice CURTA è stata inventata da un prigioniero di
 Buchenwald, Curt Herzstark durante la seconda guerra mondiale.

• La CURTA è un sistema meccanico in grado di calcolare moltiplicazioni,
 divisioni, addizioni e sottrazioni.

Calcolatori non programmabili
• Il primo sistema elettrico digitale fu sviluppato da Atanasof e Berry
 nel 1937
• E’ in grado di risolvere sistemi lineari fino ad un massimo di 29
 variabili.

 18
01/03/2019

 Calcolatori non programmabili
 • La Turing Bombe, progettata nel 1938 è un macchinario di
 considerevoli dimensioni sviluppato a Bletchey Park da Alan
 Turing.

 • Creato all’unico scopo rompere il codice di ENIGMA, il
 sistema usato dalla marina tedesca per le comunicazioni.

Movies:U-571 (2000), Enigma (2001), The Imitation Game (2014)

 Calcolatori Programmabili
 • Gli esempi visti sono notevoli ma poco interessanti in quanto non consentono di svolgere
 operazioni arbitrarie: contabilità, analisi di immagini, simulazione fisica, controllo e automazione.

 • Per questo scopo occorre un modello di calcolo generale in grado di eseguire un insieme di
 istruzioni base.

 • La macchina deve essere in grado di memorizzare un programma, ovvero una sequenza di
 istruzioni oltre ai dati.

 19
01/03/2019

Calcolatori Programmabili
• EDVAC (Electronic Discrete Variable Automatic
 Computer) è il primo calcolatore programmabile*

• Operazioni: addizioni, sottrazioni, moltiplicazione,
 divisioni e controllo del flusso del programma.
• Memoria seriale di 1000 parole da 34 bit: 5.5Kb

 *vi è una disputa a riguardo, interessante il caso
 della macchina progettata da Babbage nel 1837

Calcolatori Programmabili
• Legge di Moore ci dice che ogni 2 anni il numero di transistor nei processori duplica.

 20
01/03/2019

Linguaggi di Programmazione
• Il calcolatore è un oggetto ‘stupido’ che esegue le istruzioni da noi inserite.

• In che modo possiamo ‘parlare’ al calcolatore?

• Usiamo un linguaggio di programmazione

• Esempi: C, C++, C#, JAVA, Python, MATLAB ...

Sintassi e Semantica
• Occorre un modo per dare istruzioni:
 • Riconoscibili
 • Non ambigue

• Il calcolatore riconoscerà ‘espressioni’ che aderiscono strettamente ad una data sintassi

• In virtù di questa ‘ridotta capacità espressiva’ si ottengono SEMPRE espressioni con un significato
 definito, ovvero la cui semantica è non ambigua.

 21
01/03/2019

 Sintassi
 • La sintassi definisce l’insieme di regole per decretare se un espressione è corretta.

 Esempio di sintassi corretta e scorretta in italiano:

 Un bambino gioca in un prato OK

 La casa mangia la pasta OK

 La la verdura è non sul tavolo NOK

 Semantica
 • La semantica ha a che fare con il significato di un espressione

 Espressioni sintatticamente corrette potrebbero non avere senso (in Italiano)
 Un bambino gioca in un prato OK
 La casa mangia la pasta NOK
 Espressioni sintatticamente corrette potrebbero avere significati ambigui
 FRASE Luca ha visto un uomo nel giardino con un telescopio
 Luca ha visto all’interno di un giardino un uomo in possesso di un telescopio
SIGNFICATI Luca usando il suo telescopio ha visto un uomo all’interno di un giardino

 Luca ha visto un uomo all’interno di un giardino in cui si trova anche un telescopio

 22
01/03/2019

Semantica
• In un linguaggio di programmazione una espressione sintatticamente corretta non è MAI ambigua

b=0
a = b+1

Semantica: b vale zero; a vale la somma di b e 1, ovvero a vale 1

Semantica
• Studieremo la sintassi di C in modo da poter scrivere espressioni corrette.

• Problema del programmatore: comprendere la semantica delle espressioni in modo da
 comunicare al calcolatore istruzioni corrette.

Errori di sintassi
Non ci preoccupano. Sono individuati immediatamente dal compilatore.

 23
01/03/2019

Semantica
• Errori di semantica sono molto più insidiosi. Spesso
 ci si riferisce a essi come BUG

• Il primo bug fu trovato da Grace Hopper nel MARK II
 in pratica il malfunzionamento del supercalcolatore
 era dovuto ad una falena intrappolata al suo interno

• Oggi si parla di BUG software per ogni errore
 semantico che porti ad una esecuzione scorretta di
 un programma (valori errati, mancato rilascio della
 memoria, non terminazione)

Imparare a programmare
• NON È POSSIBLE imparare la ‘teoria’ della programmazione per essere in grado di programmare

• Occorre uno sforzo continuo di applicazione della programmazione.

• CONSIGLIO: pensate a problem noiosi, dispendiosi in termini di tempo che affrontate
 giornalmente o di tanto in tanto. Scrivete del codice per risolverli!

 Time Spent
• PROGRAMMARE:

 24%
 49%

 27%

 Designing Code Writing Code Debugging

 24
01/03/2019

 Imparare il C
 in 21 Slide

Espressioni
• Un’espressione combina costanti e variabili tramite operatori.

Operatori sono tipicamente binari e hanno due operandi

Somma: OPERANDO1 + OPERANDO2
10+1

ATTENZIONE: un’espressione può essere usata come operando per creare espressioni complesse

10*2 + 10*3;

 25
01/03/2019

Variabili
• Una variabile è un nome che rappresenta simbolicamente un valore.

• Inizializzo una variabile con l’operatore = detto assegnazione

a = 1 ;
a = a + 1 ;

Dati
• Le variabili in C devono essere definite assieme al loro tipo
 • int: rappresenta l’insieme dei numeri interi [-1,0,1,2 …]
 • float: rappresenta l’insieme dei numeri reali [2.3,1.0,-100.1 …]
 • double: rappresenta l’insieme dei numeri reali [2.3,1.0,-100.1 …] con una precision doppia
 • char : rappresenta I caratteri ASCII: [a,b,C,D,#....]
• Occorre dichiarare le varibili con il loro tipo:
 int a;
• Può essere conveniente aggregare istanze del medesimo tipo in sequenze ordinate. In C si
 possono usare gli array.
 int a[10]; //definisco un array di 10 elementi
 printf(“%d”,a[8]); //stampo l’element nella posizione 9 della
 sequenza, perchè conto da da 0.

 26
01/03/2019

Programma
• Ogni espressione (la sua semantica) costituisce un’istruzione al calcolatore
• Ogni istruzione va terminata con ;
• Una sequenza di istruzioni è un programma

int a = 1; esecuzione lineare di istruzioni.

int b = 2;

int c = a + b;

Condizioni
• In certi casi è opportuno eseguire delle operazioni dipendentemente da una condizione
• Esempi:
 • se l’acqua bolle butta la pasta
 • se l’acqua bolle butta la pasta, altrimenti aspetta 10 minuti

 • Uscire dal labirinto toccando la parete con la mano destra.
 • Se davanti è libero e la mano destra tocca il muro, vai avanti
 • Altrimenti:
 • Se davanti c’è un muro:
 • ruota a sinistra
 • Altrimenti:
 • ruota a destra e avanza

 27
01/03/2019

Condizioni
• In certi casi è opportuno eseguire delle operazioni dipendentemente da una condizione

if (condition){
 do something;
}else{
 do something else;
}

Condizioni
• Le condizioni si esprimono tramite espressioni logiche.
• Le espressioni logiche sono espressioni il cui valore è !=0 oppure 0
• Dove 0 è considerato FALSO e !=0 è considerato VERO

• Esempi:
 10>0 1//VERO
 int a=0
 a>=0 1//VERO
 a==0 1//VERO
 a
01/03/2019

Algebra di Boole
• Possiamo combinare più espressioni logiche usando l’algebra di Boole

• Si usano gli operatori and, or e not
 &&, ||, !

 a=12
 a > 0 or a < -20 VERO

 a < 20 and a > 0 VERO

 Tabelle di verità

Iterazioni
• Pensiamo all’algoritmo per la ‘’cottura della pasta’’
if (acqua_bolle) {
 butta_pasta();
} else {
 wait_minutes(5);
 if (acqua_bolle){
 butta_pasta();
 } else {
 wait_minutes(5);
 if (acqua_bolle) {
 butta_pasta();
 }
 …

 29
01/03/2019

Iterazioni
• Pensiamo all’algoritmo per la ‘’cottura della pasta’’
if (acqua_bolle) {

 X
 butta_pasta();
} else {
 wait_minutes(5);
 if (acqua_bolle){
 butta_pasta();
 } else {
 wait_minutes(5);
 if (acqua_bolle) {
 butta_pasta();
 }
 …

Iterazioni
• Occorre un costrutto che ci consenta di ripetere una porzione di codice.

while (!acqua_bolle){
 wait_minutes(5);
}
butta_pasta();

 30
01/03/2019

Iterazioni
• Per realizzare cicli usiamo due costrutti: for e while.

• Usiamo while quando occorre eseguire una porzione di codice fino a che una condizione rimane
 vera [Strumento generale]
• Usiamo for quando è evidente che vogliamo scorrere una array o altra struttura sequenziale

while (condition){
 //do something
}
for (init; condition; increment){
 //do something
}

Iterazioni
• Ricetta per le iterazioni

1. Scegliere la variabile che 'conta'
2. Assegnarle il valore iniziale
3. Definire il test per terminare l’iterazione
4. Scrivere il blocco da eseguire
 1. Modificare la variabile di conteggio
5. Eseguire il codice al termine dell’iterazione

 31
01/03/2019

Tornando all’esempio di prima...
• Metodo di Erone per approssimare z = .
 0 = ∈ + inizializzo il mio valore ad un numero positivo
 1. SE: ⋅ = termina.
 1 
 2. +1 = 2 + 
 3. Vai a 1.

• Proviamo in C!

 32
Puoi anche leggere