Лабораторная работа № 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

Создайте форму

Это StringGrid1

 

Зададим значения некоторым свойствам этих объектов

Объект

Свойство

Значение

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. Или надо снять флажок
в окне Tools|(Options|)Debugger Options|Language Exceptions

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;