Студопедия — Программы
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Программы






 

 

 

 

 


9. Приложение 2. Текст программы на языке C#

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Threading;

using System.Collections;

 

public delegate void delEv();

public delegate void Del();

 

 

public class Avto

{

public int num; //номер объекта

public event delEv evSpecial;

public int x, y;//координаты машины

public double fi = 0.1;

public int dx1, dy1, dx2, dy2;//приращения машин

public int speed;//скорость машины

Thread thread;

public bool dvig = true;

public bool life;//признак жизни потока

public bool run = true;

public event Del ev;

 

 

public int N { get { return num; } }//номер машины

public int X { get { return x; } set { x = value; } }//координата X

public int Y { get { return y; } set { y = value; } }//координата Y

 

 

public Avto(int N, int X, int Y, int Speed)

{

num = N;

x = X; y = Y;

speed = Speed;

life = true;

//создать и запустить поток

thread = new Thread(new ThreadStart(AvtoFunc));

thread.Start();

 

 

}

 

public void Finish()//завершить поток

{

//Resume();

life = false;

}

 

void AvtoFunc()

{

 

 

while (life)

{

 

if (run)

{

Thread.Sleep(speed);

if (ev!= null) ev();

if (dvig)

{

//уравнение движения по окр-ти

dx1 = (int)(19 * Math.Sin(fi));

dy1 = (int)(19 * Math.Cos(fi));

x += dx1;

y += dy1;

 

 

}

else

{

dx2 = (int)(28 * Math.Sin(fi));

dy2 = (int)(28 * Math.Cos(fi));

y -= dx2;

x -= dy2;

 

 

}

 

fi += 0.1;

 

}

 

evSpecial();

 

}

}

 

public void Suspend()//приостановить поток

{

if (run)

{

run = false;

 

}

}

 

public void Resume()//возобновить поток

{

if (!run)

{

run = true;

 

}

}

 

}

 

 

class Avtos: Form

{

ArrayList al; //ссылка на список машин

ListBox listBoxNum;//список номеров машин

private int num = 0;//номер объекта машины

private Form f;// ссылка на дочернее окно управления

private Button add, del, ok;// ссылки на кнопки

public bool run = true;//признак движения машин

 

public Avtos()//конструктор

{

 

al = new ArrayList();

run = true;//машины двигаются

Size = new Size(770, 770);//установить размер прикладного окна

Text = "Шоссе";//установить заголовок прикладного окна

 

f = new Form();//создать объект дочернего окна

f.Text = "Control";//установить заголовок дочернего окна

f.Size = new Size(300, 150);//установить размеры дочернего окна

f.Show();//показать дочернее окно

 

ok = new Button();//создать кнопку приостановки

ok.Text = "Stop";//именовать кнопку

ok.Size = new Size(45, 30);//размеры кнопки

ok.Location = new Point(5, 10);//поместить кнопку в окне

ok.Click += new EventHandler(OK);//подписать обработчик

f.Controls.Add(ok);//поместить объект ок в контейнер окна

 

add = new Button();//создать кнопку добавления машин

add.Text = "Add";//именовать кнопку

add.Size = new Size(45, 30);//размеры кнопки

add.Location = new Point(5, 50);//поместить кнопку в окне

add.Click += new EventHandler(ADD);//подписать обработчик

f.Controls.Add(add);//поместить объект add в контейнер окна

 

listBoxNum = new ListBox();//создать элемент списка номеров

listBoxNum.Location = new Point(140, 10);//разместить в окне

listBoxNum.Size = new Size(60, 70);//установить размер

f.Controls.Add(listBoxNum);//поместить в контейнер окна

 

del = new Button();//создать кнопку удаления машин

del.Text = "Del";//именовать кнопку

del.Size = new Size(40, 30);//установить размер

del.Location = new Point(90, 10);//поместить кнопку в окне

del.Click += new EventHandler(DEL);//подписать обработчик

f.Controls.Add(del);//поместить объект del в контейнер окна

}

 

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

private void OK(Object obj, EventArgs arg)

{

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

//перебрать список объектов машин

Avto a = (Avto)inum.Current;

if (run) { a.Suspend(); ok.Text = "Start"; }

else { a.Resume(); ok.Text = "Stop"; }

}

run =!run;

}

 

