Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб 4.doc
Скачиваний:
3
Добавлен:
08.05.2019
Размер:
87.04 Кб
Скачать

Калькулятор

схема

сложения

схема

вычитания

схема

умножения

схема

деления

регистр

сумматор

В примере приведены определения основных классов и типов и реализации только некоторых компонентных функций.

class TShema;

class TObject //абстрактый класс - стоит во главе иерархии классов

{protected:

TShema* owner;

public:

TObject();

~TObject();

virtual void HandleEvent(TEvent&);

virtual void ClearEvent(TEvent&);

};

class TShema::public TObject // абстрактная группа

{protected:

TItem* last;

public:

TShema();

~TShema();

virtual void Insert(TObject*);

virtual void HandleEvent(TEvent&);

};

class TDevice: public TShema // абстрактное устройство управления

{protected:

int EndState;

public:

virtual void GetEvent(TEvent&);

virtual void Execute();

virtual int Valid();

virtual void EndExec();

};

class TRec: public TObject/ устройство для хранения данных-регистр

{protected:

float x;

public:

TReg();

~TReg();

float GetX();

void SetX(float&);

};

class TCalc : public TDevice //калькулятор

{pritected:

TReg* sum; // указатель на сумматор

TReg* reg; // указатель на регистр

public:

TCalc();

void HamdleEvent(TEvent&);

void GetEvent(TEvent&);

void Execute();

float GetSum(); // получить значение сумматора

void PutSum(float); //занести число в сумматор

voit Help();

};

class TAdd : public TObject // схема сложения

{public:

void HandleEvent(TEvent&);

void Add();

};

TObject::TObject()

{owner=0;}

TShema::TShema()

{last=0;}

TCalc::TCalc()

{TObject* r;

sum=new TReg;

reg=new TReg;

r=new TAdd;

Insert (sum);

// и так далее для всех схем

};

TCalc::HandleEvent(TEvent& event)

{if(event.what==evMessage)

switch(event.command)

{cmQuit:

EndExec();

ClearEvent(event);

break;

cmGet:

cout<<GetSum()<<endl;

ClearEvent(event);

break;

cmSet:

PutSum(event.A);

ClearEvent(event);

break;

default:

TSheme::HandleEvent(event);

} }

TSheme::HandleEvent(TEvent&event)

{TItem* r;

if(event.what==evMassage)

{r=last;

while(event.what!=evNothing&&r!=0)

{r->HandleEvent(event);

r=r->next;}

} }

TAdd::HandleEvent(TEvent&event)

{if(event.what==evMessage)

switch(event.command)

{cmAdd:

//занести в регистр число

(owner->reg)->SetX(event.A);

//вызвать метод сложения

Add();

ClearEvent(event);

break;

} }

TAdd::Add() //в сумматор добавить содержимое регистра

{float a,b;

//получить значение сумматора

a=(owner->sum)->GetX();

//получить значение регистра

b=(owner->reg)->GetX();

//изменить значение сумматора

(owner->sum)->SetX(a+b);

}