Cpp/Exam2



Kartkówka 2014-03-16 z "Algorytmy i złożoność-c". Tu będą zbiory i operacje na nich

Będzie trzeba napisać dla którejś z metody implementowania zbiorów którąś operację.


 * Możliwe metody
 * dla każdej z możliwych wartości M przechowujemy informację czy ona występuje tak/nie:
 * 1) tablica bool dla każdej możliwej wartości. Gdy mamy np litery A-Z to tablica Z-A (26?) elementów typu bool.
 * 2) tablica jako int - działa tak samo jak 1) ale zamiast bool mamy int i na jego bitach kodujemy boolean, potem operacje dzielenia mnożenia przez 2, lub bitowo maska, XOR, OR, AND aby wyjąć dany bit - to jest bardziej skomplikowane (pewnie nie będzie tej metody)
 * spis elementów - zapisujemy które wartości występują:
 * 3) jeżeli jest to zbiór znaków, to można jako string - pewnie tego nie będzie, podobne do metody 4)
 * 4) tablica N elementów, gdzie zapisujemy WARTOŚCI elementów zbioru które występują a N to zakładana maksymalna ilość elementów w zbiorze
 * 5) lista elementów - zamiast tablicy
 * 6) tablica o zmiennym rozmiarze (dynamiczna pamięć, re-alokacja)
 * 7) (nie było na wykładzie) można jeszcze stosować listę tablic.
 * 8) (nie było na wykładzie) mapa hash

Najważniejsze są zapewne metody 1 oraz 4 (i ew. jej warianty 6,5, może 3).


 * Możliwe operacje (tutaj zakładam że to zbiór elementów typu char, gdy inny typ to analogicznie)
 * Bazowe
 * void init
 * void add(char c)
 * void del(char c)
 * int size (moc - pobierz rozmiar)
 * bool check(char c)
 * Dodatkowe
 * jakiś sposób iterowania wszystkich elementów po kolei, np:
 * void get(int ix) pobiera N-ty element ze zbioru. Np. gdy zbiór liter ma w sobie litery "C,F,X,Z" to trzecia (index 2) da nam X, get(2)=='X'
 * void add(const zbior &other) - dodaj do tego zbioru inny zbiór
 * void diff(const zbior &other) - odejmuj od tego zbioru inny zbiór
 * void intersect(const zbior &other) - część wspólna
 * void negation - zamienia zbiór na jego negację

Dla większości operacji trzeba podjąć decyzję jak ma działać kod:
 * czy funkcje modyfikacji np. add(const zbior &other) mają zmienić obiekt na którym pracują (np zbiór A mają zmienić dodając elementy zbioru B), czy też ma powstać nowy zbiór C, gdzie C=A+B a sam zbiór A pozostaje bez zmian
 * czy ma to być obiektowo, tzn mamy klasę zbiór z metodami, czy ew. funkcje do których przekazujemy zmienne, a pewne zmienne np. max rozmiar tablicy itd są może globalne (prosty kod).
 * w wersji z spisem elementów, można by trzymać wartości posortowane lub nie posortowane.

Poniższe przykłady zakładając wartiant: obiektowo, zwracamy nowy zbiór C, natomiast opeacje jednoelementowe add i del modyfikują nasz obiekt. Wartości będą posortowane.

Wynik działania programu:

W tym kodzie operacje zbiorowe na zbior_list nie są jeszcze zaimplementowane.