//создать автомобиль и включить его в список

public void ADD(Object obj, EventArgs arg)

{

num++;

Avto b;

Random r = new Random();

if (num % 2 == 0)

{

Avto a = new Avto(num, 385, 660, r.Next(50, 100));

Console.WriteLine("Добавлен автомобиль " + num);

a.dvig = false;

//a.ev += new Del(this.Handlerev);

b = a;

}

else

{

Avto a = new Avto(num, 195, 400, r.Next(50, 100));

Console.WriteLine("Добавлен автомобиль " + num);

a.dvig = true;

//a.ev += new Del(this.Handlerev);

b = a;

}

 

listBoxNum.Items.Add(num);

al.Add(b);

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

Avto q = (Avto)inum.Current;

q.evSpecial += new delEv(this.HandlerEvSpecial);

q.ev += new Del(this.Handlerev);

 

}

}

 

//обработать нажатие кнопки удаления машины

private void DEL(Object o, EventArgs e)

{

if (listBoxNum.SelectedIndex == -1)

{

MessageBox.Show("Выделите номер"

+ "\n удаляемого объекта");

}

else

{

int numSel = (int)listBoxNum.SelectedItem;

listBoxNum.Items.Remove(numSel);//Удалить из списка

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

Avto a = (Avto)inum.Current;

if (a.N == numSel)

{//объект с указанным номером найден

a.Finish();//завершить поток

al.Remove(a);//удалить из списка

return;

}

}

}

}

//обработчик столкновения и разъезда машин

public void Handlerev()

{

bool crash = false;

for (int i = 0; i < al.Count; i++)

{

Avto a = (Avto)al[i];

 

if (a.life)

for (int j = i; j < al.Count; j++)

{

Avto a1 = (Avto)al[j];

 

if ((a.num!= a1.num) && (Math.Abs(a1.x - a.x) < 10) && (Math.Abs(a1.y - a.y) < 10))

{

Console.WriteLine("Автомобили " + a.num +" и "+ a1.num + " врезались");

crash = true;

a.run = false;

a1.run = false;

Thread.Sleep(500);

a.run = true;

a1.run = true;

run = true;

 

 

if (crash)

{

if ((a.x > a1.x)||(a.y > a1.y))

{

a.x += 2;

a1.x -= 1;

a.y += 2;

a1.y -= 1;

crash = false;

}

else

{

a1.x += 2;

a.x -= 1;

a1.y += 2;

a.y -= 1;

crash = false;

}

Console.WriteLine("Автомобили " + a.num + " и " + a1.num + " разъехались");

 

}

 

}

}

}

 

 

}

 

public void HandlerEvSpecial()

{

Invalidate();

}

 

//перерисовать прикладное окно

protected override void OnPaint(PaintEventArgs arg)

{

arg.Graphics.FillEllipse(new SolidBrush(Color.Gray), 100, 100, 604, 604);//внешнее кольцо

arg.Graphics.FillEllipse(new SolidBrush(Color.White), 173, 173, 454, 454);//разделительная полоса

arg.Graphics.FillEllipse(new SolidBrush(Color.Gray), 175, 175, 450, 450);//внутреннее кольцо

arg.Graphics.FillEllipse(new SolidBrush(Color.YellowGreen), 245, 245, 300, 300);

this.BackColor = Color.YellowGreen; // Закрасить фон зеленым

this.FormBorderStyle = FormBorderStyle.FixedSingle; // Запрет изменения размера окна

this.MaximizeBox = false; // Убрать кнопку "Развернуть окно"

this.DoubleBuffered = true; // Включить буферизацию изображения

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

Avto a = (Avto)inum.Current;

arg.Graphics.FillEllipse(new SolidBrush(Color.Red), a.x, a.y, 25, 25);//машина

arg.Graphics.DrawString(a.N.ToString(), new Font("Comic Sans MS", 9), new SolidBrush(Color.White), a.x + 5, a.y + 5);//номера машин

 

}

}

 

static void Main()

