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

Приложение з Пример оформления листинга программы Приложение г Листинги программных модулей

В данном приложении приводятся листинги всех модулей в соответствии с диаграммой модулей (рис. 5.23).

Г.1 Листинг модуля ElectricalAppliance.h

Модуль содержит протокол класса ElectricalAppliance.

#pragma once // один проход при компиляции

class ElectricalAppliance abstract // класс электроприбор - абстрактный класс

{

protected: // защищенные члены класса

bool state; // состояние

public: // открытые члены класса

ElectricalAppliance(); // конструктор по умолчанию

~ElectricalAppliance(); // деструктор

bool GetState(); // геттер для состояния

void On(); // включить

void Off(); // выключить

virtual void Imitate() = 0; // имитировать работу в течении еденицы времени

// чисто виртуальная функция

};

Г.2 Листинг модуля ElectricalAppliance.cpp

Модуль содержит реализацию (тело) класса ElectricalAppliance.

#include "ElectricalAppliance.h"

ElectricalAppliance::ElectricalAppliance()

{

state = false; // по умолчанию прибор выключен

}

ElectricalAppliance::~ElectricalAppliance() {}

bool ElectricalAppliance::GetState()

{

return this->state;

}

void ElectricalAppliance::On()

{

this->state = true;

}

void ElectricalAppliance::Off()

{

this->state = false;

}

Г.3 Листинг модуля Button.h

Модуль содержит протокол класса Button.

#pragma once

#include "ElectricalAppliance.h" // используется класс электроприбор

class Button : // класс кнопка

public ElectricalAppliance // наследует электроприбор

{

public:

Button();

~Button();

void Push(); // нажать

void Imitate(); // перегруженный метод имитации работы

};

Г.4 Листинг модуля Button.cpp

Модуль содержит реализацию (тело) класса Button.

#include "Button.h"

Button::Button() {}

Button::~Button() {}

void Button::Push()

{

this->On(); // кнопка - электроприбор и при нажатии она включается

}

void Button::Imitate()

{

if (this->GetState()) // кнопка без фиксации

this->Off(); // работает мгновенно в момент нажатия

}

Г.5 Листинг модуля Lamp.h

Модуль содержит протокол класса Lamp.

#pragma once

#include "ElectricalAppliance.h"

class Lamp : // класс лампа

public ElectricalAppliance // наследует эклетроприбор

{

public:

Lamp();

~Lamp();

void Imitate();

};

Г.6 Листинг модуля Lamp.cpp

Модуль содержит реализацию (тело) класса Lamp.

#include "Lamp.h"

Lamp::Lamp() {}

Lamp::~Lamp() {}

void Lamp::Imitate() {}

Г.7 Листинг модуля PowerElement.h

Модуль содержит протокол класса PowerElement.

#pragma once

#include "ElectricalAppliance.h"

class PowerElement : // класс силовой элемент

public ElectricalAppliance // наследует класс электроприбор

{

protected:

int workTime; // время работы

public:

PowerElement();

~PowerElement();

void Imitate();

int GetWorkTime(); // геттер времени работы

};

Г.8 Листинг модуля PowerElement.cpp

Модуль содержит реализацию (тело) класса PowerElement.

#include "PowerElement.h"

PowerElement::PowerElement()

{

workTime = 0; // время работы по умолчанию

}

PowerElement::~PowerElement() {}

void PowerElement::Imitate()

{

if (state) // если прибор работает

workTime++; // подсчитываем его время

}

int PowerElement::GetWorkTime()

{

return workTime;

}

Г.9 Листинг модуля Speaker.h

Модуль содержит протокол класса Speaker.

#pragma once

#include "ElectricalAppliance.h"

class Speaker : // класс спикер

public ElectricalAppliance // наследует электроприбор

{

protected:

int beepTime; // продолжительность звучания

public:

Speaker();

~Speaker();

void Beep(); // издавать звуковой сигнал

void Imitate();

};

Г.10 Листинг модуля Speaker.cpp

Модуль содержит реализацию (тело) класса Speaker.

#include "Speaker.h"

Speaker::Speaker(void)

{

beepTime = 0; // время звучания по умолчанию

}

Speaker::~Speaker(void) {}

void Speaker::Beep()

{

this->beepTime = 3; // сигнал будет звучать 3 ед. времени

this->On();

}

void Speaker::Imitate()

{

if (GetState()) // если прибор работает

{

if (beepTime == 0) // время звучания истекло

Off(); // выключаем прибор

beepTime--; // уменьшаем время звучания

}

}

Г.11 Листинг модуля Timer.h

Модуль содержит протокол класса Timer.

#pragma once

#include "ElectricalAppliance.h"

class Timer : // класс таймер

public ElectricalAppliance // наследует электроприбор

{

public:

int time; // время отсчета

Timer();

~Timer();

void Imitate();

};

Г.12 Листинг модуля Timer.cpp

Модуль содержит реализацию (тело) класса Timer.

#include "Timer.h"

Timer::Timer(void)

{

time = 0; // время отсчета по умолчанию

}

Timer::~Timer(void) {}

void Timer::Imitate()

