ZTP2023: Zadanie przed lab.4

Zadanie, które dotyczy zakresu materiału, jaki będzie poruszany na lab. 4. Rozwiązanie tego zadania nie jest wymagane. Stanowi wyłącznie pomoc w przygotowaniu się do zajęć.

Zamieszczony poniżej kod programu reprezentuje przykład programowania z wykorzystaniem cech charakterystycznych. W programie wykorzystywane są dwie klasy reprezentujące dwa pojęcia:

  1. temperatura_wody – liczba rzeczywista reprezentująca temperaturę wody
  2. kostka_do_gry – liczba całkowita reprezentująca wartość, jaka może wypaść w wyniku rzutu kostką do gry.

Dla tych klas zdefiniowano ich cechy charakterystyczne. Są nimi:

  1. _jest_liczba – cecha mówiąca, czy danych obiekt reprezentuje liczbę,
  2. _jest_liczba_calkowita – cecha mówiąca, czy liczba którą reprezentuje danych obiekt, jest liczbą całkowitą,
  3. _nalezy_do_przedzialu – cecha mówiąca, czy liczba którą reprezentuje danych obiekt, należy do przedziału,
  4. _dolna_granica_przedzialu – wartość dolnej granicy przedziału, do którego mogą należeć liczby reprezentowane przez danych obiekt,
  5. _gorna_granica_przedzialu – wartość górnej granicy przedziału, do którego mogą należeć liczby reprezentowane przez danych obiekt,

Cechy charakterystyczne zostały zaimplementowane w programie. W tym celu najpierw zostały zaimplementowane dwie klasy: Bazowe_Cechy oraz Cechy: public Bazowe_Cechy tworzące pojęcie zbioru cech.

Następnie dla każdej z dwóch klas: temperatura_wody i kostka_do_gry zostały skonkretyzowane w odpowiedni sposób przypisane im klasy cech:

  1. Cechy<temperatura_wody>: public Bazowe_Cechy
  2. Cechy<kostka_do_gry>: public Bazowe_Cechy

Działanie programu polega na gromadzeniu danych liczbowych różnych typów w kontenerach, przy czym kontenery do walidacji wprowadzanych danych używają cech charakterystycznych. W tym celu zdefiniowana została klasa reprezentująca kontener SzablonStosu przystosowany do przechowywania dowolnych wartości, w tym obiektów typu temperatura_wody i kostka_do_gry. Metoda push tego kontenera przed umieszczeniem danej dokonuje jej walidacji posługując się informacjami z klasy Bazowe_Cechy.

Wykorzystanie kontenera zostało zademonstrowane w funkcji main. W kodzie main tworzone są trzy kontenery K1, K2 i K3, a następnie są wypełniane wartościami. Uwaga: kontener K1 jest zapełniany wartościami tak długo, póki wystarczy zasobów komputera (w trakcie wykonania programu warto uruchomić menedżer zadań i w sekcji wydajności obserwować, jak ubywa wolnej pamięci w miarę pracy programu).

Zadania do zrobienia przed ćwiczeniami

  1. Przenieś kod do środowiska VS C++, skompiluj i uruchom.
  2. Przeanalizuj kod, upewnij się, że rozumiesz rolę wszystkich pól i metod w klasach i potrafisz to wyjaśnić na zajęciach.
  3. Upewnij się, że potrafisz wyjaśnić, dlaczego tyle właśnie elementów zostaje umieszczonych w każdym z trzech kontenerów (a nie więcej).
  4. dodaj do kodu jeszcze jedną klasę reprezentującą pojęcie liczbowe „numer kołnierzyka koszuli” i skonkretyzuj w odpowiedni sposób odpowiadającą jej klasę cech. Następnie, jeżeli to konieczne, rozszerz kod metody push tak aby poprawnie walidował obiekty nowego typu. W funkcji main dodaj kontener K4 w którym zgromadzisz kilka obiektów nowego typu.
  5. Przygotuj się do rozwijania tego kodu dla potrzeb nowych rodzajów wartości, jakie można przechowywać w tym kontenerze.

