Regole e Gruppi

Gli elaborati possono essere svolti singolarmente (meglio) o in gruppi di 2 persone. Gruppi più ampi non sono possibili. È 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 riguarda 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

Mini server HTTP [massimo 2 persone]

Sviluppare un piccolo server HTTP capace di rispondere a richieste di tipo GET, POST e HEAD. Il server deve fornire risposte che rispettino lo standard HTTP in pieno e deve essere possibile interagire con il server tramite un comune browser. Il progetto può sembrare complesso, ma è solamente inusuale.

Vi suggerisco di utilizzare più thread concorrenti (anche se non è necessario) e la creazione degli oggetti richiesta e risposta, con le variabili istanza ed i metodi opportuni. Ad esempio, l'oggetto richiesta potrebbe avere il metodo servi() che crei la relativa risposta.

Un server deve sempre stare in attesa di possibili richieste su di una data porta. A questo scopo potete utilizzare la classe java.net.ServerSocket, che implementa un tipo di socket adatto ad un server. Il ServerSocket attende di ricevere una richiesta e quando ne arriva una crea un oggetto Socket opportuno. Il pacchetto java.net, va quindi importato all'inizio del programma.

import java.net.*;

Gli header, delle richieste ricevute e delle risposte inoltrate, vanno riportati nella console.

Prima di iniziare questo progetto:

Software per il calcolo del consumo telefonico [massimo 2 persone]

Il controllo della convenienza del proprio provider cellulare è reso difficile dalle diversità tariffarie. Il progetto si propone di sviluppare un software per il calcolo del consumo telefonico su dati reali. Il programma deve essere di utilità pratica e deve permettere all'utente di:

Suggerimenti: progettate il software prima di cominciare a scriverlo! Create una classe Telefonata e una classe ProfiloTelefonico con i metodi opportuni.

Gioco dell'Othello/Reversi [massimo 2 persone]

Sviluppare una applicazione per il gioco dell'Othello/Reversi. Per informazioni sul gioco vi rimando al sito della Federazione Italiana Gioco Othello (Reversi), in particolare per quanto riguarda le regole del gioco di cui riporto un sunto per comodità.

"Othello si gioca in due, su una scacchiera 8x8, verde, con 64 pedine bicolori. Un giocatore ha il Nero (che inizia il gioco), l'avversario il Bianco (nel nostro progetto 'O' e 'X' rispettivamente) La disposizione iniziale delle pedine sulla scacchiera è

 +-------------------------------+
1|   |   |   |   |   |   |   |   |
 |---+---+---+---+---+---+---+---|
2|   |   |   |   |   |   |   |   |
 |---+---+---+---+---+---+---+---|
3|   |   |   |   |   |   |   |   |
 |---+---+---+---+---+---+---+---|
4|   |   |   | X | O |   |   |   |
 |---+---+---+---+---+---+---+---|
5|   |   |   | O | X |   |   |   |
 |---+---+---+---+---+---+---+---|
6|   |   |   |   |   |   |   |   |
 |---+---+---+---+---+---+---+---|
7|   |   |   |   |   |   |   |   |
 |---+---+---+---+---+---+---+---|
8|   |   |   |   |   |   |   |   |
 +-------------------------------+
   A   B   C   D   E   F   G   H

Al suo turno ogni giocatore poggia una pedina, con la faccia del proprio colore rivolta verso l'alto, su una casella ancora vuota. Una pedina imprigiona quelle avversarie in una o più direzioni (orizzontale, verticale e/o diagonale), rendendo le pedine imprigionate del proprio colore (ovvero capovolgendole). Il giocatore, al suo turno, è obbligato a giocare appoggiando una pedina in maniera da imprigionare almeno un disco avversario; non può porre una pedina in una casella senza girare dischi avversari, né girare meno di quelle richieste, né rinunciare alla mossa. Nel caso in cui non vi siano mosse legali, il giocatore passa, e tocca nuovamente all'avversario, fino all'esaurimento delle mosse per entrambe i giocatori (in genere ciò capita dopo aver riempito interamente di pedine la scacchiera). Raramente può succedere che tutte le pedine diventino di un solo colore o che entrambi i giocatori non possano muovere anche se ci sono ancora caselle vuote, in tal caso la partita termina. Vince chi, quando è stata giocata l'ultima mossa, ha più pedine dell'avversario."

Il progetto consiste nello scrivere un programma capace di giocare con l'utente. Per prima cosa deve chiedere all'utente se vuole iniziare e quindi deve di volta in volta scegliere la mossa migliore da fare. Per calcolare la mossa migliore dovreste iterare su tutte le mosse disponibili e contare per ognuna il numero di pedine che vengono conquistate, scegliendo quindi la migliore. Prima di passare la mano al giocatore, il programa deve anche verificare che ci siano mosse legali per quest'ultimo. In caso contrario, prima di giocare nuovamente il programma ne deve avvisare il giocatore.

Il programma deve infine essere in grado di capire se la partita è finita e quindi di decretare il vincitore. Prima di iniziare questo progetto:

Classe per la gestione di numeri interi superLong [massimo 2 persone]

Abbiamo visto che la classe long permette di rappresentare interi con segno fino a 9223372036854775807. Supponiamo di voler calcolare esattamente il numero di permutazioni possibili con un mazzo di carte. Il numero supera la possbilità di rappresentazione della classe long (è 8.1592e+047!).

