Объектно-ориентированное программирование

Описание разрабатываемой программы с точки зрения пользователя. Диаграмма вариантов использования приложения. Объектное представление программы. Разработка класса корабля, прикладного окна и события but. Окно приложения с перемещающимися кораблями.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 05.04.2014
Размер файла 207,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Pause.setLocation(20, 110);

Pause.setSize(100, 25);

Pause.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent aE)

{

if (Pause.getLabel() == "Пауза")

{

for (int i = 0; i < prog.num; i++)// генерируем событие приостановки

{

prog.ship[i].Stop();

SetStatus(i, "Остановлен");

}

prog.charger.Stop();

Pause.setLabel("Старт");// меняем текст кнопки

}

else

{

for (int i = 0; i < prog.num; i++)// генерируем событие запуска

{

prog.ship[i].Start();

SetStatus(i, "В полете");

}

prog.charger.Start();

Pause.setLabel("Пауза");

}

}

});

this.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent wE)

{

System.exit(0);

}

});

Koord = new Point[10];

for (int i = 0; i < 10; i++)

Koord[i] = new Point(15, i * 21 + 40);

Sost = new TextField[10];

for (int i = 0; i < 10; i++)

{

Sost[i] = new TextField();

Sost[i].setLocation(Koord[i]);

Sost[i].setText(System.Convert.ToString(i) + ". Не запущен");

Sost[i].setSize(90, 20);

}

Sost[0].setText("0. В полёте");

// окошко с кнопками управления

ctrl = new Frame("Controls");

ctrl.setSize(150, 200);

ctrl.setLayout(new FlowLayout());

ctrl.setLocation(10, 50);

ctrl.add(AddShip);

ctrl.add(AddFuel);

ctrl.add(Pause);

ctrl.add(numShip);

ctrl.setVisible(true);

ctrl.show();

// окошко с информацией

Info = new Frame("Info");

Info.setSize(150, 260);

for (int i = 0; i < 10; i++)

Info.add(Sost[i], new Point()); // Массив сообщений во 2 окне

Info.setLocation(10, 250);

Info.setVisible(true);

Info.show();

AddShip.addActionListener(this);

AddFuel.addActionListener(this);

Pause.addActionListener(this);

}

public void SetStatus(int num, String str)

{

this.Sost[num].setText(System.Convert.ToString(num) + ". " + str);

}

public boolean IsntDisappeared(int i) // Проверка статуса на "исчезновение"

{

if (Sost[i].getText() == System.Convert.ToString(i) + ". Исчез")

return false;

else return true;

}

public void actionPerformed(ActionEvent aE)

{

//repaint();//Перерисовать

}

public static void main()

{

Controls MainForm = new Controls();

MainForm.show();

}

}

Приложение 4. Текст программы на языке C++/CLI

// UniteCPP.cpp : main project file.

#include "stdafx.h"

#include "Form1.h"

#using <System.dll>

#using <System.Windows.Forms.dll>

#using <System.Drawing.dll>

using namespace System::Threading;

using namespace UniteCPP;

public delegate void delBut(String ^btn, int numship); // делегат события кнопок

// класс формы с кнопками

ref class ButtonForm : Form

