Лабораторная работа № 3 Табулирование функций
Цель: Научиться вводу и выводу значений целого, вещественного, логического и перечисляемого типов
Объекты: TForm, TEdit, TUpDown, TCheckBox, TRadioGroup, TStringGrid
Написать программу для вычисления таблицы значений заданных трех функций f1(a, b,c, d), f2(a, b,c, d), f3(a, b,c, d), для нескольких значений d, меняющихся от dнач до dкон.
d \ F | F1(a, b,c, d) | F2(a, b,c, d) | F3(a, b,c, d) |
< dнач > | <F1(a, b,c, dнач)> | <F2(a, b,c, dнач)> | <F3(a, b,c, dнач)> |
… | … | … | … |
< dкон > | <F1(a, b,c, dкон)> | <F2(a, b,c, dкон)> | <F3(a, b,c, dкон)> |
Аргументы функции a, b,c, d – разных типов: целый, вещественный, логический и перечисляемый.
Для ввода значений целого типа использовать объекты TLabel, TEdit и TUpDown
Для ввода значений вещественного типа использовать объекты TLabel, TEdit
Для ввода значений логического типа использовать объект TCheckBox
Для ввода значений перечисляемого типа использовать объекты TRadioGroup или TComboBox
Вывод осуществить в TStringGrid
![]()
![]()
![]()
![]()
![]()

TLabel TEdit TCheckBox TComboBox TRadioGroup
![]()

