PROGRAMMAZIONE I E LABORATORIO O - Z
Modulo PROGRAMMAZIONE I

Anno accademico 2022/2023 - Docente: FABRIZIO MESSINA

Risultati di apprendimento attesi

Conoscenza e capacità di comprensione (knowledge and understanding): l'obiettivo primario del corso è l’acquisizione da parte degli studenti della “filosofia” della programmazione strutturata, e la conoscenza dettagliata della sintassi e della semantica del linguaggio di programmazione C. Il corso rivolge una particolare attenzione allo sviluppo di codice ben scritto e ben strutturato utilizzando le tecniche di base per lo sviluppo del software. 


Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): si intende fornire gli strumenti per conseguire le seguenti abilità pratiche e professionali:

  • Tradurre in codice idee algoritmiche;

  • Progettare, descrivere ed implementare  programmi in C;

  • Saper usare gli strumenti per debug di programmi C;

  • Comprendere ed analizzare codice C di terze parti anche in termini  di efficienza;

  • Orientarsi nella documentazione delle librerie.

Autonomia di giudizio (making judgements): attraverso l'esame di numerosi esempi di codice e una consistente componente pratica che prevede lo svolgimento di esercizi all'elaboratore, il discente sarà in grado di analizzare problemi e progettare e implementare le relative soluzioni software.

Abilità comunicative (communication skills): lo studente acquisirà le necessarie abilità comunicative nell'impiego del linguaggio verbale/tecnico nell'ambito della programmazione degli elaboratori.

Capacità di apprendimento (learning skills): il corso intende fornire al discente le necessarie metodologie teoriche e pratiche da mettere in campo in contesti professionali e, in particolare, la capacità di formulare algoritmi ad-hoc per la risoluzione di nuovi problemi e la possibilità di acquisire facilmente ed in breve tempo un altro linguaggio di programmazione.


DATE D'ESAME

Tutte le date di esame sono pubblicate nel sito www.dmi.unict.it

PROVE IN ITINERE

Sono previste prove in itinere. Il superamento di tutte le prove in itinere equivale al superamento della prova teorica (1).

PROVE DI FINE CORSO

1. Prova teorica. Si tratta di un test a risposta multipla atto a verificare la comprensione degli elementi di base della programmazione e delle principali caratteristiche del linguaggio C. Al test non è assegnato un voto in trentesimi (il compito riceverà esito “ammesso” o “non ammesso”).

2. Prova pratica di laboratorio. Si tratta di una serie di esercizi o un piccolo progetto da svolgere in aula al calcolatore. La prova è giudicata insufficiente se il codice prodotto presenta errori di compilazione o se non produce un output compatibile con le consegne del compito. Verrà assegnato un voto in trentesimi al compito. 

3. Prova orale: una discussione sulla prova svolta al calcolatore, domande sugli argomenti teorici inseriti nel programma. La prova permette di incrementare o decrementare il voto ottenuto alla prova 2) (di norma al massimo 3 punti). Qualora la prova 3) mettesse in luce evidenti lacune, lo studente può essere rimandato, con l’obbligo di ripetere le tre prove.

La verifica dell’apprendimento potrà essere effettuata anche per via telematica, qualora le condizioni lo dovessero richiedere

Modalità di svolgimento dell'insegnamento


Lezioni frontali ed esposizione di schemi ed algoritmi. 


Prerequisiti richiesti

Frequenza e superamento del test finale dei corsi zero di informatica. 

Frequenza lezioni

La frequenza delle lezioni non è obbligatoria ma è fortemente consigliata.



Contenuti del corso

Introduzione alla programmazione

  • Problemi; Algoritmi; Diagrammi di flusso.

  • Tipi di informazione e loro rappresentazione digitale: booleani, interi, float, stringhe, dati multimediali. Standard IEEE.

  • Cenni al modello di calcolo di von Neumann: memoria+unità di elaborazione.

  • Variabili; Espressioni; Assegnazioni.

  • Linguaggi di programmazione: macchina, assembly e di alto livello.

  • Problema della traduzione: compilazione ed interpretazione.

  • Notazione lineare strutturata. Teorema di Böhm-Jacopini.

 Il linguaggio C

  • Installazione del compilatore;

  • Primo programma: Editing, Compiling, Running, Debugging.

  • Costrutti del linguaggio.

  • Tipi di dato; Operatori predefiniti; Conversioni di tipo.

  • Gestione dell’I/O di base: stdin, stdout, stderr.

  • Esecuzione dei comandi come valutazione di espressioni.

  • Controllo del flusso:

  • if-then-else;

  • switch;

  • while;

  • do-while;

  • for;

  • break, continue;

  • Primi esempi di funzioni su dati atomici, funzioni produttive e non produttive,

  • scope delle variabili.

  • Gestione esplicita della memoria: motivazioni, tecniche e funzioni di base.

  • Puntatori: motivazioni e gestione. Operatori di indirizzo e di dereferenziazione.

  • Aritmetica dei puntatori. Puntatori e array. Puntatori come parametro di funzione. Allocazione dinamica della memoria. Il modificatore const.

  • Gli array in C: introduzione e esercizi su creazione, gestione, accesso, modifica, e controllo degli elementi di un array. Array multidimensionali.

  • Le stringhe in C: introduzione e esercizi su creazione, gestione, accesso, modifica, e controllo degli elementi di una stringa.

  • Generazione di numeri pseudo-casuali in C.

  • Le funzioni su dati non atomici e modalità di passaggio dei parametri ad una funzione. Funzioni inline. Gestione delle chiamate mediante stack delle attivazioni. Composizione di funzioni. 

  • La ricorsione: per esempi; Record di attivazione; Stack della ricorsione.

  • I Record (struct), le union e le enum.

  • Argomenti alla funzione main.

 I File.

  • Funzioni sui file: fopen, fclose, fseek, ftell, fread, fwrite

 Prime strutture dati

  • Implementazione di un insieme tramite array ordinato e array non ordinato.

  • Pile e code. Descrizione formale e implementazioni.

  • Liste concatenate: semplici, doppie. Descrizione formale e implementazioni.

