INF/01

Curriculum: PERCORSO COMUNE

A.A.
CFU Durata (ore)
Periodo Sede
2016/2017 12 96 Ciclo annuale unico URBINO

Didattica in lingua straniera
Insegnamento interamente in lingua straniera nel percorso online: Inglese

* Per questo insegnamento erogato in modalità mista presenza/online, la didattica online è svolta interamente in lingua straniera e l'esame può essere sostenuto in lingua straniera.

Assegnato ai Corsi di Studio

Docente


Marco Bernardo

marco.bernardo@uniurb.it

Obiettivi Formativi
Questo insegnamento ha lo scopo di illustrare i principi di base, le tecniche e gli strumenti della programmazione di applicazioni informatiche, attraverso la presentazione dei concetti tipici della programmazione imperativa di natura procedurale e della programmazione dichiarativa di natura logica.

Programma
01. Introduzione alla programmazione degli elaboratori
       01.01 Definizioni di base dell'informatica
       01.02 Cenni di storia dell'informatica
       01.03 Elementi di architettura degli elaboratori
       01.04 Elementi di sistemi operativi
       01.05 Elementi di linguaggi di programmazione e compilatori
       01.06 Una metodologia di sviluppo software "in the small"

02. Programmazione procedurale: il linguaggio ANSI C
       02.01 Cenni di storia del C
       02.02 Formato di un programma con una singola funzione
       02.03 Inclusione di libreria
       02.04 Funzione main
       02.05 Identificatori
       02.06 Tipi di dati predefiniti: int, double, char
       02.07 Funzioni di libreria per l'input/output interattivo
       02.08 Funzioni di libreria per l'input/output tramite file

03. Espressioni
       03.01 Definizione di costante simbolica
       03.02 Dichiarazione di variabile
       03.03 Operatori aritmetici
       03.04 Operatori relazionali
       03.05 Operatori logici
       03.06 Operatore condizionale
       03.07 Operatori di assegnamento
       03.08 Operatori di incremento/decremento
       03.09 Operatore virgola
       03.10 Tipo delle espressioni
       03.11 Precedenza e associatività degli operatori

04. Istruzioni
       04.01 Istruzione di assegnamento
       04.02 Istruzione composta
       04.03 Istruzioni di selezione: if, switch
       04.04 Istruzioni di ripetizione: while, for, do-while
       04.05 Istruzione goto
       04.06 Teorema fondamentale della programmazione strutturata

05. Procedure
       05.01 Formato di un programma con più funzioni su un singolo file
       05.02 Dichiarazione di funzione
       05.03 Definizione di funzione e parametri formali
       05.04 Invocazione di funzione e parametri effettivi
       05.05 Istruzione return
       05.06 Parametri e risultato della funzione main
       05.07 Passaggio di parametri per valore e per indirizzo
       05.08 Funzioni ricorsive
       05.09 Modello di esecuzione sequenziale basato su pila
       05.10 Formato di un programma con più funzioni su più file
       05.11 Visibilità degli identificatori locali e non locali

06. Tipi di dati
       06.01 Classificazione dei tipi di dati e operatore sizeof
       06.02 Tipo int: rappresentazione e varianti
       06.03 Tipo double: rappresentazione e varianti
       06.04 Funzioni di libreria matematica
       06.05 Tipo char: rappresentazione e funzioni di libreria
       06.06 Tipi enumerati
       06.07 Conversioni di tipo e operatore di cast
       06.08 Array: rappresentazione e operatore di indicizzazione
       06.09 Stringhe: rappresentazione e funzioni di libreria
       06.10 Strutture e unioni: rappresentazione e operatore punto
       06.11 Puntatori: operatori e funzioni di libreria

07. Correttezza di programmi procedurali
       07.01 Triple di Hoare
       07.02 Determinazione della precondizione più debole
       07.03 Verifica della correttezza di programmi procedurali iterativi
       07.04 Verifica della correttezza di programmi procedurali ricorsivi

08. Introduzione alla logica matematica
       08.01 Cenni di storia della logica
       08.02 Elementi di teoria degli insiemi
       08.03 Relazioni, funzioni, operazioni
       08.04 Principio di induzione

09. Logica proposizionale
       09.01 Sintassi della logica proposizionale
       09.02 Semantica e decidibilità della logica proposizionale
       09.03 Conseguenza ed equivalenza nella logica proposizionale
       09.04 Proprietà algebriche dei connettivi logici
       09.05 Sistemi deduttivi per la logica proposizionale

10. Logica dei predicati
       10.01 Sintassi della logica dei predicati
       10.02 Semantica e indecidibilità della logica dei predicati
       10.03 Conseguenza ed equivalenza nella logica dei predicati
       10.04 Proprietà algebriche dei quantificatori
       10.05 Sistemi deduttivi per la logica dei predicati

11. Programmazione logica: il linguaggio Prolog
       11.01 Forme normali per logica proposizionale e dei predicati
       11.02 Teoria di Herbrand e algoritmo di refutazione
       11.03 Risoluzione di Robinson per la logica proposizionale
       11.04 Unificazione di formule di logica dei predicati
       11.05 Risoluzione di Robinson per la logica dei predicati
       11.06 Prolog: clausole di Horn e strategia di risoluzione SLD
       11.07 Prolog: termini e predicati
       11.08 Prolog: input/output, taglio, negazione, miscellanea

12. Attività di laboratorio in Linux
       12.01 Cenni di storia di Linux
       12.02 Gestione dei file in Linux
       12.03 L'editor gvim
       12.04 Il compilatore gcc
       12.05 L'utility di manutenzione make
       12.06 Il debugger gdb
       12.07 Implementazione dei programmi C introdotti a lezione
       12.08 Il compilatore/interprete gprolog
       12.09 Implementazione dei programmi Prolog introdotti a lezione

