PROGRAMMAZIONE
cod. 1003606

Anno accademico 2024/25
1° anno di corso - Primo semestre
Docente
Andrea MUNARO
Settore scientifico disciplinare
Informatica (INF/01)
Ambito
Attività formative affini o integrative
Tipologia attività formativa
Affine/Integrativa
56 ore
di attività frontali
6 crediti
sede: PARMA
insegnamento
in ITALIANO

Obiettivi formativi

L'obiettivo principale del corso è quello di far acquisire allo studente le tecniche fondamentali della programmazione. Il corso mira anche a fornire allo studente la capacità di applicare tecniche di analisi dei problemi per risolvere in modo algoritmico semplici problemi pratici e quindi tradurre tali soluzioni in programmi eseguibili. Infine il corso mira a sviluppare capacità di analisi, di astrazione e di scomposizione di problemi in sottoproblemi.

Con riferimento agli Indicatori di Dublino:

Conoscenza e capacità di comprensione:
Il corso introduce i primi concetti relativi alla programmazione imperativa, con particolare attenzione alla comprensione delle tecniche algoritmiche di base dei linguaggi imperativi. Il testo di riferimento è in italiano, ma durante le lezioni viene utilizzata anche la terminologia ed eventuali slides in lingua inglese come avviamento alla consultazione di letteratura scientifica internazionale. Durante il corso, lo studente impara i fondamenti della programmazione. Lo studente acquisisce inoltre adeguate competenze informatiche, legate all’architettura dei calcolatori e alla rappresentazione dell’informazione. Inoltre, lo studente è in grado di comprendere le applicazioni di base della matematica all’informatica.

Capacità di applicare conoscenza e comprensione:
Le conoscenze teoriche presentate vengono sempre applicate alla risoluzione di problemi specifici, spesso di carattere modellistico/matematico. Lo studente è quindi in grado di utilizzare strumenti informatici e computazionali, sia come supporto ai processi matematici, sia per acquisire ulteriori informazioni. Le esercitazioni che affiancano il corso sono incentrate sulla risoluzione di esercizi e problemi. Molti metodi risolutivi vengono applicati a problemi di natura matematica e numerica e vengono presentati e analizzati sotto forma algoritmica.

Autonomia di giudizio:
Gli esercizi proposti relativamente alla parte teorica svolta a lezione possono essere affrontati individualmente o in gruppo e, spesso, possono essere risolti in modi molto diversi. Il confronto con i compagni di corso e l'ascolto delle soluzioni proposte da altri, nel lavoro a casa o durante gli svolgimenti in aula, favoriscono lo sviluppo di capacità specifiche per poter a chiarire le proprie argomentazioni e individuare strutture comuni tra i diversi approcci.

Abilità comunicative:
Le discussioni in aula e durante le esercitazioni consentono di migliorare le capacità di comunicazione. Tali discussioni riguardano i metodi per risolvere i problemi proposti, evidenziando vantaggi e svantaggi dei diversi approcci proposti. Lo studente impara a lavorare sia in autonomia che in gruppo.

Capacità di apprendimento:
Lo studio delle tecniche algoritmiche di base e la loro applicazione a problemi di natura eterogenea contribuiscono a realizzare negli studenti la capacità di apprendere in modo approfondito e non solo superficiale e ripetitivo. Le conoscenze così acquisite non sono mai rigide e meccaniche, ma sono perfettamente adattabili ad ogni evoluzione e cambiamento di prospettiva e di contesto. Lo studente è in grado di acquisire tecniche di calcolo scientifico per il mondo del lavoro, in modo autonomo o in collaborazione con studiosi di altre materie.

Prerequisiti

Nozioni di base su funzioni, insiemi ed espressioni logiche.

Contenuti dell'insegnamento

Nella prima parte del corso sono presentati concetti relativi all'architettura hardware e software degli elaboratori e alla rappresentazione dell'informazione, con particolare attenzione alla rappresentazione dei numeri interi e dei numeri reali. Successivamente, sono introdotti i fondamenti della programmazione. In particolare, sono sviluppate le nozioni di variabile, tipo di dato, algoritmo, espressione e sono introdotte le funzioni e le funzioni ricorsive, concentrandosi sulla programmazione in linguaggio C++.