TUpDown
![]()
![]()
TStringGrid
Функции
№ | f1(a, b,c, d) Результат логического типа (true/false) | f2(a, b,c, d) Результат целого типа | f3(a, b,c, d) Результат вещественного типа |
а – цел; b – вещ; c – лог; d – пер (one, two, three, four, five, six) | |||
1 | Ø(d=three) Ú (ab>5) Ù Øc | Сумма номера значения d и квадрата a | k – номер значения d
|
2 | a≠6 Ú Ø(d=two) Ù c | Разность остатка от деления a на 3 и номера значения d | k – номер значения d
|
3 | (a – кратна 3) Ù c Ú d=four | Сумма номера значения d и частного целочисленного деления a на 10 | k – номер значения d
|
4 | d=six Ù Øc Ú a≠8 | Квадрат разности a и номера значения d | k – номер значения d
|
5 | (a – четная) Ù d=four Ú Øc | Целая часть (без округления) корня квадратного из суммы 5 и номера значения d | k – номер значения d
|
6 | c Ù (a – кратна 5) Ú Ø(d=one) | Разность целой части b и номера значения d | k – номер значения d
|
7 | ab≠0 Ù Ø(d=one) Ú Øc | Сумма квадратов a и номера значения d | k – номер значения d
|
8 | d=four Ú c Ù Ø(b>2) Ù a≤0 | Разность квадратов a и номера значения d | k – номер значения d
|
9 | Øc Ù ab≤0 Ú Ø(d=five) | Сумма остатка от деления a на 5 и номера значения d | k – номер значения d
|
10 | d= two Ú (a – нечетная) Ù Øc | Разность целой части квадрата b и номера значения d | k – номер значения d
|
а – лог; b – цел; c – вещ; d – пер (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) | |||
11 | b≠5 Ú Ø(d= Wednesday) Ù a | Сумма номера значения d и квадрата b | k – номер значения d
|
12 | a Ù (b–кратна 7) Ú d= Tuesday | Разность остатка от деления b на 3 и номера значения d | k – номер значения d
|
13 | d= Saturday Ù Øa Ú b≠8 Ù c≤0 | Сумма номера значения d и частного целочисленного деления b на 10 | k – номер значения d
|
14 | Øa Ú (b – четная) Ù d= Friday | Квадрат разности b и номера значения d | k – номер значения d
|
15 | aÙ(b–кратна 5)Ú Ø(d= Sunday) | Целая часть (без округления) корня кубического из суммы 2 и номера значения d | k – номер значения d
|
16 | Ø(d=Wednesday) Ù bc≠0 Ú Øa | Разность целой части c и номера значения d | k – номер значения d
|
17 | d= Thursday Ù a Ù Ø(bc<100) | Сумма квадратов b и номера значения d | k – номер значения d
|
18 | Øa Ù cb≤0 Ú Ø(d=Saturday) | Разность квадратов b и номера значения d | k – номер значения d
|
19 | d=Friday Ú (b–нечетная) ÙØa | Сумма остатка от деления b на 5 и номера значения d | k – номер значения d
|
20 | Ø(d=Monday)Ú Øa Ù (|bc|>10) | Разность целой части квадрата c и номера значения d | k – номер значения d
|
а – вещ; b – лог; c – пер (March, April, May, June, July, August); d – цел, |d|≤20 | |||
21 | c= April Ù b Ù Ø(ad<100) | Сумма номера значения c и квадрата d | k – номер значения c
|
22 | Øb Ù da≤0 Ú Ø(c= August) | Разность остатка от деления d на 3 и номера значения c | k – номер значения c
|
23 | c= May Ú (d–нечетная) ÙØb | Сумма номера значения c и частного целочисленного деления d на 10 | k – номер значения c
|
24 | Ø(c= March)Ú Øb Ù (|ad|>10) | Квадрат разности d и номера значения c | k – номер значения c
|
25 | d≠5 Ù (Ø(c = August) Ú b) | Разность остатка от деления d на 7 и номера значения c | k – номер значения c
|
26 | b Ù (d–кратна 5) Ú c= April | Разность номера значения c и частного целочисленного деления d на 5 | k – номер значения c
|
27 | c=March Ù Øb Ú d≠8 Ù a≤0 | Сумма квадратов d и номера значения c | k – номер значения c
|
28 | Øb Ú (d – четная) Ù c= June | Разность квадратов d и номера значения c | k – номер значения c
|
29 | Ø(c= March) Ù ad≠0 Ú Øb | Сумма остатка от деления d на 5 и номера значения c | k – номер значения c
|
30 | (d–кратна 5) Ù b ÚØ(c= July) | Разность номера значения c и остатка от целочисленного деления d на 5 | k – номер значения c
|
;
; ![]()
Пример с описанием порядка решения задачи
1. Условие задачи (Табуляция функций)
Написать программу для вычисления таблицы значений заданных трех функций f1(a, b,c, d), f2(a, b,c, d), f3(a, b,c, d), для нескольких значений d, меняющихся от dнач до dкон.
d \ F | F1(a, b,c, d) | F2(a, b,c, d) | F3(a, b,c, d) |
< dнач > | <F1(a, b,c, dнач)> | <F2(a, b,c, dнач)> | <F3(a, b,c, dнач)> |
… | |||
< dкон > | <F1(a, b,c, dкон)> | <F2(a, b,c, dкон)> | <F3(a, b,c, dкон)> |
Аргументы функции a, b,c, d – разных типов: целый, вещественный, логический и перечисляемый.
Для ввода значений целого типа использовать объекты TLabel, TEdit и TUpDown
Для ввода значений вещественного типа использовать объекты TLabel, TEdit
Для ввода значений логического типа использовать объект TCheckBox
Для ввода значений перечисляемого типа использовать объекты TRadioGroup или TComboBox
Вывод осуществить в TStringGrid
Вариант 0.
№ | f1(a, b,c, d) Результат логического типа (true/false) | f2(a, b,c, d) Результат целого типа | f3(a, b,c, d) Результат вещественного типа |
а – цел; b – вещ; c – лог; d – пер (day0,day1,day2,day3) | |||
0 | Ø(d=day2) Ù (a–четное) | Сумма номера значения d и целой части корня кубического из (1+|b|) | k – номер значения d
|
2.Уточненное условие задачи
Для заданных а – целого типа; b – вещественного; c – логического; d1, d2 – перечисляемого со значениями (day0,day1,day2,day3), d1≤d2. Вычислить и вывести в виде таблицы значения трех функций:
f1(a, b,c, d)= Not (d=day2) And Not Odd(a), или можно записать как Not (d=day2) And (a Mod 2=0)
f2(a, b,c, d)=Ord(d)+Trunc(Exp(1/3*Ln(1+Abs(b))))
f3(a, b,c, d)= Exp(3/4*Ln(Abs(Ord(d)-a*b)))
3.Примеры
Пример 1
a=1; b=3.5; c=true;
d1=day2; d2=day0
d1>d2, Недопустимый интервал для d!
Пример 2
a=2; b=3.0; c=true;
d1=day0; d2=day2
d1<d2, d по-очереди принимает значения day0,day1,day2:
d \ F | F1(a, b,c, d) | F2(a, b,c, d) | F3(a, b,c, d) |
day0 | Ø(day0=day2) Ù (2–четное)= Ø false Ù true = trueÙtrue = true |
|
|
day1 | Ø(day1=day2) Ù (2–четное)= Ø false Ù true = trueÙtrue = true |
|
|
day2 | Ø(day2=day2) Ù (2–четное)= Ø true Ù true = falseÙtrue = false |
|
|
d \ F | F1(a, b,c, d) | F2(a, b,c, d) | F3(a, b,c, d) |
day0 | true | 1 | 3,8337 |
day1 | true | 2 | 3,3437 |
day2 | false | 3 | 2,8284 |
3.Таблица данных
Класс | Имя | Описание (смысл) | Тип | Структура | Формат |
Исходные | a | Целочисленный аргумент, |a|≤20 | цел | прост | |
b | Вещественный аргумент, |b|<20, точность ±0,1 | вещ | прост | -XX. X :5:1 | |
c | Логический аргумент, {true, false} | лог | прост | ||
d1 | Начальное и конечное значения аргумента перечисляемого типа с значениями (day0,day1,day2,day3), day0≤d1≤d2≤ day3 | пер | прост | ||
d2 | пер | прост | |||
Выходные | Res1 | Значение функции f1 | лог | прост | |
Res2 | Значение функции f2 | цел | прост | ||
Res2 | Значение функции f3 | вещ | прост | XXX. XXXX :8:4 | |
Промежуточные | d | Аргумент перечисляемого типа с значениями (day0,day1,day2,day3) | пер | прост |
4,5.Входная/Выходная форма
Создадим форму, учитывая, что
Для ввода значений целого типа использовать объекты TLabel, TEdit и TUpDown
Для ввода значений вещественного типа использовать объекты TLabel, TEdit
Для ввода значений логического типа использовать объект TCheckBox
Для ввода значений перечисляемого типа использовать объекты TRadioGroup или TComboBox
Вывод осуществить в TStringGrid
Создайте форму
|
Зададим значения некоторым свойствам этих объектов
Объект | Свойство | Значение |
Form1 | Caption (Заголовок) | Табуляция трех функций |
Label1 | Caption | Введите значения |
Label2 | Caption | A |
Label3 | Caption | B |
CheckBox1 | Caption | C, поставьте V |
Checked (начальное значение) | True | |
Edit1 | ReadOnly (только для чтения) | True |
UpDown1 | Min (Мин. значение A) | -20 |
Max (Макс. значение A) | 20 | |
Increment (шаг изменения) | 1 | |
Position (Начальное значение) | 2 | |
Associate (Ассоциировать с объектом) | Edit1 | |
Edit2 | Text (Начальное значение) | 3 //3,0 Запятая или точка – зависит от настроек конкретной Windows // хранится в DecimalSeparator: Char; |
Button1 | Caption | Решить |
Button2 | Caption | Закрыть |
StringGrid1 | ColCount (кол-во столбцов) | 4 |
+Option |- ColSizing (Разрешить изменять ширину столбцов) | True | |
RadioGroup1 | Caption | D1 |
Items … | day0 day1 day2 day3 | |
ItemIndex (Начальное значение) | 0 | |
RadioGroup2 | Caption | D2 |
Items … | day0 day1 day2 day3 | |
ItemIndex (Начальное значение) | 3 |
Получим форму

