Istruzioni per lo svolgimento degli esercizi del laboratorio di programmazione

Le informazioni riportate in questa pagina riguardano sia le lezioni che la prova individuale di programmazione che si svolge in laboratorio, e riguardano: la documentazione disponibile durante il suo svolgimento, l’ambiente operativo su cui è basata (con particolare riferimento al contenuto di file e directory a disposizione dello studente) e le modalità di svolgimento della prova stessa.

Una breve guida per l’impaziente è la seguente:

  • invocate il comando firma seguito dal vostro numero di matricola e dal numero di laboratorio in corso, ad esempio, se il vostro numero di matricola è 123456 e state svolgendo il laboratorio 03, date il comando:

    firma 123456 03
    
  • portatevi nella directory del primo esercizio (ad esempio 01-salve_mondo),

  • leggete la traccia dell’esercizio contenuta nel file Testo.md,

  • implementate la vostra soluzione in uno (o più) file (salvati nella directory corrente, con nome qualunuque purché abbiano estensione .java, .sh o .c), avendo cura di definire una ed una sola funzione, o metodo, di nome main (nel caso di script di shell, l’estensione deve essere .sh e ci deve essere un solo file);

  • eseguite il comando:

    verifica
    

    se l’esecuzione del comando riporta errori (di compilazione, o collegamento), correggeteli prima di procedere, quindi accertatevi che sui casi d’esempio il vostro programma si comporti come atteso, nel caso non accada, correggete gli errori prima di procedere.

  • una vota che avete la verifica ha successo, consegnate il vostro materiale con il comando:

    consegna
    

    si raccomanda di consegnare ogni soluzione appena ottenuta per evitare potenziali perdite di dati;

  • passate a considerare l’esercizio successivo seguendo di nuovo queste istruzioni (dal secondo punto in poi).

Documentazione

Durante le esercitazioni è possibile utilizzare ogni materiale stampato si intenda, viceversa durate la prova d’esame è possibile utilizzare esclusivamente i libri di testo messi a disposizione dal docente sulla cattedra.

In aggiunta al materiale stampato è possibile accedere on-line a:

Ambiente operativo

All’avvio del sistema troverete un terminale attivo con una shell (bash) in esecuzione ed un editor di testo.

Tramite la shell potete invocare i comandi necessari allo svolgimento del laboratorio, o esame, in particolare:

  • javac, java per compilare il codice sorgente Java ed eseguire il bytecode risultante;
  • gcc, per compilare e collegare il codice sorgente C;
  • nedit &, per invocare un (altra istanza dell’) editor di testo,
  • gnome-terminal &, per invocave un (altra istanza del) terminale,
  • firefox &, per invocare un browser web (utile ad accedere alla documentazione).

Qualora chiudeste accidentalmente il terminale, potete invocarne una nuova istanza scegliendo l’opportuna voce dal menù di sistema.

Potete consultare la documentazione dell’editor, con particolare riferimento al menù delle preferenze e alla sezione sulla programmazione, per scoprire come attivare ed utilizzare le informazioni relative al numero di linea (line numbers).

Contenuto di file e directory

La directory relativa agli esercizi da svolgere contiene:

LEGGIMI.md

Una versione in formato testo della “breve guida per l’impaziente” riportata all’inizio di questa pagina.

bin/

La directory che contiene i comandi necessari allo svolgimento del laboratorio, o prova d’esame.

01-primo_esercizio/ ... N-ennesimo_esercizio/

Le directory contenenti il materiale relativo ai vari esercizi che costituiscono la lezione, o l’esame (i nomi dipendono dall’esercizio, quelli riportati qui sono evidentemente d’esempio).

Si raccomanda di non modificare, o cancellare, nessuno tra i file descritti in questa guida, ma di creare e modificare solo i file con esensione .java, .sh, .c (ed eventualmente .h) corrispondenti alle proprie soluzioni.

Le directory degli esercizi

Le directory N-esercizio (dove N è un intetro, generalmente compreso tra 1 e 6, e esercizio è il nome dell’esercizio) contengono i seguenti file (dove M è un numero, generalmente compreso tra 1 e 3):

Testo.md

Questo file contiene il testo dell’esercizio. Il suo contenuto è descritto in una sezione seguente.

input-1.txtinput-M.txt

Questi file (se presenti) contengono alcuni esempi di input.

