![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Для пункта меню “Идеальный газ” напишите новый код программы.
Для этого необходимо щелчком мыши на пункте меню, создать новую заготовку. 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; Си Molecule Mol [N];
Добавьте в код функции как показано ниже void __fastcall TForm1:: N3Click(TObject *Sender) { struct Molecule { int X, Y; int Vx, Vy; }; const int N=30; Molecule Mol [N]; int CurV;
…………………..// Скопируйте код функции предыдущей программы по одной молекуле, и внесите изменения по указаниям приведенным ниже.
}
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. Чтобы повысить точность модели, необходимо уменьшить радиус молекул (вплоть до единицы). Проверить ошибки, провести компиляцию сохранить проект. Запустить на выполнение. Записать код функции и скриншот работающей программы в отчет. Нарисовать блок-схему для кода функции пункта меню Идеальный газ. 4.3 Добавить новые пункты меню в соответствии с рисунком приведенном ниже:
|