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

[Le tracce degli elaborati sono definitive, verranno eventualmente arricchite di particolari o precisazioni prima della fine del semestre.]

CONSIDERAZIONI GENERALI

Software per la gestione di un magazzino [1 persona solamente]

Una piccola ditta vi contatta per sviluppare il software per la gestione del magazzino. il software deve permettere la memorizzazione in un file i dati degli articoli stipati nei vari magazzini. Per ogni articolo sarà necessario memorizzare il codice del prodotto (un numero scelto dagli uffici tecnici), il nome descrittivo, la data di inserimento a magazzino, la quantità di pezzi inseriti, il codice dell'inserimento (un numero progressivo assegnato automaticamente dal software), la localizzazione nel magazzino (una lettera indicante il settore del magazzino in cui l'oggetto è stato depositato: A, B, C, etc).

Il codice deve permettere di caricare a magazzino una nuova partita di articoli, di prelevare dal magazzino una intera partita o una sua parte. Ad esempio l'operatore deve poter chiedere al software di prelevare 15 pezzi dell'oggetto X. L'oggetto X può essere stato immagazzinato in più lotti. Se un singolo lotto è composto da 15 pezzi quello verrà eliminato dal magazzino e verranno fornite le coordinate spaziale per recuperarlo (settore C). Se i singoli lotti sono composti da meno di 15 pezzi, il software dovrà verificare se in magazzino ci sono 15 pezzi del prodotto X e localizzare i vari lotti da cui prelevarli. Se non ci sono, dovrà chiedere all'operatore se vuole procedere al prelievo di un numero minore di oggetti. Quando il lotto contiene più articoli di quelli richiesti dovrete semplicemente decrementare la quantità relativa a quel lotto.

Il software deve permettere la stampa in un file HTML dell'intera giacenza del magazzino catalogata per: 1) nome dell'articolo, 2) localizzazione degli oggetti (settori A, B, C, ect).

Infine, dovete prevedere funzionalità di servizio come quella di cancellare il file del magazzino, di creare un nuovo file del magazzino, etc.

Suggerimenti: 1) progettate il software prima di cominciare a scriverlo! Create una classe Articolo e una classe Magazzino con i metodi opportuni. 2) Invece di modificare il file, modificate l'oggetto in memoria e riscrivete l'intero file ad ogni modifica. Esempio: nel file del magazzino riservate la prima riga a contenere un intero con il numero di oggetti presenti nel file. Potete, all'inizio del programma, utilizzare questo numero per creare un oggetto Magazzino di dimensioni opportune in cui caricare i vari articoli. Ad ogni modifica riscrivete, per semplicità, l'intero file del magazzino.

Risolutore di Sudoku [gruppo fino a 2 persone]

Il Sudoku, un gioco che la scorsa estate aveva 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:

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 downloaded jwget [gruppo fino a 2 persone]

GNU wget è una utility da riga di comando molto diffusa in ambiente Linux/Mac, ma disponibile anche per ambiente Windows. Serve per scaricare un file, una pagina o una intera gerarchia di pagine dal web. Scopo di questo progetto è quello di scrivere una rudimentale versione di wget in Java.

Il programma deve essere in grado di:

L'input utente potete scegliere di leggerlo da console, utilizzando metodi della classe javax.swing.JOptionPane o meglio ancora, da console sfruttando gli argomenti del metodo main() (che vedremo nella prossima esercitazione di laboratorio).

Il progetto può sembrare complesso, ma è solamente inusuale. La connessione con il server HTTP 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 HTTP sulla porta standard (80) semplicemente con:

webSocket = new Socket(nomeServer, 80);

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 richieste al server HTTP) con il metodo print() e leggere da quello di ingresso (la risposta del server HTTP) con il metodo readLine().

Prima di iniziare questo progetto:

Gli studenti del corso Laboratorio di Programmazione ad Oggetti sono invitati, se lo desiderano, ad approfondire il protocollo HTTP tramite le slides presentate durante la lezione 14.

Tracce elaborati PHP

Ai fini della valutazione verranno considerate la semplicità e la chiarezza del codice sviluppato per risolvere il problema. 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.

Sito per le aste on line [gruppo fino a 2 persone]

Sviluppare un sito per le aste on line. Il sito deve visualizzare le aste attive e permettere agli utenti (dopo una fase di login) di fare delle puntate. Sviluppare la pagina iniziale del sito che visualizzi l'elenco delle aste attive; cliccando su di ogni asta si deve aprire una pagina descrittiva che visualizzi una foto dell'oggetto, la data di scadenza dell'asta (o informi l'utente che l'asta è scaduta) il prezzo corrente, un link al venditore e quant altro desiderate.

Deve essere inoltre possibile registrarsi come utente al sito fornendo le proprie generalità (almeno Nome, Cognome, Codice Fiscale, indirizzo e numero di telefono e email). Ciascun utente oltre a fare offerte per le aste attive può mettere in vendita un oggetto di cui dovrà fornire i dettagli che poi verranno visualizzati sulla pagina descrittiva dell'asta.

Il sito, al termine dell'asta e dopo ogni puntata di un utente deve inviargli una email per informarlo che dal suo account è partita l'offerta o che ha vinto l'asta.

Infine, ogni utente deve poter puntare una cifra desiderata su ogni asta e deve poter scegliere in che momento fare la puntata (adesso, 1 ora prima della chiusura dell'asta, 5 minuti prima della chiusura dell'asta, 10 secondi prima della chiusura dell'asta).

©2006 Roberto Sassi