Programma esteso

Il corso consiste delle seguenti quattro parti (∼16 ore per parti 1 e 2, ∼40 ore per parti 3 e 4):

1. Rappresentazione dell’informazione
• Algebra di Boole.
• Sistemi di numerazione e conversione tra basi.
• Operazioni aritmetiche fondamentali ed algoritmi connessi. Analisi asintotica.
• Rappresentazione dei dati e aritmetica degli elaboratori: numeri con segno, complemento a 2, overflow, numeri in virgola mobile.

2. Cenni di architettura hardware e software
• Struttura del calcolatore.
• Linguaggio macchina e assembler.
• Sistema operativo.

3. Fondamenti di programmazione
• Problemi e algoritmi. Diagrammi di flusso. Risoluzione di semplici problemi.
• Linguaggi e ambienti di programmazione. Ambienti di sviluppo integrato (IDE).
• Espressioni: sintassi, valutazione (associatività e precedenza). Tipo di un’espressione.
• Astrazione nei linguaggi di programmazione: dati, operazioni, controllo. Tipo di dato: definizione, tipi semplici e tipi strutturati, primitivi e definiti dall’utente. Strutture dati astratte e concrete. Compatibilità e conversioni di tipo.
• Nomi, ambienti e regole di scope: struttura a blocchi, ambiente locale e non locale, variabili globali.
• Programmazione strutturata. Strutture di controllo.
• Ricorsione e paradigma Divide et Impera. Esempi di applicazione Divide et Impera: Binary-Search, Elevamento a potenza, Algoritmo di Karatsuba per moltiplicazione binaria, Merge-Sort.
• Complessità di un algoritmo.

4. Programmazione in linguaggio C++
• Dichiarazione di variabile. Tipi semplici e primitivi. Costanti, valori, operazioni. Dichiarazione di costanti.
• Input/output di base.
• Assegnamenti ed espressioni.
• Statement per il controllo di flusso: if, switch, while, do while, for, break e continue.
• Tipi strutturati: array, dichiarazione. selezione elementi, memorizzazione, operazioni.
Array bi-dimensionali. Matrici. Esempi operazioni su matrici e array. Stringhe: realizzazione tramite array, operazioni, funzioni di libreria. Struct: dichiarazione, selezione elementi, operazioni.
• Dichiarazione e chiamata di funzione. Passaggio parametri: per valore, per riferimento.
Passaggio parametri di tipo array. Funzioni void.
• Struttura di un programma e regole di scope.
• Puntatori ed allocazione dinamica della memoria (operatore new). Operazioni su puntatori. Puntatori ed array. Liste semplicemente concatenate.
• Sviluppo di semplici programmi nel frammento imperativo del C++. Utilizzo di funzioni di libreria.

Bibliografia

Slides per tutte e quattro le parti saranno messe a disposizione dal docente, assieme alla seguente dispensa (per parti 3 e 4):

• G. Rossi. Fondamenti di Programmazione (con linguaggio di riferimento C++).

Un altro riferimento (ricco di esercizi ed esempi) per parti 3 e 4 è il seguente:

• L.J. Aguilar. Fondamenti di programmazione in C++, Seconda Edizione, McGraw-Hill, 2021

Metodi didattici

Il corso consiste in lezioni frontali svolte in aula.

Modalità verifica apprendimento

L’esame consiste di due parti indipendenti:

• Prova di teoria (30% del voto finale);
• Prova di programmazione (70% del voto finale).

La prova di teoria consiste di esercizi sulle parti 1, 2 e 3 del corso. La prova di programmazione consiste nella risoluzione su carta di alcuni esercizi di programmazione utilizzando il frammento imperativo del linguaggio di programmazione C++. Non è ammesso consultare libri di testo o appunti durante lo svolgimento di entrambe le prove.

Altre informazioni