Programmazione 2  canale A-D

2° semestre  A.A. 2007-08


Docente :   Francesco Parisi-Presicce
Ufficio:  Via Salaria 113, terzo piano, stanza 345a    
telefono : 06 4991 8514
Email: parisi (AT) di   (DOT) uniroma1 (DOT) it  (inserire nel Subject  Progr2)
Orario ricevimento studenti:  Mar e Ven  2:30 - 4:30 e per Appuntamento
Esercitazioni:  dott. Lorenzo Carlucci     carlucci (AT) di (DOT) uniroma1 (DOT) it 

telefono : 06 4991 8358


 

 AVVISI



 

OBIETTIVO DEL CORSO: 

L'obiettivo del corso, che prosegue il cammino iniziato con Programmazione I, é quello di portare lo studente ad un buon livello di dimestichezza programmativa. Il linguaggio di riferimento è il C. Alla fine del corso lo studente


Il corso é fortemente integrato con il corso di Laboratorio Programmazione.

 

MODALITA' D'ESAME: 

L'esame consiste in una prova scritta (un insieme di esercizi) ed una prova orale facoltativa. È prevista una prova scritta intermedia (mercoledì 23 aprile) che riguarda solamente gli argomenti svolti nella prima parte del corso.
Nell'appello della sessione estiva gli esercizi della prova scritta saranno divisi in due parti: gli esercizi relativi agli argomenti della prima parte del corso e quelli relativi alla seconda parte. Chi ha superato la prova intermedia può completare l'esame svolgendo solo gli esercizi della seconda parte.
Il risultato della prova intermedia è valido solamente per l'appello della sessione estiva.
Se si desidera tentare di migliorare il voto della prova scritta è possibile sostenere la prova orale. In quest'ultimo caso, se si rifiuta il voto determinato dalle due prove (scritta e orale) si dovrà risostenere la prova scritta.

Nella prova scritta è estremamente importante che le soluzioni siano scritte in modo chiaramente leggibile ed esauriente. Se una soluzione non è sufficientemente ben scritta, non sarà presa in considerazione.




PROGRAMMA (preliminare)


Ricorsione. Richiami di programmazione ricorsiva: i fondamenti della ricorsione; lo stack delle chiamate ricorsive; esempi di programmi ricorsivi. La "tail recursion". Richiami su strutture dinamiche ricorsive: le liste. Cenni di complessità di spazio e di tempo per gli algoritmi e i programmi. Confronto tra soluzioni iterative e ricorsive. Tecniche per la scrittura di programmi corretti. L'importanza della specifica precisa di un programma. Precondizioni e postcondizioni delle funzioni. Uso di assert per la loro verifica. Strutturazione dei programmi: sottoprogrammi e moduli. Tipi di dato astratti. Mascheramento dell'informazione. Pile e code: definizione e implementazione mediante liste e vettori. Invarianti come strumenti di progettazione di cicli. Applicazione del metodo al problema dell'ordinamento.

Alberi binari: definizione e implementazione. Proprietà degli alberi binari: altezza, foglie, alberi pieni, completi, criteri di bilanciamento. Alberi binari di ricerca. Grafi, loro rappresentazione e visita di grafi.

Aspetti di sicurezza nello sviluppo di programmi in C.



DIARIO delle LEZIONI

Introduzione al corso.  Ricorsione: principi, esempi di base e confronto con versioni iterative. Ricorsione di coda.  Problem Solving   Pre- e Post- condizioni.  Programmazione Robusta.  Leggibilità.
    Esercizi di ricorsione su liste:
  1. Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste.
  2. Scrivere una funzione che cancella un nodo da una lista circolare contenente un valore x dato.
  3. Scrivere una funzione per concatenare due liste circolari. La funzione dovrà restituire una puntatore all’ultimo nodo della nuova lista circolare.
Tipi di Dato Astratto    Il tipo Pila e sue implementazioni. Valutazione Postfissa
Esercitazioni sulla ricorsione e sulle liste. Esercitazioni sui tipi di dato astratto e pile.
Tipi di Dato Astratto. Il tipo Coda e sue implementazioni.
Algoritmi di Ordinamento e loro correttezza
Testing e Correttezza dell'algoritmo di ricerca binaria
Esercitazioni dalle 12:30 alle 13:30 in Aula 1 NEC
Prova Intermedia in NEC aula1 dalle 8:30 alle 12:30
E' necessario prenotarsi qui
Discussione della Prova Intermedia
Alberi: rappresentazione ed operazioni per manipolarli Visitaper livelli.  Alberi binari di ricerca. 
Alberi Bilanciati .  Verifica Alberi Bilanciati.  Alberi n-ari.  Aspetti di sicurezza nella programmazione in C. 
Esercitazioni di preparazione agli esami
Esercitazioni di preparazione agli esami


RISORSE:

 Al Kelley, I. Pohl C, didattica e programmazione, Addison-Wesley, traduzione italiana a cura del Prof. G. Pighizzini, Univ. Milano.
In questo testo sono trattati quasi tutti gli argomenti del corso di Programmazione II.

(Si ringrazia il prof. R. Silvestri per i seguenti commenti alla bibliografia):

  1. H.M. Deytel , P.Deytel C corso completo di programmazione, Apogeo, 2000.

    (questo testo è già stato utilizzato a Programmazione I, e servirà ancora per alcune lezioni di Programmazione II).

  2. S.P. Harbison III, G.L. Steele Jr    C: A Reference Manual Prentice Hall.

    Un manuale di riferimento per il linguaggio C estremamente curato e preciso. Utilissimo per risolvere dubbi circa: ciò che è C standard (ANSI/ISO) e ciò che non lo è, portabilità, compatibilità con il C++, ecc. Fortemente consigliato a chiunque voglia fare un uso non occasionale del linguaggio C.

  3. B.W. Kernighan, D.M. Ritchie    Linguaggio C, Jackson libri.

    Il classico manuale del linguaggio C.

  4. B.W. Kernighan, R. Pike    The Practice of Programming,  Addison-Wesley.
    Tratta in modo sintetico e significativo tutti gli aspetti della programmazione. Dalle strutture dati ed algoritmi al debugging e testing, dallo stile di programmazione alla progettazione di librerie, passando per l'analisi delle prestazioni e i metodi per migliorare la portabilità. I linguaggi considerati sono: C, C++ e Java.

  5. J. Bentley    Programming Pearls,  Addison-Wesley.
    Molti dei temi trattati nel libro di Kernighan e Pike sono qui elaborati in modo originale e stimolante. Pieno di divertenti ed istruttivi aneddoti che mostrano la reale differenza tra la teoria e la pratica della programmazione e financo dell'ingegneria del software. Usa i linguaggi C e C++.

  6. S. Mc Connell Code Complete: A Practical Handbook of Software Construction.,  Microsoft Press.
    Un trattamento quasi enciclopedico di tutto ciò che riguarda la programmazione. Tantissimi suggerimenti e consigli per migliorare la programmazione in un qualsiasi linguaggio imperativo: C, Pascal, Fortran, ecc.

  7. Corso in linea di A. D. Marshall 1994-99
     [[http://www.cs.cf.ac.uk/Dave/C/CE.html][Programming in C, UNIX System Calls and Subroutines using C.]]
    Questo corso è completo: da un'introduzione ad argomenti avanzati di programmazione in C sotto UNIX, è scritto in modo chiaro e con molti esempi
  8. Il C introdotto in confronto a Java, per chi già conosce Java. CperJavaExpert.pdf: