Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Dekorator

Przykład 4
#include "proces.h"
#include "dekorator.h"

#include <iostream>

int main () {
	ProcesAbstrakcyjny * proces = new Proces;
	proces = new ZaklocenieStochastyczne(proces, 0.1);
	proces = new ZaklocenieDeterministyczne(proces, 0.1, 20);
	proces = new NieliniowoscStatyczna(proces, 0.8, 0.1);

	for (unsigned int t = 0; t <= 20; ++t)
		std::clog << t << " " << proces->symuluj(1.0) << std::endl;

	delete proces;

	return 0;
}
#ifndef __DEKORATOR_H__
#define __DEKORATOR_H__
#include "proces.h"

class Dekorator : public ProcesAbstrakcyjny {
public:
	Dekorator (ProcesAbstrakcyjny * p);
	virtual ~Dekorator ();
	virtual double symuluj (double wej) = 0;
protected:
	ProcesAbstrakcyjny * s_proc;
};

class ZaklocenieStochastyczne : public Dekorator {
public:
	ZaklocenieStochastyczne (ProcesAbstrakcyjny * p, double maxZaklocenie);
	virtual double symuluj (double wej);
private:
	double s_maxZaklocenie;
};

class ZaklocenieDeterministyczne : public Dekorator {
public:
	ZaklocenieDeterministyczne (ProcesAbstrakcyjny * p, double amp, int okres);
	virtual double symuluj (double wej);
private:
	double s_amp;
	int s_okres;
	int s_t;
};

class NieliniowoscStatyczna : public Dekorator {
public:
	NieliniowoscStatyczna (ProcesAbstrakcyjny * p, double yGr, double knas);
	virtual double symuluj (double wej);
private:
	double s_yGr;
	double s_knas;
};

#endif
#include "dekorator.h"
#include <cstdlib>
#include <ctime>
#include <cmath>

Dekorator::Dekorator (ProcesAbstrakcyjny * p) 
	: s_proc(p) 
{}
	
Dekorator::~Dekorator () {
	delete s_proc;
}

ZaklocenieStochastyczne::ZaklocenieStochastyczne (ProcesAbstrakcyjny * p, double maxZaklocenie) 
	: Dekorator(p), s_maxZaklocenie(maxZaklocenie)
{
	std::srand(static_cast<unsigned int>(std::time(0)));
}

double ZaklocenieStochastyczne::symuluj (double wej) {
	// zaklocenie z zakresu -1, 1
	double zaklocenie = ((std::rand() % 1000) / 500.0) - 1.0;
	return s_proc->symuluj(wej) + zaklocenie * s_maxZaklocenie;
}

ZaklocenieDeterministyczne::ZaklocenieDeterministyczne (ProcesAbstrakcyjny * p, double amp, int okres) 
	: Dekorator(p), s_amp(amp), s_okres(okres), s_t(0)
{}
	
double ZaklocenieDeterministyczne::symuluj (double wej) {
	// zaklocenie deterministyczne - sinus
	double zaklocenie = s_amp * std::sin((static_cast<double>(s_t % s_okres) / s_okres) * 6.28);
	++s_t;
	return s_proc->symuluj(wej) + zaklocenie;
}

NieliniowoscStatyczna::NieliniowoscStatyczna (ProcesAbstrakcyjny * p, double yGr, double knas) 
	: Dekorator(p), s_yGr(yGr), s_knas(knas)
{}
	
double NieliniowoscStatyczna::symuluj (double wej) {
	double temp = s_proc->symuluj(wej);
	double wyj = (std::fabs(temp) <= s_yGr) ? temp : (s_yGr + (temp-s_yGr)*s_knas);
	
	return wyj;
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11