Írjunk Student osztályt, amely képes elmenteni és betölteni magát! Egy állományban több Student típusú objektumot is tárolhatunk! Valósítsuk meg mind a bináris, mind a szöveges tárolást, és az utóbbit a szabványos bemeneten és kimeneten is teszteljük!
A Student osztály adattagjai az alábbiak:
class Student
{
static const unsigned neptun_size = 7;
char neptun[neptun_size]; // Ehelyett is jobb lenne a string, de a példa kedvéért ezt is gyakoroljuk
unsigned mark; // Érdemjegy: az unsigned charral több baj van, mint így (minden I/O karakterként kezeli)
public:
std::string name; // Ezt nem akarjuk korlátozni
...
};
A feladatot érdemes tanulmányozni a házi feladat mentésének/betöltésének megírása előtt.
Írjunk szöveges és bináris betöltést/elmentést az alábbi verem osztály számára!
class Stack
{
unsigned int elementNum;
int *pData;
public:
Stack() {elementNum=0;pData=NULL;}
// A másoló konstruktor szükséges a dinamikus adattagok miatt
Stack(const Stack& theOther);
// A destruktor felszabadítja a dinamikus adattagot
~Stack() {if(pData!=NULL) delete[]pData;}
bool isEmpty()const{return !elementNum;}
void pop(int& element);
void push(int element);
// Az = operátor, amely a mély másolást valósítja meg
const Stack& Stack::operator = (const Stack& theOther);
};
A példa igényli az állomány végéig való olvasást, és a tömbök bináris kiírását. A konzolon/terminálon az állomány vége jel Windows alatt <Enter>Ctrl+Z<Enter>, Linux/Unix alatt Ctrl+D<Enter>.
Adott egy 3*3-as mátrixokat reprezentáló osztály:
class Matrix
{
public:
double values[9];
// Konstruktor
Matrix(double defValue=1){ for(int i = 0; i < 9; i++){ values[i] = defValue; }}
};
Írjunk az osztályhoz olyan tagfüggvényt, amely
- elmenti az elemeket bináris állományba
- elmenti az elemeket szöveges állományba
- betölti az elemeket bináris állományból
- betölti az elemeket szöveges állományból!
Teszteljük az osztályt:
- teszteljük a szöveges függvényeket cin és cout segítségével!
- teszteljük a szöveges és a bináris függvényeket állománnyal!
Adott egy kétdimenziós vektort reprezentáló osztály:
class TwoDimVector
{
public:
double x,y;
// Konstruktor
TwoDimVector(double x=0, double y=0){this->x=x; this->y=y;};
};
Írjunk az osztályhoz olyan tagfüggvényt, amely
- elmenti a két tagváltozót bináris állományba
- elmenti a két tagváltozót szöveges állományba
- betölti a két tagváltozót bináris állományból
- betölti a két tagváltozót szöveges állományból!
Teszteljük az osztályt:
- teszteljük a szöveges függvényeket cin és cout segítségével!
- teszteljük a szöveges és a bináris függvényeket állománnyal!
A példa megoldásában használt elemek elengedhetetlenek a házi feladat elkészítéséhez.
Készítsünk egész elemeket tartalmazó multihalmazokat reprezentáló osztályt (Multiset)! A multihalmazok és a halmazok között annyi a különbség, hogy a multihalmaz egy elemet többször is tartalmazhat. Egy elem multiplicitása azt adja meg, hogy az elem hányszor van benne a halmazban.
A multihalmazban ezúttal nem rögzítjük az elemek maximális számát. Figyeljünk az egységbezárás alapelvére, használjunk konstruktorokat és privát tagváltozókat, valamint a dinamikus adattagokat tartalmazó osztályok implementálásánál előkerülő dolgokra (destruktor, másoló konstruktor, egyenlőségoperátor)! Implementáljuk az alábbi publikus tagfüggvényeket!
- add: hozzáad egy elemet a halmazhoz.
- remove: csökkenti az adott elem multiplicitását, ha az nullára csökkenne, eltávolítja az elemet.
- get: visszaadja egy elem multiplicitását, ha nincs benne, akkor nullát ad vissza
- union: az uniót számolja ki: az unióban az egyes elemek multiplicitásai az elem eredeti hamazokban lévő multiplicitásának összege
- intersection: kiszámolja a multihalmazok metszetét: itt az azonos, de többször szereplő elemeket különbözőnek kell tekinteni a halmazhoz képest
- compare: összehasonlít két halmazt: itt is az azonos, de többször szereplő elemeket különbözőnek kell tekinteni az összehasonlításkor
Készítsünk függvényeket, melyekkel a multihalmaz tartalma elmenthető állományokba, illetve onnan betölthető.