Università degli Studi di Ferrara Dipartimento di Ingegneria Fondamenti di Informatica modulo B Corso di Laurea triennale in Ingegneria Elettronica e Informatica Prof. Evelina Lamma Anno Accademico 2012/13 1 OBIETTIVI (modulo B) • Approfondire l’uso del linguaggio C rispetto a quanto noto dal modulo A (propedeutico) • Presentare le principali strutture di dato utilizzate per applicazioni informatiche e gli algoritmi associati (discutendone la complessità) • Introdurre il concetto di componente software (modulo, tipo di dato astratto, classe e oggetto) • Presentare i principi della programmazione a oggetti e il linguaggio Java • Sperimentare librerie di componenti Java per le strutture di dato (JCF) 2 OBIETTIVO: SUPERARE L’ESAME A GIUGNO-LUGLIO 3 E’ NOSTRO OBIETTIVO CHE ACQUISIATE CFU! • Fondamenti di Informatica vale 12 CFU • Lezioni e ricevimento • Tutorato (esercizi, passo passo) 4 LEZIONI e RICEVIMENTO • Mercoledì, h. 11-13.30 Aula 1 (no il 27/2-vedi orario) • Giovedì, h. 11-13.30 Aula 1 (no il 7/3 – vedi orario) alcune lezioni si terranno in Laboratorio di Informatica Grande (vedi orario lezioni, settimanalmente) • Ricevimento, nel II semestre: – Ogni mercoledì, h. 10-11 e su richiesta h. 14-15 – Dip. di Ingegneria, III piano – tel. interno 4894 5 SITO DEL MODULO B http://www.unife.it/ing/informazione/fond-info-modulo-b Riferimento per: • materiale didattico (lucidi delle lezioni, esercizi, programmi svolti) • struttura e modalità d’esame • testi dei compiti d’esame e loro soluzione • Avvisi su lezioni che si svolgeranno in Laboratorio (ma anche sito orario lezioni, settimanale) 6 TUTORATO • Attività di esercitazione assistita da tutore • Esercizi proposti a lezione e risolti individualmente, con il supporto dei tutori • Due turni, almeno inizialmente, mercoledi’ alle ore 8.45 oppure alle ore 14 • Iscriversi alla Lista creata come appello in data 27 Febbrario, nel turno preferito, entro oggi!!!! Grazie! 7 KUNERANGO • www.kunerango.com • Piattaforma sociale per preparazione esami, sviluppata da nostri studenti magistrali di Ingegneria Informatica • Scambio di info, appunti, etc. / ricevimenti a distanza / avvisi 8 ESAME • In due parti (A e B separati), alla fine di ogni modulo • Voto finale = media delle prove parziali • Solo per chi ha già superato il parziale modulo A (entro il 2013 occorre superare la parte B!) • In un'unica parte (A+B), alla fine di tutto il corso 9 ESAME – parziale B [o A+B] • Una prova Java di programmazione in laboratorio (on/off) • Scrittura di un programma in linguaggio Java • Occorre dimostrare di saper effettivamente produrre un programma eseguibile • Una prova C (in laboratorio) • Sintesi di un programma C che verte sulle strutture dati (liste, alberi, tavole), compilato ed eseguito correttamente [A+B ha una funzione in più, solitamente su vettori] • Una prova di teoria (scritta) • Esercizi (teoria della parte B: analisi di complessità, risposte a domande aperte su OOP e Java, [+ teoria della parte A se non già superato il parziale]) 10 Esame: organizzazione 45 min lab, Java 2-2,5 h lab, C <=1h scritto, teoria E’ facoltativo richiedere un esame orale Non è possibile consultare appunti o testi durante le prove (sia scritte sia pratiche). 11 APPELLI D’ESAME • Date e liste d’esame pubblicate prossimamente sul portale: http://studiare.unife.it • Indicativamente 2-3 prove tra Giugno e Luglio • Ore 8.45-9 prova pratica in Lab. di Informatica, a seguire prova C e scritto nel pomeriggio) 12 PREREQUISITI... • Modulo A (almeno studiato e assimilato se non superato il parziale …) • per affronatre e superare l’esame è indispensabile fare costantemente esercizi al calcolatore Esercizi al studio calcolatore LABORATORIO/TUTORATO • Attività di esercitazione assistita da tutore • Attività di esercitazione libera 13 INFORMAZIONI UTILI • Orario di Ricevimento • Mercoledì h. 10-11 c/o Dipartimento di Ingegneria, III piano (blu) ufficio 324. • Posta elettronica [email protected] • Telefono 0532-97-4894 • E inoltre... • Tutor per il laboratorio: • Andrea Peano • Riccardo Zese [email protected] 14 Modulo A - recap • • • • Architettura dei sistemi di elaborazione. – Struttura generale di un calcolatore elettronico, macchina di Von Neumann. Software di base per sistemi di elaborazione: il sistema operativo. – Il sistema operativo Window, il file system. Metodi per l'analisi di un problema. – Algoritmi e programmi. I linguaggi di programmazione e cenni alla loro evoluzione. – Ambienti di programmazione: editor, debugger, compilatori ed interpreti; fasi di sviluppo di un programma. Sviluppo top-down e bottom-up. 15 Modulo A – recap (2) • Il linguaggio C. – Alfabeto e sintassi del C, Tipi di dato primitivi in C, Tipi di dato scalari e strutturati (array e struct) – Espressioni, – Dichiarazione di costanti, variabili e loro tipo. – Istruzioni di assegnamento e di ingresso/uscita, composte, condizionali e cicli. – Funzioni e procedure, record di attivazione. Ricorsione e ricorsione tail – Tecniche di passaggio dei parametri, Regole di visibilità e tempo di vita. – Librerie standard. – Gestione di file binari e di testo. – Il preprocessore C, il linker. – Progetti su più file. – Argomenti del main 16 PROGRAMMA DEL MODULO B • Algoritmi e strutture di dati: – Cenni sulle tecniche per la gestione di tabelle, liste, alberi e loro realizzazione in C. Algoritmi di ricerca su tali strutture dati. Complessità degli algoritmi (applicata alle strutture dato presentate e agli algoritmi per esse). Algoritmi di ordinamento. • Approfondimenti sul linguaggio C: – Funzioni come parametri. Variabili statiche. Altri costrutti C: switch case. Programmazione “modulare” in C. File header e file implementazione. 17 PROGRAMMA DEL MODULO B • La programmazione a oggetti e il linguaggio Java: – Il concetto di componente software. Progettare per astrazioni. Incapsulamento e protezione. Classi ed ereditarietà. – Il linguaggio Java: classe, costruzione e distruzione di oggetti, oggetti semplici e oggetti composti. Package e Package di I/O. Ereditarietà, Classi Astratte, Interfacce. Eccezioni. Le librerie grafiche AWT e Swing. Realizzazione di Applet. Java e la rete. Strutture dati in Java: la Java Collections Framework (JCF). 18 Testi e materiale consigliato • Per la parte sul linguaggio C: – Copie dei lucidi mostrati a lezione (sono scaricabili dal sito del corso) – A. Ciampolini, E. Lamma. Esercizi di programmazione – Linguaggio C, Progetto Leonardo, 1999. – C. Demetrescu, I. Finocchi, G.F. Italiano, Algoritmi e strutture dati, McGraw-Hill, 2008. – S. Ceri, D. Mandrioli, L. Sbattella, Informatica Programmazione, McGraw-Hill, 2° edizione (Cap 10). 19 Testi e materiale consigliato • Per la parte sul linguaggio Java, qualsiasi testo introduttivo a tale linguaggio, tra questi segnaliamo: – Cay S. di Horstmann, Concetti di informatica e fondamenti di Java - 4a ed., Apogeo, Milano. – H. M. Deitel, P. J. Deitel. Java Fondamenti di Programmazione, 3a ed., Apogeo, Milano. – J. Lewis,W. Loftus, Java - Fondamenti di progettazione software, Addison Wesley Italia. 20 Risorse per la programmazione • Ambienti di programmazione utilizzati nel corso disponibili in Laboratorio di Informatica: – MS VisualStudio – Eclipse (Jcreator, più semplice, ma …) 21 For foreign students • It is possible to give the exam in English, provided that I am asked 1 week in advance • If you have problems with Italian, you may consider buying a textbook for Java in your own language 22 Un po’ di storia sui linguaggi 1957 John Backus e colleghi della IBM rilasciano la prima versione del compilatore per il linguaggio di programmazione FORTRAN (Formula Translator) alla Westinghouse. 1959 Si forma il Comitato per i linguaggi di sistemi di dati e nasce il COBOL (Common Business Oriented Language). 1959 John McCarthy sviluppa il linguaggio LISP (List Processing) per le applicazioni di Intelligenza Artificiale. 1964 Nasce il linguaggio BASIC (Beginner's Allpurpose Symbolic Instruction Code). E' sviluppato a Dartmouth da John Kemeny e Thomas Kurtz. Ne deriveranno molte varianti. 24 Un po’ di storia sui linguaggi 1967 Ole-Johan Dahl e Kristen Nygaard del Centro Computer Norvegese, completano una versione general-purpose del linguaggio SIMULA, il primo linguaggio object-oriented. 1972 Dennis Ritchie sviluppa il linguaggio "C" ai laboratori Bell. Così chiamato semplicemente perchè il suo predecessore era stato battezzato "B". 1995 Nasce il linguaggio di programmazione Java, piattaforma indipendente per sviluppo di applicazioni. 25 EVOLUZIONE DEI LINGUAGGI ADA C++ VISICALC PROLOG SMALLTALK FORTRAN77 LISP PASCAL SIMULA67 LISP ALGOL APL COBOL LISP ALGOL LISP FORTRAN C Linguaggi-macchina PlanKalcul 1945 1950 1960 1970 1980 1990 2000 26 LINGUAGGI DI ALTO LIVELLO Barriera di astrazione Fortran C Modula-2 Smalltalk Java Cobol Basic Pascal Python Algol Simula67 C++ Ada Lisp Scheme Prolog ML 27 LINGUAGGI DI ALTO LIVELLO Barriera di astrazione IMPERATIVI Fortran C Modula-2 Smalltalk Java Cobol Basic Pascal Python Algol Lisp Simula67 C++ A OGGETTI Ada Scheme Prolog DICHIARATIVI FUNZIONALI ML 28 EVOLUZIONE DEI LINGUAGGI FORTRAN ALGOL60 BASIC SIMULA67 PASCAL ADA SMALLTALK C++ 29 Quali astrazioni? • Sui dati: da indirizzi fisici a nomi simbolici per le variabili (Assembler) • Sul controllo (programmazione strutturata, Pascal, C): – sequenza (;), – blocco, – if else, while do, etc. { int p=1; for (i=1 ; i <= n ; ++i) . . . } p *= x; 30 Astrazioni funzionali • Sulle operazioni (funzioni): long potenza(int x, int n) /* par. formali */ { int i; long p = 1; /* var. locali */ for (i=1 ; i <= n ; ++i) p *= x; return p; } long Y; Y=potenza(X,10); 31 Encapsulation • Coniugare l’astrazione su dati e operazioni (astrazioni di dato, tipi di dato astratto, classi e oggetti) – Incapsulamento (dati e operazioni) – Protezione – Coesione – Riuso – … (Ereditarietà) 32 OOP e Java public class Counter { private int x; public void reset() { x = 0; } public void inc() { x++; } public int getValue() { return x;} } Counter Y; Y = new Counter(); Y.reset(); Y.inc(); 33 Programmazione Orientata agli Oggetti (OOP) • Astrazione: separazione fra interfaccia e implementazione • Incapsulamento: insieme di meccanismi che consentono di proteggere lo stato di un oggetto e in generale di nascondere gli aspetti che non si vogliono rendere pubblici – Linguaggi object-based • Ereditarietà: consente di creare un componente (classe) che riusa metodi e attributi di un componente (classe) già esistente ─ Linguaggi object-oriented public class BiCounter extends Counter { public void dec() { x--; } } 35 Ereditarietà public class Counter { private int x; public void reset() { x = 0; } public void inc() { x++; } public int getValue() { return x;} } public class BiCounter extends Counter { public void dec() { x--; } } Counter Y; Y = new BiCounter(); Y.reset(); Y.inc(); Y.dec(); 36