args-1.txtargs-M.txt

Questi file (se presenti) contengono esempi di argomenti sulla linea di comando.

output-1.txtoutput-M.txt

Questi file contengono esempi di output.

I file di esempio possono essere utilizzati in questo modo. Supponete che il file input-1.txt contenga le righe:

ciao
mamma

ed il file args-1.txt contenga le stringhe:

uno 2 3

e, per finire, che il file output-1.txt contenga le righe:

ben fatto
mamma

Assumiamo inoltre che la vostra soluzione sia stata compilata (tramite il comando make soluzione) generando un eseguibile di nome soluzione; se l’invocazione:

soluzione uno 2 3

a cui venga dato in input nel flusso di ingresso:

ciao
mamma

non produce in output nel flusso d’uscita:

ben fatto
mamma

significa che la vostra soluzione è errata. Analogo procedimento vale per gli altri file di esempio.

Osservate che questa verifica può essere svolta in modo automatico su tutti i file di esempio tramite il comando make test (fatta salva l’osservazione che il test si arresta nel caso vengano incontrate delle differenze).

La directory dei comandi

La directory bin contiene i seguenti comandi:

identifica

Questo comando serve ad identificare il vostro elaborato. Dopo aver usato il comando firma all’inizio del laboratorio, o dell’esame, potete in ogni momento usare questo per visualizzare le vostre credenziali. Questo comando sarà usato dal docente per verificare la vostra idendità (ad esempio tramite l’ispezione durante l’esame di un docuemnto di idendità con una fotografia).

consegna

Questo comando invia al docente i file sorgente con cui avete implementato le soluzioni per i vari esercizi. Potete usarlo ogni volta che avete terminato un esercizio, ma ai fini della valutazione d’esame verrà considerata solo l’ultima consegna effettuata in ordine di tempo.

aggiorna

Questo comando aggiorna i testi degli esercizi e va invocato su indicazione del docente, qualora si siano riscontrati dei problemi nel materiale ottenuto all’atto della firma.

soluzione

Questo comando effettua la compilazione dell’eserizio nella directory corrente e lo pone in esecuzione, può essere invocato con argomenti sulla linea di comando e legge l’eventuale flusso di ingresso.

verifica

Questo comando, dopo aver effettuato la compilazione dell’esercizio nella directory corrente, ne verifica il funzionamento su tutti i casi d’esempio riportando il risultato dell’elaborazio.

Si osserva che il comando firma non è presente in questa direcotry perché va invocato una sola volta all’inizio del laboratorio, o esame.

Modalità di svolgimento dell laboratorio, o esame

Il laboratorio, o esame, si sviluppa in una serie di esercizi di difficoltà crescente. Lo studente è invitato a risolverli in ordine, a verificare che le sue soluzioni si comportino in modo corretto sugli esempi forniti e quindi a consegnare il risultato del suo lavoro.

Il materiale relativo a ciascun esercizio è contenuto in una directory di nome esercizio-N dove N è un numero (generalmente compreso tra 1 e 6, e esercizio è il nome dell’esercizio)).

Preparare la soluzione

Per prima cosa lo studente si deve spostare nella directory dell’esercizio che intende risolvere. Ad esempio, per risolvere l’esercizio 1 occorre spostarsi nella directory 01-esercizio con il comando:

cd 01-esercizio

Il testo dell’esercizio è contenuto nel file Testo.md da leggere attentamente (ad esempio usando il comando less), che è diviso nelle seguenti sezioni (che, tranne per la prima, potrebbero non essere presenti):

Descrizione
Questa sezione contiene una descrizione dell’esercizio.
Vincoli
Questa sezione, se presente, contiene le specifiche precise del formato dei dati in ingresso ed uscita. Si osservi che una soluzione che non rispetti i vincoli espressi in questa sezione non è considerata corretta e, pertanto, non sarà valutata positivamente all’esame.
Esempio
Questa sezione contiene uno, o più, esempi di esecuzione.
Suggerimenti
Questa sezione, se presente, contiene alcuni suggerimenti su come svolgere l’esercizio.
Osservazioni
Questa sezione, se presente, contiene oservazioni e spunti di riflessioni circa l’esercizio, è usualmente di particolare importanza nel contesto delle esercitazioni.