{

Form ^ctrl; // Форма с кнопками

Form ^Info;

Button ^AddShip; // Добавить новый корабль

Button ^AddFuel; // Добавить топливо

Button ^pause; // Приостановка всех кораблей

TextBox ^numShip; // Номер корабля, которому добавляется топливо

array< TextBox^ > ^Sost; // Сообщения о состоянии кораблей

public: event delBut ^but; // Привязываем к делегату события нажатия кнопок

// конструктор формы

public: ButtonForm()

{

// кнопки

AddShip = gcnew Button();

AddShip->Location = Point(10, 50);

AddShip->Text = "Добавить корабль";

AddShip->Size = System::Drawing::Size(120, 25);

AddShip->Click += gcnew EventHandler(this, &ButtonForm::onAdd);

AddFuel = gcnew Button();

AddFuel->Location = Point(10, 80);

AddFuel->Text = "Добавить топливо";

AddFuel->Size = System::Drawing::Size(120,25);

AddFuel->Click += gcnew EventHandler(this, &ButtonForm::onAddFuel);

pause = gcnew Button();

pause->Location = Point(20, 110);

pause->Size = System::Drawing::Size(100, 25);

pause->Text = "Пауза";

pause->Click += gcnew EventHandler(this, &ButtonForm::onPause);

numShip = gcnew TextBox();

numShip->Location = Point(35, 20);

numShip->Text = "0";

numShip->Size = Drawing::Size(65, 25);

Sost = gcnew array< TextBox^ >(10);;

for (int i = 0; i < 10; i++)

{

Sost[i] = gcnew TextBox();

Sost[i]->Location = Point(15, i*21 + 5); //Koord[i];

Sost[i]->Text = Convert::ToString(i)+". Не запущен";

Sost[i]->Size = System::Drawing::Size(90, 20);

}

Sost[0]->Text = "0. В полёте";

//окошко с кнопками управления

ctrl = gcnew Form();

ctrl->Location = Point(10,50);// позиционируем

ctrl->Text = "Controls";

ctrl->ClientSize = System::Drawing::Size(150,150);

ctrl->Controls->Add(AddShip);

ctrl->Controls->Add(AddFuel);

ctrl->Controls->Add(pause);

ctrl->Controls->Add(numShip);

// окошко с информацией

Info = gcnew Form();

Info->Text = "Info";

Info->ClientSize = System::Drawing::Size(110, 230);

for (int i = 0; i < 10; i++ ) Info->Controls->Add(Sost[i]); // Массив сообщений во 2 окне

ctrl->Location = Point(10, 50); // позиционируем

ctrl->Show(); // показываем окно

Info->Location = Point(10, 250);

Info->Show();

}

public: void SetStatus (int num, String ^str)

{

this->Sost[num]->Text = Convert::ToString(num) + ". " + str;

}

public: bool IsntDisappeared(int i) // Проверка статуса на "исчезновение"

{

if (Sost[i]->Text == Convert::ToString(i) + ". Исчез")

return false;

else return true;

}

// обработчик кнопки добавления корабля

void onAdd(System::Object^ sender, EventArgs^ e)

{

but("add", 0);

}

// обработчик кнопки приостановки

void onPause(Object^ sender, EventArgs^ e)

{

if (pause->Text == "Пауза")

{

pause->Text = "Старт"; // меняем текст кнопки

but("stop", 0); // генерируем событие приостановки

}

else

{

pause->Text = "Пауза";

but("start", 0); // генерируем событие запуска

}

};

// обработчик кнопки добавления топлива

void onAddFuel(Object^ sender, EventArgs^ e)

{

but("fuel", Convert::ToInt32(this->numShip->Text));

};

};

// Класс корабля.

ref class Ship

