Gli Strumenti

Gli esercizi contenuti nel repository possono essere svolti semplicemente leggendo il testo dell'esercizio e procedendo in modo tradizionale.

Gli studenti che intendono avvalersi dei testcase (e degli strumenti di supporto che ne facilitano l'uso ai fini della verifica funzionale) possono scaricare un archivio compresso dell'intero repository, oppure ottenere un clone locale con il comando:

git clone git@github.com:mapio/labprog.git

Una volta configurato il sistema per l'uso degli script contenuti nella cartella bin/, vi potete apprestare a svolgere gli esercizi seguendo i passi della seguente (una guida più dettagliata è riportata nel seguito di questa pagina):

Breve guida

  • portatevi nella directory del primo esercizio (ad esempio 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
    

    che compila la soluzione e verifica il suo comportamento sui file di test; 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.

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

Documentazione

Durante lo svolgimento degli esercizi è buona norma fare riferimento ai libri di testo e (a seconda del linguaggio scelto):

Contenuto di file e directory

Il repository contiene:

README.md, LICENSE-CC.txt e LICENSE-GPL.txt

Una breve descrizione del contenuto (con link a questo sito) e dei termini di licenza di uso del materiale.

bin/

La directory che contiene i comandi di supporto ai test.

esercizi/

Le directory contenente gli esercizi.

Si raccomanda di non modificare, o cancellare, nessuno tra i file qui descritti, 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 esercizio/<NOME> (dove <NOME> è 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.

expected-1.txtexpected-M.txt

Questi file contengono esempi di output atteso.

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 actual-1.txt contenga le righe:

ben fatto
mamma

Se, dopo aver compilato la vostra soluzione, invocandola con gli argomenti 2 3 sulla riga di comando e dandole in input nel flusso di ingresso:

ciao
mamma

essa 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 verifica.

La directory dei comandi

La directory bin contiene i seguenti comandi:

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.

Tali comandi possono essere invocati dall'interprete a riga di comando del proprio sistema operativo, una volta che ci si è posizionati nella directory dell'esercizio.

Configurazione dell'interprete dei comandi

Se si usa l'interprete di comandi bash col sistema operativo GNU/Linux è possibile invocare i comandi precedenti specificandone il solo nome (e non il percorso completo) semplicemente aggiornando la variabile d'ambiente PATH. Per farlo è sufficiente portarsi nella directory in cui è contenuta la cartella bin/ ed impartire il comando:

export PATH="$(pwd)/bin:$PATH"

Una configurazione del tutto simile è possibile per altri interpreti di comandi (anche in altri sistemi operativi).

Modalità di svolgimento degli esercizi

Il materiale relativo a ciascun esercizio è contenuto in una directory di nome esercizi/<NOME> dove <NOME> è 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 disegna_v occorre spostarsi nella directory disegna_v con il comando:

cd esercizi/disegna_v

Il testo dell'esercizio è contenuto nel file Testo.md (che è un semplice file di testo) da leggere attentamente, 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.

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

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 l'eventuale compilazione e 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 actual-N.txt, ad esempio tramite il comando:

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