Лабораторная
работа № 2
Программирование
линейных и разветвляющихся алгоритмов
для студентов 1 курса спец-ти ПИЭ по дисциплине
«Объектно-ориентированное программирование»
Цель
работы: приобретение практических
навыков программирования линейных и разветвляющихся алгоритмов.
Используемые программные средства: Borland Delphi.
Линейными называются алгоритмы, в которых команды выполняются в последовательном
порядке, т.е. одна за одной. Для их программирования используются операторы
присваивания. Если в программе предусматривается проверка некоторых условий,
при которых нарушается порядок выполнения команд в приложении, то такие
алгоритмы называются разветвляющимися.
Для их организации в языке Object Pascal используются
операторы условия (if) и операторы выбора (case).
Работа с
компонентами. Ввод, редактирование и отображение информации
выполняется в специальных полях или областях
формы. Для этих целей
Delphi предлагает различные компоненты.
Компоненты Edit типа TEdit (панель Standard) и MaskEdit
типа
TMaskEdit (панель Additional) представляют собой строку для обработки информации и относятся к
Однострочным редакторам. Компонент MaskEdit, в отличие от Edit,
предоставляет возможность ограничения вводимой
информации по шаблону.
Основное свойство
компонентов - Text, используемое для ввода и редактирования данных в текстовом виде (тип string).
Для отображения
информации без возможности редактирования при выполнении программы используется компонент
Label типа TLabel (панель Standard). Текст представляет
собой надпись и
чаще всего используется в качестве заголовков
для других элементов.
Основные свойства компонента Label приведены в табл. 2.1.
Таблица 2.1
Основные свойства компонента Label
Свойство |
Описание |
Alignment |
определяет способ
выравнивания текста внутри компонента |
taLeftJustify |
по левому
краю |
taCenter |
по центру |
taRightJustify |
по правому
краю |
AutoSize |
автоматическая коррекция размеров компонента в зависимости
от теста надписи |
Caption |
текст надписи |
При использовании
компонентов ввода-вывода достаточно часто требуется провести преобразование
типов. Например, для того чтобы вывести с помощью компонента Edit значение переменной
типа real, необходимо сначала получить строковое
представление переменой. Это можно сделать с помощью функции
FloatToStr(Value: real):string;
которая преобразует вещественное
значение Value в строку символов.
Компоненты Кнопки являются управляющими элементами
и используются для выдачи команд на выполнение определенных функциональных
действий. В Delphi имеются различные варианты кнопок: стандартная кнопка Button типа TButton (панель Standard), кнопка с рисунком BitBtn типа TBitBtn
(панель
Additional) и кнопка быстрого доступа SpeedButton типа TSpeedButton
(панель Additional). На
поверхности кнопки может
содержаться
надпись, поясняющая назначение кнопки (свойство Caption).
Основным для кнопок
являются событие OnClick, возникающее при нажатии на
кнопку. При этом
кнопка принимает соответствующий вид, подтверждающий действие.
Действия, выполняемые в
обработчике события OnClick, происходят сразу после отпускания кнопки.
Для организации разветвлений в Delphi используются
компоненты в виде кнопок-переключателей, состояние которых (включено-выключено)
визуально отражается во время выполнения приложения: CheckBox типа TCheckBox ,RadioButton типа TRadioButton
и RadioGroup типа TRadioGroup
. Компоненты расположены на панели Standard.Основным свойством компонентов CheckBox и RadioButton является свойство Checked типа boolean.
Компонент RadioGroup представляет собой группу кнопок, являющихся
взаимно исключающими, т.е. при выборе одного переключателя другие становятся невыбранными. Для управления
количеством и названиями переключателей используется свойство Items типа TStrings, которое позволяет получить доступ к отдельным переключателям в группе.
Отсчет строк в массиве Items начинается с нуля. Для работы со списком
заголовков кнопок в режиме проектирования приложения значения свойства Items компонента
можно изменить, используя редактор StringListEditor. Для
доступа к отдельному переключателю используется свойство ItemIndex типа integer, содержащее номер переключателя. Количество
столбцов для вывода информации определяется
свойством Columns.
2.2. Порядок
выполнения работы
Изучить свойства
компонентов, используемых для ввода-вывода информации, для организации
разветвлений и управления. Изучить операторы, используемые в Object Pascal для программирования линейных и разветвляющихся
алгоритмов, выполнить контрольные примеры и задания соответствующего варианта.
Контрольный пример 2.1
Составить программу для расчета значения
f :
Значения z и x вводятся с клавиатуры.
Решение.
1.
Открыть
новый проект Delphi: File – New Application.
2.
Установить с
помощью Object Inspector следующие
свойства компонента
Form1:
Form1.Height
= 190
Form1.Width
= 300
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 (в поле компонента Edit), x=1 (поле компонента Edit2) и нажать кнопку Счет. Результат выполнения
программы показан на рис. 2.1.
Рис.2.1.
Результат выполнения программы
для
контрольного примера 2.1.
Контрольный пример 2.2
Составить программу для расчета значения
функции f (x) :
Решение.
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.
Результат выполнения программы
для
контрольного примера
Условный оператор может применяться
для отслеживания в программе так называемых
исключительных ситуаций: например,
деление на ноль.
В нашем примере при х=-3 возникает такая ситуация. Если мы попробуем ввести значение х=-3, программа выдаст сообщение об
ошибке (рис.2.3).
Рис.2.3. Сообщение об ошибке.
Чтобы избежать такой ситуации необходимо, чтобы перед
вычислением значения функции осуществлялась проверка равенства нулю делителя в
выражении Вставим в процедуру обработчика события
TForm1.Button1Click оператор
if x=
- 3 then begin
edit2.Text:= ' На ноль
делить нельзя!';
exit;
end;
После запуска программы на
выполнение, получим
Рис. 2.4. Результат выполнения программы
ий ор
для контрольного
примера 2.2 при исключительной ситуации
Отредактируем текст
модуля таким образом, чтобы перед выполнением вычислений выполнялась проверка,
задано ли значение. Если значение не задано, то следует вывести сообщение об
этом в отдельном окне. Поместим перед оператором присваивания x:=StrToFloat (edit1.Text); строку:
if Edit1.Text <> ' ' then begin
которая проверяет значения свойств Edit1.Text. Если эти значения не пустые, то вычисляется
значение функции, в противном случае управление передается следующему фрагменту
программы, который нужно вставить перед последним оператором end:
else ShowMessage('Не
заданы значения!');
Примечание. Для
вывода текста в отдельном окне сообщения использовалась процедура ShowMessage('const
Msg: string'), которая отображает модальное
окно сообщения с кнопкой OK (рис. 2.5).
Рис.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).
Рис. 2.6. Список элементов в
окне String List Editor
бВ окне Инспектора
объектов зададим для свойства RadioGroup1.ItemIndex значение 0, чтобы сделать первую кнопку выбранной
по умолчанию. Зададим размер символов компонента RadioGroup, установив для свойства RadioGroup1.Font.Size значение 12 пунктов.
4. Для решения задачи запишем обработчик событий Button1.Click (кнопка Вычислить),
щелкнув на компоненте Button1 два раза
левой кнопкой мыши. Текст соответствующей
процедуры имеет вид:
// Обработчик события щелчка на кнопке Button1
procedure TForm1.Button1Clic (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.7. Результат выполнения программы
для
контрольного примера 2.3
Контрольные вопросы
1. Что такое оператор? Чем различаются простые и структурные операторы?
2. Опишите оператор присваивания, его назначение и порядок выполнения.
3.
Что представляет собой составной оператор? Как ограничиваются операторы, объединенные в
составной оператор?
4. Какие операторы используются для организации линейных разветвляющихся
алгоритмов и какова их структура?
5. Какие компоненты используются в Delphi для организации разветвлений?
6. Перечислите основные свойства компонентов Edit, CheckBox, Button и RadioGroup?
7. Укажите назначение кнопок в Delphi.
Вариант 1
Задание 1. Составить программу для
вычисления функции
Значения a, z и x вводятся с клавиатуры
Задание 2. Составить программу для вычисления функции
Значения a, b и x вводятся с клавиатуры
Задание 3. По дате (месяц и день рождения) определите знак зодиака.
21.03 – 20.04: Овен; |
21.04 – 20.05: Телец; |
21.05 – 21.06: Близнецы; |
22.06 – 22.07: Рак; |
23.07 – 23.08: Лев; |
24.08 – 23.09: Дева; |
24.09 – 23.10: Весы; |
24.10 – 22.11: Скорпион; |
23.11 – 21.12: Стрелец; |
22.12 – 20.01: Козерог; |
21.01 – 19.02: Водолей; |
20.02 – 20.03: Рыбы. |
Использовать оператор выбора case.
Вариант 2
Задание 1. Составить программу для
вычисления функции
Значения a, b и
x вводятся
с клавиатуры.
Задание 2. Составить программу для
вычисления функции
или выведите сообщение:
«Функция не определена в
данной точке». Значения
a, b и x вводятся с клавиатуры.
Задание 3. По номеру n (n > 0) некоторого
года определить c – номер его столетия (учесть, что, к примеру, началом XX столетия был 1901, а не 1900 год!). Использовать оператор выбора case.
Вариант 3
Задание
1. Составить программу для вычисления функции
Задание
2. Составить программу для вычисления функции
или
выведите сообщение: «Функция не определена в данной точке». Значения a,
b и x вводятся с клавиатуры.
Задание
3. Составьте программу вычисления
по заданному радиусу и значению переменной
k площади круга (если k = 1),
длины окружности (если k = 2) или объема шара (если k = 3). Использовать оператор выбора case.
Вариант
4
Задание
1. Составить программу для вычисления функции.
Значения a, b
и x вводятся с клавиатуры.
Задание
2. Составить программу для вычисления функции
или выведите сообщение: «Функция не определена в
данной точке». Значения
a, b и x вводятся с клавиатуры.
Задание 3. Написать
программу нахождения числа дней в месяце, если
даны: номер
месяца n – целое число от 1 до 12; целое число a , равное единице
для високосного года и равное нулю в
противоположном случае.
Использовать оператор выбора case.
Вариант 5
Задание 1. Составить программу для
вычисления функции
Значение переменных x
и y вводятся с клавиатуры.
Задание
2. Составить программу для вычисления функции
или выведите сообщение:
«Функция не определена в
данной точке». Значения
a, b и x вводятся
с клавиатуры.
Задание 3. Для целого числа k от 1 до 99 вывести фразу “мне k лет”, учитывая при этом, что при некоторых значениях k слово “лет” надо заменить на слово “год” или “года”. Использовать
оператор выбора case.
Вариант 6
Задание 1. Составить программу для
вычисления функции
Значения a , x и y вводятся с клавиатуры.
Задание 2. Составить программу для
вычисления функции
или выведите сообщение:
«Функция не определена в
данной точке». Значения
a, b и x вводятся с клавиатуры.
Задание 3. Для натурального числа k напечатать фразу
«мы нашли k грибов в лесу», согласовав окончание слова «гриб» с числом выбора case.
Вариант 7
Задание 1. Составить программу для расчета
значения
Значения x , y и z вводятся
с клавиатуры.
Задание 2. Составить программу для
вычисления функции
. Использовать
оператор
Задание
3. Напишите программу, которая
анализирует возраст человека и относит его к одной из четырех групп:
дошкольник, ученик, работник, пенсионер. Возраст вводится с клавиатуры.
Использовать оператор выбора case.
Вариант 8
Задание 1. Составить программу для
расчета значения w :
Значения x , y и z вводятся
с клавиатуры.
Задание 2. Составить программу для
вычисления функции
или
выведите сообщение: «Функция не определена в данной точке». Значения t и
x вводятся с клавиатуры.
Задание 3. В зависимости от стажа работы на предприятии введена
надбавка в размере:
для работающих от 5 до 10 лет – 12%;
для работающих от 10 до 15 лет – 18%;
для работающих свыше 15 лет – 24%.
Составить программу, которая по заданному стажу
работы определит размер надбавки в процентах. Использовать оператор выбора case.