Pliki do pobrania

Plik programu: ZPO-traits.cpp
Plik z danymi wejściowymi: qv-lab4 (po założeniu nowego projektu VC++ należy go umieścić w tym samym folderze, co plik z kodem programu).

 
/* ==========================
   (c) WMP.SNS UKSW, 2015
========================== */

#include<iostream>
#include<fstream>
#include<string>
#include<limits>
#include<exception>

using namespace std;

class _Bazowe_Cechy {
public:
	// pola statyczne stałe - dla stałych wartości całkowitych
	static const bool _jest_liczba = false;
	static const bool _nalezy_do_przedzialu = false;
	static const bool _jest_liczba_calkowita = false;
};

template<typename T>
class _Cechy : public _Bazowe_Cechy {
public:
	// metody statyczne - dla wartości innych typów niż liczby całkowite
	static const T _dolna_granica() { return T(); };
	static const T _gorna_granica() { return T(); };
};

template<typename T>
class Cechy : public _Cechy<T> {
};

class przyspieszenie {
	double a;
public:
	przyspieszenie(double acc = 0) : a(acc) {};
	double operator()() const { return a; };
	przyspieszenie& operator=(double acc) { a = acc; return *this; };
	bool operator<(const przyspieszenie& p) const { return (a < p.a); };
	friend ostream& operator<<(ostream& os, const przyspieszenie&);
};
ostream& operator<<(ostream& os, const przyspieszenie& p) { return os << p.a; };

template<>
class Cechy<przyspieszenie> : public _Cechy<przyspieszenie> {
public:
	static const bool _jest_liczba = true;
};

class temperatura_wody {
	double t;
public:
	temperatura_wody(double temp = 50) : t(temp) {};
	double operator()() const { return t; };
	temperatura_wody& operator=(double temp) { t = temp; return *this; };
	bool operator<(const temperatura_wody& tw) const { return (t < tw.t); };
	friend ostream& operator<<(ostream& os, const temperatura_wody&);
};
ostream& operator<<(ostream& os, const temperatura_wody& tw) { return os << tw.t; };

template<>
class Cechy<temperatura_wody> : public _Cechy<temperatura_wody> {
public:
	static const bool _jest_liczba = true;
	static const bool _nalezy_do_przedzialu = true;
	static const temperatura_wody _dolna_granica() { return temperatura_wody(0); };
	static const temperatura_wody _gorna_granica() { return temperatura_wody(100); };
};

class kostka_do_gry {
	int n;
public:
	kostka_do_gry(int num = 1) : n(num) {};
	int operator()() const { return n; };
	kostka_do_gry& operator=(int num) { n = num; return *this; };
	bool operator<(const kostka_do_gry& k) const { return (n < k.n); };
	friend ostream& operator<<(ostream& os, const kostka_do_gry&);
};
ostream& operator<<(ostream& os, const kostka_do_gry& k) { return os << k.n; };

template<>
class Cechy<kostka_do_gry> : public _Cechy<kostka_do_gry> {
public:
	static const bool _jest_liczba = true;
	static const bool _nalezy_do_przedzialu = true;
	static const bool _jest_liczba_calkowita = true;
	static const kostka_do_gry _dolna_granica() { return kostka_do_gry(1); };
	static const kostka_do_gry _gorna_granica() { return kostka_do_gry(6); };
};

class Przepelnienie : public exception {
	char opis[100];
public:
	Przepelnienie(const char* o) { strcpy_s(opis, o); }
	const char* what() const throw() { return opis; };
};
class BrakDanych : public exception {
	char opis[100];
public:
	BrakDanych(const char* o) { strcpy_s(opis, o); }
	const char* what() const throw() { return opis; };
};

