- •Теоретические сведения.
- •Ход работы
- •Void __fastcall tForm1::StartStopBtnClick(tObject *Sender)
- •Самостоятельная работа.
- •4.2 Для пункта меню “Идеальный газ” напишите новый код программы.
- •4.3 Добавить новые пункты меню в соответствии с рисунком приведенном ниже:
- •4.4 При нажатии на пункт «о программе» :
Самостоятельная работа.
Задача 4.1. Добавьте в проект главное меню с пунктами
Движение молекулы -> В закрытом сосуде
Идеальный газ
Для пункта меню “В закрытом сосуде”, перейти в окно Инспектора Объектов по клавише F11, открыть закладку Events-События и выбрать строку OnClick как показано на рисунке. Запустить программу на выполнение и проверить работу меню. Если на форме не появляется главное меню, тогда необходимо изменить свойство формы BorderStyle на значение bsSizeable
4.2 Для пункта меню “Идеальный газ” напишите новый код программы.
Для этого необходимо щелчком мыши на пункте меню, создать новую заготовку.
void __fastcall TForm1::N3Click(TObject *Sender)
{
// тело функции по заданию сам.работы 4.1
}
Для второй функции доработайте готовую модель одной молекулы.
В физике идеальным называется газ, в котором силы взаимодействия между частицами пренебрежимо малы. Имея готовую модель одной молекулы , необходимо доработать программу так, чтобы она работала не с одной молекулой, а с массивом из N молекул. Кроме того, поскольку в газе обычно встречаются как «медленные», так и «быстрые» молекулы, скорость каждой отдельной молекулы будет выбираться случайным образом. Количество молекул объявим в виде константы и определим равное 30.
Для этого в код программы добавим описание нового типа данных «молекула»:
Указание: в языке Паскальэтот тип данных называлась запись и выглядела следующим образом
type
Molecule = record
X, Y : Integer;
Vx,Vy:Integer;
end;
объявление типа данных структура на языке С++будет выглядеть следующим образом
struct Molecule
{
int X, Y ;
int Vx, Vy;
};
Объявление одномерного массива измените так:
Паскаль Mol : array[1..N] of Molecule;
Си MoleculeMol[N];
Добавьте в код функции как показано ниже
void __fastcall TForm1::N3Click(TObject *Sender)
{
struct Molecule
{
int X, Y ;
int Vx, Vy;
};
const int N=30;
Molecule Mol [N];
intCurV;
…………………..// Скопируйте код функции предыдущей программы по одной молекуле, и внесите изменения по указаниям приведенным ниже.
}
4.2.1 Приведенный ниже фрагмент определяет выбор начального положения молекулы по координате Х и Y и её направления ,получение составляющих скорости молекулы
x = RandomRange(R, Screen->Width - R);
y = RandomRange(R, Screen->Height - R);
angle = random(360)* M_PI /180;
Vx = floor(V * sin(angle)); //
Vy = floor(V * cos(angle));
Необходимо заменить на циклический алгоритм, определения начального положения массива молекул М[i], для которых определяются координатыXиYв виде составного имени :M[i].XиM[i].Y
for( i=0; i<N;i++)
{
Mol[i].X := RandomRange(R, Screen->Width - R);
Mol[i].Y := RandomRange(R, Screen->Height - R);
angle= random(360)*M_ PI /180;
CurV= RandomRange(1, V);
Mol[i].Vx = floor(CurV * sin(angle));
Mol[i].Vy := floor(CurV * cos(angle));
}
while (IsRunning)
{//начало цикла while
for( i=0; i<N;i++)
{
//……………….
}
Sleep(10); // пауза 10 миллисекунд
Application->ProcessMessages();
}//конец цикла while
Обращение к объектам и его свойствам в языке С++ точка заменяется стрелкой Например:
Паскаль Screen.Width
Си Screen->Width
Далее самостоятельно измените код программы, опираясь на приведенный код написанный на языке Паскаль.
procedure TForm1.StartStopBtnClick(Sender: TObject);
const R : Integer = 10; { радиус молекулы }
V : Integer = 7; { максимальная скорость молекулы }
N = 30;
var angle : Real; { угол, задающий изначальное направление полета }
i : Integer;
Mol : array[1..N] of Molecule;
CurV : Integer;
begin
if IsRunning then
begin
IsRunning := false;
StartStopBtn.Caption := 'Пуск';
Exit;
end;
StartStopBtn.Caption := 'Стоп';
IsRunning := true;
Randomize;
Screen.Refresh;
for i := 1 to N do
begin
Mol[i].X := RandomRange(R, Screen.Width - R); { выбор начального }
Mol[i].Y := RandomRange(R, Screen.Height - R); { положения молекулы }
angle := Random(360)* Pi /180; { и ее направления }
CurV := RandomRange(1, V);
Mol[i].Vx := Round(CurV * Sin(angle)); { получение составляющих }
Mol[i].Vy := Round(CurV * Cos(angle)); { скорости молекулы }
end;
while isRunning do { основной цикл }
begin
for i := 1 to N do
begin
Screen.Canvas.Pen.Color := clBtnFace; { стираем молекулу }
Screen.Canvas.Ellipse(Mol[i].X - R, Mol[i].Y - R,
Mol[i].X + R, Mol[i].Y + R);
Mol[i].X := Mol[i].X + Mol[i].Vx; { сдвигаем на новую позицию }
Mol[i].Y := Mol[i].Y + Mol[i].Vy;
{ определяем, не вышла ли }
if Mol[i].X > Screen.Width - R then { молекула за границы аквариума }
begin Mol[i].X := Screen.Width - R; Mol[i].Vx := - Mol[i].Vx; end;
if Mol[i].X < R then
begin Mol[i].X := R; Mol[i].Vx := - Mol[i].Vx; end;
if Mol[i].Y > Screen.Height - R then
begin Mol[i].Y := Screen.Height - R; Mol[i].Vy := - Mol[i].Vy; end;
if Mol[i].Y < R then
begin Mol[i].Y := R; Mol[i].Vy := - Mol[i].Vy; end;
Screen.Canvas.Pen.Color := clBlue; { рисуем молекулу на }
Screen.Canvas.Ellipse(Mol[i].X - R, Mol[i].Y - R, Mol[i].X + R, Mol[i].Y + R); { новой позиции }
end;
Sleep(10); { пауза 10 миллисекунд }
Application.ProcessMessages;
end;
end;
end.
Чтобы повысить точность модели, необходимо уменьшить радиус молекул (вплоть до единицы).
Проверить ошибки, провести компиляцию сохранить проект. Запустить на выполнение.
Записать код функции и скриншот работающей программы в отчет. Нарисовать блок-схему для кода функции пункта меню Идеальный газ.