Programmazione I - Edizione 2021/22
Informazioni generali del corso
Nome del corso: | Programmazione I [MN1-1140] |
Docenti: | Paolo Valente - Roberto Cavicchioli |
Corso di Studio: | Informatica |
Tipologia: | Caratterizzante |
CFU: | 9 |
Periodo Didattico: | Primo Ciclo Semestrale |
Recapiti docente:
Ricevimento studenti: Paolo Valente: martedì, ore 09:00; Roberto Cavicchioli: mercoledì, ore 11:00
(contattare preventivamente il docente per accertarsi che non vi siano problemi per il giorno e l'orario prefissati, o per fissare assieme un appuntamento in altro momento).
Avvisi
Contenitori del materiale di questo corso
Tutto il materiale relativo a questo corso è distribuito
tra questa pagina, che contiene fondamentalmente tutto il
materiale didattico e le informazioni sul corso, e la pagina
Moodle di questo stesso corso, che contiene le videolezioni e
tutti gli annunci. Iscrivetevi su Moodle utilizzando il vostro indirizzo di posta elettronica d'ateneo.
Materiale didattico anni precedenti (incluso tutte le prove d'esame)
Cliccare qui per la pagina
dell'edizione 2020/2021 del corso (nella quale troverete il link
alla pagina dell'edizione ancora precedente e così
via). Altrimenti
cliccare qui per un
archivio compresso di tutto il materiale didattico dall'anno
accademico 2009/2010.
Obiettivi del corso
L'insegnamento ha per obiettivo l'introduzione dello studente ai fondamenti della programmazione. Come linguaggio di riferimento viene usato il sottoinsieme procedurale del C++, mentre come sistema operativo GNU/Linux.
Nel corso si adotta l'approccio "imparare facendo" (e spero anche "divertendosi"): quasi ogni nuova nozione o dettaglio è subito messo in pratica al calcolatore con esercizi di complessità crescente.
Prerequisiti e mini-corso di introduzione all'uso del PC
L'unico prerequisito del corso di Programmazione I è essere in
grado di effettuare tutte le operazioni di base di un file system,
nonché scrivere e modificare file di testo. In merito, tutte le
conoscenze necessarie per svolgere questi compiti in ambiente
GNU/Linux vengono fornite nel mini-corso di introduzione all'uso del
PC. Il mini-corso si svolgerà nelle prime ore di questo
insegnamento, mentre il materiale didattico
è qui.
Se si desidera
svolgere gli esercizi sul proprio PC, si puo' utilizzare qualsiasi
distribuzione Linux senza problemi. Nel dubbio, consiglio di
scegliere semplicemente la distribuzione che si preferisce o che da
meno problemi (come, ad esempio, la distribuzione Ubuntu). Anche
l'uso di macchine virtuali (ad esempio VirtualBox) o dell'ambiente
Cygwin va bene.
Studenti non frequentanti
Non è obbligatorio seguire le lezioni per poter
sostenere l'esame di questo corso. In particolare, per
gli studenti non frequentanti, si consiglia di seguire
attentamente le indicazioni riportate nella sezioni
"Prerequisiti e mini-corso di introduzione all'uso del PC",
"Materiale didattico" e "Modalità d'esame".
Programma del corso
- Obiettivi e contenuti dell'informatica, algoritmi e programmi.
- Costanti e variabili, tipi di dato primitivi, definizioni e dichiarazioni, espressioni aritmetiche e logiche, istruzioni di assegnamento, operatori, input/output, conversioni di
tipo.
- Concetto di blocco. Strutture di controllo condizionali e iterative. Regole di visibilità e durata delle variabili.
- Tipi di dato strutturati: vettori, matrici, stringhe, struct. Concetto di riferimento e puntatore.
- Funzioni, passaggio dei parametri per valore e per riferimento.
- Memoria dinamica, record di attivazione delle funzioni, gestione memoria stack.
- Gestione dei file di testo e dei file binari.
- Panoramica sui linguaggi di programmazione. Interpreti, compilatori, linker.
Lezioni ed orario
Quest'anno le lezioni dell'insegnamento di Programmazione I si
terranno in modalità in presenza, con il
seguente orario.
Il corso è sdoppiato in due gruppi: gli studenti i cui cognomi
iniziano con una lettera nell'intervallo O-Z sono nel gruppo 2 e
dovrebbero fare l'esame con me (Paolo Valente), mentre gli altri,
ossia il gruppo A-N, con altro docente.
Le lezioni e le esercitazioni registrate coincidono per i due
gruppi. In particolare, io sto videoregistrando le lezioni, mentre
Roberto sta videoregistrando le esercitazioni.
Materiale didattico
Tutte le nozioni fornite nel corso sono riportate nelle
seguenti presentazioni sulle lezioni e sulle
esercitazioni. Non è quindi obbligatorio l'utilizzo di alcun
libro di testo. Le presentazioni relative alle lezioni guidano
anche nella fruizione delle presentazioni sulle esercitazioni:
in particolare indicano quali esercizi svolgere man mano che
si procede nella teoria, con l'ovvio sottointeso che, prima di
arrivare a svolgere l'esercizio indicato e contenuto in una
data esercitazione, bisogna aver studiato tutte le slide della
esercitazione fino alla slide relativa all'esercizio
stesso.
In base all'esperienza passata, la quasi totalità degli
studenti, frequentanti e non, è riuscita a studiare con
profitto ed a superare l'esame utilizzando solo le seguenti
presentazioni. In ogni caso, per studenti che si sentono
maggiormente a proprio agio con un libro di testo, che trovano
le slide in qualche modo insufficienti o che vogliono
eventualmente approfondire degli argomenti, si consigliano i
testi riportati nella sezione Testi
consigliati come ulteriore riferimento.
Nota sulla pubblicazione delle presentazioni
Trovate le presentazioni delle lezioni e delle
esercitazioni qui.
Lezioni
Esercitazioni
Modalità d'esame
In questa sezione vengono descritte le modalità d'esame,
nell'ipotesi di esame in presenza. Nella sezione
successiva viene descritto (solo) ciò che cambia con la
modalità a distanza. Per quest'anno non sappiamo ancora quale delle due modalità
d'esame saranno adottate.
- L'esame può essere sostenuto in occasione di
un appello d'esame
- In ciascun anno accademico, vi
sono tipicamente sei appelli:
- tre appelli invernali, nel periodo di pausa tra il
primo ed il secondo semestre di lezione
- due appelli estivi, nel periodo tra la fine del
secondo semestre e l'inizio delle vacanze estive
- un appello autunnale, poco prima dell'inizio del
primo semestre di lezioni
- Per ciascun appello, l'esame si compone di due
prove:
- Una prova scritta (a volte
chiamata anche test) con maggioranza di domande a
scelta multipla e alcune domande aperte
- Non si può utilizzare materiale didattico,
appunti o altri manuali
- Al termine del tempo previsto, saranno ritirati
gli elaborati degli studenti, ed avverrà una
correzione pubblica, ossia verranno comunicate
pubblicamente le risposte corrette.
- Dopo la correzione pubblica, lo studente potrà
decidere se farsi registrare il voto o meno. In
particolare, per non farsi registrare il voto della
prova scritta, basterà andare semplicemente via. Per
avere invece il voto registrato, è necessario
restare dopo la correzione pubblica, e partecipare
alla correzione del proprio compito assieme al
docente. L'esame si conclude quindi il giorno
stesso.
- Nel caso di mancata registrazione, l'ultima prova
scritta superata rimane valida per gli appelli
successivi (per accedere alla prova di
programmazione, come spiegato sotto), per la durata
di un anno accademico. Nel caso invece lo studente
si faccia registrare il voto, il nuovo voto
sostituisce il precedente.
- Si può ritentare la prova scritta tutte le volte
che si vuole, senza alcun vincolo di alcun tipo, o
alcun obbligo di saltare appelli.
- Una prova di programmazione, spesso chiamata
anche prova pratica per evitare confusione
col nome del corso, da svolgersi su
calcolatore.
- Si può accedere alla prova pratica solo se
si è superata almeno una prova scritta nell'arco
accademico in corso (un anno accademico N/(N+1) va
dal primo ottobre dell'anno solare N, al primo
aprile dell'anno solare N+2).
- Come regola generale, si può ritentare la prova
pratica tutte le volte che si vuole, senza alcun
vincolo di alcun tipo, o alcun obbligo di saltare
appelli. Tuttavia ci può essere una eccezione,
come spiegato nel punto seguente.
- Sulla prova di programmazione può essere aggiunto
il seguente ulteriore vincolo, a causa della limitata
capienza dei laboratori in cui viene effettuata la prova stessa:
se si partecipa ad una prova pratica e non la si supera con un
voto almeno uguale a 15, allora si è obbligati a
saltare solo la prova pratica al successivo
appello. Quindi, per maggiore chiarezza, si salterà la prova
pratica nell'appello successivo se: si partecipa alla prova
pratica, ma non si consegna, oppure si consegna e si
ottiene un voto inferiore a 15. Questo vincolo
tipicamente viene aggiunto solo nel primi tre-cinque appelli, e
viene comunicato dai docenti.
- La prova consiste nella scrittura di un programma o
frammento di codice che risponda alle specifiche riportate
nella traccia fornita all'atto della prova stessa.
- Si può utilizzare materiale didattico, appunti o
manuali. Data la possibilità che non ci si possa
connettere ad Internet durante la prova, si
consiglia di portare con sé tutto il materiale
didattico che si ritiene opportuno.
- Durante la prova lo studente avrà modo di
scrivere, compilare e provare il proprio elaborato nel tempo a
disposizione.
- Durante la prova sarà fornito anche
un tester, ossia un programma che collauda il
vostro programma e ce lo spedisce se è
sufficiente. Si tratta di uno script, il cui
attualmente è
prova-sorgente-spedisci-data_della_prova.sh. Dovrete
iniziare a collaudare il vostro programma con il
tester a partire dal momento in cui il vostro
programma fornirà la funzionalità di stampa. Il tester
andrà utilizzato nel modo seguente:
- Scaricate il tester dalla cartella contenente
il materiale dell'appello d'esame a cui state
partecipando. Accedete a tale cartella da questa
pagina.
- Copiate il tester nella stessa cartella in
cui è presente il vostro eseguibile.
- Lanciate il tester con la seguente riga di comando:
bash prova-sorgente-spedisci-data_della_prova.sh nome_vostro_sorgente
Notate che si tratta del nome del sorgente e non dell'eseguibile. In vecchie versioni del tester, c'e' invece da fornire direttamente il nome dell'eseguibile.
- Il tester esegue una serie di test, uno
dopo l'altro. In particolare, se uno dei test
fallisce, il tester vi riporta e vi spiega il
fallimento per quel test, e non esegue i test
successivi della serie. Una volta che avrete
corretto l'errore che fa fallire tale test, ed
il test avrà quindi successo, il tester
procederà con i test successivi, e così
via.
- Per un test che fallisce a causa di un output
errato del vostro programma, il tester vi dice
quale era l'output atteso, e quale è stato invece
l'output del vostro programma. Scorrete il
contenuto del terminale fino all'inizio
dell'output di tale test, per vedere con quale
input è avvenuto tale fallimento. Una semplice
soluzione per cercare l'errore che ha causato il
fallimento è quella di fornire lo stesso input
manualmente al vostro programma.
- Se invece il vostro programma si blocca
nell'esecuzione di un test, allora anche il
tester si blocca. Interrompete il tester, e, per
cercare l'errore che causa il bloccaggio del
vostro programma, procedete come nel punto
precedente.
- Se, infine, il vostro programma va in loop,
siete sostanzialmente nella stessa situazione
del punto precedente. Interrompete il tester, e,
se ormai sono state stampate troppe righe per
ritornare all'inizio dell'output del test per
cui il vostro programma va in loop, rieseguite
il tester ed interrompetelo non appena va in
loop. Procedete poi come nel caso di output
errato del vostro programma. Puo' capitare che
non riusciate a fermare il tester abbastanza
velocemente, e che quindi facciate fatica a
ritrovare l'inizio dell'output. In questo caso,
provate a redirezionare l'output su un file, a
fermare il programma dopo qualche secondo
(altrimenti va avanti all'infinito), e poi a
visualizzare il file con un visualizzatore. Col
visualizzatore potrete trovare facilmente il
primo test in cui ci sono problemi. Ad
esempio:
bash prova-sorgente-spedisci-data_della_prova.sh nome_vostro_sorgente > output
less output
- Per poter accedere alla correzione della prova
pratica, il vostro programma dovrà superare
un insieme minimo di test, che collaudano
solo le funzionalità di base richieste per la
sufficienza. Se il vostro programma non supera
tali test, il tester vi dirà che il vostro
programma non è ancora sufficiente per la
consegna. Se invece li supera, allora il
tester ci spedirà il vostro sorgente.
- Se il vostro programma supera l'insieme
minimo di test, ma non tutti i test, allora il
tester (oltre a spedire il vostro sorgente, come
spiegato sopra) vi dirà fino a quale
funzionalità verrà corretto il vostro
programma.
- Lo studente può abbandonare la prova anche prima
della fine della stessa. Se non abbandona, il suo
elaborato sarà preso in consegna dal docente, ma lo
studente avrà comunque ancora la possibilità di
decidere di non consegnare dopo la correzione
pubblica, come di seguito specificato.
- Al termine del tempo previsto avverrà una
correzione pubblica, ossia verrà mostrata una
possibile soluzione del compito. Ogni algoritmo
equivalente a quello mostrato nella correzione è
valido per superare la prova. Ovviamente l'esito
della prova in termini di punti dipenderà
dall'aderenza alle specifiche date nella traccia,
dagli errori introdotti e, in misura minore, dalla
efficienza/inefficienza in termini di quantità di
codice scritto o numeri di passi effettuati
dall'algoritmo realizzato dallo
studente.
- Dopo la correzione pubblica, lo studente,
ovviamente purché non abbia precedentemente
abbandonato, può decidere se farsi correggere il
compito o meno. Nel caso lo studente scelga di non
farsi correggere il compito, la prova scritta
rimane valida per gli appelli successivi. Nel caso
invece lo studente decida di farsi correggere il
compito, questa scelta conclude l'intero esame, in
base alle modalità riportate di seguito.
- Se i vincoli di tempo lo permettono, l'elaborato
di ciascuno degli studenti che hanno deciso di
farsi correggere il compito viene corretto
immediatamente, in presenza dello studente
stesso. Se i vincoli di tempo non permettono una
correzione immediata, tali studenti saranno
convocati per la correzione in un secondo
momento. Quindi, a meno di problemi di tempo,
l'intero esame di Programmazione I si conclude
il giorno stesso della prova pratica.
- Per ciascuno studente che ha deciso di farsi
correggere il compito, l'esito della prova sarà
comunicato contestualmente alla correzione
dell'elaborato, e, in base all'esito della prova
pratica e della prova scritta, sarà stabilito
l'esito dell'intero esame.
- Calcolo del voto finale: il voto finale è
tipicamente dato dalla media pesata tra il voto
della prova scritta ed il voto della prova pratica,
il peso di ciascuna delle due prove è stabilito dal
docente in base alla loro difficoltà.
- Nel caso lo studente non abbia superato
l'esame, oppure rifiuti il voto proposto,
sia la prova scritta che quella di programmazione
saranno invalidate, e pertanto dovranno essere sostenute di
nuovo.
- Sarà obbligatorio utilizzare, come sistema
operativo, la distribuzione GNU/Linux
presente sulle macchine del laboratorio. Per gli
studenti non frequentanti è fortemente consigliato
di assicurarsi di aver familiarizzato un minimo con
l'ambiente da utilizzare durante l'esame. Si
consiglia vivamente di assicurarsi di essere in
grado di editare un file sorgente, compilarlo ed
eseguirlo.
- Per chi non fosse pratico
dell'ambiente GNU/Linux, può essere utile consultare
il materiale della prima
lezione del mini corso di Introduzione all'uso
del PC, o qualsiasi altro tutorial introduttivo
sull'uso del sistema operativo
Linux.
- Si ricorda che:
- nel caso di superamento della prova di programmazione, e di
insoddisfazione rispetto al voto proposto è possibile
sostenere, immediatamente dopo la correzione della propria prova
pratica, un esame orale facoltativo (che potrà
migliorare ma anche peggiorare il voto acquisito dalle prove
scritta e di programmazione).
- è possibile ripetere la prova scritta negli appelli
successivi tenendo presente che il voto della prova scritta
precedente rimane valido fino alla consegna della nuova prova
scritta e comunque non oltre l'anno accademico in corso
- è possibile ripetere la prova di programmazione negli
appelli successivi tenendo presente che il voto della prova
scritta precedente rimane valido fino alla consegna della nuova
prova di programmazione e comunque non oltre l'anno accademico
in corso.
Modalità d'esame a distanza
In questa sezione vengono descritte le modalità di svolgimento
dell'esame a distanza. In particolare, viene descritto solo ciò
che cambia rispetto all'esame in presenza, tutte le altre
informazioni sono presenti nella sezione
generale Modalità d'esame.
Le regole per la prova scritta a distanza sono fornite in questo documento.
Le regole per la prova pratica a distanza sono fornite in questo documento.
- Ci si iscrive su esse3. In particolare ci si può iscrivere
alla prova scritta, all'appello vero e proprio, o ad
entrambi. L'iscrizione all'appello vero e proprio implica
l'iscrizione alla prova pratica. Quindi: 1) se non si è ancora mai
superata la prova scritta o se si intende solo rifare la prova
scritta ci si può iscrivere solo alla prova scritta, 2) per potersi
iscrivere direttamente all'appello vero e proprio bisogna aver
superato la prova scritta in uno degli appelli precedenti dello
stesso anno accademico. Se si rientra nel caso 2) e si vuole anche
provare a ripetere la prova scritta, ci si iscrive sia alla prova
scritta che all'appello vero e proprio. L'iscrizione a ciascuna
delle due prove è aperta fino a tre giorni prima della prova
stessa.
NB: iscriversi per poi cambiare idea e non presentarsi non comporta nessun problema, mentre, al
contrario iscrizioni pervenute in ritardo non saranno accettate.
Prove d'esame
- Mini scritti
- Traccia e soluzione prima mini prova scritta, cartella
- Traccia e soluzione seconda mini prova scritta, cartella
- Primo appello invernale:
- Secondo appello invernale:
- Terzo appello invernale:
- Primo appello estivo:
- Secondo appello estivo:
- Appello autunnale:
Testi consigliati
- Bruce Eckel
Thinking in C++, 2nd Edition, Volume 1. Disponibile
gratuitamente online. Effettuate una ricerca attraverso un
motore di ricerca per trovare il sito WEB per voi più conveniente
da cui scaricare o attraverso cui navigare nel documento.
- Testo chiaro e completo per apprendere il linguaggio, e per acquisire dimistichezza con il lessico della programmazione (ed in generale dell'Informatica) in lingua Inglese.
- Andrea Domenici, Graziano Frosini
Introduzione alla programmazione ed elementi di strutture dati con il Linguaggio C++
Franco Angeli
ISBN 88-464-3173-1
- Più sintetico e formale del precedente, ma molto chiaro e conciso. Anche questo molto appropriato per incominciare.
- Bjarne Stroustrup
Programming: Principles and Practice Using C++
- Ottimo libro introduttivo, che introduce non solo al
linguaggio in sé, ma anche ai principi di base per
programmare bene. Controllate sul WEB se riuscite a trovarne
una qualche versione in formato elettronico scaricabile
gratuitamente.
- Bjarne Stroustrup
C++. Linguaggio, libreria standard, principi di programmazione
Pearson Education Italia
- Scritto dall'autore stesso del linguaggio C++, non è di facile lettura come i precedenti, e soprattutto presuppone la conoscenza del linguaggio C o del C++ stesso. E' segnalato in questo elenco quale testo di approfondimento e riferimento sul C++ (con alta probabilità tra i migliori disponibili).