Fondamenti di Informatica - Lorenzo Seidenari 01/03/2019
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
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
01/03/2019 Interessi Scientifici Visual Recognition Deep Learning Interessi Scientifici Intelligenza artificiale Finzione Realtà 2
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
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
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
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
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
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