Programmazione I - Edizione 2020/21

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

Avviso a tutti gli studenti! A seguito della comunicazione del Rettore relativa alle attivita' in presenza, gli esami scritti e pratici di Programmazione I seguiranno le seguenti modalita':

- L'esame scritto si svolgera' in modalita' mista, cioe' sia in presenza che a distanza. Per mantenere uniformita' nel giudizio la modalita' sara' sempre attraverso l'utilizzo di Dolly e Moodle. Pertanto lo studente che si presenta all'esame in modalità "in presenza" dovra' utilizzare il suo computer portatile per accedere a Dolly e svolgere l'esame sulla piattaforma. Lo studente che invece richiede la modalita' a distanza per comprovati motivi utilizzera' SEB e Google Meet come da istruzioni per gli esami a distanza fornite nella sezione apposita.

- L'esame pratico si svolgera' anch'esso in modalita' mista. Anche qui, per mantenere uniformita' di modalita' e giudizio, si utilizzera' il laboratorio virtuale come gia' visto durante i precedenti appelli e come descritto nella documentazione relativa agli esami a distanza nella sezione apposita. Lo studente in presenza dovra' utilizzare il suo computer portatile per collegarsi alla piattaforma dei laboratori virtuali. Lo stesso fara' lo studente che ha richiesto la modalita' a distanza, sempre accedendo a SEB.

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 Dolly di questo stesso corso, che contiene le videolezioni e tutti gli annunci.

Materiale didattico anni precedenti (incluso tutte le prove d'esame)

Cliccare qui per la pagina dell'edizione 2019/2020 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à a distanza, 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 coincidono per i due gruppi. In particolare, io sto videoregistrando le lezioni, mentre Roberto sta videoregistrando le esercitazioni.

Oltre alle lezioni videoregistrate, ci sono poi le lezioni-ricevimento, separate tra i due gruppi. In dettaglio:

  • Gruppo AN: lezione-ricevimento al mercoledì, alle 11
  • Gruppo OZ: lezione-ricevimento al martedì, alle 9

Per entrambi i gruppi, il luogo virtuale della lezione-ricevimento sarà l'aula virtuale di collaborate. Trovate il link all'aula sulla pagina Dolly di questo corso.

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

Le presentazioni e gli esercizi verranno pubblicati un po' alla volta, man mano che procedono le lezioni. In particolare, la presentazione dell'ultima lezione è soggetta a cambiamenti. In particolare, per tale presentazione, aggiungeremo nuove slide man mano che saranno oggetto delle videolezioni. Questo sopratutto perché le slide delle lezioni, quest'anno, conterranno anche link alle videoregistrazioni delle esercitazioni. E tali link verranno aggiunti man mano che tali videoregistrazioni vengono effettuate.

In ogni caso, il materiale didattico dell'anno in corso avrà occasionalmente differenze minime rispetto a quello dell'anno precedente. Utilizzate pertanto il materiale didattico dell'anno accademico precedente, controllando di tanto in tanto eventuali cambiamenti nel materiale di questo anno accademico.

Lezioni

  • Introduzione dell'insegnamento di Programmazione I, pdf
  • Problemi, algoritmi, programmi, pdf
  • Introduzione al linguaggio C/C++: tipi di dato e numeri interi, variabili e costanti con nome, struttura (semplificata) di un programma, pdf
  • Completamento assegnamento, compendio sintassi C/C++, tipo booleano ed operatori logici, espressioni aritmetiche e logiche, pdf
  • Programmazione strutturata, istruzioni condizionali, pdf
  • Istruzioni cicliche, pdf; versione in bianco e nero di alcuni degli esercizi per casa, ps
  • Notazione posizionale, pdf
  • Funzioni, pdf
  • Visibilità e tempo di vita, pdf
  • Tipi primitivi (I parte): compendio booleani, tipo carattere, conversioni esplicite, pdf
  • Tipi primitivi (II parte): tipi enum, float e double; conversioni di tipo, pdf
  • Riferimenti e passaggio dei parametri per riferimento, pdf
  • Ingegneria del codice, pdf
  • Array statici, array circolari e code, pdf
  • Stream, file ed input/output formattato, pdf
  • Stringhe, struct e matrici statiche, pdf
  • Array dinamici e puntatori, pdf
  • Input/output non formattato, pdf
  • Compendio C/C++, pdf
  • Algoritmi e programmi, traduttori e compilatori, ambienti di sviluppo, pdf
  • Gestione della memoria, pdf
  • Introduzione alle liste, pdf

Esercitazioni

  • Introduzione ad ingresso e uscita, compilazione, pdf
  • Completamento ingresso e uscita, variabili e costanti intere, cartella
  • Tipo booleano, operatori relazionali e logici, espressioni logiche, istruzioni di scelta semplice, cartella
  • Istruzioni di scelta multipla, overflow, cartella
  • Istruzioni cicliche, notazione posizionale, cartella
  • Funzioni, testing, tracing, fasi di sviluppo cartella
  • Visibilità, tipi di dato primitivi e conversioni, cartella
  • Riferimenti, array, I/O formattato, cartella
  • Stringhe, struct e matrici, cartella
  • Array dinamici, IO non formattato, cartella

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. Quest'anno gli esami saranno quasi certamente tenuti con modalità a distanza.

  • 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:
        1. Scaricate il tester dalla cartella contenente il materiale dell'appello d'esame a cui state partecipando. Accedete a tale cartella da questa pagina.
        2. Copiate il tester nella stessa cartella in cui è presente il vostro eseguibile.
        3. 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.
        4. 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.
        5. 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.
        6. 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.
        7. 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
        8. 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.
        9. 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.

Iscrizione agli esami

  • 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

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).