Лабораторная работа «Визуальное программирование» (скачать)

advertisement
1
ВИЗУАЛЬНОЕ ПРОГРАММИРОВАНИЕ
В C++BUILDER
Методические указания к лабораторным работам по дисциплине
"Программирование"
Содержание
1. C++ Builder ............................................................................................................... 2
2. Этапы проектирования в C++ Builder ................................................................... 3
3. Объект AnsiString .................................................................................................... 4
3.1. Операции, определенные для объекта AnsiString ......................................... 4
3.2. Некоторые методы объекта AnsiString. .......................................................... 4
4. Основные компоненты C++ Builder ...................................................................... 5
5. Основные общие свойства компонентов .............................................................. 6
6. Основные события компонентов ........................................................................... 6
Лабораторная работа №1. Первый проект ................................................................ 7
Лабораторная работа №2. Объект AnsiString ........................................................... 9
Лабораторная работа №3. События от таймера ..................................................... 10
Лабораторная работа №4. Массивы ........................................................................ 12
Лабораторная работа №5. Построение графиков и диаграмм .............................. 15
Построение графиков ............................................................................................ 15
Построение диаграмм ............................................................................................ 16
Лабораторная работа №6. Диалоговые окна .......................................................... 18
Лабораторная работа №7. Моделирование случайных процессов ...................... 21
Лабораторная работа №8. Создание меню. ............................................................ 24
Лабораторная работа №9. Рисование ...................................................................... 27
Задания к лабораторной работе ............................................................................ 29
2
1. C++ Builder
C++ Builder есть система программирования для созданий приложений, то есть
программ, работающих под управлением операционной системы Windows.
Это управление заключается в том, что операционная система отслеживает
наступление событий при работе приложения и вызывает (передаёт
управление) функцию, операторы которой должны по замыслу программиста
выполняться как реакция на произошедшее событие.
Событиями, наступление которых фиксирует операционная система, являются,
например, щелчок мышью по окну, перетаскивание окна по экрану, истечение
определённого промежутка времени и т.д.
То, что создаётся с помощью C++ Builder, принято называть проектом, а сам
процесс создания – проектированием.
Проект в C++ Builder создаётся из компонентов, основным из которых является
форма.
Компоненты с одной стороны, являются визуальными элементами: кнопками,
списками и т.д., а с другой стороны являются экземплярами объектов. Все
объекты в C++ Builder порождены одним объектом – TObject.
Объявление экземпляров в системе C++ Builder частично автоматизировано –
программист рисует на форме компонент, задаёт его свойства и методы в окне
инспектора объектов, а соответствующий код в программный файл вставляет
C++ Builder.
Терминология, используемая при программировании в системе C++ Builder,
несколько отличается от принятой, в частности:
 компонент означает экземпляр объекта, либо сам объект,
 свойство компонента – поле экземпляра,
 событие компонента –
операционной системой,
метод
экземпляра,
который
вызывается
 метод компонента – метод экземпляра, который вызывается программно,
как функция.
Все экземпляры объявляются в C++ Builder указателями на объект, поэтому
обращение к их свойствам, событиям и методам осуществляются посредством
операции “->”.
3
2. Этапы проектирования в C++ Builder
1. Открыть C++ Builder:
страница
компонент
ов
компонент
форма - место
для вставки
компонентов
код
инспектор
объектов
2. Сохранить новый проект в своей папке:
 File – Save Project As
 выбрать путь и создать свою папку
 Сохранить
 Сохранить
либо открыть существующий проект (файл с расширением bpr).
Примечание. Первое “Сохранить” записывает на диск файл с расширением cpp,
а второе “Сохранить” – файл проекта с расширением bpr.
3. Вставить в форму компоненты:
 открыть страницу (Standard, Additional и т.д.), на которой находится значок
нужного компонента
 щелчком выбрать значок компонента, затем нарисовать компонент в любом
месте формы;
 перетащить компонент в нужное место и при необходимости изменить его
размеры.
4. Задать значения свойствам компонентов:
 щелчком выделить компонент на форме;
 в окне Object Inspector на закладке Properties выбрать свойство;
 изменить значение свойства в правом столбце закладки, выбрав нужное
значение из списка, либо набрав его на клавиатуре.
5. Задать обработчики событий для компонентов:
 выделить компонент на форме;
 в окне Object Inspector открыть закладку Events;
 дважды щелкнуть в правом столбце нужного события;
 набрать операторы в окне кода между фигурными скобками, находящимися
после заголовка события.
4
6. Открытие приложения (запуск проекта):
 щелчок
по
кнопке ;


7.

либо через пункт меню Run;
либо Ctrl + F9.
Закрытие приложения
щелчок по стандартной кнопке закрытия в правом верхнем углу
приложения;
либо щелчок по кнопке
.
3. Объект AnsiString
В C++ Builder строковый тип реализован в виде объекта AnsiString. Это строки
с нулевым символом в конце. При объявлении переменные типа AnsiString
(экземпляры объекта AnsiString) инициализируются пустыми строками.
Примечание. Некоторые поля компонентов, например, Caption и Text имеют
тип AnsiString. Некоторые функции API Windows, например, MessageBox
имеют аргументы типа массив символов (char *).
3.1. Операции, определенные для объекта AnsiString
1. Операции отношения (с учетом регистра):
==
!=
>
<
>=
<=
2. Операция присваивания:
=
3. Операции конкатенации (склейки строк):
+= +
4. Операция индексации [], нумерация символов в строке начинается с 1.
3.2. Некоторые методы объекта AnsiString.
AnsiString(char* Src)
c_str()
AnsiPos(AnsiString& SbS)
void Delete(int inx, int cnt)
void Insert(AnsiString& Str,
int indx)
int Length()
void SetLength(int Length)
AnsiString StringOfChar
преобразование типа char* в AnsiString.
преобразование типа AnsiString в char*.
возвращает номер первого символа, с которого SbS
входит в строку; если вхождения нет, то возвращает 0;
поддерживает многобайтные символы.
удаляет из строки, начиная с inx, cnt символов.
вставляет Str в строку, начиная с indx символа.
возвращает длину строки.
усекает строку до Length символов.
возвращает строку из count символов ch.
(char ch, int count)
void SubString
(int indx, int count)
StrToFloat(AnsiString S)
StrToInt(AnsiString S)
FloatToStr(float F)
AnsiString IntToStr(int I)
возвращает подстроку, начиная с indx символа, из count
символов.
преобразует строку S в тип float.
преобразует строку S в тип int.
преобразование вещественного F в строку.
преобразование целого I в строку.
5
4. Основные компоненты C++ Builder
Ниже перечислены компоненты, которые наиболее часто используются
начинающимися программистами; в скобках находятся страницы, на которых
находятся компоненты.
 Метки