La soluzione (tranne che quando diversamente specificato dal testo) deve essere implementata in Java, con uno script o in C (tipicamente a seconda dell’anno cui è iscritto lo studente).

Linguaggio Java

Nel primo caso, la soluzione dev’essere costituita da uno, o più, file (dal nome qualunque, purché con estensione .java e salvati nella directory dell’esercizio cui fanno riferimento) di cui uno ed uno solo contenga (all’interno di una classe pubblica) la definizione di un metodo di nome main con segnatura

public static void main( String[] args )

che, se eseguita, produce il comportamento descritto dal testo dell’esercizio (per maggiore dettaglio si veda il seguito).

Il codice deve aderire alle specifiche di Java versione 8 ed usare esclusivamente le API standard del linguaggio, non sarà accettato codice di versioni successive di Java o basato su librerie addizionali (come la libreria prog).

Script di shell

Nel caso degli script di shell, la soluzione dev’essere costituita da un solo file (dal nome qualunque, purché con estensione .sh e salvato nella directory dell’esercizio cui fa riferimento).

Tale file, se eseguito, produce il comportamento descritto dal testo dell’esercizio (per maggiore dettaglio si veda il seguito) e dev’essere tale che l’ultimo comando restituisca un exit code pari a 0.

Il codice deve invocare comandi di shell, o di sistema, normalmente presenti nella toolchain standard GNU/Linux.

Linguaggio C

Nota bene: dall’A.A. 2016/17 non sono più accettate soluzioni in C.

Nel caso del linguaggio C, la soluzione dev’essere costituita da uno, o più, file (dal nome qualunque, purché con estensione .c e salvati nella directory dell’esercizio cui fanno riferimento) di cui uno ed uno solo contenga la definizione di una funzione di nome main con segnatura

int main( int argc, char *argv[] )

che, se eseguita, produce il comportamento descritto dal testo dell’esercizio (per maggiore dettaglio si veda il seguito) e termini con l’istruzione return 0; (questo fatto è cruciale per il processo di verifica con il comando make test).

Il codice deve aderire allo standard ANSI C (altrimenti detto C89) e relativa libreria standard, non sarà accettato codice C99 o C++, o basato su librerie addizionali.

Compilare ed eseguire i test

Una volta implementata la soluzione, lo studente può verificare che compili (e colleghi link, nel caso del C) correttamente tramite il comando:

soluzione

che, qualora la compilazione (ed il collegamento) avvengano senza errori, pone in esecuzione la soluzione. Inoltre, lo studente può accertarsi che sui dati forniti come esempio si comporti in modo inteso tramite il comando:

verifica

Se ci sono differenze tra l’output prodotto dalla soluzione dello studente e quello provvisto dai file di esempio tale comando terminerà con un messaggio d’errore. Per comodità, è presente anche comando:

pulisci

che ha l’effetto di cancellare i file prodotti dalla compilazione, collegamento ed esecuzione dei test (nonché i file che iniziano per ~ che sono le copie di backup create dall’editor).

Si osservi che i suddetti comandi sono offerti come ausilio allo studente, ma il loro uso è di fatto completamente equivalente all’abituale compilazone in Java:

javac *.java

oppure alla abituale compilazione in C:

gcc -o soluzione -O3 -Wall -ansi --pedantic-errors *.c

e all’esecuzione, in Java, di:

java Soluzione arg1 ... argK < input-N.txt > actual-N.txt

oppure, per gli script di shell, di:

bash soluzione.sh arg1 ... argK < input-N.txt > actual-N.txt

oppure, in C, di:

./soluzione arg1 ... argK < input-N.txt > actual-N.txt

dove Soluzione sia il nome della classe pubblica ove è definito il metodo main e arg1 ... argK è il contenuto del file args-N.txt.

A tale esecuzione, può essere fatta seguire manualmente la verifica delle differenze tra il risultato actual-N.txt prodotto dal proprio codice e quello atteso output-N.txt, ad esempio tramite il comando:

diff -b actual-N.txt output-N.txt | tee diffs-N.txt

Consegna

Una volta effettuata la verifica, lo studente può consegnare il suo materiale con il comando:

consegna

Farà fede l’ultima versione consegnata (in ordine di tempo). Si consiglia di effettuare la consegna man mano che vengono svolti gli esercizi per evitare che eventuali malfunzionamenti possano causare la perdita del proprio lavoro.