Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проект4.docx
Скачиваний:
11
Добавлен:
11.04.2015
Размер:
224.35 Кб
Скачать

Самостоятельная работа.

Задача 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.

Чтобы повысить точность модели, необходимо уменьшить радиус молекул (вплоть до единицы).

Проверить ошибки, провести компиляцию сохранить проект. Запустить на выполнение.

Записать код функции и скриншот работающей программы в отчет. Нарисовать блок-схему для кода функции пункта меню Идеальный газ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]