Riassegnamento dei turni

A causa di una serie di errori (non dei docenti, ve lo posso garantire) si è resa necessaria una riassegnazione dei turni di laboratorio e di teoria, come segue:

La teoria viene riassegnata allo stesso modo. Questo significa che alcuni di voi avrebbero laboratorio già oggi pomeriggio. Dato che i laboratori di lunedì sono già iniziati, chi è in questa condizione può partecipare anche al primo laboratorio di mercoledì 16 in modo mettersi al pari con Linux.

Soluzioni dello scritto di settembre

Per avere la soluzione, dovete digitare il vostro numero di matricola nell'apposito spazio e cliccare su “Scarica PDF” (il numero di matricola è necessario perché la soluzione dipende dal numero di matricola).

Introduzione

Il corso di programmazione verrà erogato in contemporanea da tre docenti per tutti i corsi di laurea: gli studenti sono divisi sulla base del cognome. Verrà utilizzato il linguaggio Go.

Programma di massima

Il corso di programmazione è un corso di 12 crediti finalizzato all'insegnamento della programmazione. Trattandosi di un corso di base, non richiede alcuna conoscenza specifica pregressa; obiettivo del corso è formare gli studenti alla programmazione in senso tradizionale, mediante l'uso di un linguaggio imperativo; il linguaggio insegnato nel corso sarà Go.

Il corso si compone di due moduli, svolti in parallelo: teoria e laboratorio. Questa pagina descrive solo il modulo di programmazione (teoria), che viene svolto da tre docenti in parallelo, mentre il laboratorio di programmazione è tenuto da sei diversi docenti in parallelo. Per informazioni/chiarimenti, dopo avere letto alcune indicazioni di base potete scrivere al docente (Sebastiano Vigna).

Orario

Gli studenti sono divisi in turni di laboratorio sulla base del corso di laurea e delle prime lettere del cognome. La divisione, l'orario e aule delle lezioni di teoria e dei laboratori sono disponibili qui,

Libri di testo consigliati

I testo consigliati per il corso sono:

Per la prima parte si farà riferimento a

Letture avanzate

Esempi

Esempi di programmazione concorrente (fuori programma)

Contenuti del corso

