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

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

Программы





 

 

 

 

 


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




Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Принципы резекции желудка по типу Бильрот 1, Бильрот 2; операция Гофмейстера-Финстерера. Гастрэктомия Резекция желудка – удаление части желудка: а) дистальная – удаляют 2/3 желудка б) проксимальная – удаляют 95% желудка. Показания...

Ваготомия. Дренирующие операции Ваготомия – денервация зон желудка, секретирующих соляную кислоту, путем пересечения блуждающих нервов или их ветвей...

Билиодигестивные анастомозы Показания для наложения билиодигестивных анастомозов: 1. нарушения проходимости терминального отдела холедоха при доброкачественной патологии (стенозы и стриктуры холедоха) 2. опухоли большого дуоденального сосочка...

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

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

Особенности массовой коммуникации Развитие средств связи и информации привело к возникновению явления массовой коммуникации...

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