{

if (GetState()) // если прибор работает

{

if (time == 0) // если время истекло

Off(); // выключаем прибор

time--; // ведем обратный отсчет

}

}

Г.13 Листинг модуля Door.h

Модуль содержит перечисление состояний и протокол класса Door.

#pragma once

enum DoorStates // состояние дверцы

{

Opened, // открыта

Closed // закрыта

};

class Door // класс дверь

{

protected:

DoorStates state; // текущее состояние двери

public:

Door();

~Door();

DoorStates GetState(); // геттер для состояния

void Open(); // открыть дверь

void Close(); // закрыть дверь

};

Г.14 Листинг модуля Door.cpp

Модуль содержит реализацию (тело) класса Door.

#include "Door.h"

Door::Door()

{

state = Closed; // по умолчанию дверь закрыта

}

Door::~Door() {}

DoorStates Door::GetState()

{

return state;

}

void Door::Open()

{

state = Opened;

}

void Door::Close()

{

state = Closed;

}

Г.15 Листинг модуля HouseholdAppliance.h

Модуль содержит протокол класса HouseholdAppliance.

#pragma once

class HouseholdAppliance // класс кухонный прибор

{

public:

HouseholdAppliance();

~HouseholdAppliance();

virtual void Imitate() = 0; // имитировать работу в течении еденицы времени

// чисто виртуальная функция

};

Г.16 Листинг модуля HouseholdAppliance.cpp

Модуль содержит реализацию (тело) класса HouseholdAppliance.

#include "HouseholdAppliance.h"

HouseholdAppliance::HouseholdAppliance(void) {}

HouseholdAppliance::~HouseholdAppliance(void) {}

Г.17 Листинг модуля MicrowaveOven.h

Модуль содержит структуру статистики работы и протокол класса MicrowaveOven.

#pragma once

#include <iostream> // работа с потоками ввода/вывода

#include "ElectricalAppliance.h"

#include "HouseholdAppliance.h"

#include "Button.h"

#include "Door.h"

#include "Timer.h"

#include "Lamp.h"

#include "PowerElement.h"

#include "Speaker.h"

struct Statistics // статистика работы печи

{

int powerElementWorkTime, // время работы силового элемента

readyCount, // количество готовых блюд

interruptCount; // количество прерываний приготовления

};

class MicrowaveOven : // класс микроволновая печь

public ElectricalAppliance, // наследует электроприбор

public HouseholdAppliance // и кухонный прибор

{

protected: // защищенные члены - невозмодно воздействие извне

Timer timer; // таймер

Lamp lamp; // лампа

PowerElement powerElement; // силовой элемент

int interruptCount;

int readyCount;

void StartCooking(); // начать процесс приготовления

void StopCooking(); // процесс приготовления завершен

public: // открытые члены класса

Button button; // кнопка

Door door; // дверь

Speaker speaker; // спикер

MicrowaveOven();

~MicrowaveOven();

void Imitate(); // имитировать работу в течении еденицы времени

Statistics GetStatistics(); // получить статистику работы печи

// перегруженный оператор вывода экземпляра класса в поток

// используется для вывода состояния печи на каждом шаге

friend std::ostream& operator << ( // реализовывается как друг возврашает поток вывода

std::ostream& s, // поток вывода

MicrowaveOven& mo); // экземпляр класса

};

Г.18 Листинг модуля MicrowaveOven.cpp

Модуль содержит реализацию (тело) класса MicrowaveOven.

#include "MicrowaveOven.h"

MicrowaveOven::MicrowaveOven()

{

interruptCount = 0; // значения по умолчанию

readyCount = 0;

}

MicrowaveOven::~MicrowaveOven() {}

void MicrowaveOven::StartCooking()

{

timer.time = 60; // устанавливаем время приготовления

timer.On(); // включается таймер

powerElement.On(); // включается силовой элемент

lamp.On(); // включается лампа

}

void MicrowaveOven::StopCooking()

{

powerElement.Off(); // выключается силовой элемент

lamp.Off(); // выключается лампа

speaker.Beep(); // издается звуковой сигнал

timer.time = 0; // печь готова к приготовлению следующего блюда

}

void MicrowaveOven::Imitate()

{

if (GetState()) // если печь включена в сеть электропитания

{

if (door.GetState() == Closed) // если дверь закрыта

{

if (timer.time == -1) // если время истекло

{

StopCooking(); // останавливается процесс приготовления

readyCount++; // увеличивается число приготовленных блюд

}

else if (timer.time == 0) // если процесс приготовления пищи еще не начался

{

lamp.Off(); // лампа выключается

if (button.GetState()) // если нажали кнопку

StartCooking(); // начать процесс приготовления

}

else // идет процесс приготовления пищи

{

if (button.GetState()) // нажали кнопку

timer.time += 60; // увеличивается время приготовления на 60 секунд

}

}

else // дверь открыта

{

if (timer.GetState()) // если таймер ведет отсчет

{

powerElement.Off(); // выключается силовой элемент

timer.time = 0; // сбрасывается таймер

timer.Off(); // выключается таймер

interruptCount++; // число прерываний приготовления

}

lamp.On(); // включается лампа

}

button.Imitate(); // имитируется работа всех компонентов печи

speaker.Imitate();

powerElement.Imitate();

lamp.Imitate();

timer.Imitate();

}

}

