Diario lezioni
29/9/03 Lez. 1,2 Presentazione del corso. Programma, obiettivi, organizzazione, verifica finale. Basi fisiche della tecnologia binaria degli elaboratori. Gerarchia dei livelli di descrizione: dall' HW alle applicazioni.
30/9/03 Lez. 3,4 Rappresentazione di dati ed istruzioni mediante bit. Cenni alla codifica ASCII. Bytes e parole. Schema di von Neumann di un elaboratore. Memoria, processore, registri, bus, clock. Programmazione in linguaggio macchina.
2/10/03 Lez. 5,6 Passaggio dal linguaggio macchina al linguaggio assembler. Cenni al firmware. Vantaggi di un uso non dedicato delle risorse. Sistema operativo: principali compiti e caratteristiche generali. Time sharing e multiprogrammazione, muliutenza e gestione delle risorse. Accesso alle informazionisu disco. Filesystem UNIX. Nomi dei files. Concetto di directory.
6/10/03 Lez. 7,8,9 (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 e differenze tra text editor e word processor. Comandi apropos e man per accedere alle informazioni relative ai comandi. Navigazione nel filesystem UNIX. Visualizzazione della lista dei processi.
7/10/03 Lez. 10,11,12 (gruppo 2): vedi gruppo 1.
8/10/03 Lez. 13,14: Processo come applicazione caricata nella memoria del processore per l' esecuzione. Pseudofiles associati ad ogni processo (stdin,stdout,stderr). Possibilita' di comunicazione tra processi. Ridirezione e pipes. Cenni alle comunicazioni tra processi via rete. Cenni ai protocolli di rete ed alla loro stratificazione. Esempio di comunicazione tra processi via rete: transazioni tra web browser e web server mediante protocollo HTTP. Comandi della shell come linguaggio di programmazione interpretato.
9/10/03 Lez. 15,16: Costrutti fondamentali per la programmazione
procedurale: sequenza/iterazione/salto condizionato. Variabili di shell.
Distinzione tra nome e valore delle variabili. Relazioni tra programmi
ed algoritmi. Programmi interpretati e compilati. Funzioni del
compilatore. Cenni alle classificazioni dei linguaggi di programmazione
(imperativi(procedurali, a oggetti)/dichiarativi(logici, funzionali),
procedurale/eventi).
13/10/03 Lez. 17,18,19(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.
14/10/03 Lez. 20,21,22(gruppo 2): vedi gr. 1.
15/10/03 Lez. 23,24: Il linguaggio C. Cenni alla storia dell'
evoluzione del linguaggio C. Standard ANSI-ISO ed estensioni dello
standard. Struttura di un programma C. Ruolo del precompilatore.
Elementi del linguaggio: commenti, istruzioni. Dati: costanti, costanti
simboliche e variabili. Tipi dati primitivi del C.
16/10/03 Lez. 25,26: Rappresentazione binaria di interi e razionali.
Conversioni tra base 2 e 10 e viceversa (richiami). Rappresentazione in
base 8 e 16. Costanti numeriche intere e char rappresentate in forma
ottale ed esadecimale. Dichiarazione di tipo ed assegnazione. Operatori
elementari (+,-,*,/,%,==,!=,<,<=,>,>=, op. unario di cambio
segno). Conversione (cast) esplicita ed implicita tra tipi dati.
Istruzioni if, if-else e for.
20/10/03 Lez. 27,28,29; (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 e if-else.
21/10/03 Lez. 30,31,32; (gruppo 2): vedi gr. 1.
22/10/03 Lez. 33,34: Costrutti if-else:if annidati - if- else if. Switch-case. Salto
incondizionato: goto.
Costrutti di iterazione: while
e do-while. Istruzioni break. continue ed exit.
23/10/03 Lez. 35,36: Operatori logici. Operatore di assegnazione
condizionata. Quadro delle priorita' tra operatori. Esempi di utilizzo.
Rappresentazione di interi signed e unsigned sul computer. Aritmetica
modulare, rappresentazione con bit del segno e complemento a 2 per
interi con segno.
27/10/03 Lez. 37,38,39: 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 come
operatore unario. Utilizzo di funzioni della libreria matematica.
Aritmetica con tipo dati char.
Operatore sizeof e dimensione
dei tipi dati e costanti letterali col compilatore gcc. Illustrazione
delle proprieta' dell' aritmetica degli int. Calcolo del fattoriale.
28/10/03 Lez. 40,41,42: (gruppo 2) vedi gr.1.
29/10/03 Lez. 43,44: Rappresentazione degli interi con bias 127. Rappresentazione
dei 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. Operatori bit-a-bit: &,|,^,~,>>,<<.
30/10/03 Lez 45,46: Esempi di utilizzo degli operatori
bit-a-bit. Concetto, meccanismo ed utilita' di sottoprogrammi. Function
C: dichiarazione, definizione e utilizzo. Istruzione return. Passaggio parametri.
Tipo void. Visibilita'
dei nomi in un programma, variabili locali e globali. Function
ricorsive.
4/11/03 Lez 47,48,49: (gruppo 2) Trasformazione di un proramma
in una function. Ruolo della dichiarazione (prototipo) e del suo
posizionamento. Visibilita' delle variabili. Utilizzo di variabili
globali per ritornare piu' di un valore da una function. Uso del comando time. Uso degli
operatori bit-a-bit per ricavare la rappresentazione binaria di interi.
Verifica delle proprieta' dell' aritmetica tra float. Verifica del
valore di ritorno di un programma (main).
5/11/03 Lez 50,51,52: (gruppo 1) v. gr 2.
6/11/03 Lez 53,54: Puntatori ed indirizzi di memoria. Indirizzo di
una variabile e indirezione di un puntatore ( operatori & e *).
Dichiarazione di puntatori ai vari tipi dati. Costante NULL. Puntatori
come argomenti di function. Esempi di utilizzo. Allocazione dinamica
della memoria (malloc). Classi
di memoria (attributo static).
10/11/03 Lez 55,56,57: (gruppo 1) Utilizzo di puntatori.
Indirezione, indirizzo di e puntatori. Esempi di uso di function che
utilizzano puntatori. Cast tra puntatori. Uso di malloc e massima
memoria utilizzabile.
11/11/03 Lez 58,59,60: (gruppo 2) v. gr. 1.
12/11/03 Lez 61,62: Tipo "puntatore void". Allocazione dinamica (malloc,calloc,realloc, free).
Aritmetica dei puntatori. Array: dichiarazione e utilizzo. Array a piu'
dimensioni. Stringhe. Funzioni di manipolazione di stringhe. Array
e puntatori. Passaggio di array 1D a function.
13/11/03 Lez 63,64: Uso di array bidimensionali e relazioni con
array di puntatori e puntatori a puntatori. Array di stringhe. Uso di
argomenti della function main.
Strutture: dichiarazione del tipo dati, inizializzazione,
utilizzo. Passaggio di strutture a function. Strutture contenenti
puntatori. Unioni.
17/11/03 Lez 65,66,67: (gruppo 1) Utilizzo di puntatori ed array.
Implementazione di un algoritmo di ordinamento (bubblesort) per titpi
numerici e stringhe. Uso di strlen. Definizione
ed uso di strutture.
18/11/03 Lez 68,69,70: (gruppo 2) v. gr.1.
19/11/03 Lez 71,72: 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. Introdizione 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 non
formattato e senza buffer ( file
descriptor, open,close, write, read ).
20/11/03 Lez 73,74: I/O con buffer non formattato (a livello di
carattere, linea e blocco) e formattato (fopen, fclose, fflush, fwrite,fread,
ftell, fseek,
fputc,putc,putchar,fgetc,getc,getchar,fputs,puts,fgets,gets,fread,fwrite,fprintf,printf,sprintf,scanf,sscanf,fscanf).
Convertitori di formato.
24/11/03 Lez 75,76: (gruppo 1) Utilizzo dei covertitori di formato
in lettura e scrittura. Esempio di implementazione e manipolazione
di una lista concatenata mediante strutture. Lettura e scrittura
non formattata. Uso dei costrutti di controllo del precompilatore.
25/11/03 Lez 77,78:(gruppo 2) v. gr. 1.
26/11/03 Lez 78,80: Ciclo di vita del software e sue fasi.
Motivazione e principi della programmazione strutturata. Esempio di
progetto software con simulazione delle varie fasi (analisi, disegno,
codifica, test e validazione).
27/11/03 Lez 81: Cenni a strumenti di debugging e analisi di
efficienza. Discussione del concetto di efficienza del SW. Complementi
su convertitori di formato e sull' uso di array 2D, array di
puntatori e puntatori a puntatori per manipolare le stringhe.