- •4.1. Объектное представление программы 6
- •4.3. Потоки 7
- •5.Поэтапная разработка программной системы 7
- •1. Задание
- •2.Уточнение задания
- •3. Описание разрабатываемой программы с точки зрения пользователя
- •4.2. События
- •4.3. Потоки
- •5.Поэтапная разработка программной системы
- •5.3.1. Этап 1. Разработка класса Avto
- •5.3.2. Этап 2. Разработка события ev и уведомления
- •5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.
- •5.3.4. Этап 4. Добавление элемента списка, добавление кнопок остановки и удаления.
- •5.3.5. Этап 5. Добавления события ev.
- •11. Приложение 4. Текст программы на языке Java
5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.
Наступил этап разработки, когда появится прикладное окно приложения с перемещающимися шарами. А также прикладное окно с кнопкой добавления машин.
Наследовав класс Form или Frame, класс Avtos существенно расширит свою функциональность. Теперь можно создать прикладное окно (основную форму) и дочернее окно (дочернюю форму). Реализация этого этапа представлены в примерах 5.3.3.1 и 5.3.3.2 и 5.3.3.3.
Пример 5.3.3.1. Реализация третьего этапа разработки Avtos–приложения на языке С#.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections;
public delegate void delEv();
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 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 (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; //ссылка на список машин
private int num = 0;//номер объекта машины
private Form f;// ссылка на дочернее окно управления
private Button add;// ссылки на кнопки
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();//показать дочернее окно
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 в контейнер окна
}
//создать автомобиль
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;
b = a;
}
else
{
Avto a = new Avto(num, 195, 400, r.Next(50, 100));
Console.WriteLine("Добавлен автомобиль " + num);
a.dvig = true;
b = a;
}
al.Add(b);
IEnumerator inum = al.GetEnumerator();
while (inum.MoveNext())
{
Avto q = (Avto)inum.Current;
q.evSpecial += new delEv(this.HandlerEvSpecial);
}
}
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());
}
}
Результат:
Пример 5.3.3.2. Реализация третьего этапа разработки Avtos–приложения на языке С++/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();
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;
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);
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; //ссылка на список машин
int num;// = 0;//номер объекта машины
Form ^f;// ссылка на дочернее окно управления
Button ^add;// ссылки на кнопки
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();
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);
}
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;
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;
}
al->Add(b);
IEnumerator ^inum = al->GetEnumerator();
while (inum->MoveNext())
{
Avto ^q = (Avto^)inum->Current;
q->evSpecial += gcnew delEv(this, &Avtos::HandlerEvSpecial);
}
}
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());
}
Результат:
Пример 5.3.3.3. Реализация третьего этапа разработки Avtos–приложения на языке Java.
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Avto extends Observable implements Runnable
{
public int num;
public int x, y;
public double fi = 0.1;
public int dx1, dy1, dx2, dy2;
Thread thr;
public boolean dvig = true, run = true;
boolean life;
public int speed;
public int N() { return num; }
public int X() { return x; }
public int Y() { return y; }
public Avto(int N, int X, int Y, int Speed)
{
num = N;
x = X; y = Y;
speed = Speed;
life = true;
thr = new Thread(this);
thr.start();
}
public void report()
{
setChanged();
notifyObservers();
}
public void Finish()
{
Resume();
life = false;
}
public void run()
{
while (life)
{
if (run)
{
try
{
Thread.sleep(speed);
}
catch (InterruptedException e) { }
if (dvig)
{
x += dx1;
y += dy1;
dx1 = (int)(19 * Math.sin(fi));
dy1 = (int)(19 * Math.cos(fi));
}
else
{
y -= dx2;
x -= dy2;
dx2 = (int)(28 * Math.sin(fi));
dy2 = (int)(28 * Math.cos(fi));
}
fi += 0.1;
report();
}
}
}
public void Suspend()
{
if (run)
{
run = false;
}
}
public void Resume()
{
if (!run)
{
run = true;
}
}
}
public class Autos extends Frame implements Observer, ActionListener, ItemListener
{
public ArrayList al;
private boolean run;
private Frame f;
private Button add;
private int num = 0;
private Random r;
public Autos()
{
al = new ArrayList();
r = new Random();
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent wE)
{
for (int n = 0; n < al.size(); n++)
{
Avto a = (Avto)al.get(n);
a.Suspend();
}
System.exit(0);
}
});
setTitle("Шоссе");
setLocation(new Point(600, 0));
setBackground(Color.green);
run = true;
f = new Frame();
f.setSize(300, 100);
f.setTitle("Control");
f.setLocation(new Point(150,150));
f.setLayout(new FlowLayout());
add = new Button("Add");
add.setActionCommand("ADD");
add.addActionListener(this);
f.add(add);
f.setVisible(true);
}
//обработать уведомдение
public void update(Observable obj, Object arg)
{
repaint();
}
//перерисовать окно
public void paint(Graphics g)
{
g.setColor(Color.gray);
g.fillOval(100, 100, 604, 604);
g.fillOval(175, 175, 450, 450);
g.setColor(Color.white);
g.fillOval(173, 173, 454, 454);
g.setColor(Color.gray);
g.fillOval(175, 175, 450, 450);
g.fillOval(175, 175, 450, 450);
g.setColor(Color.green);
g.fillOval(245, 245, 300, 300);
for (int i = 0; i < al.size(); i++)
{
g.setColor(Color.red);
Avto a = (Avto)al.get(i);
g.fillOval(a.X(), a.Y(), 25, 25);
g.setColor(Color.white);
g.drawString(Integer.toString(a.num), a.X() + 5, a.Y() + 15);
}
}
//выполнить команды для нажатия кнопок
public void actionPerformed(ActionEvent aE)
{
String str = aE.getActionCommand();
if (str.equals("ADD"))
{
num++;
Avto b;
r = new Random();
if (num % 2 == 0)
{
Avto a = new Avto(num, 385, 666, r.nextInt(100)+50);
System.out.println("Dobavlen avto " + num);
a.dvig = false;
b = a;
}
else
{
Avto a = new Avto(num, 195, 400, r.nextInt(100)+50);
System.out.println("Dobavlen avto " + num);
a.dvig = true;
b = a;
}
b.addObserver(this);
al.add(b);
}
repaint();
}
public void itemStateChanged(ItemEvent e)
{
repaint();
}
public static void main(String[] args)
{
Autos auto = new Autos();
auto.setSize(750, 750);
auto.setVisible(true);
}
}
Результат:
