Всем доброго времени суток. Преподаватель поставил задачу написать программу на 3-х языках: C#, C++/CLI, Java. Написал программу на C#, также другой ветке форума помогли перевести её на C++/CLI. Может найдётся добрый человек, который поможет перевести её на Java?=) Просто с языком не знаком, и слышал, что от C# он не сильно отличается, только в нём нет делегирования и потоки как-то специфично реализуются.
Сам бы с удовольствие со всем разобрался, но время сильно ограничено (просто не успею разобраться), преподаватели наверно думают, что в сутках 48 часов=)
Ниже привожу примеры на C# и на C++/CLI
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
| using System;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
delegate void DEL(int k);
class Ball
{
public int x, y; // координаты
Thread t; // поток
bool life; // индикатор жизни шарика
Window win;//объявление поля win
public Ball(Window win)
{
x = 0;
y = 100;
this.win = win;//присвоение полю win параметра win
life = true;
t = new Thread(new ThreadStart(Moving));
t.Start();
}
public event DEL ev;//объявление объекта типа делегат
void Moving()
{
int dx = 3;//шаг перемещения шарика
while (life)
{
Console.WriteLine("Начало движения");
if (x <= win.Width - 10)
x += dx;
else
{
if (ev != null) ev(win.k);
life = false;
Console.WriteLine("Конец");
win.Invalidate();
}
win.Invalidate();
Thread.Sleep(25);
}
}
public void Handler(int k)
{
k++;//увеличения переменной количества окон
if (k < 3)
{
Window win = new Window(k);//если окно одно, то создаём ещё одно
win.Text = "Window 2";
win.StartPosition = new FormStartPosition();
win.Location = new Point(250 * k, 100);
win.ShowDialog();//чтобы предотвратить схлопывание потока, текущий поток ожидает возврата DialogResult
}
}
}
class Window : Form
{
Ball ball;//создание объекта ball класса Ball
public int k;//номер окна(от 1 до 2)
public Window(int k)
{
this.k = k;//присвоение текущего значения k переменной k
ball = new Ball(this);//шарик принимает параметр окно
this.Text = "Window"; //название окна
ball.ev+= new DEL(ball.Handler);//создание объекта делегата и загрузка в него обработчика
}
protected override void OnPaint(PaintEventArgs e) // модификатор расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события.
{
base.OnPaint(e);
e.Graphics.DrawEllipse(new Pen(Color.Black, 5), ball.x, ball.y, 50, 50);
Console.WriteLine("repaint");
}
static void Main(string[] args)
{
int k = 1;//инициализация количества окон
Window w = new Window(k);//создание обекта класса Window
w.StartPosition = new FormStartPosition();
w.Location = new Point(200*k,100);
w.Show();
Application.Run(); // запуск этого окна
}
} |
|
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| #include "stdafx.h"
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
#using <System.dll>
using namespace System;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Threading;
delegate void DEL(int k);
ref class Window;
ref class Ball
{
public:
int x, y;
Thread ^ t;
bool life;
Window ^ win;
Ball(Window ^ win);
event DEL ^ ev;
private:
void Moving();
public:
void Handler(int k);
};
ref class Window : Form
{
Ball ^ ball;
public:
int k;
Window(int k)
{
this->k = k;
ball = gcnew Ball(this);
this->Text = "Window";
ball->ev += gcnew DEL(ball, &Ball::Handler);
}
protected:
virtual void OnPaint(PaintEventArgs ^ e) override
{
Form::OnPaint(e);
e->Graphics->DrawEllipse(gcnew Pen(Color::Green, 5), ball->x, ball->y, 50, 50);
Console::WriteLine("repaint");
}
};
Ball::Ball(Window ^ win)
{
x = 0;
y = 100;
life = true;
this->win = win;
t = gcnew Thread(gcnew ThreadStart(this, &Ball::Moving));
t->Start();
}
void Ball::Moving()
{
int dx = 3;
while(life)
{
Console::WriteLine("Начало движения");
if(x <= win->Width - 10)
x += dx;
else
{
ev(win->k);
life = false;
Console::WriteLine("Конец");
win->Invalidate();
}
win->Invalidate();
Thread::Sleep(25);
}
}
void Ball::Handler(int k)
{
++k;
if(k < 3)
{
Window ^ win = gcnew Window(k);
win->Text = "Window 2";
win->StartPosition = FormStartPosition();
win->Location = Point(250 * k, 100);
win->ShowDialog();
}
}
int main(cli::array<String ^> ^ args)
{
int k = 1;
Window ^ w = gcnew Window(k);
w->StartPosition = FormStartPosition();
w->Location = Point(200 * k, 100);
w->Show();
Application::Run();
} |
|