Regole e Gruppi

Gli elaborati possono essere svolti singolarmente (meglio) o in gruppi di 2 persone. Gruppi più ampi non sono possibili. E' previsto che lo stesso gruppo lavori sia sul progetto in Java che su quello in PHP.

L'esame si svolgerà in ogni caso singolarmente. I componenti di un gruppo possono sostenere l'esame in sessioni diverse, ma è necessario che il gruppo venga preventivamente registrato (basta contattare il docente prima che uno dei due componenti sostenga l'esame).

Ciascun gruppo, completati gli elaborati dovrà preparare una breve relazione che commenti il lavoro svolto. Per quanto rigurda l'elaborato Java, è sufficiente la documentazione Javadoc prodotta automaticamente.

Il codice DEVE essere opportunamente indentato e commentato.

Comunicazioni riguardanti le consegne e l'esame avverranno anche mediante posta elettronica e pubblicazione di avvisi sulla pagina comunicazioni.htm.

Tracce elaborati Java

CONSIDERAZIONI GENERALI

Software per la gestione di una piccola biblioteca [1 persona solamente]

In questo progetto viene richiesto di scrivere il software per la gestione di una piccola biblioteca.

L'utente amministratore deve poter:

Il catalogo dei libri deve essere contenuto in un file di testo, in cui ci sia una riga per libro e in cui i campi siano separati da tabulazioni. Quando il programma parte deve caricare il file in un array di oggetti libro. Dopo ogni nuovo inserimento o modifica (restituzione, prestito, etc) il catalogo viene risalvato completamente (per semplicità!). La prima riga del file del catalogo contiene il numero di libri in esso contenuti. Va letta per prima cosa per poter creare un array di oggetti libro di dimensioni opportune.

Per l'esame inserite almeno 10 libri

Risolutore di Sudoku [gruppo fino a 2 persone]

Il Sudoku, un gioco che recentemente ha riscosso una certa popolarità, consiste in una matrice 9×9, ulteriormente suddivisa in 9 sottomatrici 3×3, i cui devono essere posti numeri da 1 a 9 in modo da non avere ripetizioni in una stessa riga, colonna o sottomatrice 3×3. Il gioco inizia con alcuni numeri opportunamente collocati nella griglia (il "suggerimento iniziale") e termina quando la griglia è stata completamente riempita. Se il suggerimento iniziale è ben fatto, il gioco ammette una sola soluzione. Una possibile griglia è la seguente:

 +-----------------------------------+
1|   |   |   $   | 2 | 5 $   |   |   |
 |---+---+---+---+---+---+---+---+---|
2|   | 2 | 6 $   | 1 |   $   | 3 |   |
 |---+---+---+---+---+---+---+---+---|
3|   |   | 1 $   |   | 7 $ 9 | 8 |   |
 |===+===+===+===+===+===+===+===+===|
4| 2 |   | 3 $   |   |   $   |   |   |
 |---+---+---+---+---+---+---+---+---|
5| 1 | 4 |   $   |   |   $   | 2 | 7 |
 |---+---+---+---+---+---+---+---+---|
6|   |   |   $   |   |   $ 4 |   | 1 |
 |===+===+===+===+===+===+===+===+===|
7|   | 9 | 2 $ 7 |   |   $ 5 |   |   |
 |---+---+---+---+---+---+---+---+---|
8|   | 3 |   $   | 4 |   $ 2 | 6 |   |
 |---+---+---+---+---+---+---+---+---|
9|   |   |   $ 2 | 9 |   $   |   |   |
 +-----------------------------------+
   A   B   C   D   E   F   G   H   I

Il progetto consiste nello scrivere un programma capace di risolvere automaticamente un sudoku proposto dall'utente. Il programma deve inizialmente chiedere all'utente quale sia il nome del file contenente il suggerimento iniziale che deve essere un file di testo in cui siano contenuti solo caratteri '@' (al posto delle caselle vuote) o numeri. Ad esempio lo schema precedente deve essere passato al programma tramite un file schemaSudoku1.txt (il nome è irrilevante) che contenga:

@@@@25@@@
@26@1@@3@
@@1@@798@
2@3@@@@@@
14@@@@@27
@@@@@@4@1
@927@@5@@
@3@@4@26@
@@@29@@@@

Il programma deve implementare un semplice algoritmo:

Attenzione! Aggiunta facolativa ma consigliata (13 Febbraio 2006)

[Come alcuni hanno fatto notare, l'algoritmo precedente è capace di risolvere solo schemi molto facili. Ecco quindi una aggiunta (facoltativa ma caldamente consigliata) per risolvere Sudoku più complessi.]

  • tramite un ciclo eplorare tutte le righe (e successivamente tutte le colonne e tutti i sottoblocchi 3×3) tenendo conto di quante volte ciascun numero compare nelle liste dei numeri disponibili delle caselle vuote per ciascuna riga/colonna/sottoblocco. Se un numero compare nella lista dei numeri disponibili di una sola casella per riga (o colonna, o sottoblocco) allora il numero deve essere inserito in quella casella. L'algoritmo implementa la norma per cui un numero deve comparire una volta in ciascuna riga, colonna e in ciascuna sottomatrice 3×3.

L'algoritmo deve essere ripetuto fino a che il sudoku è risolto o fino a che la nuova iterazione non inserisce altri numeri (il sudoku in questi casi rimarrebbe incompleto perché il suggerimento iniziale non permette una soluzione univoca con questo schema risolutivo). Ad ogni interazione (e alla fine) il programma deve disegnare una scacchiera come quella sopra (anche se il refresh è veloce e si fatica e vederne il risultato non importa) e indicare all'utente quali caselle ha riempito (cioè hanno un solo numero possibile) a quel ciclo.

Prima di iniziare questo progetto:

Rudimentale Client POP3 [gruppo fino a 2 persone]

POP3 (Post Office Protocol - Version 3) è il protocollo comunemente utilizzato da molti internet provider per fornire agli utenti una casella di posta in arrivo. Il progetto consiste nel preparare un semplice client che permetta all'utente di leggere i propri messaggi di posta ed eventualmente scaricarli in files locali . Il progetto, oltre a permettere di approfondire minimamente l'utilizzo dei socket in Java, permette l'approfondimento di un protocollo molto diffuso.

Per prima cosa è necessario leggere la parte introduttiva delle specifiche del protocollo: rfc1939. Inoltre è meglio esercitarsi utilizzando il programma telnet da linea di comando. Esempio di sessione:

C:\>telnet mailserver.dti.unimi.it 110
+OK CommuniGate Pro POP3 Server 4.0.6 ready &kt;219733.1103287239@dti.unimi.it>
USER sassi
+OK please send the PASS
PASS *******************
+OK 2 messages (15879 bytes)
LIST
+OK 2 messages
1 8443
2 7436
.
STAT
+OK 2 15879
RETR 1
+OK 8443 bytes will follow
Return-Path: <sassi@dti.unimi.it>
Received: from [159.149.71.47] (HELO DONDOLO)
  by dti.unimi.it (CommuniGate Pro SMTP 4.0.6)
  with SMTP id 1474511 for sassi@dti.unimi.it; Fri, 17 Dec 2004 13:39:39 +0100
Message-ID: <055001c4e433$cb2681e0$f4451897@DONDOLO>
...
...
DELE 1
+OK marked deleted
DELE 2
+OK marked deleted
RETR 3
-ERR no such message
QUIT
+OK CommuniGate Pro POP3 Server connection closed
C:\>

I comandi POP3 che possono tornarvi utili sono:

USER
PASS
STAT
LIST
RETR
DELE
NOOP
RSET
QUIT

Il programma, deve leggere dal file di configurazione "RCconf.ini" il nome del server da contattare, username e password (fare il login utilizzando i comandi USER e PASS). Potete utilizzare un qualunque server POP3 dove abbiate un account (Libero, Tin, ...); alternativamente, il server POP3 della vostra casella email all'università va benone (ganimede.crema.unimi.it).

Una volta stabilita la connessione, il programma deve presentare all'utente una lista dei messaggi (potete utilizzare i comandi LIST e STAT, metterne gli output in una stringa e quindi offire all'utente le infomazioni ottenute opportunamente formattate). Per ciascun messaggio deve presentare il numero progressivo, il mittente, il soggetto e la dimensione in Kbytes. L'utente a questo punto può fare alcune cose (è di fatto un interprete di comandi):

  1. uscire dal programma: (dovete chiudere la connessione al server con il comando QUIT e quindi, una volta ottenuta conferma, uscire dal programma)
  2. leggere un messaggio: (utilizzare il comando RETR, il messaggio deve essere ben presentato. Non basta fare l'echo a monitor della risposta del server POP3)
  3. salvare un intero messaggio su file: (utilizzare RETR)
  4. segnare per la cancellazione un messaggio: (chiedere sempre conferma all'utente. Utilizzare il comando DELE)
  5. togliere il segno di cancellazione dai messaggi: utilizzare RSET).

In ogni caso, il programma deve sempre verificare la risposta del server (+OK o -ERR) e agire di conseguenza.

Il progetto può sembrare complesso, ma è solamente inusuale. La connessione con il server POP3 si ottiene attraverso la classe Socket contenuta nel pacchetto java.net, che quindi va importato all'inizio del programma.

import java.net.*;

Nel vostro programma, dovete istanziare un oggetto Socket e connetterlo al server POP3 sulla porta standard (110) semplicemente con:

webSocket = new Socket(nomeServer, 110);

dove nomeServer è semplicemente una stringa con l'indirizzo IP del server. La connessione potrebbe non riuscire; dovete preparvi a gestire le eccezioni sollevate. All'oggetto Socket sono connessi due Socket binari. E' possibile accedere ai due streams con i metodi getOutputStream() e getInputStream(). E' sempre conveniente "incartare" i due streams in modo da poterli manipolare più facilmente, come mostrato nell'esempio seguente:

webOut = new PrintWriter(webSocket.getOutputStream(), true);
webIn = new BufferedReader(new InputStreamReader(webSocket.getInputStream()));

Da questo punto in poi, lavorare sui due streams è pressoché identico a quanto visto per i files: potete scrivere sullo stream di uscita (cioè inviare comandi al server POP3) con il metodo print() e leggere da quello di ingresso (la risposta del server POP3) con il metodo realLine().

Prima di iniziare questo progetto:

Per chi vuole anche URL-decodificare i messaggi (facoltativo) sono disponibili i seguenti links:

Tracce elaborati PHP

Ai fini della valutazione verranno considerate la semplicità e la chiarezza del codice sviluppato per risolvere il problema. Parzioni di codice che implementino inutili complicazioni tolgono punti. Al contrario, eventuali integrazioni a quanto richiesto, quando concordate con il docente saranno valutate positivamente.

Per l'esame è necessario accompagnare il progetto con una breve relazione che spieghi sinteticamente le scelte fatte e la struttura del codice. E' importante essere sintetici (max 1 o 2 pagine).

Portale di gestione dei titoli [gruppo fino a 2 persone]

Vista la ripresa delle borse internazionali, vi viene commissionato un piccolo portale per la gestione di un portafoglio titoli personali.

Dovete preparare un portale che preveda:

Il calcolo del valore attuale di ciascuna azione è la parte interessante del progetto. Per farlo, chiedete al modulo PHP di leggere la pagina televideo (e sottopagina) indicatavi dall'utente. In PHP (nelle versioni recenti) è possibile accedere ad una pagina web come se si trattasse di un file locale. Vediamo un esempio:

<?php
$file = fopen ("http://www.dti.unimi.it/~sassi/LIA2005/index.htm", "r");
if (!$file) {
    echo "<p>Non riesco a connetermi al sito remoto.\n";
    exit;
}
while (!feof ($file)) {
    $line = fgets ($file, 1024);
    if (eregi ("<title>(.*)</title>", $line, $out)) {
        $title = $out[1];
        break;
    }
}
fclose($file);
?>
<html>
<title>Prova di connessione a sito web esterno</title>
</html>
<body>
Il titolo del sito remoto è: <tt><?php print $title; ?></tt>
</body>
</html>

Invece di cercare la stringa del titolo, dovrete cercare la stringa corrispondente al codice del titolo fornitovi dall'utente. Quando lo trovate, leggetene il valore che si trova sulla stesso riga.

Ricetta a partire dalla lista degli ingredienti [gruppo fino a 2 persone]

La dieta degli studenti universitari non è spesso ottimale. Talvolta anche se si parte con la precisa intenzione di cucinare qualcosa di nuovo, ci si ferma, una volta aperto un ricettario, di fronte al fatto che gli ingredienti richiesti non coincidono con quanto contenuto nel frigorifero.

L'associazione degli studenti vi incarica di preparare un sito dove sia possibile indicare quanto disponibile nel frigorifero ed ottenere di conseguenza una serie di ricette che contengano tali ingredienti. Obiettivo di questo elaborato è quello di costruire il ricettario on-line.

Costruire per prima cosa il database delle ricette, che contenga, oltre al testo della ricetta vera e propria, una lista degli ingredienti (che verrà utilizzata per la ricerca). Inoltre costruire il database degli utenti che devono essere registrati per inserire nuove ricette.

Il progetto si compone dei file:

©2005 Roberto Sassi