Il programma di massima del corso è il seguente (TWG=The Way to Go):

  1. Introduzione al corso. Architettura del calcolatore. Che cos'è l'informatica. Linguaggi di programmazione (macchina, assembly, alto livello). Il calcolatore come macchina programmabile.
  2. La macchina di von Neumann. Informazione (bit, byte,...). Caricamento in RAM del programma, fetch-decode-execute. Architettura della CPU: ALU e CU. Un esempio di CPU con relativo linguaggio assembly.
  3. Ciclo di vita del software. Strumenti per la programmazione. Storia di go. Il primo programma in go [TWG4]. Il go tool. Compilazione. Esecuzione. Formattazione. Documentazione. [TWG3]
  4. Discussione degli aspetti lessicali e sintattici. Commenti [TWG4]. Struttura generale di un programma go: programma, pacchetti, sorgenti. La libreria standard. [TWG4]
  5. Variabili: nome, tipo, valore, visibilità (scope). Tipi. Classificazione dei tipi (tipi di base, tipi composti, interfacce). Dichiarazione, assegnamenti e assegnamenti multipli, short-assignment. [TWG4]
  6. I/O di base: fmt.Println, fmt.Print, fmt.Scan. Tipi di base numerici (int, float64). Espressioni numeriche. Conversioni. Variabili inutilizzate e blank variable. [TWG4]
  7. Selezione binaria (if). Il tipo bool e gli operatori booleani. Esercizi. [TWG5]
  8. Ancora sull'if: variabili locali all'if (locali ai blocchi; locali al costrutto). Esempi.
  9. Il ciclo (for): versione unaria, ternaria, zeraria. Esercizi. [TWG5]
  10. Esercizi con i cicli semplici. Istruzioni break e continue. [TWG5]
  11. I caratteri (ASCII, Unicode, UTF-8). Tipo rune. Tipo string: differenze fra raw e UTF-8. Funzione len. Quarta forma del ciclo for (range). [TWG4]
  12. Esercizi con i cicli annidati.
  13. Rappresentazione dell'informazione. Notazione posizionale. Rappresentazione degli interi negativi. Range di rappresentazione, overflow. Tipi interi a lunghezza fissa. Cenni alla rappresentazione dei reali: virgola fissa e mobile (standard IEEE 754). Cenni al tipo complex. [Dispense, TWG4, TWG5]
  14. Selezione multiaria (switch). [TWG5]
  15. Funzioni: parametri, segnatura argomenti. Passaggio per valore. Valori restituiti. Valori restituiti con nome. [TWG6]
  16. Esercizi. Pacchetto strconv e pacchetto strings. [TWG]
  17. Puntatori: operatori * e &. La funzione new. [TWG4]
  18. Type: alias e definizioni. Struct. Esercizi con puntatori e struct.
  19. Array e slice. Inizializzatori. Applicazione dei for range. Funzione append. [TWG7]
  20. Esercizi. Subslicing. fmt.Printf. Argomenti da riga di comando.
  21. Generazione numeri pseudocasuali. Pacchetto math. Esercizi.
  22. Mappe. Applicazione dei for range. Conversione di string a []rune. Esercizi. [TWG8]
  23. Ricorsione. Stack di esecuzione. [TWG6]
  24. Esercizi sulla ricorsione.
  25. Grafica con il pacchetto github.com/holizz/terrapin. Esempio semplice. Frattali e curva di Koch.
  26. Pacchetti e struttura. Visibilità. Documentare un pacchetto. Metodi. [TWG9 (cenni)]
  27. Interfacce (cenni). Esempi: Stringer, Reader, Writer. [TWG10, TWG11]
  28. Conversione di tipi, switch su tipi, argomenti variadici. [TWG11, TWG6]
  29. Tipi funzione e chiusure (cenni). Esempi dalle librerie (ordinamento, shuffling, ricerca in stringhe). L'esempio dell'integrazione numerica (metodo Monte–Carlo). [TWG6]
  30. I/O avanzato. File, istruzioni panic e defer. [TWG6, TWG12, TWG13]
  31. Esercitazione: lettura di un file di testo con formato prestabilito, espressioni regolari, gestione degli errori di I/O e di parsing.
  32. Esempio: un pacchetto per le liste concatenate semplici di stringhe.
  33. Testing unitario e funzionale. (E2E) [TWG13]
  34. Il linguaggio C. Il gcc. Differenze sintattiche: punto-e-virgola, parentesi nelle strutture di controllo, dichiarazioni di variabili, tipi e funzioni. Differenze nelle strutture di controllo del flusso (switch, while, do-while). Uso di istruzioni semplici nelle strutture di controllo. Inclusione vs. importazione.
  35. Assenza di stringhe, slice, mappe. Uso dei char[] per le stringhe. Tipi elementari e dipendenza dal compilatore; uso di tipi specifici (stdint.h, bool.h). Cast impliciti. Definizione di macro. Funzioni di libreria. Parametri da riga di comando.
  36. Puntatori, aritmetica dei puntatori. Gestione della memoria: malloc, free.

Modalità d'esame