template<typename T, int rozmiar, typename CechyT = Cechy<T>>
class SzablonStosu{
	T stos[rozmiar];
	int top;
public:
	int zajetosc() { return top; };
	SzablonStosu() : top(0) {}
	void push(const T& i) {
		if (top == rozmiar)
			throw Przepelnienie(typeid(i).name());
		stos[top++] = i;
	}
	void push(int i) {
		if (top == rozmiar)
			throw Przepelnienie(typeid(i).name());

		// walidacja wartości przekazanej do zapisu
		if (CechyT::_jest_liczba && CechyT::_jest_liczba_calkowita) {
			if (CechyT::_nalezy_do_przedzialu) {
				if (!(T(i) < CechyT::_dolna_granica()) && !(CechyT::_gorna_granica() < T(i)))
					stos[top++] = i;
			}
			else
				stos[top++] = i;
		}
	}
	void push(double i) {
		if (top == rozmiar)
			throw Przepelnienie(typeid(i).name());

		// walidacja wartości przekazanej do zapisu
		if (CechyT::_jest_liczba && !CechyT::_jest_liczba_calkowita) {
			if (CechyT::_nalezy_do_przedzialu) {
				if (!(T(i) < CechyT::_dolna_granica()) && !(CechyT::_gorna_granica() < T(i)))
					stos[top++] = i;
			}
			else
				stos[top++] = i;
		}
	}
	T pop() {
		if (top == 0)
			throw BrakDanych(typeid(stos[0]).name());

		return stos[--top];
	}
	template<typename U1, int r, typename U2>
	friend ostream& operator<<(ostream& os, const SzablonStosu<U1, r, U2>&);
};
template<typename U1, int r, typename U2>
ostream& operator<<(ostream& os, const SzablonStosu<U1, r, U2>& S)
{
	for (int i = 0; i < S.top; i++) cout << S.stos[i] << endl;
	return os;
};

int main() {
	SzablonStosu<string, 5> K1;
	SzablonStosu<przyspieszenie, 10> K2;
	SzablonStosu<temperatura_wody, 10> K3;
	SzablonStosu<kostka_do_gry, 10> K4;

	// zapełnianie stosów K1, K2, K3 i K4:
	ifstream fi("qv-lab4.txt");
	string s;
	try{
		K1.push("Henryk");
		K1.push("Sienkiewicz");
		while (fi) {
			fi >> s;
			K1.push(s);
			fi.seekg(ios::beg);
			fi.clear();
			cout << '*';
		};
	}
	catch (Przepelnienie& e){
		cout << "K1 gotowy: " << e.what() << endl;
	};
	cout << "Danych na stosie K1: " << K1.zajetosc() << endl << endl;

	K2.push(przyspieszenie());
	K2.push(przyspieszenie(5.0));
	K2.push(10);	// uwaga: nie akceptujemy przyspieszenia jako liczby całkowitej
	K2.push(10.0);
	cout << K2;
	cout << "Danych na stosie K2: " << K2.zajetosc() << endl << endl;

	K3.push(temperatura_wody());
	K3.push(temperatura_wody(36.6));
	K3.push(71.2);
	K3.push(112.1); // uwaga: nie akceptujemy wartości spoza przedziału
	cout << K3;
	cout << "Danych na stosie K3: " << K3.zajetosc() << endl << endl;

	K4.push(kostka_do_gry(3));
	K4.push(kostka_do_gry());
	K4.push(6);
	K4.push(10); // uwaga: nie akceptujemy wartości spoza przedziału
	cout << K4;
	cout << "Danych na stosie K4: " << K4.zajetosc() << endl << endl;

	// opróżnianie stosów
	try{
		while (true)
			K1.pop();
	}
	catch (BrakDanych& e) {
		cout << "K1 pusty: " << e.what() << endl;
	}
	try{
		while (true)
			K2.pop();
	}
	catch (BrakDanych& e) {
		cout << "K2 pusty: " << e.what() << endl;
	}
	try{
		while (true)
			K3.pop();
	}
	catch (BrakDanych& e) {
		cout << "K3 pusty: " << e.what() << endl;
	}
	try {
		while (true)
			K4.pop();
	}
	catch (BrakDanych& e) {
		cout << "K4 pusty: " << e.what() << endl;
	}

	system("pause");
	return 0;
}

ZTP2023: Wskazówki przed lab. 1

Zasady ogólne

