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 nomemain
(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):
alla documentazione delle API di Java (la libreria standard di Java), della GNU C Library (la libreria standard del C), del compilatore javac, della macchina virtuale java, del compilatore GCC;
alle guide Input/output (ed altro) con le API di Java e Input/output (ed altro) con la libreria standard in C (con esempi di codice sorgente che si possono utilizzare nella soluzione degli esercizi);
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.txt
… input-M.txt
Questi file (se presenti) contengono alcuni esempi di input.
args-1.txt
… args-M.txt
Questi file (se presenti) contengono esempi di argomenti sulla linea di comando.
expected-1.txt
… expected-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