ZPO 2016: zadanie przed lab. 4

Zamieszczony poniżej kod programu reprezentuje przykład programowania z wykorzystaniem cech charakterystycznych.
Najpierw zostały zaimplementowane dwie klasy: Bazowe_Cechy oraz Cechy: public Bazowe_Cechy tworzące pojęcie pewnego zbioru cech. Następnie zostały zadeklarowane dwie inne klasy:

  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 każdej z tych dwóch klas 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

Następnie został zdefiniowany kontener SzablonStosu przystosowany do przechowywania dowolnych wartości, w tym typu temperatura_wody i kostka_do_gry. Kontener ten w swoim działaniu posługuje się klasą 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. 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-lab4
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).

 
/* ========================================
ZPO: laboratorium 4
WMP.SNS UKSW, Warszawa
========================================
*/
#include<iostream>
#include<fstream>
#include<string>
#include<limits>
#include<exception>

using namespace std;

class Bazowe_Cechy {
public:
	static const bool _jest_liczba = false;
	static const bool _nalezy_do_przedzialu = false;
	static const bool _jest_liczba_calkowita = false;
	static const int _dolna_granica_przedzialu = 0;
	static const int _gorna_granica_przedzialu = 0;
};

template<typename T>
class Cechy: public Bazowe_Cechy {
public:
	static const double dolna_granica_przedzialu() { return 0; };
	static const double gorna_granica_przedzialu() { return 0; };
};

class temperatura_wody {
	double t;
public:
	temperatura_wody(double temp = 50): t(temp) {};
	double operator()() { return t; };
	temperatura_wody& operator=(double temp) { t = temp; return *this; };
};

template<>
class Cechy<temperatura_wody>: public Bazowe_Cechy {
public:
	static const bool _jest_liczba = true;
	static const bool _nalezy_do_przedzialu = true;
	static const double dolna_granica_przedzialu() { return 0; };
	static const double gorna_granica_przedzialu() { return 100; };
};

class kostka_do_gry {
	int n;
public:
	kostka_do_gry(int num = 1): n(num) {};
	int operator()() { return n; };
	kostka_do_gry& operator=(int num) { n = num; return *this; };
};

template<>
class Cechy<kostka_do_gry>: public Bazowe_Cechy  {
public:
	static const bool _jest_liczba = true;
	static const bool _nalezy_do_przedzialu = true;
	static const bool _jest_liczba_calkowita = true;
	static const int _dolna_granica_przedzialu = 1;
	static const int _gorna_granica_przedzialu = 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, class _Cechy = 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());
		if(Cechy<T>::_jest_liczba && Cechy<T>::_jest_liczba_calkowita) {
			if(Cechy<T>::_nalezy_do_przedzialu) {
				if((Cechy<T>::_dolna_granica_przedzialu <= i) && (i <= Cechy<T>::_gorna_granica_przedzialu))
					stos[top++] = i;
			} 
			else
				stos[top++] = i;
		}
	}
	void push(double i) {
		if(top==rozmiar)
			throw Przepelnienie(typeid(i).name());
		if(Cechy<T>::_jest_liczba && !Cechy<T>::_jest_liczba_calkowita) {
			if(Cechy<T>::_nalezy_do_przedzialu) {
				if((Cechy<T>::dolna_granica_przedzialu() <= i) && (i <= Cechy<T>::gorna_granica_przedzialu()))
					stos[top++] = i;
			} 
			else
				stos[top++] = i;
		}
	}
	T pop() {
		if(top==0)
			throw BrakDanych(typeid(stos[0]).name());
		return stos[--top];
	}
};

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

	// zapełnianie stosu
	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();
		};
	}
	catch(Przepelnienie& e){
		cout << "K1 gotowy: " << e.what() << endl;
	};
	cout << "Danych na stosie K1: " << K1.zajetosc() << endl;

	K2.push(temperatura_wody());
	K2.push(temperatura_wody(36.6));
	K2.push(40);
	K2.push(71.2);
	cout << "Danych na stosie K2: " << K2.zajetosc() << endl;

	K3.push(kostka_do_gry(3));
	K3.push(kostka_do_gry());
	K3.push(4);
	K3.push(6);
	K3.push(10);
	cout << "Danych na stosie K3: " << K3.zajetosc() << endl;

	// opróżnianie stosu
	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;
	}

	system("pause");
	return 0;
}

Plan laboratoriów ZPO2016 – prognoza

Poniżej grafika, przedstawiająca plan zajęć laboratoryjnych ZPO ze wskazaniem tygodni i grup, które w tych tygodniach mają zajęcia. Jest to prognoza, ponieważ w razie ewentualnych zmian w planie (w rodzaju np. godzin dziekańskich) niezbędne będą kolejne adaptacje, tak aby zachowana została równa liczba godzin zajęć dla wszystkich grup.

Plan lab. ZPO 2016
Plan lab. ZPO 2016
Plan lab. ZPO 2016 - objaśnienie użytych kolorów
Plan lab. ZPO 2016 – objaśnienie użytych kolorów

Uwaga: dla zachowania równego rytmu pracy grup oraz równej liczby zajęć zostały wprowadzone dwie zmiany w cyklu pracy:

  1. zmiany w cyklu pracy grup wtorkowych: 3 stycznia mają zajęcia grupy 3 i 5, a nie 4 i 6.
  2. zmiany w cyklu pracy grupy czwartkowej:
    1. 17 listopada zajęcia ma grupa 2, a nie grupa 1,
    2. 5 stycznia zajęcia ma grupa 1, a nie grupa 2.