{

Application.Run(new Avtos());

}

}

 

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

// kurs.cc.cpp: main project file.

 

#include "stdafx.h"

#using <System.Drawing.dll>

#using <System.Windows.Forms.dll>

using namespace System;

using namespace System::Threading;

using namespace System::Collections;

using namespace System::Drawing;

using namespace System::Windows::Forms;

 

delegate void delEv();

delegate void Del();

 

 

ref class Avto

{

public:

 

int num;

event delEv ^evSpecial;

int x, y;

double fi;

int dx1, dy1, dx2, dy2;

int speed;

Thread ^thread;

bool dvig;

bool life;

bool run;

event Del ^ev;

 

 

property int N { int get() { return num; } }

property int X { int get() { return x; } }

property int Y { int get() { return y; } }

 

Avto(int N, int X, int Y, int Speed)

{

fi = 0.1;

num = N;

dvig = true;

run = true;

x = X; y = Y;

speed = Speed;

life = true;

thread = gcnew Thread(gcnew ThreadStart(this,&Avto::AvtoFunc));

thread->Start();

 

 

}

 

void Finish()

{

//Resume();

life = false;

}

 

void AvtoFunc()

{

while (life)

{

 

if (run)

{

Thread::Sleep(speed);

ev();

if (dvig)

{

dx1 = (int)(19 * System::Math::Sin(fi));

dy1 = (int)(19 * System::Math::Cos(fi));

x += dx1;

y += dy1;

 

 

}

else

{

dx2 = (int)(28 * System::Math::Sin(fi));

dy2 = (int)(28 * System::Math::Cos(fi));

y -= dx2;

x -= dy2;

 

 

}

 

fi += 0.1;

 

}

 

evSpecial();

 

 

}

}

 

void Suspend()

{

if (run)

{

run = false;

 

}

}

void Resume()

{

if (!run)

{

run = true;

 

}

}

};

 

 

ref class Avtos: public Form

{

private:

ArrayList ^al; //ссылка на список машин

ListBox ^listBoxNum;//список номеров машин

int num;// = 0;//номер объекта машины

Form ^f;// ссылка на дочернее окно управления

Button ^add, ^del, ^ok;// ссылки на кнопки

bool run;// = true;//признак движения машин

 

public:

Avtos()

{

num=0;

al = gcnew ArrayList();

run = true;

Size = Drawing::Size(770, 770);

Text = "Шоссе";

 

 

f = gcnew Form();

f->Text = "Control";

f->Size = Drawing::Size(300, 150);

f->Show();

 

ok = gcnew Button();

ok->Text = "Stop";

ok->Size = Drawing::Size(45, 30);

ok->Location = Point(5, 10);

ok->Click += gcnew EventHandler(this, &Avtos::OK);

f->Controls->Add(ok);

 

add = gcnew Button();

add->Text = "Add";

add->Size = Drawing::Size(45, 30);

add->Location = Point(5, 50);

add->Click += gcnew EventHandler(this, &Avtos::ADD);

f->Controls->Add(add);

 

listBoxNum = gcnew ListBox();

listBoxNum->Location = Point(140, 10);

listBoxNum->Size = Drawing::Size(60, 70);

f->Controls->Add(listBoxNum);

 

del = gcnew Button();

del->Text = "Del";

del->Size = Drawing::Size(40, 30);

del->Location = Point(90, 10);

del->Click += gcnew EventHandler(this, &Avtos::DEL);

f->Controls->Add(del);

}

 

private:

void OK(Object ^obj, EventArgs ^arg)

{

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^a = (Avto^)inum->Current;

if (run) { a->Suspend(); ok->Text = "Start"; }

else { a->Resume(); ok->Text = "Stop"; }

}

run =!run;

}

 

public:

void ADD(Object ^obj, EventArgs ^arg)