Zasady wykonywania i oceniania programów na stacjonarnych zajęciach lab.:

  • Każdy uczestnik wykonuje na komputerze w pracowni dwa zadania w środowisku MS Visual Studio: podstawowe (pierwszego poziomu) za 6 pkt. i dodatkowe (drugiego poziomu) za 4 pkt.
  • Zadań nie wolno realizować na własnym laptopie.
  • Dopiero kiedy prowadzący odbierze i pozytywnie oceni zadanie podstawowe, można zacząć rozwiązywać zadanie dodatkowe (dodatkowe bywa łatwiejsze).
  • Studenci mogą realizować swoje zadania tylko na zajęciach – nie ma możliwości kończenia programu poza pracownią i przesyłania go do oceny w godzinach wieczornych czy następnego dnia.
  • Studenci obowiązkowo uploadują do moodle rozwiązane zadania I i II poziomu w trakcie zajęć. Rozwiązania uploadowane po zajęciach nie będą oceniane.

Pełny opis zasad jest zamieszczony w moodle.

Rozwiązania będą weryfikowane za pomocą oprogramowania antyplagiatowego MOSS (tak samo jak w ubiegłym semestrze), dlatego oceny wystawione na zajęciach mogą jeszcze być później korygowane na podstawie wyników raportu MOSS (zbytnie podobieństwo kodu powoduje obniżenie oceny u wszystkich wskazanych w raporcie, tj. bez ustalania, kto był rzeczywistym autorem, a kto popełnił plagiat).

Porady przed lab. 1

Zadania realizowane na pierwszych zajęciach lab. będą dotyczyły materiału z pierwszego wykładu ZTP i wykładów PO z poprzedniego semestru. Dlatego proszę Państwa o przejrzenie materiału z poprzedniego semestru, a zwłaszcza dwóch ostatnich wykładów (strumienie).

PO2023: Wyniki egzaminu – termin drugi, 21.09

Wiersze zawierają: trzy ostatnie cyfry z nr indeksu, liczbę punktów za część teoretyczną, liczbę punktów za część praktyczną, całkowitą liczbę zdobytych punktów i ocenę.

  1. ***050   6.5   1   7.5   2
  2. ***172   17.7   13   30.7   4
  3. ***268   16.5   3.5   20 + ε   3
  4. ***468   13.5   8   21.5   3
  5. ***475   6.5   0   6.5   2
  6. ***476   7   1   8   2
  7. ***478   3.5   0   3.5   2
  8. ***489   4.5   0   4.5   2
  9. ***497   23   11   34   4.5
  10. ***501   2.5   0   2.5   2
  11. ***512   15.5   13   28.5   4
  12. ***526   3   0   3   2
  13. ***531   12   0   12   2
  14. ***536   8   0   8   2
  15. ***545   5.5   0   5.5   2
  16. ***563   9.5   0   9.5   2
  17. ***578   15   1   16   2
  18. ***658   7.5   6   13.5   2
  19. ***986   16   9   25   3.5

Wgląd w prace egzaminacyjne będzie możliwy we czwartek, 28.09, w godz. od 14:00 do 14:30 16:00 do 16:30 (lub dłużej, aż do ostatniego zainteresowanego) w pok. 1247 bud. 12.

W razie niejasności proszę o kontakt mailowy.

PO2023: Poprawa lab. i egzamin w sesji wrześniowej – terminy i zasady

Termin poprawy zajęć laboratoryjnych

20 września (środa), godz. 11:30, pracownia komputerowa 119, bud. 21. Czas trwania: około 4 godzin zegarowych.

II termin egzaminu

21 września (czwartek), godz. 13:00, sala 108, bud.21. Egzamin w drugim terminie ma formę i czas trwania identyczne jak w pierwszym.

Zasady udziału w poprawie zajęć laboratoryjnych