Label – метка (Standard).
StaticText – метка с бордюром (Additional).
 Редакторы
Edit – однострочечный редактор (Standard).
LabelEdit – однострочечный редактор с меткой (Additional).
MaskEdit – однострочечный редактор с шаблонами (Additional).
Memo – многострочечный редактор (Standard).
ReachEdit – многострочечный редактор в обогащённом формате (Win32).
 Компоненты для создания меню
MainMenu – главное меню (Standard).
PopUpMenu – контекстное меню (Standard).
 Кнопки
BitBtn – кнопка с пиктограммой (Additional).
Button – кнопка (Standard).
RadioButton – радиокнопка (Standard).
RadioGroup – группа радиокнопок (Standard).
SpeedButton – кнопка с пиктограммой и фиксацией (Additional).
 Индикаторы (флажки)
CheckBox – индикатор (флажок) (Standard).
CheckListBox – список строк с индикаторами (Additional).
 Списки (массивы)
ListBox – список строк (одномерный массив) (Standard).
StringGrid – таблица строк (двумерный массив) (Additional).
ColorBox – выпадающий список для выбора цвета (Additional).
ComboBox – выпадающий список строк (Standard).
ComboBoxEx – выпадающий список строк с изображениями (Win32).
ImageList – список изображений (Additional).
 Контейнеры
GroupBox – групповая панель (Standard).
Panel – панель (Standard).
ToolBar – панель для инструментов (Win32).
Image – контейнер для графического изображения (Additional).
ControlBar – контейнер инструментальных панелей (Additional).
CoolBar – контейнер инструментальных панелей (Win32).
 Диалоговые окна
OpenDialog – для открытия файла (Dialogs).
SaveDialog – для сохранения файла (Dialogs).
OpenPictureDialog – для открытия изображения (Dialogs).
SavePictureDialog – для сохранения изображения (Dialogs).
ColorDialog – для выбора цвета (Dialogs).
FontDialog – выбор шрифта (Dialogs).
6
 Разное
Animate – клипы Windows (Win32).
Chart – графики и диаграммы (Additional).
PaintBox – окно для рисования (System).
StatusBar – полоса состояния Win32).
Timer – таймер (System).
Примечание. Кроме указанных в C++ Builder есть и другие компоненты,
например, многочисленная группа компонентов для создания СУБД.
5. Основные общие свойства компонентов
 Caption – надпись на компоненте.
 Align – выравнивание компонента относительно контейнера; возможные
значения:






alNone – компонент остается там, где он был в момент проектирования.
alTop – компонент занимает верхнюю часть контейнера.
alBottom – компонент занимает нижнюю часть контейнера.
alLeft – компонент занимает левую часть контейнера.
alRight – компонент занимает правую часть контейнера.
alClient – компонент занимает весь контейнер.
 int Left – расстояние в пикселях между левыми границами компонента и
контейнера.
 int Top – расстояние в пикселях между верхними границами компонента и
контейнера.
 int Height – высота компонента в пикселях.
 int Width – ширина компонента в пикселях.
 int Color – цвет фона компонента.
 Font – атрибуты шрифта.
 Cursor – форма курсора над компонентом.
 Enabled – доступность компонента (true/false).
 Visible – видимость компонента (true/false).
 Name – имя компонента.
Примечание. Если компонент есть форма, то свойства Left и Top
отсчитываются от границ экрана, а свойства Enabled и Visible используются
только при создании многоформенных приложений.
6. Основные события компонентов









