29 novembre 2006

Progetto di Programmazione a oggetti

Tecnologie Informatiche
A.A. 2006/2007


Introduzione


Una grande Università che sul proprio sito web riceve molti accessi al giorno decide di replicare il contenuto del proprio server principale (di seguito: SERVER) per diminuire il carico di lavoro e la occupazione di banda su di esso. Per fare ciò vuole creare una rete di altri server, (di seguito: PROXY), con il requisito fondamentale che essi si aggiornino automaticamente ai cambiamenti del SERVER, quali l'aggiunta di nuove pagine web (FILE) e la modifica di FILE esistenti. I browser degli utenti (CLIENT) verranno quindi indirizzati sui PROXY invece che sul SERVER, visualizzeranno un sito sempre aggiornato e non sovraccaricheranno il SERVER principale.

L'Università, prima di realizzare la rete di PROXY, vuole simulare l'intero sistema con un programma scritto in linguaggio C++. Nel seguito sono descritti il meccanismo dettagliato del sistema e i requisiti per la sua simulazione.


Descrizione del sistema

Il CLIENT

Il CLIENT è un computer dotato di un browser e di una memoria cache sulla quale vengono memorizzate le pagine web (FILE) accedute più di recente.
Il CLIENT tiene traccia della data di memorizzazione di ogni FILE nella cache.
Ogni CLIENT si connette alla rete attraverso un provider. Questa informazione sarà utilizzata per assegnare al client il PROXY più vicino.
Ogni volta che un utente richiede una pagina sul suo browser (ad esempio la pagina www.università.it/index.html), il CLIENT esegue questi passi:
  1. interroga il DNS, cioè un server apposito che restituisce l'indirizzo del PROXY più vicino (anziché l'indirizzo del SERVER)
  2. verifica l'eventuale possesso del FILE (pagina) in cache. Se il FILE c'è, il CLIENT chiede al PROXY la data di ultima modifica della pagina e la confronta con la data di memorizzazione del FILE in cache. Se i due FILE hanno la stessa data allora il CLIENT non fa altre richieste, ma mostra direttamente la pagina. Altrimenti prosegue con il prossimo passo.
  3. il CLIENT chiede il FILE al PROXY, lo visualizza e lo memorizza nella cache.

Chiameremo le due richieste di cui ai passi 2 e 3, rispettivamente: LastMod() e Get().

Il PROXY

Il PROXY è un computer in grado di rispondere alle richieste dei CLIENT e di eseguire, a sua volta, delle richieste al SERVER. Il PROXY ha una memoria dove mantiene i FILE.
Quando il PROXY riceve una richiesta, sia LastMod() che Get(), per poter rispondere deve prima verificare l'aggiornamento del FILE nella sua memoria. Poi potrà rispondere, rispettivamente:
  1. inviando la data dell'ultimo aggiornamento del file, nel caso di richiesta LastMod()
  2. inviando il file stesso, nel caso di richiesta Get()

L'aggiornamento del file si verifica in questo modo:
  1. Il PROXY deve verificare il possesso del FILE nella sua memoria.
  2. Se sì, deve verificare che non sia stato modificato sul SERVER, mediante una richiesta LastMod() analoga a quella del CLIENT.
  3. Se è stato modificato o se non era presente in memoria deve richiedere il FILE al SERVER (mediante una opportuna Get()) e (re)inserirlo in memoria.

Il SERVER

Il SERVER mantiene tutti i FILE, può rispondere alle richieste LastMod() e Get(), e, nel caso gli venga richiesto un file non esistente, restituisce un file speciale chiamato ERRORFILE. Inoltre è possibile aggiungere nuovi FILE sul SERVER e aggiornare file esistenti.

Modellazione

Modellare il sistema come segue.

  • una classe File. Ogni oggetto ha un contenuto, come stringa di testo. Ha un metodo per stamparsi e uno per restituire la propria lunghezza
  • una classe base Computer, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • un repository di FILE, con filename, size, date
    • un log delle operazioni eseguite
    • Add(), aggiunge un file al repository
    • Touch(), aggiorna la data di un FILE alla data corrente (simula un aggiornamento del file)
    • LastMod(), restituisce la data di un FILE
    • Get(), restituisce il contenuto di un file
    • Log(), aggiorna il log con l'operazione eseguita
    • Stat(), stampa le statistiche relative al log
  • una classe derivata Proxy, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • Get() e LastMod() modificati per la verifica e l'aggiornamento del FILE
    • gestione dell'ERRORFILE (non deve essere mai memorizzato in cache)
  • una classe derivata Server, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • Get() e LastMod() modificati per la gestione dei FILE inesistenti
  • classe Dns
  • classe Client, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • stampa del FILE (simula la visualizzazione di una pagina)
    • richiesta di un file


Realizzare un main() che, leggendo un file di configurazione in un formato a scelta, esegua una simulazione con 100 CLIENT, 4 PROXY, 1 SERVER, 1 DNS, 5 FILE.

24 novembre 2006

Esempi di overloading; Costruttore di copia

Lezione del 24 novembre
[45 presenti]


Argomenti trattati:

  • overloading degli operatori ++, <<>
  • overloading dell'operatore [] per la classe Punto
  • costruttore di copia
  • classe Lista: problema dell'interferenza (condivisione di memoria + side effect)



Podcast della lezione:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20061124.mp3