Zgodnie z regulaminem zaliczeń przedmiotów, studenci, którzy na laboratorium nie zdobyli wystarczającej liczby punktów i otrzymali ocenę negatywną, mają prawo do poprawy tej oceny. Ci, którzy zamierzają uczestniczyć w poprawie, muszą jednak najpierw otrzymać ocenę pozytywną z zadania semestralnego. Rozwiązania zadań semestralnych (zzipowany komplet plików, spełniających wszystkie formalne wymagania) studenci przekazują do oceny swoim prowadzącym zajęcia. Jeżeli ktoś w czerwcu pozytywnie rozliczył swoje zadanie semestralne, to jest już dopuszczony do poprawy. Takie osoby mogą teraz przypomnieć o pozytywnym zaliczeniu zadania swoim prowadzącym, ponieważ przed poprawą będę prosił prowadzących o przesłanie do mnie list osób, które otrzymały oceny pozytywne za zadanie semestralne. Tylko osoby, które będą na tych listach, zostaną dopuszczone do poprawy.

Studenci przekazują do swoich prowadzących rozwiązania zadań semestralnych do oceny według zasad i zgodnie z terminami ustalonymi przez tych prowadzących. Studenci z mojej grupy, którzy chcą przystąpić do poprawy, a nie mają jeszcze zaliczonego zadania semestralnego, przesyłają mi je do oceny w postaci załącznika do maila w terminie od 11 do 18 września (poniedziałek) rano. Prace przesłane później mogą nie zostać ocenione, a prace przesłane wcześniej mogą niechcący zostać przeoczone. Mail z odpowiedzią/oceną zostanie wysłany zwrotnie, tj. na adres mailowy, z którego nadesłano rozwiązanie. Wszystkie oceny za zadania semestralne muszą zostać wystawione do 20 września (środa), rano.

Zgłoszenie udziału w poprawie zajęć laboratoryjnych

Osoby, które chcą i mogą przystąpić do poprawy, przysyłają do mnie mailem swoje zgłoszenie udziału w poprawie (wystarczy jedno zdanie typu „zgłaszam swój udział w …”, a poniżej imię, nazwisko i nr indeksu). Zgłoszenie należy wysłać w terminie od 11 (poniedziałek) do 19 września (wtorek), do końca dnia. Proszę nie przysyłać zgłoszeń wcześniej, bo mogą zostać przeze mnie niechcący przeoczone. Brak przesłania w terminie zgłoszenia udziału spowoduje, że nie zostanie przygotowane zadanie dla danej osoby i tym samym uniemożliwi jej udział w poprawie. Uwaga: jeżeli żadne zgłoszenia nie zostaną przesłane w terminie, poprawa zostanie odwołana.

PO2023: Wyniki egzaminu – termin pierwszy, 23.06

Wiersze zawierają: trzy ostatnie cyfry z nr indeksu, liczbę punktów za część teoretyczną, liczbę punktów za część praktyczną, całkowitą liczbę zdobytych punktów i ocenę.

  1. ***050   5   8.0   13.0   2
  2. ***065   12.5   14.0   26.5   3.5
  3. ***172   11   5.0   16.0   2
  4. ***235   15.5   8.0   23.5   3
  5. ***246   19.5   16.0   35.5   4.5
  6. ***261   18   13.5   31.5   4
  7. ***268   10   6.0   16.0   2
  8. ***360   14.5   5.5   20.0 + ε   3
  9. ***466   18   4.0   22.0   3
  10. ***468   8   6.0   14.0   2
  11. ***473   2.5   0.0   2.5   2
  12. ***475   8   5.0   13.0   2
  13. ***476   4.5   2.0   6.5   2
  14. ***478   0.5   0.0   0.5   2
  15. ***479   22   5.0   27.0   3.5
  16. ***487   15.5   5.0   20.5   3
  17. ***511   11.5   8.5   20.0 + ε   3
  18. ***512   12   6.0   18.0   2
  19. ***531   7.5   0.5   8.0   2
  20. ***533   16.5   5.0   21.5   3
  21. ***536   10   4.0   14.0   2
  22. ***545   9   0.0   9.0   2
  23. ***548   20   8.0   28.0   4
  24. ***560   11.5   11.0   22.5   3
  25. ***578   6.5   0.5   7.0   2
  26. ***589   20.5   3.0   23.5   3
  27. ***594   18.5   5.5   24.0   3.5
  28. ***621   13.5   6.5   20.0 + ε   3
  29. ***807   14.5   5.5   20.0 + ε   3
  30. ***851   17.5   10.5   28.0   4
  31. ***986   14   5.0   19.0   2

