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

Ход работы

  1. Загрузите среду визуального программирования Bilder C++

  2. Откажитесь от возможности изменять размеры окна программы, указав значение свойства формы BorderStylebsDialog.

Задав это значение, выполните программу и убедитесь, что нельзя изменить размер формы. Обратите внимание на отсутствие кнопок для минимизации и максимизации окна, а также системного меню. Завершите работу программы.

Измените заголовок формы : как на рисунке ниже

  1. Вставьте в форму объект типа TPaintBox, как показано на рис4.4. Для этого щелкните на пиктограмме объекта типа PaintBox, которая находится на закладке System палитры компонентов главного окна Bilder C++.

  2. После этого щелкните в точке вставки на форме. Разверните на все окно формы как показано на рисунке выше. Измените его название со значения по умолчанию PaintBox1 на более звучное Screen.

  3. Добавьте на форму кнопку, нажатием которой вся система будет запускаться. В качестве её названия введите StartStopBtn , а в качестве надписи на ней Пуск

  1. Нажатием клавиши F12 перейдите в окно кода программы и подключите библиотеки #include <stdlib.h> #include <math.h> в модуле Unit1.cpp

#include <Math.hpp> в модуле Unit1.h

Пояснение:

Для генерации случайного местонахождения молекулы используется генератор случайных чисел randomize(), из библиотеки stdlib.h.

Функция RandomRange(Left,Right) возвращает случайное целое число в промежутке от Left до Right включительно, из библиотеки Math.hpp.

Напомним, что функции sin() и cos() требуют передавать им аргументы в радианах, случайное число генерируется в диапазоне от 0 до 360 , поэтому используем формулу перевода из градусов в радианы:180 градусов= радиан

  1. Двойным щелчком на кнопке StartStopBtn перейдите к редактированию обработчика события в полученную заготовку в окне кода программы

void __fastcall TForm1::StartStopBtnClick(TObject *Sender)

{

// записать код программы

}

Void __fastcall tForm1::StartStopBtnClick(tObject *Sender)

{

int x,y,Vx,Vy; //координаты молекулы и составляющие скорости

float angle; // угол, задающий начальное направление полета

const float R=10; // радиус молекулы

const float V=7; // скорость молекулы

randomize();

Screen->Refresh(); // очистка экрана

x = RandomRange(R, Screen->Width - R);

y = RandomRange(R, Screen->Height - R);

// выбор начального положения молекулы по координате Х и Y и её направления

angle = random(360)* M_PI /180;

Vx = floor(V * sin(angle)); // получение составляющих скорости молекулы

Vy = floor(V * cos(angle));

while (IsRunning) // основной цикл

{

//стереть молекулу с экрана (дописать код самостоятельно, смотри в теории программный код)

// вычислить новую позицию молекулы по формулам:

x=x+Vx;

y=y+Vy;

// ЕСЛИ молекула вышла за правую границу аквариума ТО вернуть её к

if (x > Screen->Width - R)

{

x = Screen->Width - R; //ближайшей допустимой точке

// изменить горизонтальную скорость на противоположную по формуле:

Vx = - Vx;

}

//конецесли

//Далее составьте код программы самостоятельно по алгоритму

ЕСЛИ молекула вышла за левую границу аквариума ТО

вернуть её к ближайшей допустимой точке (смотри теорию выше)

изменить горизонтальную скорость на противоположную по формуле: КОНЕЦЕСЛИ

ЕСЛИ молекула вышла за верхнюю границу аквариума ТО

вернуть её к ближайшей допустимой точке

изменить вертикальную скорость на противоположную по формуле:

Vy=-Vy;

КОНЕЦЕСЛИ

ЕСЛИ молекула вышла за нижнюю границу аквариума ТО

вернуть её к ближайшей допустимой точке

изменить вертикальную скорость на противоположную по формуле:

Vy=-Vy;

КОНЕЦЕСЛИ

Нарисовать молекулу на новой позиции( смотри теорию выше)

Sleep(10); // пауза 10 миллисекунд

}

// конец цикла while

}

// конец подпрограммы обработчика события, нажатие на клавишу

  1. Для возможности реализации завершения программы, нам необходимо добавить глобальную логическую переменную IsRunning,

сразу после строки объявления формы TForm1 *Form1;

bool IsRunning=false

  1. Продолжаем редактировать код функции обработчика события OnClick. В код функции обработки события StartStopBtnClick после объявления переменных добавьте указанный ниже алгоритм.

void __fastcall TForm1::StartStopBtnClick(TObject *Sender)

{

//описание переменных

// Алгоритм работы будет выглядеть так:

if (IsRunning== true)

{

IsRunning=false;

StartStopBtn->Caption=” Пуск”;

return;

}

IsRunning=true;

StartStopBtn->Caption=” Стоп”;

// Далее продолжение кода , вызов randomize(), очистка экрана и так далее

……………..

…………...

}

  1. Сохранить проект, провести компиляцию и запустить на выполнение. Молекула исправно летает по экрану. Единственная загвоздка заключается в том, что из приложения можно выйти, только при аварийном завершении программы ( команда главного меню RUN-> Program Reset

  1. Когда пользователь нажимает кнопку ПУСК первый раз, значение переменной IsRunning равно false, поэтому программа начнет выполнять цикл движения молекулы. Если же он нажмет кнопку еще раз , то переменная IsRunning станет равной false и цикл закончится.

При реализации циклического алгоритма, можно заметить что условие не изменяется, то есть программа не будет прерываться, чтобы обработать нажатие кнопки. Чтобы такого не происходило, необходимо где-нибудь в цикле принудительно вызвать обработку пришедших событий .

Для этого вставьте вызов процедуры в теле цикла после паузы в 10 миллисекунд.

Application->ProcessMessages();

в конце цикла while.

  1. Создайте ехе-файл Вашей программы. Выполните пункт главного меню Project => Build All.

  2. Закончите работу. Оформите отчет, в соответствии с документом Требование к оформлению отчета.

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