Codice C++ di esempio realizzato a lezione:
Tutti i file si trovano su: http://multicommunity.di.uniroma1.it/learning/50_course/1369/20061124.zip

Dispense online:
Gestione della memoria: costruttore di copia, operatore di assegnazione, distruttore, interferenza

21 novembre 2006

Overloading degli operatori

Lezione del 17 novembre
[40 presenti]


Argomenti trattati:

  • classe Complesso:
    • dichiarazione,
    • definizione
    • esempio d'uso
  • soluzione alla domanda 19 del test di esonero
  • overloading degli operatori

Podcast della lezione:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20061117.mp3


Codice C++ di esempio realizzato a lezione:



Dispense online:
Esempi, overloading degli operatori

14 novembre 2006

Soluzione della prova intermedia - SECONDA PARTE

Ecco la soluzione della seconda parte della prova del 10 novembre scorso (il programma).



#include <iostream>
using namespace std;

void LeggiIn(int* v)
{ for (int i = 0; i < 10; i++)
cin >> v[i];
}

int ContaDifferenti(int* v)
{ int ultimo = v[0];
int quanti = 1;
for (int i = 1; i < 10; i++)
{ if (v[i] != ultimo)
{ quanti++;
ultimo = v[i];
}
}
return quanti;
}

int AllocaECopia(int*& w,int* v)
{ int n = ContaDifferenti(v);
w = new int[n];
w[0] = v[0];
int i = 1, j = 0;
while (i < 10)
{ if (v[i] != w[j])
{ j++;
w[j] = v[i];
}
i++;
}
return n;
}

int Sostituisci(int* w, int n)
{ if (n == 0)
return 0;
w[0] = w[0] + Sostituisci(w+1, n-1);
return w[0];
}

int Sum(int x)
{ static int accumulatore = 0;
accumulatore = accumulatore + x;
return accumulatore;
}

void Stampa(int* v, int* w, int n, int t)
{ for (int i = 0; i < 10; i++)
cout << "v[" << i << "]=" << v[i] << endl;
cout << endl;
for (int i = 0; i < n; i++)
cout << "w[" << i << "]=" << w[i] << endl;
cout << endl;
cout << "t=" << t << endl;
}

main()
{ // domanda a)
int v[10];
LeggiIn(v);

// domanda b)
int* w;
int n = AllocaECopia(w,v);

// domanda c)
Sostituisci(w,n);

// domanda d)
int t;
for (int i = 0; i < n; i++)
t = Sum(w[i]);

// domanda e)
Stampa(v,w,n,t);

system("PAUSE");
}

Correzione dell'esonero

Lezione del 14 novembre
[37 presenti]

Argomenti trattati:

  • Visione dei compiti d'esonero (test a risposta multipla) da parte degli studenti.
  • Soluzione alla lavagna di tutte le domande del test d'esonero con spiegazione delle motivazioni per le risposte esatte e per quelle sbagliate.
Podcast:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20061114.mp3

"Sulla rifiutabilità dell'esonero"

Chi non è contento del voto dell'esonero può fare come segue:

  1. svolgere il progetto
  2. sostenere l'esame. Gli verrà proposto un voto per il progetto e quindi un voto totale che comprende il bonus e la media con l'esonero
  3. rifiutare il voto mantenendo il progetto.
  4. Tornare all'appello successivo a sostenere solamente il test a risposta multipla. Ovviamente, il voto dell'esonero è perso e viene sostituito dal nuovo voto (non si può scegliere il migliore). Quindi verrà ricalcolato il voto totale.
NB: Chi rifiuta il voto all'esame può decidere di rifiutare il solo esonero, o il solo progetto, o entrambi. Il bonus non si può rifiutare (e quindi non si può rifare).

NB2: Ogni voto viene mantenuto per 2 anni (stessa validità del programma del corso). Quindi potete utilizzare il voto dell'esonero del 10 nov scorso in tutti i miei appelli fino al 9 novembre 2008.

L'orario di ricevimento studenti di mercoledì 15 novembre è così modificato:

dalle 9:30 alle 10:30

(La variazione ha effetto solo per mercoledì 15)

Il docente

Emanuele Panizzi


10 novembre 2006

Risultati della prova intermedia - PRIMA PARTE

Ecco i risultati della prima parte della prova intermedia di oggi (l'esonero). Ho regalato un punto a tutti.

Qui trovate il testo del compito (il disegnino della domanda 2 non si vede. Chi è interessato può passare a prendere una copia cartacea a ricevimento studenti).

NB: ricordate che la domanda 20 aveva un refuso: la graffa chiusa sta all'ultima riga, come vi ho detto e scritto alla lavagna durante la prova.


RISPOSTE ESATTE:
1c, 2c, 3a, 4b, 5c, 6b, 7b, 8b, 9a, 10c, 11a, 12b, 13d, 14a, 15b, 16a, 17c, 18a, 19b, 20-(=stampa 5 volte 1), 21c, 22b, 23a, 24d, 25b, 26b, 27b, 28b, 29a, 30a.

06 novembre 2006

Esercitazione: classe Punto

Lezione del 31 ottobre
[46 presenti]


Argomenti trattati:

  • dichiarazione della classe Punto
  • definizione delle funzioni proprie della classe

Podcast della lezione:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20061031.mp3


Codice C++ di esempio realizzato a lezione:



Dispense online:
Esempi