Wgląd w prace egzaminacyjne będzie możliwy we wtorek, 27.06, w godz. od 14:00 do 14:30 (lub dłużej, aż do ostatniego zainteresowanego) w pok. 1247 bud. 12.

W razie niejasności proszę o kontakt mailowy

PO2023: Wyniki z egzaminu zerowego

Lista osób, które otrzymały ocenę pozytywną z zajęć lab. ale nie zostały zwolnione z egzaminu i osiągnęły co najmniej 50% pkt. na egzaminie zerowym. Wiersze zawierają: trzy ostatnie cyfry nr indeksu, liczbę zdobytych punktów i proponowaną ocenę.

  1. ***225   22.0   4
  2. ***229   19.0   3.5
  3. ***238   18.0   3.5
  4. ***245   21.5   4
  5. ***263   18.5   3.5
  6. ***271   15.0   3
  7. ***272   17.5   3.5
  8. ***384   25.0   4.5
  9. ***534   19.0   3.5
  10. ***543   18.0   3.5
  11. ***553   19.5   3.5
  12. ***560   15.5   3
  13. ***561   21.0   4
  14. ***577   21.5   4
  15. ***579   17.0   3.5
  16. ***585   20.0   4
  17. ***637   18.0   3.5
  18. ***659   25.5   5
  19. ***677   14.0 + ε   3
  20. ***729   19.5   3.5
  21. ***810   17.5   3.5
  22. ***980   17.0   3.5

Lista osób, które uczestniczyły w egzaminie zerowym, ale liczba zdobytych na egzaminie punktów nie przekroczyła progowej wartości 50% możliwych do zdobycia. Wiersze zawierają trzy ostatnie cyfry nr indeksu.

  1. ***050
  2. ***172
  3. ***235
  4. ***261
  5. ***466
  6. ***468
  7. ***473
  8. ***475
  9. ***476
  10. ***478
  11. ***479
  12. ***487
  13. ***511
  14. ***512
  15. ***526
  16. ***531
  17. ***533
  18. ***536
  19. ***545
  20. ***589
  21. ***594
  22. ***851
  23. ***986

Wgląd do pracy egzaminacyjnej będzie możliwy w poniedziałek, 19 czerwca, w godz. od 13:00 do 13:30 (lub dłużej, aż do ostatniego zainteresowanego) w pok. 1247 bud. 12.

W razie niejasności, proszę o kontakt mailowy.

PO2023: Lista osób zwolnionych z egzaminu

Lista zawiera trzy ostatnie cyfry numeru indeksu osób zwolnionych z egzaminu za bardzo dobre wyniki na zajęciach lab. oraz proponowaną ocenę.

  1. ***293   5
  2. ***295   5
  3. ***378   4.5
  4. ***467   4.5
  5. ***614   4.5
  6. ***627   5
  7. ***867   5

Osoby te z egzaminu z wykładu otrzymują ocenę taką, jaką otrzymały z zajęć lab. tj. 5 (bardzo dobry) albo 4.5 (dobry plus), która zostanie wpisana do protokołu USOS jako ocena zdobyta w pierwszym terminie.

W razie niejasności proszę o kontakt mailowy.

PO2023: Informacje organizacyjne

