Programmazione I  (P-Z)  a.a. 2004/05 


Prof. R. Silvestri e Dott. I. Salvo


Finalità

L'obiettivo del corso è fornire le basi della programmazione dei calcolatori con linguaggi imperativi. Tali basi sono esemplificate tramite l'apprendimento del linguaggio C.

Programma

Nozioni di base

Cenni sulla struttura e funzionamento di un calcolatore. Esecuzione di un programma. Linguaggi assemblativi e linguaggi ad alto livello. Il linguaggio C. Gli algoritmi, lo pseudocodice, i diagrammi di flusso. Dichiarazione di variabili numeriche. Operatori matematici, operatori relazionali, operatori logici. Assegnamenti. Conversioni implicite e conversioni esplicite. Istruzioni di selezione. Istruzioni iterative. Contatori e sentinelle. Formattazione dell'input con printf. Formattazione dell'output con scanf.

Funzioni

I vantaggi della programmazione strutturata. La direttiva #include. Definizione di funzione. Il tipo void. Prototipo di funzione. Passaggio di parametri per valore. Regole di visibilità. Funzioni ricorsive.

Tipi semplici e tipi strutturati

Il tipo carattere e il tipo stringa. Dichiarazione, inizializzazione e utilizzo di vettori. La direttiva #define. Alcuni algoritmi di ordinamento: per inserzione, per selezione, a bolle. L'algoritmo della ricerca binaria. Vettori multidimensionali. Vettori a dimensione variabile. Dichiarazione, inizializzazione ed utilizzo di strutture (struct). Dichiarazione, inizializzazione ed utilizzo di unioni (union). Strutture che contengono altre strutture od unioni. Strutture che contengono vettori. Vettori di strutture. Le enumerazioni (enum). La parola chiave typedef. Dichiarazione, inizializzazione e utilizzo di puntatori. Passaggio di parametri per riferimento: l'operatore di indirizzo & e l'operatore di deriferimento *. Il qualificatore const. Allocazione dinamica della memoria: sizeof, malloc, free. Il tipo void *. La relazione tra puntatori e vettori. I vettori di puntatori. L'aritmetica dei puntatori.

I file su disco

I file ad accesso sequenziale. Le funzioni fopen, fclose, fflush, fgetc, fputc, fgets, fputs, rewind. Lettura e scrittura formattata con fprintf e fscanf.

Introduzione alle strutture di dati dinamiche

Strutture dati lineari: liste, pile, code. Implementazione tramite strutture e puntatori. Linee guida per la realizzazione di piccole librerie: decomposizione in moduli, separazione interfaccia-implementazione, compilazione di più file e compilazione separata. I specificatori static ed extern.

Testi

Testo di riferimento

Testi di approfondimento

  • 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.
  • 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.
  • 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++.
  • S. McConnell     Code Complete   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. Un libro simile ma specifico per il C e per certi versi più concreto: S. Maguire     Writing Solid Code   Microsoft Press.