OnCreate – создание формы, происходит при открытии приложения.
OnClick – щелчок левой клавишей мыши по компоненту.
OnDblClick – двойной щелчок по компоненту.
OnKeyDown – клавиша движется вниз.
OnKeyPressed – нажатие клавиши.
OnKeyUp – клавиша поднимается.
OnMouseMove – курсор мыши перемещается по компоненту.
OnMouseDown – левая клавиша мыши движется вниз.
OnMouseUp – левая клавиша мыши поднимается вверх.
7
Лабораторная работа №1. Первый проект
Компоненты: Form, CheckBox, StaticText, Button
Характерные свойства используемых компонентов.
CheckBox
Alignment – расположение свойства надписи (Caption) по отношению к
флажку:
taLeftJustify – слева,
taRightJustify – справа.
Checked – true – флажок установлен, false – флажок сброшен.
StaticText
BorderStyle – стиль рамки: sbsNone – нет рамки, sbsSingle – линия,
sbsSunken – утопленный текст.
Постановка задачи. Создать приложение для подсчёта количества щелчков
мышью по выделенной части экрана, причём каждый щелчок должен менять
размеры и перемещать эту выделенную часть экрана.
Решение задачи и выбор компонентов для создания интерфейса. В качестве
выделенной части экрана выберем окно формы, так как одним из событий
формы является OnClick, которое и позволит подсчитывать щелчки мышью,
кроме этого, размеры и положение окна формы можно менять во время
работы приложения. Результат подсчёта будем выводить через свойство
Caption компонента StaticText. Посредством свойства Checked компонента
CheckBox будем задавать увеличение/уменьшение размеров окна формы и
направление перемещения.
Состав проекта:
Задание свойств используемых компонентов:
Form1
Caption: “Не щелкай клювом!”
Color: clMoneyGreen – цвет фона,
Cursor: crCross – форма курсора (крест),
Font: Шрифт: Arial, Размер: 12.
StaticText1
Alignment: taCenter – центрирование надписи,
BoderStyle: sbsSunken – стиль рамки,
Color: clWhite – цвет фона,
Font: Шрифт: Arial, Размер: 18.
8
CheckBox1
Alignment: taLeftJustify – надпись слева от флажка,
Color: clSilver
Checked: True – флажок установлен.
Обработчики событий:
void __fastcall TForm1::Button1Click(TObject *Sender)
{// щелчок по Button1 - закрываем приложение
Application->Terminate();
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{// начало работы приложения – устанавливаем свойство формы
CheckBox1 -> Caption = "Больше / Меньше";
}
void __fastcall TForm1::FormClick(TObject *Sender)
{ // щелчок по форме
StaticText1 -> Caption = // увеличиваем на 1 количество щелчков по форме
IntToStr(StrToInt(StaticText1->Caption)+1);
if(CheckBox1 -> Checked == True) // флаг установлен:
{Form1 -> Width +=20;
// увеличиваем размеры формы
Form1 -> Height +=20;
Form1 -> Top +=20; // и сдвигаем её вниз и вправо
Form1 -> Left +=20;
}
else // флаг сброшен:
{Form1 -> Width -=20;
// уменьшаем размеры формы
Form1 -> Height -=20;
Form1 -> Top -=20; // и сдвигаем её вверх и влево
Form1 -> Left -=20;
}
}
void __fastcall TForm1::
Button1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{ // курсор двигается по кнопке Button1 "Закрыть"
if(CheckBox1 -> Checked == True)
// флаг установлен:
Button1 -> Left -= Button1->Width; // сдвигаем кнопку влево
else //
флаг сброшен
Button1 -> Left += Button1 -> Width;
// сдвигаем кнопку вправо
}
Примечание. После открытия приложения, щелкнуть по кнопке “Закрыть” не
удастся.
9
Лабораторная работа №2. Объект AnsiString
Компоненты: Panel, Label, Edit
Характерное свойство компонента Edit:
Text – текст (тип AnsiString) в окне однострочечного редактора.
Характерное событие компонента Edit:
OnChange – наступает при всяком изменении в окне Edit.
Постановка задачи. Создать приложение для демонстрации операций “вставка
подстроки в строку” и “вырезка подстроки”, определённых для объекта
AnsiString.
Состав проекта:
Обработчики событий:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // вставка подстроки в строку, начиная с позиции ind
AnsiString qq = Edit2 -> Text; // вспомогательная переменная
int ind = StrToInt(Edit3 -> Text);
if(qq != "") Edit1 -> Text = Edit1 -> Text.Insert(qq, ind); // метод объекта
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // вырезка из строки coun символов, начиная с позиции ind
AnsiString qq=Edit1 -> Text;
int ind = StrToInt(Edit3 -> Text), coun = StrToInt(Edit4->Text) ;
if(qq != "") Edit1 -> Text = Edit1 -> Text.SubString(ind, coun); // метод объекта
}
10
Лабораторная работа №3. События от таймера
Компонент: Timer
Характерное свойство компонента Timer:
Interval – интервал времени в миллисекундах между событиями OnTimer,
если Interval == 0, то событие OnTimer не отслеживается.
Характерное событие компонента Timer:
OnTimer– наступает каждые Interval миллисекунд.
Постановка задачи. Два участка экрана обмениваются числами 0 и 1.
Требуется интерактивно изменять скорость обмена.
Состав проекта:
Задание свойств компонентов
Form1 -> Caption: События от таймера
Label1 -> Caption: “1”
Label2 -> Caption: “2”
Panel1 -> Caption: “”
Panel2 -> Caption: “Скорость”
Label1 -> Alignment: taCenter
Label1 -> Autosize: false
Label2 -> Alignment: taCenter
Label2 -> Autosize: false
Обработчики событий
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // "Старт"
//Установка начального значения свойства Interval
Timer1->Interval=500;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // "Стоп"
Timer1->Interval=0;
}
11
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{ // обработка события от таймера
Label1->Caption =
IntToStr((StrToInt(Label1->Caption)+1)%2);
Label2->Caption =
IntToStr((StrToInt(Label2->Caption)+1)%2);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // "Быстрее" - уменьшаем значение свойства Interval
Timer1->Interval /= 2;
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{ // "Медленнее" - увеличиваем значение свойства Interval
Timer1->Interval *= 2;
}
12
Лабораторная работа №4. Массивы
Компоненты: ListBox – одномерный массив (список),
StringGrid – двухмерный массив (таблица),
типы элементов этих массивов AnsiString.
Характерные свойства компонента ListBox
Items -> Count – количество строк (элементов) в списке, нумерация начинается
с 0.
Items -> Strings[номер] – элемент списка с указанным номером.
Методы компонента ListBox
Items -> Clear() – удаление из списка элементов (очистка списка).
Items -> Add(AnsiString Str) – добавление в конец списка строки Str.
Items -> LoadFromFile(AnsiString имя_файла) – заполнение списка строками из
файла с указанным именем.
Items -> SaveToFile(AnsiString имя_файла) – запись элементов списка в файл с
указанным именем.
Примечание. Обращение к методам LoadFromFile и SaveToFile возможно лишь
при наличии в проекте компонентов OpenDialog и SaveDialog соответственно.
Постановка задачи. Вычислить среднее значение элементов массива целых
чисел.
Состав проекта:
Обработчики событий
void __fastcall TForm1::Button1Click(TObject *Sender)
{// вносим элемент в список
ListBox1->Items->Add(Edit1->Text);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{// чистим список
ListBox1->Items->Clear();
}
13
void __fastcall TForm1::Button2Click(TObject *Sender)
{// считаем среднее значение элементов списка
Label1->Caption = "";
float s=0;
for(int i=0; i<ListBox1->Items->Count; i++)
s += StrToFloat(ListBox1->Items->Strings[i])/ListBox1->Items->Count;
Label1 -> Caption = FloatToStr(s);
}
Характерные свойства компонента StringGrid:
FixedCols – количество непрокручиваемых столбцов таблицы.
FixedRows – количество непрокручиваемых строк таблицы.
FixedColor – цвет непрокручиваемых ячеек таблицы.
RowCount – количество строк.
ColCount – количество столбцов.
Cells[номер_столбцаl][номер_строки] – элемент (типа AnsiString) двумерного
массива, нумерация элементов начинается с 0.
ScrollBars – наличие полос прокрутки – ssNone – нет полос, ssHorizontal –
горизонтальная полоса, ssVertical – вертикальная, ssBoth – обе полосы.
Характерные события компонента StringGrid:
OnSelectCell – наступает при щелчке по ячейке таблицы, возвращаются
номера столбца и строки.
Постановка задачи. Вычислить среднее значение элементов матрицы; размеры
матрицы и её элементы задаются интерактивно.
Состав проекта:
Обработчики событий:
void __fastcall TForm1::FormCreate(TObject *Sender)
{// начало работы приложения
// задаем свойства компонента StringGrid1
StringGrid1 -> FixedRows = 0; // количество непрокручиваемых строк
StringGrid1 -> FixedCols = 0; // количество непрокручиваемых столбцов
StringGrid1 -> RowCount = StrToInt(Edit1 -> Text); // количество строк
StringGrid1 -> ColCount = StrToInt(Edit2 -> Text); // количество столбцов
}
14
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{ // событие: выделена ячейка таблицы StringGrid1
// помещаем в неё значение из окна Edit3
StringGrid1->Cells[ACol][ARow] = Edit3->Text;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // щелчок по кнопке Button1 "Среднее ="
// считаем среднее значение элементов таблицы StringGrid1
float average = 0;
for(int j= 0; j < StringGrid1 -> ColCount; j++)
for(int i=0; i< StringGrid1 -> RowCount; i++)
average += StrToFloat(StringGrid1 -> Cells[j][i]);
average /= StrToInt(StringGrid1 -> ColCount)*StrToInt(StringGrid1
RowCount);
// выводим полученное среднее на метку Label1
Label1->Caption = FloatToStr(average);
}
void __fastcall TForm1::StringGrid1DblClick(TObject *Sender)
{ // двойной щелчок по компоненту StringGrid1
// задаем новые количества строк и столбцов
StringGrid1->RowCount = StrToInt(Edit1->Text);
StringGrid1->ColCount = StrToInt(Edit2->Text);
}
->
15
Лабораторная работа №5. Построение графиков и
диаграмм
Компонент: Chart
В каждом компоненте Chart для построения каждой диаграммы или графика
отводится своя, так называемая, серия (Series).
В одном компоненте Chart можно строить несколько графиков без ущерба
наглядности, а диаграмма красивой получается только одна.
Вставка серии (Series) в компонент Chart:
 двойной щелчок по компоненту Chart на форме,
 выбрать Add на закладке Chart – Series.
Выбор вида серии:
 выбрать Change на закладке Chart – Series,
 выбрать вид серии из предлагаемого набора: Line – график, Bar –
столбиковая диаграмма, Pie – круговая диаграмма и т.д. Посредством
установки флажка “3D” можно выбрать объёмные виды серий.
Форматирование серии в окне инспектора объектов:
 AllowPanning - возможность прокрутки графика,
 AllowZoom - возможность вырезания части графика и ее увеличения,
 Title
- заголовок,
 Foot
- подпись под графиком/диаграммой,
 Frame
- тип рамки,
 Legend
- легенда = список обозначений,
 BottomAxis - характеристики нижней оси,
 LeftAxis
- характеристики левой оси,
 RightAxis
- характеристики правой оси
и некоторые другие.
Форматировать серии можно и на закладках Chart и Series окна Editing Chart.
Построение точки на графике:
Series1 -> AddXY(аргумент, значение_функции, надпись, цвет)
Внесение значения в диаграмму:
Series1 -> Add(значение, надпись, цвет)
Очистка серии: Series1 – Clear();
Построение графиков
Постановка задачи. В одной системе координат построить графики двух
функций:
y = sin(kx + m) и y = sin(k2x + m); значения коэффициентов m и k, а также
границы изменения x вводятся интерактивно.
16
Состав проекта:
Обработчики событий
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // Строим график в экземпляре Series1
Series1 -> Clear(); // очищаем экземпляр
double k = StrToFloat(Edit1 -> Text),
// значение параметра k берём из
Edit1
m = StrToFloat(Edit2 -> Text);
// значение параметра m берём из Edit2
for(float x = StrToFloat(Edit3 -> Text); x <= StrToFloat(Edit4 -> Text); x += 0.01)
Series1 -> AddXY(x, sin(k*x+m), "", clRed); // добавляем в экземпляр точку
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // строим график в экземпляре Series2
Series2 -> Clear();
double k = StrToFloat(Edit1 -> Text),
m = StrToFloat(Edit2 -> Text);
for(float x = StrToFloat(Edit3 -> Text); x <= StrToFloat(Edit4 -> Text); x += 0.01)
Series2 -> AddXY(x, sin(k*x*x+m), "", clGreen);
}
Построение диаграмм
Постановка задачи. Целые числа вводятся интерактивно, построить
столбиковую диаграмму количества введённых чисел, которые не
превосходят 10, не превосходят 20 и больше 20.
17
Состав проекта:
Обработчики событий.
void __fastcall TForm1::Button2Click(TObject *Sender)
{// чистим список введённых чисел
ListBox1->Clear();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // добавляем в список элемент
ListBox1->Items->Add(Edit1->Text);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{// строим диаграмму
int Col10 = 0, Col20 = 0, ColOther = 0; // начальные количества
Series1->Clear(); // чистим диаграмму
for(int i = 0; i < ListBox1->Items->Count; i++) // считаем количества
{ int Y = StrToInt(ListBox1->Items->Strings[i]);
if(Y<=10){ Col10 += 1; goto next; }
if(Y <= 20) Col20 += 1;
else ColOther += 1;
next:
}
// вносим значения в диаграмму
Series1->Add(Col10, "<= 10", clRed);
Series1->Add(Col20, "<= 20", clGreen);
Series1->Add(ColOther, ">20", clBlue);
}
18
Лабораторная работа №6. Диалоговые окна
Свойство компонентов Hint – всплывающая подсказка.
Функции: MessageBox, InputBox
Компоненты: BitBtn, Memo, OpenDialog, SaveDialog, FontDialog
Если задать свойство Hint компонента, например, Hint = “Слово”, и установить
свойство ShowHint = True, то при задержании курсора над этим компонентом
появится всплывающая подсказка “Слово”.
Функция MessageBox
int MessageBox(char * Text, char * Caption, int Flags);
выводит на экран модальное окно с текстом Text, надписью окна Caption и
кнопками Flags.
Значения параметра Flags задают кнопки окна:
MB_ABORTRETRYIGNORE Abort, Retry и Ignore.
MB_OK OK.
MB_OKCANCEL
OK и Cancel.
MB_RETRYCANCEL
Retry и Cancel.
MB_YESNO Yes и No.
MB_YESNOCANCEL
Yes, No и Cancel.
Функция MessageBox возвращает 0, если недостаточно памяти для создания
окна, в противном случае она возвращает следующие значения:
Значение
IDOK
IDCANCEL
IDABORT
IDRETRY
IDIGNORE
IDYES
IDNO
Окно было закрыто щелчком по
кнопке:
OK
CANCEL
ABORT
RETRY
IGNORE
YES
NO
Пример вызова функции:
Application -> MessageBox("Текст", "Заголовок", MB_OKCANCEL);
Функция InputBox:
AnsiString InputBox(AnsiString надпись, AnsiString сообщение,
AnsiString значение);
выводит окно с надписью, сообщением и значением по умолчанию.
Функция InputBox возвращает набранную пользователем строку.
Пример вызова функции:
AnsiString InputString = InputBox("Input Box", "Prompt", "Default string");
19
Компонент BitBtn
Характерное свойство компонента BitBtn - изображение на кнопке, которое
представляет собой файл с расширением bmp. Для того, чтобы поместить
изображение на кнопку, сначала открываем окно Picture Editor, выбрав
свойство Glyph, затем загружаем файл *.bmp.
Большой выбор рисунков для кнопок представлен в папке
C: \ Program Files \ Common Files \ Borland Shared \ Images \ Buttons.
Компонент Memo
Свойство Lines компонента Memo во многом повторяет свойство Items
компонента ListBox.
Свойство Font компонента Memo позволяет работать со шрифтом, в частности,
метод Assign:
Memo1 -> Font -> Assign(FontDialog1 -> Font)
меняет параметры шрифта в окне Memo посредством диалогового окна
FontDialog.
Компоненты OpenDialog, SaveDialog и FontDialog
Эти компоненты, невидимые во время работы приложения, создают окна для
диалогового выбора полного имени файла для чтения и записи.
Методы OpenDialog1->Execute() и SaveDialog1->Execute() возвращают true,
если выбор имени файла был успешен, и false – в случае неудачи.
Полное имя выбранного файла возвращается в свойствах OpenDialog1>FileName и SaveDialog1->FileName.
Метод FontDialog1->Font возвращает параметры выбранного посредством
диалогового окна шрифта.
Постановка
задачи.
Создать
простейший
текстовый
редактор,
обеспечивающий возможности набора и исправления текста, сохранение
текста в файле и считывание текста из файла.
Состав проекта:
20
Обработчики событий
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{ // читаем файл
if(!OpenDialog1->Execute())
Application->MessageBox("Файл не выбран", "", MB_OK);
else
{AnsiString path = OpenDialog1->FileName;
Memo1->Lines->LoadFromFile(path);
}
}
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{ // пишем в файл
if(!OpenDialog1->Execute())
Application->MessageBox("Файл не выбран", "", MB_OK);
else
{AnsiString path = OpenDialog1->FileName;
Memo1->Lines->SaveToFile(path);
}
}
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{ // выбор шрифта
if(FontDialog1->Execute())
Memo1->Font->Assign(FontDialog1->Font);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{// закрываем приложение
Application->Terminate();
}
21
Лабораторная
работа
случайных процессов
№7.
Моделирование
Используемые компоненты: StringGrid, Chart, Timer.
Постановка задачи. (Случайное блуждание точки с отражающими экранами).
Частица движется вдоль оси OX внутри отрезка [a; b] под действием
случайных сил. В начальный момент времени она находится в точке x0. В
моменты времени t = 1, 2, 3,… она перемещается на величину x влево с
вероятностью p, либо вправо с вероятностью 1- p. Если координата частицы
должна быть меньше a (больше b), то она становится равной a (равной b).
Требуется:
1. отразить на экране процесс блуждания точки;
2. построить графики количеств нахождений точки в левой и в правой
половинах отрезка в зависимости от времени.
Выбор компонентов. В качестве отрезка выберем компонент StringGrid с
одной строкой и двадцатью столбцами, точка будет изображаться символом
”#”, для построения графиков выберем компонент Chart.
Состав проекта:
Обработчики событий
// Глобальные переменные, используемые несколькими функциями
float ProbLeft = 0.5; // вероятность смещения точки влево
int X,
// координата точки на отрезке
XСoord = 0,
// абсцисса точки на графике (Chart -> Series)
Middle; // середина отрезка
int NumberLeft = 1, // количество посещений точкой левой половины
отрезка
NumberRight = 0;
// количество посещений точкой правой половины
отрезка
AnsiString app = "0,5", ss = "Случайное блуждание p = ";// вывод сообщений в
Form->Caption
22
void __fastcall TForm1::FormCreate(TObject *Sender)
{// подготовка к работе приложения
randomize();
// инициализация генератора случайных чисел
ProbLeft = 0.5;
// вероятность смещения влево по умолчанию
Form1->Caption = ss + app; // вывод значения вероятности
StringGrid1->Cells[X][0] = "#";
// начальное положение точки
NumberLeft = 1, NumberRight = 0; // начальные количества посещений точкой
половин
Middle = (int) StringGrid1->ColCount; // середина отрезка
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{// старт процессу блуждания
Timer1->Interval = 100;
NumberLeft = 1; NumberRight = 0;
StringGrid1->Cells[X][0] = "";
X =Middle;
StringGrid1->Cells[X][0] = "#";
Series1->Clear();
Series2->Clear();
XCoord=0;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{// события от таймера
int Sum;
StringGrid1->Cells[X][0] = "";
// стираем точку
float rr= (float)(rand() % 100)/100; // случайное число из отрезка [0; 1]
if( rr<= ProbLeft)
// вероятность события равна значению ProbLeft
{if(X > 0)--X; else X=1; ++ NumberLeft;}
// смещаем точку влево
else
// вероятность события равна 1 - ProbLeft
{if(X<StringGrid1 -> ColCount-1) ++X; // смещаем точку вправо
else X = StringGrid1 -> ColCount-1;
++ NumberRight;
}
StringGrid1 -> Cells[X][0] = "#";
// выводим точку
++ XCoord;
// увеличиваем абсциссу точки на графике
// готовимся считать процент посещений половин
Sum = NumberLeft + NumberRight;
// строим точку на графике
Series1 -> AddXY(XCoord, (float) NumberLeft/Sum*100, "", clRed);
Series2->AddXY(XCoord, (float) NumberRight/Sum*100, "", clGreen);
}
23
void __fastcall TForm1::Button2Click(TObject *Sender)
{// останов процесса блуждания
Timer1->Interval = 0;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // новая вероятность смещения влево
AnsiString
PrLeft = InputBox("Вероятность смещения влево", "",
FloatToStr(ProbLeft));
ProbLeft = StrToFloat(PrLeft);
// выводим новое значение вероятности
app = PrLeft; Form1->Caption = ss + app;
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{// продолжение процесса блуждания
Timer1->Interval = 100;
}
24
Лабораторная работа №8. Создание меню.
Компонент MainMenu, свойство PopUpMenu
Компонент MainMenu предназначен для создания меню в приложении.
После помещения компонента на форме, дважды щелкаем по нему:
В первой строке располагаются пункты меню, а под ними – соответствующие
им подпункты, изменяем им свойство Caption.
Примечания.
1. Знак амперсанта "&" перед буквой в свойстве Caption создает "горячую
клавишу", то есть вызов этого пункта (подпункта) можно осуществить и
комбинацией Alt + буква.
2. Горизонтальная черта появится, если свойство Caption подпункта
установить в "-".
3. Для появления прямоугольника, соответствующего подпункту справа, а не
внизу пункта, следует нажать Ctrl + 
После объявления пункты и подпункты меню становятся компонентами со
своими свойствами и событиями (см. окно инспектора объектов, в котором
они представлены своими именами N1, N2 и т.д.), в частности, все они имеют
событие OnClick, обработка которых осуществляет реакцию приложения на
выбор пользователем того или иного пункта меню.
Постановка задачи. Создать приложение с меню.
Состав проекта:
25
Обработчики событий
Примечание. Имена событий ExitClick, OpenClick, FileClick и SomeThingClick
есть результат смены свойства Name соответствующих пунктов меню в окне
инспектора объектов.
void __fastcall TForm1::ExitClick(TObject *Sender)
{// пользователь выбрал пункт меню "Файл - Выход"
// операторы - реакция приложения на выбор пользователя
Application->Terminate();
}
void __fastcall TForm1::OpenClick(TObject *Sender)
{ // пользователь выбрал пункт подменю 1-го уровня "Файл - Открыть"
// операторы - реакция на выбор, например,
Form1 -> Caption ="Файл - Открыть";
}
void __fastcall TForm1::FileClick(TObject *Sender)
{ // пользователь выбрал пункт меню "Файл"
// операторы - реакция на выбор, например,
Form1 -> Caption ="Файл";
}
void __fastcall TForm1::SomeThingClick(TObject *Sender)
{// пользователь выбрал пункт подменю 2-го уровня "Файл - Открыть - Чтонибудь"
// операторы - реакция на выбор, например,
Form1 -> Caption ="Файл - Открыть - Что-нибудь";
}
void __fastcall TForm1::N6Click(TObject *Sender)
{
Application->MessageBox("Поднимите указательный перст и как ...",
"Тайная техника щелчка:", MB_OK);
}
Свойство PopUpMenu
Большинство компонентов C++ Builder имеют свойство PopUpMenu для
создания контекстного меню, которое появляется в результате щелчка правой
клавишей мыши по компоненту в открытом приложении.
26
Для задания свойства PopUpMenu можно поступить следующим образом:
1. вставляем компонент PopUpMenu в форму,
2. задаём пункты и подпункты контекстного меню так же, как и для
MainMenu,
3. выделяем компонент, для которого создаётся контекстное меню, и в его
свойстве PopUpMenu выбираем из списка имя компонента PopUpMenu.
Примечания.
1. PopUpMenu является и компонентом и свойством.
2. Свойства PopUpMenu разных компонентов могут ссылаться на один и тот
же компонент PopUpMenu.
Результат задания свойства PopUpMenu для компонента Button:
27
Лабораторная работа №9. Рисование
Компоненты: PaintBox, RadioGroup
Компонент RadioGroup даёт возможность ”нажатия” только одной кнопки из
нескольких возможных.
Характерные свойства компонента RadioGroup:
Items – на этапе проектирования позволяет задавать названия кнопок и их
количество (щелчок по … открывает для этого редактор String List Editor);
ItemIndex – номер нажатой кнопки, нумерация начинается с 0,
по умолчанию ItemIndex = -1, то есть ни одна кнопка из группы не нажата.
Методы и свойства компонента PaintBox позволяют рисовать в специальном
окне.
Характерные свойства компонента PaintBox:
PaintBox1 -> Width – ширина холста (окна для рисования).
PaintBox1 -> Height – высота холста.
PaintBox1 -> Canvas -> Pen – задаёт параметры линии, например, красный цвет
линии задаётся операцией:
PaintBox1 -> Canvas -> Pen ->Color = clRed;
PaintBox1 -> Canvas -> Brush – задаёт параметры закраски фигуры, например,
красный цвет закраски задаётся операцией:
PaintBox1 -> Canvas -> Brush -> Color = clred;
Фигуры на холсте изображаются методами свойства PaintBox1 -> Canvas,
например,
PaintBox1 -> Canvas -> MoveTo(int x, int y); устанавливает начальную точку
линии,
PaintBox1 -> Canvas -> LineTo(int x1, int y1); рисует отрезок от установленной
точки до точки (x1, y1), причём параметры отрезка заданы в Canvas -> Pen.
PaintBox1 -> Canvas -> Rectangle(int x1, int y1, int x2, int y2); рисует
прямоугольник, с указанными координатами концов диагонали.
PaintBox1 -> Canvas -> FillRect(Rect(int x1, int y1, int x2, int y2)); рисует
закрашенный прямоугольник с параметрами закраски, заданными в Canvas ->
Brush.
Постановка задачи. Создать простейший графический редактор для рисования
разноцветных отрезков прямых, координаты концов которых и цвета задаются
интерактивно.
28
Состав проекта:
Обработчики событий
void __fastcall TForm1::FormCreate(TObject *Sender)
{// начальные установки
// новая надпись формы – размеры холста
Form1 -> Caption = "Холст: " + IntToStr(PaintBox1->Width) + " * " +
IntToStr(PaintBox1 -> Height);
// координаты концов отрезка по умолчанию
Edit1 -> Text = "0";
Edit2 -> Text = "0";
Edit3 -> Text = IntToStr(PaintBox1->Width);
Edit4 -> Text = IntToStr(PaintBox1->Height);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{// рисовать отрезок
switch(RadioGroup1 -> ItemIndex) // выбор цвета линии
{case 0: PaintBox1 -> Canvas -> Pen -> Color = clBlack; break;
case 1: PaintBox1 -> Canvas -> Pen -> Color = clRed; break;
case 2: PaintBox1 -> Canvas -> Pen -> Color = clGreen;
}
// берём координаты концов отрезка
int x1 = StrToInt(Edit1 -> Text),
y1 = StrToInt(Edit2 -> Text),
x2 = StrToInt(Edit3 -> Text),
y2 = StrToInt(Edit4 -> Text);
// устанавливаем начальную точку отрезка
PaintBox1 -> Canvas -> MoveTo(x1, y1);
// рисуем отрезок до конечной точки
PaintBox1 -> Canvas -> LineTo(x2, y2);
}
29
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // стираем изображение
// заливаем весь холст белым цветом:
// 1) устанавливаем цвет заливки
PaintBox1 -> Canvas -> Brush -> Color = clWhite;
// 2) рисуем закрашенный прямоугольник, цвет заливки в Brush->Color
PaintBox1 -> Canvas ->
FillRect(Rect(0, 0, PaintBox1 -> Width, PaintBox1->Height));
}
Задания к лабораторной работе
1. Дана следующая иерархия объектов: родительский объект “точка” с
прямым потомком “вектор”, который имеет потомком “комплексное число”.
Поля объектов: “точка” – две вещественные координаты, потомки, наследуя эти
поля, других полей не имеют.
Создайте приложение, графически иллюстрирующее методы этих объектов:
“точка” – нарисовать/стереть точку;
“вектор” – нарисовать вектор, операции умножения вектора на число и
сложение векторов;
“комплексное число” – изобразить комплексное число, операции: сложение,
вычитание, умножение и деление.
2. Блуждание с поглощающими экранами. Частица движется вдоль оси OX
внутри отрезка [a; b] под действием случайных сил. В начальный момент
времени она находится в точке x0. В моменты времени t = 1, 2, 3,… она
перемещается на величину x влево с вероятностью p, либо вправо с
вероятностью 1- p. Если координата частицы окажется меньше a, либо больше
b, то процесс завершается.
Требуется:
 отразить на экране процесс блуждания точки;
 построить графики количеств нахождений точки в левой и в правой
половинах отрезка в зависимости от времени.
3. Блуждание точки с поглощающими экранами внутри прямоугольника.
Точка движется внутри прямоугольника [a; b]  [c; d] под действием
случайных сил. В начальный момент времени она находится в середине
прямоугольника. В моменты времени t = 1, 2, 3,… точка перемещается на
величину x влево с вероятностью p1, либо вправо с вероятностью p2, либо
вверх с вероятностью p3, либо вниз с вероятностью 1 – p1 – p2 – p3. Если
30
абсцисса точки выходит за пределы отрезка [a; b], либо ордината выходит за
пределы отрезка [c; d], то процесс завершается.
Требуется:
 отразить на экране процесс блуждания точки;
 построить графики количеств нахождений точки в четырёх четвертях
прямоугольника в зависимости от времени.
4. Блуждание точки с отражающими экранами
Условия задачи те же, что и в п.3, но точка
прямоугольника, например, если ордината точки
двигаться вниз, и f + x > d, то ордината точки
остаётся на месте.
внутри прямоугольника.
“отражается” от границ
равна f и ей предстоит
не меняется, то есть она
5.
Распространение вируса. Дан прямоугольник, разбитый на km ячеек. В
центральную ячейку участка помещается здоровая клетка, которая начинает
размножаться. Процесс размножения заключается в том, что в каждый момент
времени с вероятностью q в любой из четырёх соседних1 свободных ячеек
появляется копия здоровой клетки.
После того как количество клеток достигнет больше половины ячеек,
центральная клетка заражается вирусом. В любой момент времени после
заражения клетка может с вероятностью p заразить любую здоровую из
четырех соседних клеток. По прошествии шести единиц времени зараженная
клетка перестает болеть и становится невосприимчивой к вирусу. Иммунитет
действует в течение последующих четырех единиц времени, после чего клетка
становится обычной (здоровой) клеткой. Заразившись в четвёртый раз, клетка
погибает, то есть освобождает ячейку.
Создайте приложение,
распространение вируса.
моделирующее
размножение
клеток
и
В основу создания приложения положить объект “клетка” с наследником
“вирус”. Основным свойством объекта-родителя “клетка” является
размножение, а размножение объекта-наследника “вирус” заключается в том,
что копия вируса помещается только в ту соседнюю ячейку, которая занята
здоровой клеткой.
Приложение должно в виде диаграммы выводить количество здоровых и
больных клеток в каждый момент времени.
6.
Биосистема “кролики и волки”. Остров в kk клеток заселен кроликами и
волками. Кролики и волки в каждый момент времени с вероятностью 1/9
передвигаются в одну из восьми соседних клеток (за исключением участков,
ограниченных береговой линией) или просто сидят неподвижно. Каждый
кролик с вероятностью 1/5 в любую из девяти свободных соседних клеток
“воспроизводит” свою копию.
1
Клетки, имеющие общую сторону, являются соседними.
31
Если волк и кролик оказываются в одной клетке, то волк съедает кролика
и получает одно очко; если волк оказывается в клетке, в которой нет кролика,
то он теряет 0,1 очка (первоначально у каждого волка на счету m > 0 очков).
Волк с нулевой суммой погибает. Волк, сумма очков которого превышает
75% от начальной суммы m, в любую свободную из 9 соседних клеток с
вероятностью 1/7 “воспроизводит” свою копию с суммой очков m. После
воспроизводства волк теряет 25% своей суммы.
Если в одной клетке оказываются кроликов меньше чем волков, то
кролика съедает более сильный2 волк, если в клетке остались еще кролики, то
их съедают остальные хищники по порядку убывания суммы очков.
Создайте приложение, моделирующее развитие данной биосистемы.
В основу приложения положите объект “кролик”, который может
передвигаться и размножаться, и его потомка “волк”, который, наследуя от
родителя возможности передвигаться и размножаться, дополнительно
получает поле ”сумма очков” и метод “съесть кролика”.
Приложение должно в виде графиков выводить количество кроликов и
волков на острове в каждый момент времени.
7.
Создайте по примеру Microsoft Access приложение, выполняющее
следующие функции системы управления реляционной базой данных:
 создание структуры таблицы данных3;
 заполнение таблицы данными;
 изменение данных в таблице;
 обмен данными между таблицей и файлом на диске;
 выполнение запросов к базе данных.
8.
Создайте по примеру Microsoft Excel приложение, которое выполняет
следующие функции табличного процессора:
 вставку в ячейки таблицы чисел и формул;
 вычисление значений формул;
 автоматический пересчет значений во всех формулах, в которых
участвуют ссылки на ячейки, значения в которых изменились;
 построение диаграммы/графика по двум строкам таблицы, из которых
верхняя считается областью определения функции, а нижняя – её
множеством значений.
Из двух волков более сильный тот, кто имеет бóльшую сумму очков, если суммы
одинаковые, то кролика съедает волк, выбранный случайным образом.
3
Структура таблицы включает в себя количество столбцов таблицы, их названия, типы
данных, хранящихся в этих столбцах, задание ключевого (ых) столбца (ов).
2
32
9.
Создайте приложение, наглядно демонстрирующее основные действия со
стеком4 и очередью5.
В основу приложения положите шаблон родительского объекта “непрозрачный
мешок”, для хранения однотипных предметов, с основными методами:
поместить предмет в мешок и извлечь из мешка случайный предмет.
Объекты "стек" и "очередь" являются наследниками объекта "непрозрачный
мешок".
Тип данных, помещаемых/извлекаемых в стек/очередь, в приложении
должен задаваться интерактивно.
10. Создайте
приложение,
моделирующее
процесс
непрерывного сигнала по времени или/и по уровню.
дискретизации
11. Детерминированный конечный автомат интерактивно задаётся своими
функциями переходов и выходов. Создайте приложение, моделирующее
работу этого автомата.
12. Создайте приложение, которое строит временные диаграммы работы
элементов ЭВМ: И-НЕ, RS-триггера, регистра сдвига, двоичного счётчика.
13. Создайте приложение, которое позволяет интерактивно задавать
грамматику языка правилами вывода, и осуществляет вместе с пользователем
доказательство того, что введённая строка является сентенцией языка.
14. Создайте приложение, сортирующее массив двумя способами.
Приложение должно демонстрировать процесс сортировки и подсчитывать
сложность алгоритма сортировки. Виды сортировок определяет разработчик
проекта.
Примечание. Под сложностью алгоритма сортировки понимается
количество действий (сравнение элементов массива, перестановка элементов
и т. п.), которые необходимо выполнить для расположения элементов массива
в нужном порядке.
Создайте приложение для графического отделения корней уравнения
f ( x )  0 , где f (x ) есть многочлен степени n; степень многочлена и его
коэффициенты задаются интерактивно.
15.
16. Создайте приложение, иллюстрирующее основные действия с бинарными
деревьями:
 построение дерева,
 добавление в дерево элемента,
 обходы дерева в ширину и в глубину.
17. Создайте приложение, иллюстрирующее работу замкнутой системы
массового обслуживания с ожиданием. Значения всех необходимых
параметров системы массового обслуживания задаются интерактивно.
Стеком называется набор однотипных элементов, организованный по принципу "первым
вошел - последним вышел".
5
Очередью называется набор однотипных элементов, организованный по принципу "первым
вошел - первым вышел".
4
33
18. Создайте графический редактор, позволяющий изображать трёхмерные
фигуры и вращать их в пространстве.
19. Создайте приложение, создающее код Фано для интерактивно заданного
алфавита и иллюстрирующее работу автомата, декодирующего код Фано.
20.
Создайте приложение, которое создаёт тест и осуществляет тестирование.
21.
Создайте приложение для экспериментов над множеством Жюлиа.
Примечание. Множеством Жюлиа называется множество точек на
плоскости, координаты и цвет которых задаются следующим алгоритмом.
ввод(p, q)
xmin  ymin  1,5; xmax  ymax  1,5; M  100
x  xmin
y  y min
x  max
; y  max
a 1
b 1
для nx  0 до a – 1 шаг 1
нц
для n y  0 до b – 1 шаг 1
нц
x0  xmin  n x  x;
y0  y min  n y  y; k  0
again:
x1  x02  y02  p;
y1  2 x0 y0 ; r  x12  y12 ; k  k  1000
если r  M
то перейти к п. 4
всё
если k  K
то k  0; перейти к п. 4
всё
если r  M и k  K
то x0  x1 ; y0  y1 ; перейти к п. again
всё
4: высветить точку n x , n y  цвета k
кц
кц
Вид
множества
Жюлиа
и
значения
соответствующих параметров приведены на
рисунке.
Эксперименты над множествами Жюлиа
заключаются в изменении значений параметров.
Download