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

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

Программы






 

 

 

 

 


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; просмотров: 455. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

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

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

ОПРЕДЕЛЕНИЕ ЦЕНТРА ТЯЖЕСТИ ПЛОСКОЙ ФИГУРЫ Сила, с которой тело притягивается к Земле, называется силой тяжести...

СПИД: морально-этические проблемы Среди тысяч заболеваний совершенно особое, даже исключительное, место занимает ВИЧ-инфекция...

Понятие массовых мероприятий, их виды Под массовыми мероприятиями следует понимать совокупность действий или явлений социальной жизни с участием большого количества граждан...

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

Краткая психологическая характеристика возрастных периодов.Первый критический период развития ребенка — период новорожденности Психоаналитики говорят, что это первая травма, которую переживает ребенок, и она настолько сильна, что вся последую­щая жизнь проходит под знаком этой травмы...

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