Осталось описать обработчики событий:
- нажатие на кнопку Button1 (Решить) – рассчитать значения функций
- нажатие на кнопку Button2 (Закрыть) – закрыть форму и приложение
- выход из поля (смена фокуса) Edit2 (B) – проверка корректности данных
- изменение значения RadioGroup1 (D1) – проверка корректности данных
- изменение значения RadioGroup2 (D2) – проверка корректности данных
6.Аномальные ситуации
А и С невозможно задать некорректно. Остальное надо проверять:
№ | Описание | Сообщение, действия |
1 | B – не число | «В - не число или нужна. вместо,» Присвоить Edit2.Text:=’3’ |
2 | B – число вне диапазона |b|<20 | «B должно лежать на отрезке (-20, 20)» Присвоить Edit2.Text:=’3’ |
3 | D1 должно быть меньше или равно D2 | «D1 должно быть меньше или равно D2» Присвоить RadioGroup1.ItemIndex:= RadioGroup2.ItemIndex |
4 | D2 должно быть больше или равно D1 | «D2 должно быть больше или равно D1» Присвоить RadioGroup2.ItemIndex:= RadioGroup1.ItemIndex |
7.Тесты (см. Примеры)
8. Метод
1.Ввести значения a, b,c, d1,d2
2.Подсчитать число столбцов в таблице StringGrid1
= номер значения d2 – номер значения d1 + 2
3.Перебирая все значения d в параметрическом цикле от d1 до d2
считать значения функций и выводить их в StringGrid1
9.Алгоритм


