Programmazione (Corsi unificati)
Indice
- Avvisi
- Orario
- Credenziali zoom
- Video delle lezioni già svolte
- Appelli
- Programma del corso
- Libri di testo consigliati
- Altro materiale didattico
- README per le prove di laboratorio
- Obiettivi didattici
- Contenuti del corso
- Note di lezione
- Modalità d'esame
- Ricevimento studenti
Avvisi
- Risultati esame di settembre 2021. Sono pubblicati gli esiti della prova di laboratorio di settembre e la convocazione degli orali.
- Prova di laboratorio del 5/7. La prova di laboratorio del 5/7 si svolgerà alle ore 8:45 in modalità esclusivamente telematica. Gli studenti iscritti sono pregati di leggere con cura le istruzioni. Inoltre, a causa di problemi di visibilità via webcam dei documenti di identità in formato tipo "carta di credito" (quelli nuovi), chi prevede di presentarsi all'esame con un documento di questo tipo DEVE preparare anche una fotocopia ben leggibile del suo documento e presentarsi con il documento stesso e la fotocopia. La fotocopia non è necessaria per i documenti "vecchi" (cartacei). Il link zoom è https://us02web.zoom.us/j/85912435077?pwd=OGVocHNMSm13eTJzWjgvUEE2MEpkQT09.
- Esiti prova di laboratorio di giugno e calendario degli orali. Sono pubblicati gli esiti della prova di laboratorio di giugno e il calendario degli orali.
- Modalità appelli di giugno e luglio 2021. Con il consenso del Prorettore alla didattica, abbiamo stabilito che gli appelli di giugno e luglio si svolgano ancora esclusivamente in modalità telematica. Più precisamente, consisteranno (come tutti gli appelli fin qui svolti dopo l'emergenza sanitaria) di una prova di laboratorio a distanza e, per gli studenti sufficienti, di un orale obbligatorio.-->
- Consultazione appunti durante l'esame di laboratorio. Come per l'esame in presenza, gli studenti potranno consultare la documentazione di Go on line (https://golang.org/pkg), il libro di testo o un manuale del linguaggio, e usare carta bianca per scarabocchiare. Non sono invece ammessi appunti, eserciziari o altro materiale.
Orario
Le lezioni si svolgeranno con il seguente orario:
- Teoria (A→L); le lezioni si svolgeranno da remoto
su Zoom (vedi la sezione credenziali):
- lunedì ore 8:30-10:30
- mercoledì ore 8:30-10:30
- venerdì ore 8:30-10:30
- Laboratorio (inizia nella settimana 5-9/10/2020):
Le lezioni dei tre turni di laboratorio sono sincronizzate. Ogni settimana chi vuole (e indipendentemente dal cognome) può seguire la lezione del turno A (in presenza), prenotando un posto con l'apposita applicazione. Gli altri seguono da remoto le lezioni del turno B o C a loro assegnato a seconda del cognome.
Non è possibile cambiare turno di laboratorio.
Credenziali zoom
Le credenziali zoom sono disponibili sulla pagina Ariel del corso (Contenuti / Bacheca). Quelli precedentemente pubblicati qui non sono più validi. Gli studenti che non riuscissero ad accedere alla pagina Ariel sono pregati di contattarmi.Video delle lezioni già svolte
Dal 13 luglio i video delle lezioni già svolte sono stati rimossi e non saranno più messi a disposizione.
Appelli
Il seguente elenco contiene le date presunte degli appelli. Le date saranno da ritenersi provvisorie, e verranno confermate con l'approssimarsi degli appelli stessi. Si noti che presso il SIFA sarà aperta di norma una sola iscrizione per ciascun appello (normalmente la dicitura riportata indicherà il laboratorio, perché si tratta di solito della prima prova che si terrà), e gli studenti che intendono partecipare all'appello devono iscriversi pena l'esclusione dall'esame.
Laboratorio | Scritto | Orale | Esiti | |
---|---|---|---|---|
Gennaio 2021 (*) | 12/01/2021 | 25/01/2021 | 01/02/2021 | Esiti |
Gennaio 2021 | 19/01/2021 | 25/01/2021 | 01/02/2021 | Esiti |
Febbraio 2021 | 08/02/2021 | 15/02/2021 | 22/02/2021 | Esiti |
Giugno 2021 | 07/06/2021 | 14/06/2021 | 21/06/2021 | Esiti |
Luglio 2021 | 05/07/2021 | 09/07/2021 | 13/07/2021 | Esiti |
Settembre 2021 | 13/09/2021 | 17/09/2021 | 21/09/2021 | Esiti |
L'appello di Gennaio indicato con (*) è riservato agli studenti degli A/A precedenti.
Programma di massima del corso di Programmazione
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: questa pagina descrive solo il modulo di Programmazione (teoria), mentre il Laboratorio di programmazione è tenuto da tre diversi docenti in parallelo, e ciascuno ha una sua propria pagina web, cui vi preghiamo di fare riferimento per informazioni.
Libri di testo consigliati
I testo consigliati per il corso sono:
- Ivo Balbaert: Programmare in go. Pearson, ISBN 8891909661.
- Alan A. Donovan, Brian W. Kernighan: The Go Programming Language, Addison-Wesley.
Per la prima parte si farà riferimento a
- [FAP] "Dispense per la prima parte del corso di Fondamenti di Architetture e Programmazione" di Paolo Boldi.
Altro materiale didattico
- Il sorgente del programma che disegna il fiocco di Koch: koch.go (richiede che installiate github.com/holizz/terrapin con il comando go get).
- Il sorgente del pacchetto per le parole palindrome e alcuni main di prova.
- Il pacchetto esami (da mettere in $GO/src/esami), e i main di
prova. Per i test:
- per eseguire i test del pacchetto: go test esami
- per eseguire i test del pacchetto con copertura: go test esami -coverprofile=cov.out
- per analizzare la copertura: go tool cover -html=cov.out
Oltre al Go Playground segnaliamo il compilatore online di repl.
Obiettivi didattici
Il corso ha come scopo che lo studente acquisisca una serie di conoscenze, abilità e competenze, le principali delle quali sono:
- Conoscenze
- K1. Conoscere i concetti fondamentali della programmazione imperativa strutturata
- K2. Conoscere gli elementi principali della sintassi e della semantica del linguaggio di programmazione Go
- Abilità
- A1. Riconoscere l'uso di un pattern all'interno di una porzione di codice
- A2. Identificare porzioni di codice critiche in relazione ad un comportamento osservato
- A3. Scegliere e applicare un opportuno pattern per automatizzare un compito semplice
- A4. Tradurre in Go un semplice algoritmo descritto in linguaggio naturale
- Competenze
- C1. Interpretare e descrivere il comportamento di un programma semplice quando viene eseguito [si basa su A1, A2]
- C2. Comprendere che cosa fa un semplice programma e riconoscere come le varie parti di cui è composto contribuiscano al suo funzionamento [si basa su A1, A2]
- C3. Stabilire le cause di un malfunzionamento e intervenire su un programma semplice per correggerlo/modificarlo [si basa su C1, C2, A1, A2]
- C4. Ideare/impostare un programma per automatizzare un compito semplice [si basa su C1, C2, A2, A3]
- C5. Scrivere e mettere a punto un programma per automatizzare un compito semplice [si basa su C1, C2, C3, C4, A4]
Nella valutazione intendo avvalermi dei seguenti indicatori (* significa che questo indicatore sarà valutato principalmente durante la prova di laboratorio):
- Per C1:
- tracciare l'esecuzione di un semplice programma
- rappresentare graficamente lo stato (memoria) di un programma in esecuzione
- descrivere una porzione di codice
- Per C2:
- identificare il ruolo delle variabili
- prevedere l'output di un programma senza eseguirlo
- individuare casi di test significativi
- Per C3:
- rilevare un difetto in una porzione di codice
- spiegare le cause di un malfunzionamento
- correggere il difetto
- Per C4:
- scrivere un programma o una funzione che realizzi un compito semplice
- scrivere un programma o una funzione ricorsiva che realizzi un compito semplice
- Per C5:
- scrivere un programma che supera senza errori la fase di compilazione (*)
- scrivere programma che mostra il funzionamento corretto su casi di test significativi (*)
- evitare duplicazione di codice
- evitare codice convoluto
- usare nomi significativi per i nomi di variabili, tipi e funzioni (leggibilità)
- organizzare la struttura del programma usando funzioni (modularità)
- usare solo la memoria necessaria
Contenuti del corso
Il programma di massima del corso è il seguente (TWG=The Way to Go):
- Introduzione al corso; Architettura del calcolatore; Che cos'è; l'informatica; Linguaggi di programmazione (macchina, assembly, alto livello); Il calcolatore come macchina programmabile
- 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
- 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]
- Discussione degli aspetti lessicali e sintattici. Commenti [TWG4]. Struttura generale di un programma go: programma, pacchetti, sorgenti. La libreria standard. [TWG4]
- Variabili: nome, tipo, valore, scope. Tipi. Classificazione dei tipi (tipi di base, tipi composti, interfacce). Dichiarazione, assegnamenti e assegnamenti multipli, short-assignment [TWG4]
- 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]
- Selezione binaria (if). Il tipo bool e gli operatori booleani. Esercizi [TWG5]
- Ancora sull'if: variabili locali all'if (locali ai blocchi; locali al costrutto). Esempi
- Il ciclo (for): versione unaria, ternaria, zeraria. Esercizi [TWG5]
- Esercizi con i cicli semplici. Istruzioni break e continue [TWG5]
- Rappresentazione dell'informazione. Notazione posizionale. Rappresentazione degli interi negativi. Range di rappresentazione, overflow. Tipi interi a lunghezza fissa [Dispense, TWG4]
- Esercizi con i cicli annidati.
- Cenni alla rappresentazione dei reali: virgola fissa e mobile (standard IEEE 754). Cenni al tipo complex. I caratteri (ASCII, Unicode, UTF-8). Tipo rune [Dispense, TWG4, TWG5]
- Tipo string: differenze fra raw e utf-8. Funzione len. Quarta forma del ciclo for (range).
- Selezione multiaria (switch) [TWG5]
- Funzioni: parametri, segnatura argomenti. Passaggio per valore. Valori restituiti. Valori restituiti con nome. [TWG6]
- Esercizi. Pacchetto strconv e pacchetto strings [TWG]
- Puntatori: operatori * e &. La funzione new [TWG4]
- Type: alias e definizioni. Struct. Esercizi con puntatori e struct.
- Array e slice. Inizializzatori. Applicazione dei for range. Funzione append [TWG7]
- Esercizi. Subslicing. fmt.Printf. Argomenti da riga di comando.
- Generazione numeri pseudo-casuali. Pacchetto math. Esercizi
- Mappe. Applicazione dei for range. Conversione di string a []rune. Esercizi [TWG8]
- Ricorsione. Stack di esecuzione [TWG6]
- Esercizi sulla ricorsione
- Grafica con il pacchetto github.com/holizz/terrapin. Esempio semplice. Frattali e curva di Koch
- Pacchetti e struttura. Visibilità. Documentare un pacchetto [TWG9 (cenni)]
- Esempio: un pacchetto per le liste concatenate semplici di stringhe
- Argomenti avanzati: metodi e interfacce (cenni) [TWG10, TWG11]
- I/O avanzato. File, istruzione defer [TWG6, TWG12]
- Esercitazione: lettura di un file di testo con formato prestabilito, espressioni regolari, gestione degli errori di I/O e di parsing...
- Testing unitario e funzionale (E2E) [TWG13]
- Tipi funzione. L'esempio dell'integrazione numerica (metodo dei trapezoidi e metodo Monte-Carlo) [TWG6]
- 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.
- 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
- Puntatori, aritmetica dei puntatori. Gestione della memoria: malloc, free
Note di lezione
Rendo pubblici gli appunti che ho scritto durante le lezioni. Queste note sono finalizzate solamente a consentire agli studenti frequentanti di completare i loro appunti; non hanno ovviamente alcun significato se estrapolati dal contesto della lezione.
Modalità d'esame
Le modalità d'esame qui indicate sono da ritenersi al momento provvisorie.
- Struttura degli appelli: ogni appello prevede
- una prova di programmazione individuale in laboratorio; la prova contiene un esercizio di filtro: gli studenti che non superino il filtro non saranno ulteriormente valutati;
- una prova scritta;
- 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 21 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 proposto inferiore a 21 devono sostenere un esame orale per verificare le loro effettive competenze; 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.
- Iscrizione agli appelli: gli studenti che vogliano sostenere l'esame a un dato appello devono iscriversi al SIFA (tramite il @SIFA on-line, o recandosi presso gli appositi chioschi). Questo vale per tutti gli appelli, compresi quelli di gennaio e febbraio.
Ricevimento studenti
Il docente riceve nel suo studio di via Celoria 18 (quinto piano) o in via telematica, in ogni caso su appuntamento. Un appuntamento può essere fissato inviando una e-mail al docente e attendendo una risposta di conferma.