{

num++;

Avto ^b;

Random ^r = gcnew Random();

//Random rand = new Random();

if (num % 2 == 0)

{

Avto ^a = gcnew Avto(num, 385, 660, r->Next(50, 100));

System::Console::WriteLine("Добавлен автомобиль"+num);

a->dvig = false;

// a.ev += new Del(this.Handlerev);

b = a;

}

else

{

Avto ^a = gcnew Avto(num, 195, 400, r->Next(50, 100));

System::Console::WriteLine("Добавлен автомобиль"+num);

a->dvig = true;

// a.ev += new Del(this.Handlerev);

b = a;

}

 

listBoxNum->Items->Add(num);

al->Add(b);

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^q = (Avto^)inum->Current;

q->evSpecial += gcnew delEv(this, &Avtos::HandlerEvSpecial);

q->ev += gcnew Del(this, &Avtos::Handlerev);

}

}

 

 

private:

void DEL(Object ^o, EventArgs ^e)

{

if (listBoxNum->SelectedIndex == -1)

{

MessageBox::Show("Выделите номер удаляемого объекта");

}

else

{

int numSel = (int)listBoxNum->SelectedItem;

listBoxNum->Items->Remove(numSel);//Удалить из списка

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^a = (Avto^)inum->Current;

if (a->N == numSel)

{//объект с указанным номером найден

a->Finish();//завершить поток

al->Remove(a);//удалить из списка

return;

}

}

}

}

public:

void Handlerev()

{

bool crash = false;

for (int i = 0; i < al->Count; i++)

{

Avto ^a = (Avto^)al[i];

 

if (a->life)

for (int j = i; j < al->Count; j++)

{

Avto ^a1 = (Avto^)al[j];

 

if ((a->num!= a1->num) && (System::Math::Abs(a1->x - a->x) < 10) && (System::Math::Abs(a1->y - a->y) < 10))

{

System::Console::WriteLine("Автомобили " + a->num + " и " + a1->num + " врезались");

crash = true;

a->run = false;

a1->run = false;

Thread::Sleep(500);

a->run = true;

a1->run = true;

run = true;

 

 

if (crash)

{

if ((a->x > a1->x)||(a->y > a1->y))

{

a->x += 2;

a1->x -= 1;

a->y += 2;

a1->y -= 1;

}

else

{

a1->x += 2;

a->x -= 1;

a1->y += 2;

a->y -= 1;

}

System::Console::WriteLine("Автомобили " + a->num + " и " + a1->num + " разъехались");

}

 

}

}

}

 

 

}

 

public:

void HandlerEvSpecial()

{

Invalidate();

}

 

protected:

virtual void OnPaint(PaintEventArgs ^arg) override

{

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 100, 100, 604, 604);//внешнее кольцо

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::White), 173, 173, 454, 454);//разделительная полоса

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 175, 175, 450, 450);//внутреннее кольцо

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::YellowGreen), 245, 245, 300, 300);

this->BackColor = Color::YellowGreen; // Закрасить фон зеленым

this->MaximizeBox = false; // Убрать кнопку "Развернуть окно"

this->DoubleBuffered = true; // Включить буферизацию изображения

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^a = (Avto^)inum->Current;

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Red), a->X, a->Y, 25, 25);//машина

arg->Graphics->DrawString(a->N.ToString(), gcnew Drawing::Font("Comic Sans MS", 10), gcnew SolidBrush(Color::White), a->X + 5, a->Y + 5);//номера машин

 

}

}

};

 

static void main()

{

Application::Run(gcnew Avtos());

}

 







Дата добавления: 2015-06-15; просмотров: 456. Нарушение авторских прав; Мы поможем в написании вашей работы!



Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Философские школы эпохи эллинизма (неоплатонизм, эпикуреизм, стоицизм, скептицизм). Эпоха эллинизма со времени походов Александра Македонского, в результате которых была образована гигантская империя от Индии на востоке до Греции и Македонии на западе...

ИГРЫ НА ТАКТИЛЬНОЕ ВЗАИМОДЕЙСТВИЕ Методические рекомендации по проведению игр на тактильное взаимодействие...

Реформы П.А.Столыпина Сегодня уже никто не сомневается в том, что экономическая политика П...

Виды нарушений опорно-двигательного аппарата у детей В общеупотребительном значении нарушение опорно-двигательного аппарата (ОДА) идентифицируется с нарушениями двигательных функций и определенными органическими поражениями (дефектами)...

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия