Programma del corso

PARTE PRIMA: RAPPRESENTAZIONE ED ELABORAZIONE DELL'INFORMAZIONE
Introduzione all'informatica. Concetto di informazione. Rappresentazione dell'informazione. Supporti, codifiche, codici. Codifica binaria, altre codifiche, codice ASCII.
Rappresentazione binaria. Conversione decimale-binario e viceversa, binario-ottale e binario-esadecimale. Aritmetica binaria naturale. Rappresentazioni a cardinalità finita e problemi inerenti, rappresentazione per numero e segno e per complementi a 2, operazioni, overflow. Rappresentazione dei numeri razionali a precisione fissa e in virgola mobile: principali proprietà, overflow e underflow, operazioni.
Algebra di Boole. Operazioni fondamentali, rappresentazione tabellare, proprietà, legami con l'aritmetica binaria. Costruzione di funzioni booleane desiderate.
Problemi, risoluzione automatica e algoritmi. Proprietà di un algoritmo. Concetto di variabile. Operazioni elementari. Processo di definizione di una soluzione a un dato problema rispetto a un esecutore. Rappresentazione degli algoritmi. Diagrammi di flusso e strutture della programmazione procedurale. Concetto di tipo astratto. Organizzazione funzionale del software e concetto di architettura software. Riuso. Cenni alle problematiche relative all'ingegneria del software e al ciclo di sviluppo.
Classificazione dei linguaggi di programmazione, generazioni, livelli di astrazione, prospettiva storica, paradigmi: procedurale, funzionale, dichiarativo, ad oggetti. Interpreti e compilatori. Macchine astratte.

PARTE SECONDA: IL LINGUAGGIO C++
Introduzione al C++: concetti fondamentali, struttura di un programma C++. Area dati, stack, heap, area codice. Cenni al linguaggio C. Compilazione, collegamento, tool di sviluppo. Tipi, variabili, operatori ed espressioni in C++. Costrutti di programmazione in C++. Concetto di sottoprogramma. Sottoprogrammi in C++. Passaggio dei parametri. Concetto di puntatore; aritmetica dei puntatori; puntatori tipizzati e puntatori a void, puntatori costanti e a costanti. Allocazione dinamica. Introduzione alle liste semplici.Riferimenti. Gestione dei file; meccanismo C; meccanismo C++.
Compilazione separata; spazi dei nomi; cenni alla modularizzazione del software.
Algoritmi notevoli: Inserimento in ordine e ordinamento per fusione, Bubble Sort, ricerca lineare, ricerca in array ordinato, ricerca dicotomica binaria. Concetto di complessità computazionale.
Semplici tecniche di debug con e senza uso del debugger.

PARTE TERZA: ARCHITETTURA DEL CALCOLATORE
Automi a stati finiti, macchina di Turing e modello di Von Neumann: esempi (costruzione di un automa, riconoscitore di sequenze, macchina di Turing che somma due interi). Cenni sulla computabilità e tesi di Church-Turing. Architettura del calcolatore: legami con il modello di Von Neumann, componenti, funzionalità.