Questa pagina descrive il progetto per il corso di Informatica della Laurea in Matematica per le sessioni dell'anno accademico 2017/2018.
Il progetto è costituito da due mini-esercizi.
Si consideri un display a cristalli liquidi composto da 16 segmenti, della forma seguente.
Ogni segmento può essere nello stato "acceso" oppure "spento".
Tutto il display può quindi formare piccole espressioni aritmetiche come
ad esempio 3+3,4-3,0-8
.
Si chiede di scrivere un programma Java che "legga" l'espressione aritmetica rappresentata dal display, e "scriva" sul display stesso il risultato di tale espressione. Più precisamente:
0
a 9
) separate da +
o
-
E E
",
sempre seguendo la stessa rappresentazione (cioè
).
Ambo le cifre vengono
impostate ad E
, e l'operazione (segmenti 7 e 8) viene
spenta.0
),
così come l'operazione. La seconda cifra contiene il risultato.-
. La seconda cifra contiene il risultato.0
),
così come l'operazione. La seconda cifra contiene lo zero.Si chiede di scrivere una funzione Java avente (esattamente) nome e tipo come segue:
public static String esercizio1(String display) { ... }
Lo stato di tutti e 16 i segmenti è rappresentato come una
String
Java di lunghezza 16.
Il carattere in posizione i
nella stringa indica
lo stato del cristallo numero i
: con
'#'
si indica un cristallo acceso,
con '_'
uno spento.
(Chiarimento: qui si segue la numerazione che compare sopra in figura.)
Questo formato vale sia per il parametro di input alla funzione,
sia per il suo output.
Si può supporre che la stringa input sia sempre una stringa lunga 16, contenente solo i caratteri acceso/spento descritti sopra. In tal caso, la funzione deve sempre fornire un risultato nello stesso formato.
In caso di input malformato (stringa non di 16 caratteri, o con caratteri diversi da acceso/spento), non si richiede nessun comportamento particolare. Il programma può dare un risultato qualunque, o anche generare un errore a tempo di esecuzione.
Ecco alcuni esempi di input-output attesi.
8+8 = 16 "################" -> "__#__#___##_####" 4+6 = 10 "_###_#_####_####" -> "__#__#___###_###" 4-6 = -2 "_###_#_#_##_####" -> "_______#_#_###_#" 4-C = EE "_###_#_#_##__#_#" -> "##_##_#__##_##_#"
Un personaggio di un videogioco ha con sé un insieme di armi, che si porta dietro e usa nelle sue avventure. A un certo punto nel gioco, il personaggio si imbatte in un negozio di armi, dove può sostituire le armi che ha nel modo seguente.
Il personaggio deve scegliere fino a due armi (quindi 0, 1, o 2) tra quelle possedute, e abbandonarle, consegnandole al negoziante. Successivamente, per ogni arma consegnata in questo modo, il personaggio riceve in cambio un'arma dal negoziante. Le armi così ricevute sono distinte tra loro. Queste sono anche diverse dalle armi che il personaggio possiede in quel momento (ma non necessariamente diverse dalle armi che il personaggio aveva all'inizio).
Per esempio, il personaggio all'inizio ha
spada,arco,balestra,fionda,ascia
. Decide di
abbandonare arco,fionda
. Dopo, ha a
disposizione spada,balestra,ascia
. Il negoziante
quindi gli consegna altre due armi tra quelle che ora non ha:
alabarda,arco
. Alla fine il personaggio ha quindi a
disposizione
spada,balestra,ascia,alabarda,arco
.
In questo caso, una delle armi (arco
) è stata
nuovamente restituita al personaggio.
Si chiede di scrivere una funzione Java che legga da file l'elenco
delle armi prima della sostituzione, e l'elenco delle armi dopo la
sostituzione. La funzione deve controllare che la sostituzione sia
avvenuta correttamente, in base alle regole descritte sopra, e non
in altro modo. La funzione Java deve restituire come risultato un
booleano: questo deve essere true
se e solo se la
sostituzione è stata svolta correttamente.
Si chiede di scrivere una funzione Java avente (esattamente) nome e tipo come segue:
public static boolean esercizio2(String nomeFile) { ... }
Alla funzione viene passato un nome di file nomeFile
che è garantito esistere, e contenere due righe di testo nella forma
seguente.
armaA1 armaA2 ... armaAN armaB1 armaB2 ... armaBM
La prima riga elenca le armi prima della sostituzione, la seconda dopo la sostituzione. In ogni riga si trovano i nomi delle armi, separati da un singolo spazio. Il nome di ogni arma è composto da una parola sola, e quindi non contiene spazi al suo interno.
Non c'è un ordine particolare in cui le armi vengono elencate. È possibile che le armi elencate nella prima riga compaiano nella seconda riga in una posizione diversa, o in un ordine diverso rispetto alle altre armi. In una riga la stessa arma compare al massimo una volta (non ci sono ripetizioni).
Il numero di armi N
e M
è un naturale
(quindi maggiore o uguale a zero). Se zero, la riga è vuota.
In caso di errore di IO (per esempio, il nome di file passato come argomento non corrisponde a nessun file) o di input malformato (per esempio, meno di due righe nel file), non si richiede nessun comportamento particolare. Il programma può dare un risultato qualunque, o anche generare un errore a tempo di esecuzione.
Ecco alcuni esempi di input-output attesi:
=== Input: spada arco arco spada === Output: true ******************* === Input: spada arco arco === Output: false ******************* === Input: spada arco arco fionda === Output: true ******************* === Input: spada arco arco fionda lancia === Output: false ******************* === Input: spada arco katana mazza === Output: true ******************* === Input: cerbottana claymore dardo cannone laser fucile cannone sciabola === Output: false ******************* === Input: cerbottana claymore dardo cannone claymore fucile cannone sciabola === Output: true ******************* === Input: kusarigama naginata kusarigama kunai === Output: true ******************* === Input: === Output: true ******************* ******************* === Input: spada === Output: false
Si fa notare che in Java, se s1,s2
sono due variabili
di tipo String
, il loro confronto tramite
s1 == s2
controlla se le due stringhe hanno lo stesso
riferimento (sono memorizzate nello stesso posto in memoria),
invece dello stesso contenuto (contengono gli stessi caratteri).
Per verificare l'uguaglianza del contenuto di due stringhe,
bisogna usare invece s1.equals(s2)
.
Si chiede di scrivere una singola classe Java
Progetto
, che contenga entrambe le funzioni
esercizio1,esercizio2
con il tipo descritto sopra.
Vi viene fornito un scheletro di classe Java.
La classe scheletro va posizionata in un progetto eclipse come segue.
Create un progetto eclipse chiamato COGNOME_MATRICOLA
(usate i vostri dati),
e create la classe Progetto
al suo interno nella cartella
src
. Dovreste ottenere un file come segue:
zunino_555555/src/Progetto.java
È obbligatorio utilizzare lo scheletro associato al progetto come è, senza modificare i tipi delle funzioni all'interno, e senza modificare il suo package. È obbligatorio rispettare la posizione del file come descritto sopra.
È invece consentito (e consigliabile) definire delle
procedure/funzioni addizionali all'interno della
classe Progetto
. È consentito aggiungere
import
per usare librerie di Java.
È consentito modificare il metodo main
della classe
nello scheletro. Si noti, tuttavia, che tale metodo
potrà essere cancellato e sovrascritto, o comunque
non eseguito, da chi corregge.
Di conseguenza, se si decidono di usare variabili globali,
queste devono essere inizializzate dentro le funzioni
esercizio1, esercizio2
e non dentro
il main
, in quanto quest'ultimo non verrà eseguito.
Durante la correzione, verranno ripetutamente chiamate le funzioni
esercizio1, esercizio2
della classe scheletro,
eseguendo (anche) test automatizzati.
Il progetto verrà valutato secondo i seguenti criteri, che formano un insieme di requisiti sul codice consegnato. Ogni requisito primario è condizione necessaria per il superamento della prova: anche se uno di questi non viene rispettato, la prova non è superata. I requisiti secondari devono essere generalmente rispettati. Nel caso ci siano solo minori violazioni di tali requisiti, la prova è comunque superata. Violazioni gravi possono comunque causare il non superamento della prova.
Requisiti tecnici (primario). La soluzione consegnata deve seguire lo scheletro di progetto fornito sopra, modificato nel modo descritto sopra.
Devono inoltre essere rispettati questi requisiti:
Progetto
, i nomi o i tipi delle funzioni
esercizio1, esercizio2
.
Non aggiungete o modificate il
package
della classe.
Progetto
come descritto
sopra nel vostro progetto eclipse.
esercizio1, esercizio2
non devono
interagire con l'utente in nessun modo (ad es., chiedere
dati all'utente). I nostri test devono potere chiamare ripetutamente
quelle funzioni in modo automatico, senza il nostro intervento.
Il main
invece può interagire con l'utente, se desiderato
(ma comunque come detto sopra il codice del main
può essere ignorato da noi durante i test.)
Il non rispettare questi requisiti tecnici può causare il fallimento dei nostri test automatizzati, ed in tal caso la prova non sarà superata.
Correttezza (primario).
Non ci devono essere errori a tempo di compilazione: il programma deve
compilare. Non ci devono essere errori a tempo di esecuzione: il
programma non deve generare eccezioni (per
esempio, DivisionByZero
oppure ArrayIndexOutOfBounds
) quando eseguito su un input
valido. Il programma deve dare l'output desiderato su qualunque
input compatibile con la specifica.
Nota bene:
Nel caso il programma sia scorretto, non è compito di chi corregge
fare il debugging,
ovvero identificare la causa dell'errore e suggerire una modifica
per rimuoverla. Anche quando tale causa fosse nota a chi corregge,
non verrà comunicata allo studente, in quanto sarebbe come suggerire
una parte non banale della soluzione della prova. Infatti, capita
frequentemente che correggere l'errore dopo averlo
individuato diventi banale ("devo usare x
, e non
x+1
"), e che la prova di conseguenza consista prevalentemente
nella ricerca dell'errore.
Corollario:
se provando il programma su un insieme di input campione si riscontrano
già errori di correttezza, chi corregge non è tenuto ad esaminare
il codice del programma.
Leggibilità (secondario). Il codice deve essere scritto in modo tale da permettere ad un altro programmatore di comprenderne la logica. Non è sufficiente che il codice "funzioni", o che sia chiaro a chi lo ha scritto. Per aiutare la lettura del codice da parte di altri, si consiglia di usare dei nomi di variabile e di funzione appropriati, strutturare il codice adeguatamente (dove ha senso, meglio dividere una funzione lunga in più funzioni ausiliarie), e di inserire dei commenti.
Non commentate come state calcolando qualcosa, commentate piuttosto cosa state calcolando. Per esempio, il seguente commento è altamente inutile:
// incremento i i++;
Al contrario, il seguente aiuta a comprendere il codice:
// passo a coordinate polari rho = Math.sqrt(x*x + y*y); theta = Math.atan2(y, x);
Per potere partecipare allo scritto di una sessione di esame, il progetto deve essere consegnato entro le date indicate nell'elenco delle sessioni di esame. La consegna si svolge mandando una email avente esattamente le seguenti caratteristiche.
zunino_555555/src/Progetto.java
zunino_555555/README.txt
Se avete dubbi sul testo del progetto, ovvero su che cosa vi sta venendo chiesto, chiedete pure delucidazioni per email o a ricevimento. Se invece avete dubbi sulla soluzione dell'esercizio, ovviamente non possiamo suggerirvi nulla.
Il progetto non viene svolto in un ambiente "controllato" come per esempio avviene per un esame scritto, ma vi viene lasciata libertà di svolgerlo dove e quando preferite (compatibilmente con le scadenze). Per esempio, potete usare i laboratori quando liberi, o farlo su un vostro computer personale.
Il progetto è individuale, non di gruppo. Tuttavia, vi è consentito discutere del progetto con altre persone per scambiarsi opinioni a riguardo. Non è consentita, ovviamente, la copia di pezzi di codice inerenti al progetto da uno studente all'altro. Allo stesso modo, farsi fare il progetto da un'altra persona è considerato equivalente a copiare. In caso di dubbi sull'autenticità del progetto, ci riserviamo la possibilità di convocarvi per un colloquio sul codice che avete consegnato, anche dopo l'esame scritto.
Vi è consentito di "copiare" invece pezzi di codice che vi abbiamo fornito noi, o di "tradurre in Java" dei pezzi di codice che potreste trovare su qualche libro o tutorial online. In questo caso, però, dovete obbligatoriamente citare la fonte in un commento nel codice.
Il discutere del progetto su forum di discussione su Internet o simili non è vietato a prescindere, ma è soggetto alle stesse regole della comunicazione tra altri studenti. Inoltre, se iniziate una discussione su un forum riguardo al progetto, dovete obbligatoriamente dichiarare 1) che l'esercizio in questione è un progetto di esame, e 2) che non desiderate che qualcuno vi scriva una soluzione al posto vostro. Se anche chiarendo ciò qualcuno vi risponde includendo del codice, voi non potete includerlo nel progetto.
Se preferite, potete usare anche caratteristiche di Java non viste a lezione (costrutti, librerie, ...), anche se il progetto si può svolgere benissimo senza. Dovete però comprendere il codice che state usando: se venite chiamati ad un colloquio (vedi sopra) vi può essere chiesto di spiegarlo.
Se, nell'input dell'esercizio 1, l'operazione è completamente spenta (segmenti 7 e 8 spenti), l'operazione è da considerarsi come non valida e quindi il risultato è la configurazione d'errore. Lo stesso vale per una o più cifre completamente spente nell'input.
Informatica - Teaching - Home
Roberto Zunino, 2017