Attenzione: Informazioni per gli esami di febbraio 2024 (appello del 7 febbraio)

Per gli studenti che hanno ottenuto una valutazione positiva nell'esame di laboratorio ci sarà un esame orale svolto in presenza. L'esame consisterà nella soluzione di esercizi sulla piattaforma repl.it, con cui si consiglia di prendere familiarità prima dell'esame, e in domande sulla sintassi e semantica del Go. Si consiglia, se possibile, di portare il proprio portatile, ma è sempre necessario usare la piattaforma repl.it; in caso contrario, è possibile utilizzare il portatile del docente (con tastiera italiana).

Gli orali si svolgeranno il 12 e il 13 febbraio (10:00-14:00) nella sala riunioni al quinto piano. Potete prenotare uno slot.

È necessario presentarsi un'ora prima dello slot assegnato (ma ovviamente non prima dell'inizio del blocco). Esempio: se il blocco inizia alle 9:00 e il vostro esame è alle 10:20 dovete presentarvi alle 9:20, ma se il vostro esame è alle 9:00 o alle 9:30 dovete presentarvi alle 9:00.

Attenzione: tutti gli studenti (indipendentemente dal loro anno di immatricolazione) si devono iscrivere agli esami di programmazione sulla base dell'iniziale del loro cognome e non sulla base del loro corso di laurea o del docente con cui hanno eventualmente seguito il corso. Quindi si devono iscrivere al turno 2 (Vigna / Capra / D'Amelio) tutti e soli gli studenti con le iniziali E → O (incluse). Notate che il SIFA vi permetterà di iscrivervi a qualsiasi turno; ciò nonostante non sarete ammessi in aula se l'iniziale non rientra nell'intervallo indicato.

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.

Telegram

Per comunicazioni urgenti verrà utilizzato un canale Telegram.

Libri di testo consigliati

I testo consigliati per il corso sono:

Per la prima parte si farà riferimento a

Letture avanzate

Visualizzazione interattiva

Conferenze e podcast

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. 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]
  11. Funzioni: parametri, segnatura argomenti. Passaggio per valore. Valori restituiti. Valori restituiti con nome. [TWG6]
  12. Esercizi con i cicli semplici e funzioni. Istruzioni break e continue. [TWG5]
  13. Esercizi con i cicli annidati.
  14. 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]
  15. Selezione multiaria (switch). [TWG5]
  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. Metodi. Interfacce (cenni). Esempi: Stringer, Reader, Writer. [TWG10, TWG11 (cenni)]
  26. Grafica con il pacchetto github.com/holizz/terrapin. Esempio semplice. Frattali e curva di Koch. Un motore di ricerca.
  27. Tipi funzione e chiusure (cenni). Esempi dalle librerie (ordinamento, shuffling, ricerca in stringhe). L'esempio dell'integrazione numerica (metodo Monte–Carlo). [TWG6]
  28. Ordinamento e ricerca tramite funzioni di libreria. I/O di base. [TWG6, TWG12, TWG13]
  29. I/O avanzato. File, panic, defer e recover. [TWG6, TWG12, TWG13]
  30. Pacchetti e struttura. Visibilità. Documentare un pacchetto.
  31. Esercitazione: lettura di un file di testo con formato prestabilito, espressioni regolari, gestione degli errori di I/O e di parsing.
  32. Testing unitario e funzionale. (E2E) [TWG13]
  33. 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.
  34. 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.
  35. Puntatori, aritmetica dei puntatori. Gestione della memoria: malloc, free.
  36. Goroutine e canali.

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 orale in cui lo studente scrive e discute un breve frammento di codice su repl.it, che poi fa da spunto per domande ulteriori sul programma. Gli orali avvengono qualche giorno dopo la prova di laboratorio, per dare tempo ai docenti di correggere gli elaborati.

    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 all'orale dovrà sostenere nuovamente l'esame.

  2. 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). Fate attenzione a iscrivervi all'edizione corretta per il vostro cognome.

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.