Eventuali Propedeuticità
Non vi sono propedeuticità obbligatorie.

Si suggerisce di sostenere l'esame di Programmazione Procedurale e Logica dopo aver sostenuto l'esame di Matematica Discreta e prima di sostenere tutti gli altri esami ad eccezione di quelli di matematica e di fisica.

Risultati di Apprendimento (Descrittori di Dublino)
Conoscenza e comprensione
Lo studente acquisirà le conoscenze fondamentali nel campo della programmazione degli elaboratori, con particolare riferimento al paradigma di programmazione imperativo di natura procedurale esemplificato attraverso il linguaggio ANSI C e al paradigma di programmazione dichiarativo di natura logica esemplificato attraverso il linguaggio Prolog, e diverrà familiare con la terminologia relativa a definizioni di costanti, dichiarazioni di variabili, espressioni aritmetico-logiche, istruzioni di programmazione, funzioni, predicati, parametri, librerie e tipi di dati. Conoscerà inoltre una metodologia per sviluppare sistemi software di piccole dimensioni, come pure la tecnica delle triple di Hoare per verificarne la correttezza. Apprenderà infine i concetti sintattici, semantici, algebrici e deduttivi alla base della logica proposizionale e della logica dei predicati che sono propedeutici alla programmazione logica.

Capacità di applicare conoscenza e comprensione
Lo studente sarà in grado di progettare e sviluppare sistemi software di piccole dimensioni tramite l'applicazione di una metodologia che copre l'analisi del problema, la progettazione dell'algoritmo e l'implementazione, il testing, la verifica e la manutenzione del programma. Per quanto riguarda la fase di implementazione, lo studente saprà condurla sia attraverso un linguaggio di programmazione imperativo di natura procedurale, sia attraverso un linguaggio di programmazione dichiarativo di natura logica.

Autonomia di giudizio
Lo studente sarà in grado di valutare e confrontare progetti alternativi di uno stesso sistema software di piccole dimensioni, così come di analizzare e comparare implementazioni alternative di uno stesso progetto software.

Abilità comunicative
Lo studente sarà in grado di usare in modo appropriato la terminologia dei linguaggi di programmazione imperativi di natura procedurale e dei linguaggi di programmazione dichiarativi di natura logica. Inoltre saprà illustrare le caratteristiche salienti del progetto e dell'implementazione di un sistema software di piccole dimensioni, inclusa la produzione della documentazione del sistema software in termini di relazione tecnica, commenti interni e manuale d'uso.

Capacità di apprendimento
Lo studente acquisirà la capacità di apprendere le peculiarità sintattiche e semantiche di qualsiasi linguaggio di programmazione imperativo di natura procedurale e di qualsiasi linguaggio di programmazione dichiarativo di natura logica.

Materiale Didattico e Attività di Supporto
Il materiale didattico e le comunicazioni specifiche del docente sono reperibili, assieme ad altre attività di supporto, all'interno della piattaforma Moodle › blended.uniurb.it

Modalità Didattiche, Obblighi di Frequenza, Testi di Studio e Modalità di Accertamento
Modalità Didattiche
Lezioni teoriche ed esercitazioni guidate in laboratorio.
Obblighi di Frequenza
Sebbene fortemente consigliata, la frequenza non è obbligatoria.
Testi di Studio
Hanly, Koffman, "Problem Solving and Program Design in C", Addison-Wesley, 2016
(Hanly, Koffman, "Problem Solving e Programmazione in C", Apogeo, 2013).

Kernighan, Ritchie, "The C Programming Language", Prentice Hall, 1988
(Kernighan, Ritchie, "Il Linguaggio C", Pearson/Prentice Hall, 2004).

Asperti, Ciabattoni, "Logica a Informatica", McGraw-Hill, 1997
(Schöning, "Logic for Computer Scientists", Birkhäuser, 2008).

Console, Lamma, Mello, Milano, "Programmazione Logica e Prolog", UTET, 1997
(Sterling, Shapiro, "The Art of Prolog", MIT Press, 1997).

Modalità di Accertamento
Progetto, prova scritta e prova orale.

Il progetto, che cambia ad ogni sessione d'esame, deve essere consegnato almeno 10 giorni prima della prova scritta. Esso è superato se il voto è di almeno 18/30; il voto rimane valido fino alla seconda sessione d'esame successiva a quella in cui il progetto viene consegnato. In caso di consegna tardiva, viene applicata una penale di 3/30 per ogni giorno di ritardo. Qualora il progetto venga riconsegnato in un successivo appello d'esame, il voto del progetto precedentemente consegnato viene annullato; se la riconsegna avviene nella medesima sessione, al voto del nuovo progetto consegnato viene applicata una penale di 5/30 perché gli sviluppatori possono beneficiare della correzione del progetto precedentemente consegnato.

La prova scritta, che cambia ad ogni appello d'esame e può essere sostenuta solo se il progetto è stato superato, consiste in 9 domande più 2 esercizi da svolgere in 90 minuti. Essa è superata se il voto è di almeno 18/30; il voto rimane valido solo per l'appello d'esame in cui la prova scritta viene sostenuta.

La prova orale, che può essere sostenuta solo se il progetto e la prova scritta sono stati superati, consiste in una discussione del progetto e della prova scritta, più ulteriori domande. Se superata, essa determina un aggiustamento compreso tra -5/30 e 5/30 della media dei due precedenti voti, producendo così il voto finale.

Per ulteriori informazioni su progetti ed esami scritti > www.sti.uniurb.it/bernardo/teaching/prog_proc_logi/

Note
L'insegnamento è erogato anche on-line all'interno della piattaforma Moodle > elearning.uniurb.it