Le modalità d'esame qui indicate sono da ritenersi al momento provvisorie.

  1. Struttura degli appelli. Ogni appello prevede:
    • Una prova di programmazione individuale in laboratorio; la prova contiene un esercizio di filtro: gli studenti che non superano il filtro non saranno ulteriormente valutati; la data della prova è la data ufficiale dell'appello sul SIFA.
    • Una prova scritta che consiste in brevi frammenti di codice da scrivere, leggere, o nei quali individuare errori sintattici o semantici (non è possibile utilizzare libri o appunti): questo compitino è un buon esempio in Go (ma gli argomenti riguarderanno tutto il corso), e quello in Java sarà analogo; gli scritti sono stati fissati qualche giorno dopo le prove di laboratorio, e più precisamente il 31/1, 21/2, 18/6, 9/7 e 17/9.
    • A chi supera entrambe le prove viene proposto un voto (ottenuto come media dei voti delle due prove).
    • Gli studenti con voto proposto compreso fra 18 e 27 possono decidere se verbalizzare il voto proposto o rifiutarlo, sostenendo di nuovo l'esame in uno degli appelli successivi; gli studenti con voto superiore a 27 possono verbalizzare il voto proposto oppure sostenere un esame orale (finalizzato a migliorare il voto). Resta inteso che sostenendo l'orale lo studente può terminare con un voto superiore, uguale o inferiore a quello inizialmente proposto, oppure può addirittura essere considerato insufficiente. Le date degli orali saranno comunicate al momento dello scritto.

    Le varie parti da cui l'esame è composto vanno necessariamente sostenute nello stesso appello, e in particolare chi pur avendone la possibilità decide di non presentarsi alle verbalizzazioni dovrà sostenere nuovamente l'esame.

  2. Salto di appello: chi risulta gravemente insufficiente negli appelli di gennaio o giugno, o rifiuta il voto proposto, non potrà sostenere gli appelli di febbraio e luglio, rispettivamente. Si ritiene che siano gravemente insufficienti (e quindi passibili di salto d'appello):
    • Le persone iscritte all'appello che non si presentino alla prova di laboratorio; chi si fosse iscritto ma avesse deciso di non presentarsi può, per non incorrere nel salto d'appello, disiscriversi oppure (quando siano scaduti i termini per disiscriversi) mandare un'email al docente del turno di laboratorio almeno il giorno prima della prova.
    • Le persone che partecipano alla prova di laboratorio ma non superano l'esercizio filtro.
    • Le persone che pur superando l'esercizio filtro consegnino nella prova di laboratorio esercizi contenenti errori che evidenzino gravi lacune.
    • Non sono viceversa soggetti al salto d'appello gli studenti che, in qualunque momento della prova (di laboratorio o scritta), decidano di ritirarsi.
  3. Iscrizione agli appelli: gli studenti che vogliano sostenere l'esame a un dato appello devono iscriversi al SIFA (tramite il @SIFA online, o recandosi presso gli appositi chioschi). Questo vale per tutti gli appelli, compresi quelli di gennaio e febbraio. L'iscrizione è la stessa per tutti: sia per chi deve effettuare la prova di laboratorio e lo scritto, sia per chi ha un credito dall'anno precedente e deve solo effettuare metà dell'esame.

Ricevimento studenti

Il docente riceve nel suo studio di via Celoria 18 (quinto piano, stanza 5014) su appuntamento. Un appuntamento può essere fissato a lezione, oppure inviando un'email al docente e attendendo una risposta di conferma.

Esami per studenti degli anni accademici precedenti

Gli studenti degli anni accademici precedenti al 2018/19 che non avessero ancora sostenuto l'esame saranno autorizzati a sostenere gli appelli (prova di laboratorio, scritto e orale) in Java fino all'appello di luglio 2019 compreso: ciò significa che nella parte di laboratorio potranno usare Java (invece di Go) per risolvere gli esercizi, mentre allo scritto ci saranno due testi diversi (uno per gli studenti nuovi e uno per quelli vecchi). Da settembre 2019 l'esame sarà esclusivamente con il programma nuovo.

Per gli studenti che hanno ottenuto un credito parziale con il Prof. Mereghetti negli anni precedenti, il credito guadagnato (laboratorio o scritto) rimarrà valido fino a luglio 2019. Da settembre 2019 dovranno sostenere l'esame in Go.

Gli studenti di anni accademici in cui non esisteva la prova di laboratorio, o che non hanno crediti parziali dagli anni precedenti, devono effettuare l'esame nelle modalità standard, cioè in Java o Go fino a luglio 2019, e solo in Go in seguito, passando nella stessa sessione la prova di laboratorio, lo scritto e l'orale.