{

protected: System::Threading::Thread ^th;

public:int id; // Порядковый номер корабля

protected:bool live;

protected: double x, y; // позиция

protected: double speedX, speedY; // скорость

protected: double fi; // положение на окружности орбиты

double static fi2; // Копия фи

public: double fuel; // топливо

protected: bool WasOnMoon; // был ли на Луне

protected: bool start1; // только что стартовал

protected: bool comeback1; // первое возвращение

public: bool vstrecha;

// Конструктор класса. Принимает номер корабля.

public: Ship(int ns)

{

this->id = ns; // Записываем номер корабля

this->live = false; // первоначально не движемся

this->x = 160; // начальная позиция (поверхность Земли)

this->y = 300; // начальная позиция по высоте (поверхность Земли)

this->speedX = 0; // скорость движения по горизонтали

this->speedY = -3; // скорость движения по вертикали (старт с Земли)

this->fi = Math::PI;

this->fuel = 50; // начальный запас топлива

this->WasOnMoon = false; // изначально на Луне не был =)

this->start1 = true; // первый старт - да

this->comeback1 = false; // первое возвращение - нет

this->vstrecha = false; // встречи нет

Start(); // запускаем движение

}

// функция старта потока движения корабля

public: void Start()

{

if (live == false)

{

live = true;

th = gcnew Thread(gcnew ThreadStart(this, &Ship::Move)); // Создаем объект-поток "движение корабля"

th->Start(); // Стартуем поток

}

}

// функция остановки потока движения корабля

public: void Stop()

{

live = false;

}

// Поток, отвечающий за движение корабля

void Move()

{

while (live) // пока поток жив

{

if ((x > 0 && x < 420 && y > 210 && y < 600) && !(x == 160 && y > 232)) // Орбита Земли

{

if (WasOnMoon == false) // Если на Луне еще не был, разгон

{ // по орбите и полет к Луне

if (start1)

{

fi = -Math::PI / 2 - 0.2;

start1 = false;

}

speedY = 6 * Math::Cos(fi);

speedX = -6 * Math::Sin(fi);

y -= 0.16;

if (fi > Math::PI/2) fuel -= 0.5; // Разгон: топливо уменьшается

else fuel -= 0.05;

}

else // Если возвращается с Луны, становится на орбиту

{ // с вращением против часовой стрелки

if (comeback1 && x < 230)

{

fi = -Math::PI / 2;

comeback1 = false;

}

if (!comeback1)

{

speedY = 6 * Math::Cos(fi);

speedX = 6 * Math::Sin(fi);

y -= 0.05;

fuel -= 0.05;

}

}

}

if (x == 160 && y > 225 && y < 235) // Земля - Луна

{

speedX = -speedY + 3;

};

if (x > 465 && x < 630 && y < 180) // Орбита Луны

{

if (!WasOnMoon)

{

fi = Math::PI+0.4;

WasOnMoon = true;

comeback1 = true;

}

speedY = 4*Math::Cos(fi);

speedX = -4*Math::Sin(fi);

x += 0.04;

if (fi > Math::PI*2-0.3 || fi < Math::PI/2) fuel -= 0.5; // Разгон: топливо уменьшается

else fuel -= 0.05;

}

x += speedX; y += speedY; // движемся

if (fi < 2 * Math::PI) // изменяем угол фи

{

if (x > 425) fi += 0.051;

else fi += 0.032;

}

else fi = 0;

fi2 = fi;

this->th->Sleep(60); // спим

}

}

// публичные сеттеры/геттеры

public: property double X

{

double get() { return x ; } // чтение координаты х

};

public: property double Y

{

double get() { return Convert::ToInt32(y); } // чтение координаты у

};

public: property double setY

{

void set(double value) { y = value; } // запись координаты у

};

public: property double setX

{

void set(double value) { x = value; } // запись координаты х

};

public: property double spY

{

double get() { return Convert::ToInt32(speedY); } // чтение скорости по у

};

public: property double spX

{

double get() { return Convert::ToInt32(speedX); } // чтение скорости по х

};

public: property double setSpY

{

void set(double value) { speedY = value; } // запись скорости по у

};

public: property double setSpX

{

void set(double value) { speedX = value; } // запись скорости по х

};

public: property bool isStopped { bool get() { return !this->th->IsAlive; } };

};

ref class Charger : Ship

{

public: Charger(): Ship(10)

{

this->speedY = 0;

this->y = 225; // начальная позиция по высоте (орбита Земли)

this->x = 230;

this->fi = -Math::PI / 2 - 0.05; // начальная позиция на окружности орбиты

Stop(); // останавливаем запущенный поток для движения кораблей

StartCh(); // запускаем движение по стабильной орбите против часовой стрелки

}

public: void StartCh()

{

if (live == false)

{

this->th->Abort(); // Отключаем стандартный поток кораблей

live = true;

this->th = gcnew Thread(gcnew ThreadStart(this, &Charger::Move)); // Создаем новый поток с другой функцией движения

this->th->Start(); // Стартуем поток

}

}

void Move()

{

while (live) // пока поток жив

{

speedY = 12 * Math::Cos(fi);

speedX = 12 * Math::Sin(fi);

if (y > 415) y -= 0.27; else y -= 0.05;

x += speedX; y += speedY; // движемся

if (fi < 2 * Math::PI) fi += 0.065; // изменяем угол фи

else fi = 0;

this->th->Sleep(60); // спим

}

}

};

// Класс формы с объектами

ref class Program : public Form