Scopo del progetto è quello di sviluppare la classe superLong che permetta di rappresentare numeri interi di dimensioni a piacere (>8). Il costruttore della classe deve permettere di scegliere il numero di bytes che costituiranno la rappresentazione in memoria del numero intero (ad esempio un long è rappresentato in memoria da 64 bit, quindi 8 bytes).

Inoltre devono essere possibili le seguenti operazioni tra oggetti della classe superLong: somma, differenza, moltiplicazione, divisione intera, resto della divisione intera. Quando due oggetti superLong hanno dimensioni differenti, il risultato sarà un oggetto delle dimensioni del maggiore.

Il progetto è pensato per chi vuole approfondire la rappresentazione in memoria dei numeri. Vi suggerisco di 1) rappresentare gli oggetti longInt in complemento a due; 2) studiare sul libro di testo gli operatori sui bit. Java prevede gli stessi operatori del C.

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. È importante essere sintetici (max 1 o 2 pagine).

Dall'anno accademico 2007/2008 è obbligatorio installare l'applicazione funzionante sul server php.dti.unimi.it avendo già predisposto un opportuno database di supporto. Questo da allo studente la possibilità di testare l'applicazione in un contesto di produzione (HTTPS è supportato) e inoltre garantisce allo studente che non sorgano problemi di installazione durante l'esame. È comunque necessario portare il sorgente PHP e SQL (per il database) su un supporto elettronico.

Software di gestione dell'orario delle lezioni [gruppo fino a 2 persone]

Sviluppare un'applicazione per la visualizzazione dell'orario delle lezioni (l'applicazione non deve predisporre l'orario!).

Predisporre innanzitutto un database opportuno che contenga la lista degli esami per ciascuno dei corsi di studio erogati presso il polo didattico di Crema. Le liste complete le trovate alla pagina: http://www.dti.unimi.it/pianostudi/elenco.php. Visto che l'applicazione si occupa dell'orario corrente dovete ovviamente considerate solo il caso di chi si è immatricolato dopo l'anno accademico 2003/2004. Il database deve anche riportare se un esame è obbligatorio o complementare (lo capite dalla presenza o meno do una crocetta nella pagina degli esami).

In secondo luogo il database deve contenere anche una tabella con la lista di tutti gli esami per i quali vengono erogate lezioni. La lista la trovate alla pagina: http://www.dti.unimi.it/pianostudi/esami.php. Notate che la colonna "2007" indica in quale semestre il corso prevede lezioni (se non c'è nulla vuol dire che il corso non prevede lezioni e potete trascurarlo). Per ogni corso il vostro database deve anche contenere il nome del docente, un acronimo del corso (una abbreviazione di poche lettere che potete inventare voi), il relativo orario (giorni della settimana e fascia oraria in cui si tengono le lezioni che può essere: 9–11, 11–13, 14–16 e 16-18. Suggerimento: costruite una ulteriore tabella che mettete in relazione con la prima in base al codice dell'esame.) e l'aula (prendete spunto dalle aule del polo di Crema compresi i laboratori).

Sviluppate quindi una pagina di amministrazione che permetta all'utente di modificare o inserire l'orario per un singolo esame. (La cosa migliore è forse che predisponiate una prima form con un menù a tendina che riporti tutti i corsi attivi e che permetta all'utente di selezionarne uno. A questo punto potete visualizzare lo schema di una settimana tipo da lunedì a venerdì con una checkbox per ogni fascia oraria) [Per chi vuole dilettarsi con AJAX, questa form è adatta].

Lato utente l'applicativo deve presentare una form php iniziale (si prenda spunto dall'immagine Form1) che richiede all'utente le seguenti informazioni:

Usando queste informazioni e il relativo data base l'applicativo deve generare una nuova form del tipo Form2 e Form5 con l'elenco dei corsi (e relativi acronimi) con a fianco una check box. Ci sono due casi:

  1. nel caso in cui sia stato richiesto il corso di studi "TUTTI" (cioè tutti gli esami a prescindere dal corso di studi) i checkbox devono essere per default non checked (si veda Form5).
  2. in tutti gli altri casi gli esami obbligatori devono essere checked ed i complementari no, in modo che ciascuno studente scelga gli esami che gli interessano. Alcuni complementari non hanno un anno di corso associato. Questi li dovete presentare quando lo studente seleziona un qualunque anno di corso (uno studente potrebbe frequentare un complementare al secondo ed un altro studente al terzo).

Quando l'utente ha scelto i corsi che gli interessano e richiede l'orario, l'applicativo deve generare l'orario (usando le informazioni sul data base). Ci sono due possibili formati per l'orario. Tali formati sono definiti dal campo visualizzazione della prima form.

Ci sono due casi:

  1. visualizzazione per giorno il risultato deve essere del tipo Form3 e Form6 (caso in cui ci sono piu' insegnamenti nello stesso slot giorno/ora)
  2. visualizzazione per corso il risultato deve essere del tipo Form4

Il migliore progetto presentato verrà effettivamente utilizzato sul sito del dipartimento ad uso degli studenti. Per questo motivo è importante rispettare le specifiche indicate per il software.

Software per la gestione di un gruppo di acquisto [gruppo fino a 2 persone]

Vista la diffusa diminuzione del potere d'acquisto degli stipendi in Italia, insieme ad un gruppo di amici decidete di costituire un gruppo di acquisto e di dotarlo di un sito in modo che il maggior numero possibile di persone possa aderirvi.

In sostanza il portale dovrà essere dotato di:

©2007 Roberto Sassi