Harmonogram zajęć – aktualizacja

W związku ze zmianą planu zajęć we czwartek, 21.01 na rozkład zajęć jak dla środy, zajęcia poprawkowe (nr 7, tj. te, na których można poprawić jedno zero) grupy p. Zembrowskiego odbędą się we czwartek, 28.01. zgodnie z poniższą rozpiską:

  • grupy nr 2,5: poniedziałek 25.01 sala 1242 godzina 17.00 – 20.00
  • grupa nr 3: czwartek 28.01 sala 1221 godzina 17.00 – 20.00

Rozpiska wynika z liczby chętnych, którzy zadeklarowali swoje przyjście na zajęcia nr 7. Nie ma możliwości uczestnictwa w zajęciach dla nie swojej grupy (ustalonej na rozpisce powyżej) i będzie to bezwzględnie egzekwowane.

ZPO 2015: Egzamin, I termin

Pierwszy termin egzaminu został zaplanowany na:
2 lutego 2016 (wtorek), na godz. 11:00 w sali A106.
Czas egzaminu: 90 minut.

Ze względu na czasochłonną procedurę potwierdzania osobistej obecności trzeba się liczyć z tym, że egzamin zakończy się nawet po godz. 13-ej. Po rozpoczęciu procedury potwierdzania obecności żadne osoby nie będą wpuszczane na salę.
Pozostałe zasady zaliczenia egzaminu – tutaj.

ZPO 2015: 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.

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;
}