{

ButtonForm ^ContForm;

array< Ship^ > ^ship;

Charger ^charger;

int num;

int numdis;

int s1, s2;

double dx, dy;

System::Threading::Thread ^th;

bool live;

// Констуктор

public: Program()

{

num = 1; // стартовое кол-во кораблей

Text = "Objects"; // заголовок окна

this->Size = System::Drawing::Size(675, 675); // размер окна

this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::SizableToolWindow;

this->FormClosed += gcnew FormClosedEventHandler(this, &Program::exit);

this->Show(); // показываем

Location = Point(200, 50); // позиционируем окно

ContForm = gcnew ButtonForm(); // подключаем класс формы с кнопками управления

ContForm->but += gcnew delBut(this, &Program::ButPressed); // привязываем события нажатия кнопок

ship = gcnew array< Ship^ >(10); // Массив из 10 кораблей (макс)

for (int i = 0; i < num; i++) // Перебираем массив кораблей

{

ship[i] = gcnew Ship(i); // Создаем новый объект-корабль и помещаем его в массив

}

charger = gcnew Charger();

DoubleBuffered = true; // буферизация - устраняет мелькание

live = true; // стартуем

th = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, &Program::run));

th->Start();

}

// потоковая функция

void run()

{

while (live)

{

// перебираем корабли

for (int i = 0; i < num; i++)

{

if (Math::Abs(ship[i]->X - charger->X) < 20 && Math::Abs(ship[i]->Y - charger->Y) < 20) // Заправка

if (!charger->isStopped)

{

if (ship[i]->fuel <= 89) ship[i]->fuel += 10; else ship[i]->fuel = 99;

}

if (ship[i]->fuel <= 0) // Если кончается топливо, корабль "исчезает".

{

ship[i]->Stop();

ship[i]->setX = 1000;

ship[i]->setY = 1000 + 50*i;

numdis = i;

this->Invoke(gcnew EventHandler(this, &Program::SetStat)); // Сообщение статуса

//gcnew EventHandler(this, &ButtonForm::onPause);

}

for (int j = i + 1; j < num; j++)

{

if (i < j) // Уступает корабль с бОльшим номером

{

s2 = j;

s1 = i;

}

else

{

s2 = i;

s1 = j;

}

if (Math::Abs(ship[s1]->X - ship[s2]->X) < 20 && Math::Abs(ship[s1]->Y - ship[s2]->Y) < 20)

{

ship[s2]->vstrecha = true; // Встреча началась

if (!ship[s1]->isStopped && !ship[s2]->isStopped) ship[s2]->Stop();

}

else if (ship[s2]->vstrecha)

{

ship[s2]->Start(); // Если пропускал, то продолжить движение

ship[s2]->vstrecha = false; // Встреча закончилась;

}

}

Invalidate();

Thread::Sleep(31);

}

}

}

void SetStat(System::Object^ sender, EventArgs^ e)

{

ContForm->SetStatus(numdis, "Исчез");

};

// перерисовка содержимого окна

protected: virtual void OnPaint(PaintEventArgs^ arg) override

{

Pen ^grayPen = gcnew Pen(Color::LightGray);

Pen ^blackPen = gcnew Pen(Color::Black);

SolidBrush ^blackBrush = gcnew SolidBrush(Color::Black);

SolidBrush ^whiteBrush = gcnew SolidBrush(Color::White);

SolidBrush ^greenBrush = gcnew SolidBrush(Color::Lime);

System::Drawing::Font ^ArialF = gcnew System::Drawing::Font("Arial", 10);

arg->Graphics->FillRectangle(blackBrush,0,0,1280,960); // Фон

arg->Graphics->FillRectangle(whiteBrush, 100, 150, 2, 2); // Звезды

arg->Graphics->DrawEllipse(grayPen, 40, 230, 370, 370); // Орбита Земли

arg->Graphics->DrawEllipse(grayPen, 468, 28, 162, 162); // Орбита Луны

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DeepSkyBlue), 100, 290, 250, 250); // Земля

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DarkKhaki), 500, 60, 100, 100); // Луна

for (int i = 0; i < num; i++) // перебираем корабли

{

arg->Graphics->FillEllipse(greenBrush, ship[i]->X, ship[i]->Y, 16, 16); // корабль

arg->Graphics->DrawEllipse(blackPen, ship[i]->X, ship[i]->Y, 16, 16); // обводим корабль

arg->Graphics->DrawString(ship[i]->id + "", ArialF, blackBrush, ship[i]->X + 4, ship[i]->Y); // номер

arg->Graphics->DrawString(Math::Round(ship[i]->fuel) + "", ArialF, whiteBrush, ship[i]->X - 1, ship[i]->Y - 15);

}

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DarkRed), charger->X, charger->Y, 16, 16); // заправщик