10.Программный код
Константы и типы
…
implementation
{$R *.dfm}
const
// первая строка таблицы
verh : array [0..3] of string[11] = (' d \ F', 'F1(a, b,c, d)', 'F2(a, b,c, d)', 'F3(a, b,c, d)');
// значения в первом столбце
perStr : array [0..3] of string[4] = ('day0', 'day1', 'day2', 'day3');
type
per = (day0,day1,day2,day3);
ßсюда можно написать свои функции f1, f2, f3
Обработчики событий:
- нажатие на кнопку Button1 (Решить) – рассчитать значения функций
Для создания шаблона обработчика – двойной щелчок на кнопке «Решить»!!! Не вручную!!!
procedure TForm1.Button1Click(Sender: TObject);
var
a, i: shortint;
b: single;
c: boolean;
d, d1,d2: per;
Res1: boolean;
Res2: integer;
Res3: single;
begin
a:=UpDown1.Position;
b:=StrToFloat(Edit2.Text);
c:=CheckBox1.Checked;
d1:=per(RadioGroup1.ItemIndex);
d2:=per(RadioGroup2.ItemIndex);
// подготовка таблицы
// количество строк
StringGrid1.RowCount:=Ord(d2)-Ord(d1)+2;
// заголовок
for i:=0 to 3 do
StringGrid1.Cells[i,0]:=verh[i];
// значения d в таблице
for i:=Ord(d1) to Ord(d2) do
StringGrid1.Cells[0,i-Ord(d1)+1]:=perStr[i];
for d:=d1 to d2 do
begin
Res1:=Not (d=day2) And Not Odd(a);
Res2:= Ord(d)+Trunc(Exp(1/3*Ln(1+Abs(b))));
Res3:= Exp(3/4*Ln(Abs(Ord(d)-a*b)));
if Res1 then
StringGrid1.Cells[1, Ord(d)-Ord(d1)+1]:='True'
else
StringGrid1.Cells[1, Ord(d)-Ord(d1)+1]:='False';
StringGrid1.Cells[2, Ord(d)-Ord(d1)+1]:=IntToStr(Res2);
StringGrid1.Cells[3, Ord(d)-Ord(d1)+1]:=Format('%8.4f',[Res3]); // вывод в формате :8:4
// или StringGrid1.Cells[3, Ord(d)-Ord(d1)+1]:=FloatToStrF(Res3, ffFixed, 8, 4);
end;
end;
- нажатие на кнопку Button2 (Закрыть) – закрыть форму и приложение
Для создания шаблона обработчика – двойной щелчок на кнопке «Закрыть»!!! Не вручную!!!
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
Приложение готово для работы с корректными данными

