ПРОГРАММИРОВАНИЕ
ЛИНЕЙНЫХ И РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ
Цель
работы: приобретение практических
навыков программирования линейных и разветвляющихся алгоритмов.
Используемые программные средства: Borland Delphi.
Линейными называются алгоритмы, в которых команды выполняются в последовательном
порядке, т.е. одна за одной. Для их программирования используются операторы
присваивания. Если в программе предусматривается проверка некоторых условий,
при которых нарушается порядок выполнения команд в приложении, то такие
алгоритмы называются разветвляющимися.
Для их организации в языке Object Pascal используются
операторы условия (if) и операторы выбора (case).
Работа с компонентами. Ввод, редактирование и отображение информации
выполняется в специальных полях или областях
формы. Для этих целей Delphi
предлагает различные компоненты.
Компоненты Edit типа TEdit
Основное свойство
компонентов – Text, используемое для ввода и редактирования данных в текстовом виде (тип string).
Для отображения
информации без возможности редактирования при выполнении программы используется компонент
Label типа TLabel
качестве заголовков для
других элементов. Основные
свойства компонента
Label приведены в табл. 2.1.
Таблица 2.1
Основные
свойства компонента Label
Свойство |
Описание |
Alignment |
определяет способ выравнивания текста внутри
компонента |
taLeftJustify |
по левому краю |
taCenter |
по центру |
taRightJustify |
по правому краю |
AutoSize |
автоматическая коррекция размеров
компонента в зависимости от теста надписи |
Caption |
текст надписи |
При использовании
компонентов ввода-вывода достаточно часто требуется провести преобразование
типов. Например, для того чтобы вывести с помощью компонента Edit значение переменной
типа real, необходимо сначала получить строковое представление
переменой. Это можно сделать с помощью функции
FloatToStr(Value: real):string;
которая преобразует вещественное
значение Value в строку символов.
Компоненты Кнопки являются управляющими элементами
и используются для выдачи команд на выполнение определенных функциональных
действий. В Delphi имеются различные варианты кнопок: стандартная кнопка Button типа TButton
содержаться надпись, поясняющая
назначение кнопки (свойство Caption).
Основным для кнопок
являются событие OnClick, возникающее при нажатии на
кнопку. При этом
кнопка принимает соответствующий вид,
подтверждающий
действие. Действия, выполняемые
в обработчике события
OnClick, происходят сразу после отпускания кнопки.
Для организации
разветвлений в Delphi используются компоненты в виде кнопок-переключателей, состояние которых
(включено-выключено) визуально отражается во время выполнения приложения: CheckBox типа TCheckBox
RadioButton типа TRadioButton
Основным свойством
компонентов CheckBox и RadioButton является свойство Checked типа boolean.
Компонент RadioGroup представляет собой группу кнопок, являющихся
взаимно исключающими, т.е. при выборе одного переключателя другие становятся невыбранными. Для управления
количеством и названиями переключателей используется свойство Items типа TStrings, которое позволяет получить доступ к отдельным переключателям в группе.
Отсчет строк в массиве Items начинается с нуля. Для работы со списком
заголовков кнопок в режиме проектирования приложения значения свойства Items компонента
можно изменить, используя редактор StringListEditor. Для
доступа к отдельному переключателю используется свойство ItemIndex типа integer, содержащее номер переключателя. Количество
столбцов для вывода информации определяется
свойством Columns.
2.2. Порядок выполнения работы
Изучить свойства
компонентов, используемых для ввода-вывода информации, для организации
разветвлений и управления. Изучить операторы, используемые в Object Pascal для программирования линейных и разветвляющихся
алгоритмов, выполнить контрольные примеры и задания соответствующего варианта.
Контрольный пример 2.1
Составить программу для расчета значения
f :
f = z +
z
z 2 + 1
- 3.7 ×10-8 + ex+ z .
Значения z и x вводятся с клавиатуры.
Решение.
1.
Открыть
новый проект Delphi: File – New Application.
2. Установить с помощью
Object Inspector следующие
свойства компонента
Form1:
Form1.Height = 224
Form1.Width = 286 Form1.BorderIcons
biMaximize = false
Form1.BorderStyle = bsSingle Form1.Position =
poScreenCenter
Form1.Caption = 'Контрольный пример
1'.
3.
Расположить
на форме три компонента Edit, три компонента Label и один компонент Button.
4.
Выделяя
каждый из компонентов, находящихся на форме, с помощью Object Inspector установить для них следующие свойства:
Label1.Caption
= 'Значение z =' Label2.Caption = 'Значение x =' Label3.Caption = 'Результат ='
Edit1.Text = ''
Edit2.Text
= '' Edit3.Text = '' Button1.Caption = 'Счет'.
5.
Для решения задачи нужно записать обработчик события Button1.Click. В окне
конструктора формы два раза щелкнуть левой кнопкой мыши на кнопке Button1. В результате в окне редактора кода появится
'текст-заготовка' для процедуры Button1Click. Операторы
процедуры записать между begin…end, а описание
переменных-идентификаторов записать в разделе описания переменных процедуры.
Полный текст процедуры для обработки события Button1.Click имеет вид:
procedure TForm1.Button1Click(Sender: TObject);
var x,z,f:real;
begin // считываются исходные данные
z:=StrToFloat(Edit1.Text); {происходит
преобразование переменных из строкового типа в
вещественный}
x:=StrToFloat(Edit2.Text);
// вычисление арифметического выражения
f:=z+z/(sqr(z)+1)-3.7e-8+exp(x+z);
Edit3.Text:=FloatToStr(f); {результат преобразуется
к переменной строкового
типа и выводится в компонент Edit3 } end;
В процедуре
использовалась встроенная в язык Object Pascal функция sqr для возведения
в квадрат значения z .
Перечень основных встроенных процедур и функций приведен в Приложении Б.
6. Запустить проект на компиляцию и выполнение.
7.
Задать значения для
z = 3
(в поле компонента Edit1),
x = 1
(в поле
компонента Edit2) и нажать
кнопку Счет. Результат выполнения
программы показан на рис. 2.1.
Рис. 2.1. Результат выполнения
программы для контрольного примера 2.1
Контрольный
пример 2.2
Составить программу для расчета значения
функции
f (x) :
1
Решение.
x + 3
f (x) = 2 × x3
lg(x) + ex
x < -2,
- 2 £ x £ 2,
x > 2.
1. Открыть новый проект Delphi: File
– New Application.
2.
Установить с
помощью Object Inspector следующие
свойства компонента
Form1:
Form1.Height = 284
Form1.Width = 276 Form1.BorderIcons
biMaximize = false
Form1.BorderStyle = bsSingle Form1.Position =
poScreenCenter
Form1.Caption = 'Контрольный пример
2'.
3. Расположить на форме два компонента Edit, два
компонента Label, один компонент Button. Установить
с помощью Object Inspector для них следующие
свойства:
Label1.Caption
= 'Значение x =' Label2.Caption = 'Результат =' Edit1.Text = ''
Edit2.Text
= '' Button1.Caption = 'Вычислить'.
4. Для решения задачи запишем обработчик событий Button1.Click (кнопка Вычислить),
щелкнув на компоненте Button1 два раза
левой кнопкой мыши. Текст соответствующей
процедуры имеет вид:
procedure TForm1.Button1Click(Sender: TObject);
var x,y:extended;
begin x:=StrToFloat(edit1.Text);
if x<-2 then y:=1/(x+3)
else
if (x>=-2) and (x<=2) then y:=2*x*sqr(x)
else y:=ln(x)/ln(10)+exp(x);
edit2.Text:=FloatToStrF(y,fffixed,9,4);
end end;
5.
Запустить проект на
компиляцию и выполнение.
6.
Результат выполнения
программы показан на рис. 2.2.
Рис. 2.2. Результат выполнения
программы для контрольного примера 2.2
Условный оператор может применяться для
отслеживания в программе так называемых
исключительных ситуаций: например,
деление на ноль.
В нашем
примере при
x = -3
возникает такая ситуация.
Если мы попробуем ввести
значение x = -3 , программа выдаст сообщение об ошибке (рис. 2.3).
Рис. 2.3. Сообщение об ошибке
Чтобы избежать такой ситуации необходимо, чтобы
перед вычислением значения функции осуществлялась проверка равенства нулю делителя в
выражении
1
x + 3
. Вставим в процедуру обработчика события
TForm1.Button1Click оператор
if
x= - 3 then begin
edit2.Text:= ' На ноль делить
нельзя!'; exit;
end;
После запуска программы на выполнение, получим
Рис. 2.4. Результат выполнения программы
ий ор
Отредактируем текст
модуля таким образом, чтобы перед выполнением вычислений выполнялась проверка,
задано ли значение. Если значение не задано, то следует вывести сообщение об
этом в отдельном окне. Поместим перед оператором присваивания x:=StrToFloat (edit1.Text); строку:
if Edit1.Text
<> ' ' then begin
которая проверяет значения свойств Edit1.Text. Если эти значения не пустые, то вычисляется
значение функции, в противном случае управление передается следующему фрагменту
программы, который нужно вставить перед последним оператором end:
else ShowMessage('Не заданы значения!');
Примечание.
Для
вывода текста в отдельном окне сообщения использовалась процедура ShowMessage('const Msg: string'), которая отображает модальное окно сообщения с кнопкой OK (рис. 2.5).
й
procedure
TForm1.Button1Click(Sender: TObject); var x,y:extended;
begin
if Edit1.Text <> ''
then begin x:=StrToFloat(edit1.Text);
if
x=-3 then begin
edit2.Text:='На
ноль делить нельзя!'; exit;
end;
if
x<-2 then y:=1/(x+3)
else
if (x>=-2) and (x<=2) then y:=2*x*sqr(x)
else y:=ln(x)/ln(10)+exp(x);
edit2.Text:=FloatToStrF(y,fffixed,9,4);
end
else ShowMessage('Не заданы значения!'); end;
Сохраним, откомпилируем и запустим приложение на выполнение.
Контрольный пример 2.3
Создать приложение,
обеспечивающее ввод двух целых чисел и выполнение над ними арифметических
операций сложения, вычитания, умножения и вещественного деления. Для выбора
операции использовать переключатели,
вывод сообщения об ошибке при вводе делителя, равного нулю, выполнить в
отдельном окне сообщений.
Решение.
1. Открыть новый проект Delphi: File
– New Application.
2.
Установить с
помощью Object Inspector следующие
свойства компонента
Form1:
Form1.Height
= 316
Form1.Width = 528 Form1.BorderIcons
biMaximize
= false Form1.BorderStyle = bsSingle Form1.Position = poScreenCenter
Form1.Caption = 'Калькулятор'.
3. Расположить на форме три компонента Edit, три
компонента Label, один компонент Button, один компонент RadioGroup. Установить
с помощью Object Inspector для них
следующие свойства:
Label1.Caption
= 'Операнд' Label2.Caption = 'Операнд' Label3.Caption = 'Вычислить' Edit1.Text
= ''
Edit2.Text = '' Edit3.Text = ''
Button1.Caption
= 'Вычислить' RadioGroup1.Caption= 'Операция'.
Так как количество
переключателей в группе и надписи около них определяются свойством Items, выберем в Инспекторе объектов компонент RadioGroup1, а на странице
свойств – свойство Items (Список
элементов). В окне String List Editor введем список элементов – символов арифметических операций: +, -, *,
/ (рис. 2.6).
В окне Инспектора
объектов зададим для свойства RadioGroup1.ItemIndex значение 0, чтобы сделать первую кнопку выбранной
по умолчанию. Зададим размер символов компонента RadioGroup, установив для свойства RadioGroup1.Font.Size значение 12 пунктов.
4. Для решения задачи запишем обработчик событий Button1.Click (кнопка Вычислить),
щелкнув на компоненте Button1 два раза
левой кнопкой мыши. Текст соответствующей
процедуры имеет вид:
// Обработчик события щелчка на кнопке Button1 procedure
TForm1.Button1Click(Sender: TObject); var
a,b:integer; // 2 операнда –
целое число
c:extended; // результат арифметических операций
begin
if (Edit1.Text <> '')
and (Edit2.Text <> '') then begin
a:=StrToInt(Edit1.Text); // если значения заданы
b:=StrToInt(Edit2.Text); {преобразование текстовой строки в целое число }
Edit3.Text:=''; {очистить от результата предыдущих
вычислений}
{выбор операции в зависимости от значения свойства
RadioGroup1.ItemIndex}
Case
RadioGroup1.ItemIndex of
0: c:=a+b; // сложение
2: c:=a*b; // умножение
3:
if b=0 then begin
ShowMessage('На ноль делить нельзя!'); exit; end
else c:=a/b; // деление
end;
// вывод результата операций Edit3.Text:=FloatToStrF(c,ffGeneral,10,4); end
else ShowMessage('Не
заданы значения!'); end;
5.
Запустить проект на
компиляцию и выполнение.
6.
й ри то зи
Рис. 2.7. Результат выполнения программы для
контрольного примера 2.3
2.3. Содержание отчета
Отчет должен содержать ответы на
контрольные вопросы, тексты программ и результат решения соответствующего варианта.
2.4. Контрольные вопросы
1. Что такое оператор? Чем различаются простые и структурные операторы?
2.
Опишите оператор
присваивания, его назначение и порядок выполнения.
3.
Что представляет собой составной оператор? Как ограничиваются
операторы, объединенные в составной оператор?
4.
Какие операторы используются для организации линейных разветвляющихся алгоритмов и какова
их структура?
5.
Какие компоненты
используются в Delphi для
организации разветвлений?
6.
Перечислите основные
свойства компонентов Edit, CheckBox, Button
и RadioGroup?
7.
Укажите назначение кнопок
в Delphi.