arg->Graphics->DrawEllipse(blackPen, charger->X, charger->Y, 16, 16); // обводим корабль

arg->Graphics->DrawString("C", ArialF, blackBrush, charger->X + 2, charger->Y); // номер

}

// обработчик событий кнопок формы управления

void ButPressed(String^ btn, int numship)

{

if (btn == "add")

if (num < 10)

{ // если кол-во < 10

ship[num] = gcnew Ship(num); // создаём

ContForm->SetStatus(num, "В полёте");

num++;

}

else

{

MessageBox::Show("Не больше 10!");

}

else if (btn == "start")

{

for (int i = 0; i < num; i++)

{

if (ContForm->IsntDisappeared(i)) ship[i]->Start(); // стартуем все корабли, кроме исчезнувших

ContForm->SetStatus(i, "В полёте");

}

charger->StartCh();

}

else if (btn == "stop")

{

for (int j = 0; j < num; j++)

{

ship[j]->Stop(); // приостанавливаем все корабли

ContForm->SetStatus(j, "Остановлен");

}

charger->Stop();

}

else if (btn == "fuel") // добавляем 20 единиц топлива

{

if (ship[numship] != nullptr)

{

ship[numship]->fuel += 20;

if (ship[numship]->fuel > 99) ship[numship]->fuel = 99; // если значение топлива превысит 99, то устанавливается в 99

}

}

}

// событие закрытия окна, завершаем потоки и зыкрываем программу

protected: virtual void OnClosed(EventArgs^ args) override

{

exit(nullptr, nullptr);

}

// обработчик выхода из программы

void exit(Object ^sender, FormClosedEventArgs ^e)

{

for (int i = 0; i < num; i++)

{

ship[i]->Stop();

}

charger->Stop();

th->Abort();

th->Join();

Application::Exit();

}

};

// основная функция

int main(array<System::String ^> ^args)

{

Application::EnableVisualStyles();

Application::SetCompatibleTextRenderingDefault(false);

Application::Run(gcnew Program); // запускаем программу по созданной ссылке

return 0;

}

Размещено на Allbest.ru


Подобные документы

  • Разработка оконного приложения на языке C#, в окне которого будет игра "Лабиринт. Диаграмма вариантов использования языка UML. Описание разрабатываемой программы с точки зрения программиста. Разработка прикладного окна, классов Enemy и Dot, Wall и Map.

    курсовая работа [457,6 K], добавлен 22.06.2015

  • Разработка программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Класс программы, инструкция по использованию программы.

    курсовая работа [1,0 M], добавлен 26.12.2013

  • Введение в объектно-ориентированное программирование. Постановка задачи. Описание алгоритма решения в псевдокоде (команды в виде текста на русском языке). Исходный текст программы на С. Тестирование программы. Модификация программы. Полиморфизм.

    курсовая работа [294,0 K], добавлен 08.09.2008

  • Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.

    курсовая работа [1,2 M], добавлен 22.01.2012

  • Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.

    курс лекций [547,2 K], добавлен 01.05.2014

  • Создание потока с помощью конструктора на основе класса Thread, интерфейса Runnable, синхронизации потоков. Краткая справка по необходимым программным компонентам. Составление программы анимации мячей пространстве окна. Диаграмма классов приложения.

    лабораторная работа [884,9 K], добавлен 01.05.2014

  • Объектно-ориентированное программирование: понятие и содержание, история зарождения и развития, особенности и принципы реализации. Структура и назначение разрабатываемой программы, используемые технические и программные средства, формирование инструкции.

    курсовая работа [1,2 M], добавлен 17.04.2013

  • Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.

    курсовая работа [3,2 M], добавлен 30.01.2013

  • Описание логической и модульной структуры разрабатываемой программы, используемые в данном процессе основные технические средства. Организация хранения данных в программе, проектирование интерфейса. Тестирование и отладка, листинг готовой программы.

    курсовая работа [494,5 K], добавлен 20.06.2012

  • Проблема скрытия и защиты информации от несанкционированного использования. История создания шифра. Решения задачи шифрования текста и кодирования данных. Тестирование полученного приложения и анализ работы программы с точки зрения пользователя.

    курсовая работа [3,0 M], добавлен 24.11.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.