F9 à Run|Run – запуск
Ctrl+F2 à Run|Reset – заново (после исправления ошибки)
Для улучшения качества программного продукта следует написать и обработку аномалий:
- выход из поля Edit2 (B) – проверка корректности данных
Выделить щелчком Edit2 (В) и сделать Двойной щелчок напротив события OnExit (При выходе) для появления шаблона! Не вручную!!!
| procedure TForm1.Edit2Exit(Sender: TObject); var prob_b: single; // вещ. число (с плавающей точкой, 4 байта) begin try // попытаемся prob_b:=StrToFloat(Edit2.Text); // преобразовать в single //из строки, взятой из Edit2 if not (abs(prob_b)<20) then begin ShowMessage('В должно лежать на отрезке (-20, 20)'); Edit2.Text:='3'; // значение по умолчанию end; except // если при преобразовании StrToFloat ошибка ShowMessage('B - не число или нужна. вместо ,'); Edit2.Text:='3'; // значение по умолчанию end; end; Исключения работают только при запуске exe-файла, но не в среде Delphi. Или надо снять флажок ShowMessage(‘Сообщение’) – процедура вывода сообщений в отдельном окошке. Заголовок этого окна можно поменять в Project|Options… на закладке Application ß |
- изменение значения RadioGroup1 (D1) – проверка корректности данных
Для создания шаблона обработчика – двойной щелчок по группе! Не вручную!!!
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if RadioGroup1.IemIndex > RadioGroup2.ItemIndex then
begin
ShowMessage('D1 должно быть меньше или равно D2');
RadioGroup1.ItemIndex := RadioGroup2.ItemIndex;
end;
end;
- изменение значения RadioGroup2 (D2) – проверка корректности данных
Для создания шаблона обработчика – двойной щелчок по группе! Не вручную!!!
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex > RadioGroup2.ItemIndex then
begin
ShowMessage('D2 должно быть больше или равно D1');
RadioGroup2.ItemIndex := RadioGroup1.ItemIndex;
end;
end;
Доп. Задание
Вычисления значений функций оформить в виде процедур/функций Delphi
Поместить их после описания констант и типов
Про ComboBox – следующий лист
Ввести значение переменной перечисляемого типа можно и с помощью объекта класса TComboBox

У объектов следует поменять следующие свойства
Имя объекта | Свойство | Значение |
ComboBox1 | Items… (Список элементов выпадающего списка) Редактор открывается при нажатии на кнопку «. . .»
| day0 day1 day2 day3 |
ItemIndex (Начальное значение, индекс) | 0 | |
Style | csDropDownList (Брать значения только из списка) | |
ComboBox2 | Items… (Список элементов выпадающего списка) | day0 day1 day2 day3 |
ItemIndex (Начальное значение) | 3 | |
Style | csDropDownList (Брать значения только из списка) |
Ввод значения можно осуществить аналогичным предыдущему способом:
d1:=per(ComboBox1.ItemIndex);
Проверка корректности также похожа:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex > ComboBox2.ItemIndex then
begin
ShowMessage('D1 должно быть меньше или равно D2');
ComboBox1.ItemIndex := ComboBox2.ItemIndex;
end;
end;






