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.
• 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`a 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`a 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.
• Complessit`a di un algoritmo (cenni).
4. Programmazione in linguaggio C++
• Dichiarazione di variabile. Tipi semplici e primitivi. Costanti, valori, operazioni. Dichi arazione 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: realiz zazione 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 pun tatori. Puntatori ed array. Liste semplicemente concatenate.
• Sviluppo di semplici programmi nel frammento imperativo del C++. Utilizzo di funzioni
di libreria.
• Input/output su file. Creazione ed apertura di uno stream. Lettura/scrittura tramite
>> e <<.
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:
• Prova intermedia di teoria (30% del voto finale);
• Prova finale di programmazione (70% del voto finale).
La prova di teoria si svolgerà indicativamente a metà ottobre e consiste di esercizi sulla parte
1 e domande a crocette sulla parte 2. 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.
L’assenza alla prova intermedia permette comunque di svolgere la medesima in concomitanza
con la prova finale di programmazione.
Altre informazioni
Obiettivi agenda 2030 per lo sviluppo sostenibile
- - -