Algoritmi di ordinamento e ricerca

(definizione formale e esempi di implementazioni con array e liste)

  • Selection Sort, Insertion sort e Bubble Sort

  • Ricerca sequenziale e ricerca dicotomica

Testi di riferimento

Il linguaggio C Fondamenti e tecniche di programmazione • 9/Ed. Paul J. Deitel - Harvey M. Deitel. ISBN: 9788891906236

Programmazione del corso

 ArgomentiRiferimenti testi
1Introduzione alla programmazioneLibro di testo, eventuale materiale fornito dal docente.
2Il linguaggio CLibro di testo, eventuale materiale fornito dal docente.
3Costrutti del linguaggio CLibro di testo, eventuale materiale fornito dal docente
4Gestione dei file in CLibro di testo, eventuale materiale fornito dal docente
5Prime strutture dati  libro di testo, eventuale materiale fornito dal docente
6Algoritmi di ordinamento e di ricerca - libro di testo, eventuale materiale fornito dal docente

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

L’esame consiste nella verifica degli obiettivi preposti per il corso e cioè:

  • la capacità di descrivere ed implementare semplici procedimenti algoritmici.

  • la conoscenza del linguaggio di programmazione C

  • la capacità di progettare e scrivere in codice programmi in maniera efficiente

A tal fine l’esame è composto da tre prove atte a verificare i precedenti punti e si intenderà superato quando tutte e tre le prove saranno valutate sufficientemente:

  1. Prova teorica: un test a risposta multipla atto a verificare la comprensione degli elementi di base della programmazione e delle principali caratteristiche del linguaggio C. Tale test si dovrà svolgere con strumenti informatici in modo da dare immediato feedback allo studente e permettergli di accedere alla prova pratica di laboratorio.

  2. Prova pratica di laboratorio: una serie di esercizi o un piccolo progetto che lo studente dovrà svolgere in autonomia sul calcolatore in aula. Tale prova è inscindibile dalla prova al punto 1 e deve tenersi lo stesso giorno della prova 1.

  3. Orale: una discussione sulla prova svolta al calcolatore, domande sugli argomenti teorici inseriti nel programma.

Le prove 1), 2) e 3) sono sequenziali, pertanto, possono accedere alla prova 2) tutti coloro che abbiano superato la prova 1), e possono accedere alla prova 3) tutti coloro che abbiano superato la prova 2). Le prove 1) e 2) vanno sostenute nella stessa data. La prova 3) può essere superata in un appello o sessione differente rispetto a quello delle prove 1) e 2); la sufficienza conseguita nelle prove 1) e 2) sarà considerata valida per tutto l’A.A. (fino al mese di dicembre successivo alla erogazione del corso). Non viene assegnato alcun voto alla prova 1), mentre alla prova 2) viene assegnato un voto in trentesimi. La prova 3) permette di incrementare o  decrementare il voto ottenuto alla prova 2) (di norma al massimo 3 punti). Qualora la prova 3) mettesse in luce evidenti lacune, lo studente può essere rimandato, con l’obbligo di ripetere le tre prove. Le prove 1) e 2) si terranno nelle date ufficiali degli appelli, mentre la prova 3) si tiene in una data successiva a quella dell’appello ufficiale, come da calendario.

Esempi di domande e/o esercizi frequenti

Esempi di domande per la prova orale:

  • Gestione della memoria in C (tipi di memoria e costrutti per accedervi). Tipi di allocazione

  • Tipi di dato: a cosa servono, differenze tra i tipi, memoria occupata. Conversioni di tipo

  • Variabili e loro visibilità. Costanti. Direttiva #define.

  • Gestione dell'input/output in C. 

  • Gestione dei file in C.

  • Programmazione strutturata, principali strutture di controllo e loro usi.

  • Utilità e definizione degli array. Considerazioni sulla rappresentazione degli array in memoria. Indicizzazione di array. Relazione con i puntatori.

  • Utilità e definizione dei puntatori. Sintassi e principali vantaggi rispetto alle variabili non puntatore. Usi di puntatori per il passaggio di parametri a funzione per riferimento.

  • Stringhe: definizione e loro utilità. Principali operazioni su stringhe.