Programmazione
Registro lezioni a.a. 2015-2016
Registro esercitazioni a.a. 2015-2016 per sistema Web-CAT
- Manuale istruzioni del sistema Web-CAT (Istruzioni in formato PDF)
- Istruzioni per la creazione di file .zip per il sistema Web-CAT (PDF)
- Problemi frequenti e soluzioni (PDF)
4 Maggio 20156:
-
Compito: Ex0: Constructors
- Implementare la classe Calculator fornita nel file .zip di esempio, secondo le seguenti specifiche (riportate anche nei commenti del codice):
- Il costruttore di default imposta l'attributo a 0
- I metodi di somma e sottrazione controllano che l'argomento sia positivo. Se il valore è negativo prima gli invertono il segno e poi applicano l'operazione richiesta.
- tutte le funzioni di calcolo aggiornano il valore dell'attributo.
Tutti i metodi devono essere scritti nel file Calculator.cpp. Testare i metodi con un programma di prova.
- Quando finito creare un file .zip contenente Calculator.h, Calculator.cpp e TestCalculator.h (fornito nel file .zip di esempio) e caricarlo su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestCalculator.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WebCAT-Calculator
- Implementare la classe Calculator fornita nel file .zip di esempio, secondo le seguenti specifiche (riportate anche nei commenti del codice):
4 Maggio 2016:
-
Compito: Ex1: A simple class with default constructor
- Implementare la classe Oven fornita nel file .zip di esempio, secondo le seguenti specifiche:
- Il costruttore di default imposta l'attributo temp a 0, tutti gli attributi boolean a false tranne che microwave
- Il metodo start() accende il forno (attributo on) solo se lo sportello è chuso, la temperatura è maggiore di 0 e almeno una delle funzioni grill e microwave è attiva. Rende true se accende il forno
- Il metodo stop() rende true se il forno passa da accesso a spento, altrimenti rende false.
- Il metodo setTemp impedisce l'impostazione della temperatura minore di 0 o superiore a 800 impostandola, nel caso, al valore di limite più vicino.
- Il metodo setDoorOpen(), nel caso imposti doorOpen a true, deve spengere il forno e disattivare il grill.
Tutti i metodi devono essere scritti nel file Oven.cpp. Testare i metodi con un programma di prova.
- Quando finito creare un file .zip contenente Oven.h, Oven.cpp e TestOven.h (fornito nel file .zip di esempio) e caricarlo su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestOven.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WebCAT-Oven
- Implementare la classe Oven fornita nel file .zip di esempio, secondo le seguenti specifiche:
4 Maggio 2016:
-
Compito: Ex2 - metodi e attributi statici
- Implementare la classe Dice fornita del file .zip di esempio. Tutti i metodi devono essere scritti nel file Dice.cpp.
Testare i metodi con un proprio programma di prova. - Specifiche:
- il numero di default delle facce del dado deve essere 6;
- non deve essere possibile impostare il numero di facce del dado minore di 2, nel caso si imposti il valore di facce di default;
- non deve essere possibile modificare il numero di default delle facce del dado. Per fare questo si deve definire la variabile come costante usando lo specificatore const;
- ogni lancio incrementa un contatore di lanci effettuati, implementare un metodo per resettare questo contatore;
- prima del primo lancio ed ogni tre lanci si deve resettare il generatore di numeri casuali.
- Quando finito creare un file .zip contenente Dice.h, Dice.cpp e TestDice.h (fornito nel file .zip di esempio) e caricarlo su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestDice.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WebCAT-Dice
- Implementare la classe Dice fornita del file .zip di esempio. Tutti i metodi devono essere scritti nel file Dice.cpp.
16 Maggio 2016:
Compito: Ex3 - allocazione dinamica memoria
- Implementare la classe SimpleMatrix fornita del file .zip di esempio. Tutti i metodi devono essere scritti nel file SimpleMatrix.cpp.
Testare i metodi con un proprio programma di prova. - Specifiche:
- la matrice viene creata impostando a 0 tutti i valori;
- se si cerca di impostare un valore a coordinate fuori dal range della dimensione della matrice il metodo setValue rende false; se si imposta un valore a coordinate accettabili rende true.
- se si cerca di ottenere come terzo argomento del metodo getValue un valore a coordinate fuori dal range il metodo rende false, altrimenti rende true, mentre il valore della matrice è reso usando l'argomento;
- non ci devono essere leak di memoria. Controllare se eventuali leak sono riportati in "Results From Running Your Tests". Il sistema non sottrarrà automaticamente punti dalla valutazione, ma in fase di correzione verranno tolti 40 punti.
- Quando finito creare un file .zip contenente SimpleMatrix.h, SimpleMatrix.cpp e TestSimpleMatrix.h (fornito nel file .zip di esempio) e caricarlo su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestSimpleMatrix.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2015-WEBCAT-MemoryAllocation
16 Maggio 2016:
Compito: Ex4 - Deep copy e operatori
- Si considerino le classi RGBPixel e BitmapImage fornite nel file di esempio e se ne completino i metodi indicati con TODO. Testare le classi con un proprio programma di prova, ispirandosi ai test forniti.
- Specifiche:
- si implementi la classe RGBPixel completando il codice dell'operatore !=
- si completi il codice del costruttore di BitmapImage facendo in modo che se una delle dimensioni fornite dell'immagine è nulle o negativa allora la dimensione è impostata a 1
- si completi il distruttore per evitare memory leak
- si implementi il metodo getPixel in modo tale che se vengono richiesti pixel al di fuori delle dimensioni dell'immagine si renda un Pixel i cui valori RGB sono (-1, -1, -1)
- si implementi un costruttore per copia
- si implementi un operatore di assegnazione
- si implementi un operatore di uguaglianza
- Quando finito creare un file .zip contenente RGBpixel.h, RGBPixel.cpp, BitmapImage.h, BitmapImage.cpp, TestRGBPixel.h e TestBitmapImage.h (forniti nel file .zip di esempio) e caricarlo su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestRGBPixel.h e TestBitmapImage.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage".
- non ci devono essere leak di memoria. Controllare se eventuali leak sono riportati in "Results From Running Your Tests". Il sistema non sottrarrà automaticamente punti dalla valutazione, ma in fase di correzione verranno tolti 40 punti.
- Materiale: 2016-WEBCAT-DeepCopy
30 Maggio 2016:
- Si considerino le classi Shape, Rectangle, Point, Polygon e Circle fornite nel file di esempio e se ne completino i metodi indicati con TODO. Si consiglia di testare le classi con un proprio programma di prova ispirandosi ai test forniti nel file di esempio.
- Specifiche:
- nella classe Point implementare in modo inline i due metodi isNotNeg() e operator==. isNotNeg rende true se entrambe le coordinate del punto sono >=0
- nella classe Shape definire il distruttore. Si consideri che questa è una classe base che deve obbligare tutte le classi derivate (i.e. essere astratta) a implementare un metodo draw() che non ha argomenti e rende true se il disegno di una forma è possibile. Le classi che specializzano Shape devono essere polimorfiche ed usabili con un puntatore a classe base.
- nella classe Rectangle implementare il metodo draw() in modo tale che sia possibile disegnare il rettangolo solo se i punti topLeft e bottomRight hanno coordinate >= 0 (ovvero se isNotNeg() è true). Implementare costruttore e getter/setter er il punto bottomRight.
- nella classe Circle implementare il costruttore ed il metodo draw(), che disegna solo se le coordinate del punto topLeft sono non negative (usare isNotNeg())
- nella classe Polygon implementare il distruttore ed il costruttore. Il metodo draw disegna solo se ci sono almeno 2 punti che hanno coordinate non negative. Implementare anche i metodi getPoint(int index) e setPoint(...) che ritornano un puntatore nullo ne caso le coordinate del punto richiesto siano fuori dai margini dell'array (getPoint) o ritorna falso se si prova ad impostare un punto fuori dai margini dell'array (setPoint).
- Quando finito creare un file .zip contenente tutti i file .h e .cpp e tutti i file TestXXX.h forniti nel materiale dell'esercizio e caricare il file su Web-CAT.
-
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestXXX.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WEBCAT-AbstractPolymorphicClass
30 Maggio 2015
Compito Ex6: Multiple Inheritance
- Si completi la classe Seaplane che eredita sia dalla classe Boat che Airplane. Modificare le classi fornite in modo tale da evitare il problema del diamante.
- Implementare il metodo turnOnEngine della classe Seaplane in modo tale che usi il metodo fornito nella classe Airplane.
- Quando finito creare un file .zip contenente tutti i file .h e .cpp e tutti i file TestXXX.h forniti nel materiale dell'esercizio e caricare il file su Web-CAT.
-
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestXXX.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WEBCAT-MultipleInheritance
10 Giugno 2016
Compito Ex7: Generic Programming
- Si completino le classi GrayPixel e RGBPixel fornendo un'implementazione degli operatori richiesti. In particolare per la classe RGBPixel si consideri che l'operatore > rende vero se almeno uno dei canali è maggiore a parità degli altri.
- Si completi la classe generica ImageTemplate in modo che possa usare sia GrayPixel che RGBPixel. In particolare il metodo getPixel(int x, int y) deve rendere il pixel alle coordinate richieste senza effettuare nessun controllo se le coordinate sono entro i valori accettabili della dimensione dell'immagine. Il metodo setPixel riceve in ingresso le coordinate x e y del pixel (come interi), il pixel da impostare e rende true se le coordinate sono entro valori accettabili o false altrimenti.
- Si creino due funzioni template nel file UtilsTemplate.h di nome maxPixel. La prima versione riceve come argomenti due oggetti e rende l'oggetto pià grande della coppia. La seconda versione sovraccaricata riceve in ingresso un puntatore ad un array e la dimensione dell'array come intero e rende una copia dell'oggetto più grande dell'array. Le due funzioni template devono funzionare sia con oggetti di tipo GrayPixel che RGBPixel.
- Quando finito creare un file .zip contenente tutti i file .h e .cpp e tutti i file TestXXX.h forniti nel materiale dell'esercizio e caricare il file su Web-CAT.
-
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestXXX.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WEBCAT-Template
10 Giugno 2016
Compito Ex8: STL Vector
- Si completi la classe Inventory con i metodi:
- void addWeapon(Weapon* w); // aggiunge un arma all'inventario
- ~Inventory(); // rimuove tutti gli elementi dell'inventario
- void removeWeapon(int i); // rimuove l'i-esima arma dell'inventario
- Weapon* getWeapon(int i); // prende l'i-esima arma dell'inventario
- int useWeapon(int i); // usa l'i-esima arma dell'invetario e rende il valore del suo metodo useWeapon()
- int getNumWeapons(); // riporta il numero di elementi dell'inventario
usando un std::vector come contenitore delle armi. Per vedere sintassi e funzionamento dei metodi di std::vector riferirsi al manuale presente sul sito cplusplus.com. Per l'implementazione del distruttore potrebbe risultare utile rivedere i lucidi 73-74 relativi all'STL.
- Quando finito creare un file .zip contenente tutti i file .h e .cpp e tutti i file TestXXX.h forniti nel materiale dell'esercizio e caricare il file su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestXXX.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WEBCAT-STLVector
10 Giugno 2016
Ex9: Exceptions
- Si crei la classe ArrayRangeException in modo che estenda la classe base std::out_of_range. La classe deve riportare errori relativi a richieste di andare fuori dai limiti di un array. Il costruttore della classe deve accettare 4 argomenti nell'ordine:
- std::string con messaggio di errore. Questo messaggio deve essere usato nel costruttore della classe base.
- int per indicare il valore minimo accettabile dall'array
- int per indicare il valore massimo accettabile dall'array
- int per indicare qaul'è il valore errato richiesto nell'accesso all'array
- La classe deve fornire anche i metodi getMaxRange(), getMinRange() e getWrongRange() che riportano questi valori.
- Si implementi la classe TransparencyMask, considerando i metodi setMaskValue e getMaxValue. In particolare:
- getMaxValue lancia un'eccezione di tipo ArrayRangeException se le coordinate richieste sono oltre le dimensioni di larghezza o altezza dell'oggetto
- setMaxValue lancia un'eccezione di tipo ArrayRangeException se le coordinate richieste sono oltre le dimensioni di larghezza o altezza dell'oggetto, e lancia un'eccezione di tipo std::invalid_argument se il suo terzo parametro (int) ha valori minori di zero o maggiori di 255
- Nel caso setMaxValue venga invocato con coordinate sbagliate ed anche con valore sbagliato la prima eccezione che deve essere lanciata è std::invalid_argument
- Quando finito creare un file .zip contenente tutti i file .h e .cpp e tutti i file TestXXX.h forniti nel materiale dell'esercizio e caricare il file su Web-CAT.
- Correggere l'implementazione finché non vengono passati tutti i test riportati in "Results From Running Your Tests" (il cui codice è compreso in TestXXX.h) ed i test aggiuntivi riportati in "Estimate of Problem Coverage"
- Materiale: 2016-WEBCAT-Exception