Statistics MicrowaveOven::GetStatistics()

{

Statistics stat; // формируем выходную статистику

stat.powerElementWorkTime = powerElement.GetWorkTime();

stat.readyCount = readyCount;

stat.interruptCount = interruptCount;

return stat;

}

std::ostream& operator << (std::ostream& s, MicrowaveOven& mo)

{

if (mo.button.GetState())

s << "button is pushing" << std::endl;

if (mo.door.GetState() == Closed)

s << "door is closed" << std::endl;

else

s << "door is opened" << std::endl;

if (mo.lamp.GetState())

s << "lamp is on" << std::endl;

else

s << "lamp is off" << std::endl;

if (mo.powerElement.GetState())

s << "power element is on" << std::endl;

else

s << "power element is off" << std::endl;

if (mo.timer.GetState())

s << " and it will work " << mo.timer.time << " seconds" << std::endl;

if (mo.speaker.GetState())

s << "food is ready" << std::endl;

return s;

}

Г.19 Листинг модуля Random.h

Модуль содержит протокол класса Random.

#pragma once

class Random // класс ГСЧ

{

public:

Random();

~Random();

static void Initialize(); // инициализация ГСЧ

static float Uniform( // равномерный закон

float Min, // левая граница отрезка

int Max); // правая граница отрезка

static float Normal( // нормальный закон

float M, // матожидание

float D); // дисперсия

};

Г.20 Листинг модуля Random.cpp

Модуль содержит реализацию (тело) класса Random.

#include "Random.h"

#include <stdlib.h> // стандартная библиотека

#include <time.h> // работа с временем

#include <math.h> // мат. функции

Random::Random() {}

Random::~Random() {}

void Random::Initialize()

{

srand((unsigned)time(NULL)); // в качестве инициализирующего значения берется текущее значение времени

}

float Random::Uniform(float Min, int Max)

{

// пропорциональное преобразование отрезка

return Min + (float)rand() / RAND_MAX * (Max - Min);

}

float Random::Normal(float M, float D)

{

// приближенное моделирование нормального закона по центральной предельной теореме

return M + sqrt(D) * (Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1) + Uniform(-1, 1)) / 10.0;

}

Г.21 Листинг модуля Man.h

Модуль содержит протокол класса Man.

#pragma once

#include "MicrowaveOven.h"

class Man // класс человек

{

protected: // защищенные члены класса

int timeToAction; // время до взаимодействия с печью

public: // открытые члены класса

Man(); // конструктор

~Man(); // детсруктор

void Imitate( // имитировать деятельность в течении еденицы времени

MicrowaveOven&); // используется печь

};

Г.22 Листинг модуля Man.cpp

Модуль содержит реализацию (тело) класса Man.

#include "Man.h"

#include "Random.h"

Man::Man(void)

{

Random::Initialize(); // инициализация ГСЧ

timeToAction = (int)Random::Normal( // время до воздействия на печь распределено нормально

60, // с матожиданием

30); // и дисперсией

}

Man::~Man(void) {}

void Man::Imitate(MicrowaveOven& mo)

{

if (timeToAction == 0) // если настало время для взаимодействия

{

if (Random::Uniform(0, 1) >= 0.5) // кидаем монетку - если орел

mo.button.Push(); // нажимаем кнопку

else // иначе трогаем дверь

{

if (mo.door.GetState() == Closed) // если закрыта

mo.door.Open(); // открываем

else // иначе

mo.door.Close(); // закрываем

}

timeToAction = (int)Random::Normal(60, 30); // время до нового взаимо

}

else

timeToAction--; // ведем отсчет времени

}

Г.23 Листинг модуля Imitation.cpp

Модуль содержит реализацию функции Main.

#include <iostream> // работа с потокам ввода/вывода

#include "MicrowaveOven.h"

#include "Man.h"

using namespace std; // подключаем стандартное пространство имен

int main(int argc, char* argv[])

{

cout << "Start modeling" << endl;

MicrowaveOven mo; // микроволновая печь

cout << "Microwave Oven \"mo\" created" << endl;

Man man; // человек

cout << "Man man created" << endl;

mo.On(); // включаем печь

cout << "\"mo\" turned on" << endl;

cout << "Start modeling" << endl;

for (int i = 0; i < 600; i++) // моделирование работы системы в течении 10 минут

{

cout << "second #" << i << endl;

man.Imitate(mo); // моделирование работы человека

cout << mo; // вывод состояния печи

mo.Imitate(); // моделирование работы печи

cout << endl;

}

mo.Off(); // выключаем печь

Statistics stat = mo.GetStatistics(); // получаем и выводим статистику

cout << "Power element has worked " << stat.powerElementWorkTime << " seconds" << endl;

cout << stat.readyCount << " cooking are ready" << endl;

cout << stat.interruptCount << " cooking was interrupted" << endl;

cout << "\"mo\" turned off" << endl;

cout << "Modeling completed" << endl;

cin.get(); // задержка

return 0;

}