Diario lezioni
4/10/04 Lez. 1,2 Presentazione del corso. Programma, obiettivi, organizzazione, verifica finale. Accesso all' aula informatica. Utilizzi diversi dell' elaboratore. Basi fisiche della tecnologia binaria degli elaboratori. Bit e byte. Gerarchia dei livelli di descrizione: dall' HW alle applicazioni.
5/10/04 Lez. 3,4 Illustrazione della modalita' di interazione attraverso un' interfaccia grafica e un' interfaccia di linea. Cenni al sistema operativo e interprete di comandi. Rappresentazione di dati ed istruzioni mediante bit. Schema di von Neumann di un elaboratore. Memoria, processore, registri, bus, clock.
6/10/04 Lez.5,6 Files, filesystem e directories. Modalita' di
accesso ai file attraverso interfacce grafiche e mediante la shell
Unix. Nomi dei files. Linguaggio macchina. Linguaggio assembler.
Linguaggi di alto livello e compilatori.
7/10/04 Lez. 7,8 Compilatori ed interpreti. La shell come
interprete. Esecuzione di programmi da parte del processore. Uso
dedicato o condiviso delle risorse: vantaggi e svantaggi. Sistema
operativo: principali compiti e caratteristiche generali. Time sharing
e multiprogrammazione, multiutenza e gestione delle risorse. Programmi
monolitici e architetture client-server.
25/10/04 Lez. 9,10,11 (gruppo 1): Interfaccia di linea UNIX (bash
shell). Principali comandi di linea per: creare directory, cambiare
nome, cancellare , listare files e directory. Uso di un text editor.
Comandi apropos e man per
accedere alle informazioni relative ai comandi. Strutturazione delle
informazioni sui comandi (volumi delle man pages). Navigazione nel
filesystem UNIX. Visualizzazione della lista dei processi.
26/10/04 Lez. 12,13,14(gruppo 2): vedi gruppo 1.
27/10/04 Lez. 15,16: Codifica ASCII per i
caratteri. Pseudofiles associati ad ogni processo Unix
(stdin,stdout,stderr). Ridirezione dell' input, output e
diagnostica. Comunicazione tra processi attraverso il meccanismo
delle pipes. Linguaggi di programmazione per l' implementazione pratica
degli algoritmi. Cenni alle classificazioni dei linguaggi
(Funzionali, Logici, Imperativo-procedurali; procedurali a
oggetti; programmazione event-driven).
28/10/04 Lez. 17,18: Programmazione procedurale come evoluzione
dello stato della memoria - concetto di variabile. Tipi dati primitivi
e derivati e loro utilità. Costrutti fondamentali di
sequenza/iterazione/salto condizionato. Cenni alla storia ed
evoluzione del linguaggio C. Standardizzazione del C (C pre-standard,
standard 89 e 99). Esempio di struttura di un programma C.
Preprocessore, compilatore e linker e loro ruoli.
2/11/04 Lez. 19,20 (gruppo 2), 21,22 (gruppo 1): Esempio di
esecuzione di un programma per la shell (script bash). Ciclo
editing-compilazione-esecuzione per un semplice programma C contenete
istruzioni di I/O. Parametro del compilatore per modificare il nome di
default del binario eseguibile. Ridirezione su file dell' output.
Semplici modifiche al programma. Verifica di alcune delle anomalie
delle caratteristiche dell' aritmetica del computer.
4/11/04 Lez. 23,24: Dati: costanti e variabili. Tipi dati di base del C. Costanti numeriche intere rappresentate in forma decimale, ottale ed esadecimale. Dichiarazione di tipo ed assegnazione. Operatori elementari (+,-,*,/,%, op. unario di cambio segno). Conversione implicita tra tipi dati. Istruzioni if, for.
8/11/04 Lez. 25,26,27 (gruppo 1): Esempi di aritmetica intera, float
e conversione implicita tra tipi aritmetici. Conversione tra formato
interno e rappresentazioni esterne (descrittori di formato %u, %o,%x ).
Operatore unario di incremento e decremento unitario. Cicli for. Uso di
costrutti if.
9/11/04 Lez. 28,29,30 (gruppo 2): vedi gruppo 1.
15/11/04 Lez. 31,32,33 (gruppo 1): Assegnazione come operatore
binario. Conversione implicita e cast esplicito. Costrutti if-else:if annidati - if- else if. Switch-case. Operatore
di assegnazione
condizionata. Trasformazione di un costrutto if-else in switch-case. Implementazione
di un algoritmo iterativo per il calcolo della radice quadrata. Uso
dell' operatore di assegnazione condizionata e del cast esplicito.
Utilizzo di funzioni della libreria matematica.
Aritmetica con tipo dati char.
Operatore e dimensione
dei tipi dati e costanti letterali col compilatore gcc. Illustrazione
delle proprieta' dell' aritmetica degli interi. Calcolo del
fattoriale.
16/11/04 Lez. 34,35 (gruppo 2): vedi gruppo 1.
17/11/04 Lez. 36,37: Costrutti iterativi while e do-while. Istruzioni break e continue. Conversioni tra
base 2 e 10 e viceversa (richiami). Rappresentazione di interi signed e
unsigned sul computer: aritmetica
modulare, rappresentazione con bit del segno, complemento a 2 e bias 127 per
interi con segno.
18/11/04 Lez. 38,39: Rappresentazione in
base 8 e 16. Rappresentazione
dei numeri con virgola in base 2. Conversione tra
base 2 e 10 per numeri con virgola. Standard IEE754/IEC60559:
numeri
normalizzati, denormalizzati e valori eccezionali. Aritmetica floating
point e conseguenze sulle proprieta' algebriche dei reali rappresentati
sul computer.
22/11/04 Lez. 40,41,42 (gruppo 1): Operatori bit a bit. Uso e
trasformazioni di costrutti di salto condizionato e di iterazione.
Utilizzo degli operatori bit a bit
per ricavare la sequenza di bit di una variabile intera.
Determinazione empirica della precisione relativa di tipi float.
Non associatività dell' aritmentica floating point.
Convergenza della successione (1
+ 1/n)^n alla costante di Nepero e: possibili problemi con la
verifica della condizione di uguaglianza tra quantità
float.
23/11/04 Lez. 43,44,45 (gruppo 2): vedi gruppo 1.
24/11/04 Lez. 46,47: Precisione relativa dei tipi float
e double. Function C: dichiarazione, definizione e utilizzo.
Prototipi e loro utilizzo da parte del compilatore.
Istruzione return.
Passaggio parametri.
Tipo void.
Function
ricorsive.
25/11/04 Lez. 48,49: Complementi sulle function
ricorsive; costo computazionale della ricorsione. Function come
strumento di programmazione modulare. Compilazione di più
function presenti nello stesso file o in file separati. Creazione
separata dei files binari oggetto e linking successivo. Variabili
locali e globali. Visibilita' dei nomi relativamente alla
loro collocazione nei blocchi. Classi di memoria nella
dichiarazione delle variabili: classi register, auto.
29/11/04 Lez. 50,51: Classi di memoria. Trasformazione di un programma in un programma con function. Ordine di apparizione delle function in fase di compilazione. Compilazione unita e separata di function. Visibilita' delle variabili. Variabili automatiche e statiche. Function per risolvere la generica equazione di secondo grado. Successione di Fibonacci. Verifica dei tempi di esecuzione.
1/12/04 Lez. 52,53: esercizi con puntatori. Operatori di indirezione e "indirizzo di". Utilizzo di argomenti per passare risultati. Inizializzazione dei puntatori.
2/12/04 Lez. 54,55: Costanti simboliche (qualificatore const nelle dichiarazioni C o #define col pre-compilatore). Arrays C. Stringhe. Inizializzazione, I/O e utilizzo di arrays e stringhe. Sfondamento di indici. Aritmetica dei puntatori. Allocazione dinamica (malloc, calloc, realloc, free).
6/12/04 Lez. 56,57: Libreria di funzioni per la manipolazione di stringhe (string.h). Array a più dimensioni. Puntatori a puntatori. Scansione di stringhe. Utilizzo della classe di memoria extern per accedere a variabili globali in function residenti in files diversi da quello in cui sono dichiarate le variabili globali. Passaggio di array a function. Implementazione dell' algoritmo bubblesort.
7/12/04 Lez. 58,59,60: Unioni e strutture: dichiarazione del tipo
dati, inizializzazione,
utilizzo. Passaggio di strutture a function. Strutture contenenti
puntatori. Utilizzo dei covertitori di formato
in lettura e scrittura. Esempio di implementazione e
manipolazione
di una lista concatenata mediante strutture.
9/12/04 Lez. 61,62: Istruzioni per il preprocessore: definizione di macro con argomenti. Costrutti di controllo del preprocessore ( #if -#elif - #else- #endif, #if defined - #ifdef - #ifndef - #undef ) . Definizione e annullamento di macro mediante opzioni del compilatore. Introduzione all' I/O in C. Operazione di connessione a file esterni. Tipi di I/O: con e senza buffer - formattato e non formattato. I/O con buffer non formattato (a livello di carattere, linea e blocco) e formattato (fopen, fclose, fwrite,fread, fputc,putc,putchar,fgetc,getc,getchar,fputs,puts,fgets,gets,fread,fwrite,fprintf,printf,sprintf,scanf,sscanf,fscanf).