Egzamin zerowy

  1. Dn. 14 czerwca (środa) w sali wykładowej 108, bud. 21, w godz. 11:30 – 13:00 planowany jest egzamin zerowy z PO.
  2. Egzamin jest pisemny. Proszę zabrać ze sobą kartki papieru i długopisy oraz legitymacje studenckie. Osoby spóźnione mogą nie zostać dopuszczone do udziału w egzaminie (radzę ten jeden raz przyjechać na uczelnię wcześniejszym autobusem).
  3. Szczegółowe zasady udziału są opisane na stronie www: Zasady zaliczenia wykładu, ale uwaga: (1) egzamin nie ma części praktycznej, to znaczy, nie będzie kartki z kodem programu, dla którego należy podać komunikaty wypisywane w oknie konsoli, (2) wszystkie osoby, które mają szansę na ocenę pozytywną z lab. na koniec semestru, są oczekiwane na egzaminie.
  4. Ocenie podlegają prace egzaminacyjne tylko tych osób, które na koniec semestru, tj. 19 czerwca (poniedziałek) będą miały z zajęć lab. dostateczną liczbę punktów oraz spełnią warunki gwarantujące ocenę pozytywną.
  5. Oceny pozytywne uzyskane z tego egzaminu są wpisywane do protokołu jako zdobyte w pierwszym terminie.
  6. Oceny negatywne nie są nigdzie wpisywane i są zapominane.
  7. Jeżeli będą takie osoby, które zostaną zwolnione z egzaminu za bardzo dobre wyniki lab., to proponowana im ocena zastąpi ocenę z egzaminu zerowego. Jednak decyzja o zastosowaniu w tym roku zwolnień z egzaminu za bardzo dobre wyniki jeszcze nie została podjęta.
  8. Brak zainteresowania (niedostateczna liczba studentów na sali) spowoduje odwołanie egzaminu zerowego.

Zwracam uwagę na zasadę: Na egzaminie nie wolno sięgać do telefonów komórkowych. Telefony w czasie egzaminu muszą być wyciszone i schowane np. w torbie czy plecaku. Niestosowanie się do tej zasady skutkuje oceną negatywną oraz natychmiastowym zakończeniem egzaminu przez studenta i opuszczeniem sali.

W razie niejasności proszę o pytania mailem. Pytania o warunki zwolnienia z egzaminu za bardzo dobre wyniki z lab. będą jutro ignorowane – tak jak mówiłem, te warunki zostaną ustalone dopiero po zakończeniu semestru, kiedy będą znane wszystkie wyniki z lab.

PO2023: Wejściówka na Lab.14

Napisz klasę reprezentującą kontener typu zbiór z powtórzeniami. Jest to struktura danych, w której nowe dane dopisywane są zawsze, nawet jeżeli wielokrotnie dodawana jest ta sama wartość, a porządek danych nie jest ustalony i może być dowolny. Kontener przechowuje obiekty typu string (dodaj w nagłówku pliku instrukcję #include <string>).

Do przechowywania danych w kontenerze wykorzystaj dowolną, najkorzystniejszą twoim zdaniem strukturę danych (np. dynamicznie zaalokowana tablica, albo lista dynamiczna..). Zobacz, jak został zaimplementowany kontener typu Tablica na slajdach 266-268 wykładu 12 oraz pełny kod tej klasy na stronie www (w sekcji: Program #11):
https://ktrojanowski.blog.uksw.edu.pl/programowanie-obiektowe/kody-programow-po/
i ewentualnie skorzystaj z tych składowych, które uznasz za użyteczne.

Kontener powinien udostępniać metody: insert i remove, które odpowiednio dodają lub usuwają dane do lub z kontenera. Wartość podana w argumencie wywołania metody remove identyfikuje dane do usunięcia. W przypadku podania wartości, która występuje w kontenerze wielokrotnie, za jednym wywołaniem remove usuwane są od razu wszystkie duplikaty. Natomiast jeżeli użytkownik zażąda usunięcia wartości, która nie jest przechowywana w kontenerze, nie dzieje się nic. Dodaj też do kontenera metodę exists, która zwraca true, jeżeli wartość, podana w argumencie wywołania, występuje w kontenerze w przynajmniej jednym egzemplarzu, natomiast false – w przeciwnym przypadku.

Zademonstruj poprawne działanie kontenera, dodając do niego oraz odejmując kilka elementów i sprawdzając ich obecność w kontenerze, oraz na koniec usuwając cały, niepusty kontener.

Przetestowany, działający program (tylko plik z kodem źródłowym) uploaduj do https://e.uksw.edu.pl jako rozwiązanie zadania „Wejściówka” w sekcji „Temat 14”.