Ситкин. Информатика. Программирование в DELPHI
.pdfформу сообщение, что точка принадлежит области, в противном слу- |
||||||
чае не принадлежит. Представленную область можно разделить на |
||||||
две треугольные части первого и третьего квадрантов. Часть области, |
||||||
относящаяся к первому квадранту, описывается тремя неравенствами: |
||||||
y x; y 0; x 3. Для попадания точки в первую часть должны выпол- |
||||||
ниться все три неравенства это означает, что их следует соединить |
||||||
|
|
связкой «и», что соответствует логи- |
||||
начало |
|
ческой операции умножения and. |
||||
|
|
|||||
ввод |
|
Второй части соответствуют неравен- |
||||
|
|
|
|
|
|
|
x и у |
|
ства: y x; y 0; |
x 3, которые также |
|||
a=(y x)и(y 0) |
|
должны быть |
соединены |
операцией |
||
|
and. Между собой две тройки нера- |
|||||
и (x 3) |
|
|||||
|
|
венств |
следует |
объединить связкой |
||
b=(y x)и(y 0) |
|
«или», |
что соответствует логической |
|||
и (x 3) |
|
операции сложения or. Это объясня- |
||||
|
|
|||||
|
|
ется тем, что если точка принадлежит |
||||
a или b |
нет |
области, то она принадлежит либо |
||||
|
||||||
|
|
|||||
да |
|
первой части, либо второй, но не мо- |
||||
принадл. |
не при- |
жет принадлежать обеим частям од- |
||||
области |
надл. обл. |
новременно. Описанный способ ре- |
||||
|
|
|||||
конец |
|
шения представлен в виде блок-схемы |
||||
|
|
|
|
|
|
|
Рис. 5.8 |
|
алгоритма на рис. 5.8. |
|
|||
|
|
|
|
|
|
|
|
|
|
Для ввода значений |
координат |
||
точки разместим на форме два |
компонента LabeledEdit, |
для вывода |
||||
информации компонент Label, процесс определения принадлежно- |
||||||
сти точки области свяжем со щелчком (событием OnClick) для кнопки |
Button.
61
procedure TForm1.Button1Click(Sender: TObject); var x, y:real;
a, b:boolean;
begin
x:= StrToFloat(LabeledEdit1.Text);
y:= StrToFloat(LabeledEdit2.Text);
a:=(y<=x)and(y>=0)and(x<=3); b:=(y>=x)and(y<=0)and(x>=-3);
if a or b then Label1.Caption:='Точка принадлежит области' else Label1.Caption:='Точка не принадлежит области';
end;
В данном случае при выводе результата в компонент Label1 не использовались функции преобразований FloatToStr. Это объясняется тем, что выводится не число-
вой результат, а текст (тип String), что соответствует типу свойства Caption и преоб-
разования не нужны.
Пример работы приложения
представлен на рис. 5.9.
Рис. 5.9
Оператор выбора
В тех случаях, когда количество условий становится значитель-
ным, использование условных операторов создаёт громоздкие и запу-
танные конструкции. Для реализации множественного выбора удобно использовать оператор выбора, схема работы которого представлена на рис. 5.10, а сам оператор в общем случае имеет вид
62
case ключ of
константы 1 : оператор S1 ;
константы 2 : оператор S2 ;
………………………………… |
конст 1 |
да |
оператор S1 |
|
|
|
|||
константы N : оператор SN ; |
нет |
|
|
|
else оператор SN+1 ; |
да |
|
||
|
|
|||
конст 2 |
оператор S2 |
|||
|
||||
end; |
|
|||
|
|
|
||
|
|
|
|
где case, of, else, end служеб-
ные слова; ключ перемен- конст N да оператор SN ная или выражение порядкового
типа (обычно, целый или сим-
вольный типы); константы N
список констант порядкового типа; оператор SN оператор,
выполняемый в случае совпадения значения ключа со значением из списка константы N . Если необходимо выполнение нескольких операторов в ветви, то они заключаются в операторные скобки begin
и end.
Сначала вычисляется значение ключа , затем оно сравнивается со значениями констант из списков. В случае совпадения выполняется соответствующий оператор. Константа не должна входить в несколь-
ко списков. Если значение ключа не совпало ни с одной из кон-
стант из списков, то выполняется оператор SN+1 . Ветвь else ( опера-
тор SN+1 ) может отсутствовать, тогда при отсутствии совпадений оператор выбора пропускается, такая конструкция соответствует не-
полной форме оператора выбора.
63
Компонент CheckBox (независимый переключатель /флажок/)
Предназначен для установки параметров с двумя возможными состояниями. Основные свойства компонента описаны в табл. 5.2.
|
|
|
Таблица 5.2 |
|
Основные свойства компонента CheckBox |
|
|
|
|
|
|
Свойство |
|
Описание |
|
Name |
|
Имя компонента. Используется |
для доступа к |
|
компоненту и его свойствам |
|
|
|
|
|
|
Caption |
|
Текст рядом с переключателем |
|
|
|
Определяет позицию текста относительно пере- |
|
Alignment |
|
ключателя: taRightJustify (справа), taLeftJustify |
|
|
|
(слева) |
|
Checked |
|
True/False Состояние переключателя установ- |
|
|
лен (есть галочка)/сброшен (нет галочки) |
||
|
|
||
AllowGrayed |
|
True/False Возможность нахождения переключа- |
|
|
теля в промежуточном состоянии |
|
|
|
|
|
|
|
|
Состояние переключателя. В отличие от свойства |
|
State |
|
Checked позволяет различать |
установленное |
|
(cbChecked), промежуточное (cbGrayed), сбро- |
||
|
|
||
|
|
шенное (cbUnChecked) состояние |
|
WordWrap |
|
True/False Возможность переноса слов на сле- |
|
|
дующую строку |
|
|
|
|
|
Обычно независимый переключатель CheckBox может иметь два состояния, определяемые свойством Checked: установлен (True) или сброшен (False). Бывает, что переключатель может иметь еще и тре-
тье состояние промежуточное. В этом состоянии переключатель за-
крашивается серым цветом. Если переключатель может находиться в трёх состояния, то вместо свойства Checked используется свойство State, а в свойстве AllowGrayed устанавливается значение True.
Состояние независимого переключателя не зависит от состоя-
ний других переключателей, отсюда и название независимый.
64
Компонент RadioButton (зависимый переключатель)
Предназначен для установки взаимоисключающих параметров.
Основные свойства компонента описаны в табл. 5.3.
|
|
|
Таблица 5.3 |
|
Основные свойства компонента RadioButton |
|
|
|
|
|
|
Свойство |
|
Описание |
|
Name |
|
Имя компонента. Используется для |
доступа к |
|
компоненту и его свойствам |
|
|
|
|
|
|
Caption |
|
Текст рядом с переключателем |
|
|
|
Определяет позицию текста относительно пере- |
|
Alignment |
|
ключателя: taRightJustify (справа), |
taLeftJustify |
|
|
(слева) |
|
Checked |
|
True/False Состояние переключателя установ- |
|
|
лен (есть точка)/сброшен (нет точки) |
|
|
|
|
|
|
WordWrap |
|
True/False Возможность переноса слов на сле- |
|
|
дующую строку |
|
|
|
|
|
На форме должно находиться несколько зависимых переключа-
телей. Из группы зависимых переключателей в установленном состо-
янии может находиться только один, отсюда и название зависимый.
Пример 5.3
Разработаем справочную систему для расчёта стоимости проез-
да в один из пригородов с тремя уровнями комфорта и возможностью скидки. Исходные данные представлены в табл. 5.4.
|
|
|
Таблица 5.4 |
|
|
Исходные данные |
|
||
|
|
|
|
|
Пункт назначения |
Базовая стоимость |
Параметры |
Коэффициент |
|
0) Подпорожье |
300 руб. |
III класс |
1 |
|
1) Пушкин, 2) Всеволожск |
100 руб. |
II класс |
1,25 |
|
3) Выборг, 4) Приозерск, |
200 руб. |
I класс |
1,5 |
|
5) Гатчина, 6)Тосно |
|
|
||
скидка |
0,75 |
|||
|
||||
|
65 |
|
|
начало |
|
|
|
Блок-схема алгоритма реше- |
||
|
|
|
|
|
|
|
n = № |
|
|
|
ния представлена на |
рис. 5.11. |
|
|
|
|
|
|
|
|
выбранного |
|
|
|
Сначала по выбранному городу из |
||
города |
|
|
|
списка (с нумерацией от нуля) |
||
|
|
|
|
|||
n = 0 |
да |
стоимость |
|
определяется |
базовая |
стоимость |
|
St = 300 |
|
||||
|
|
|
|
|
|
|
нет |
|
|
|
поездки. Если на момент расчёта |
||
n = 1, 2 |
да |
стоимость |
|
город не выбран, то |
стоимость |
|
|
St = 100 |
|
||||
|
|
|
|
|
||
|
|
|
|
|
|
|
нет |
|
|
|
имеет нулевое значение и пользо- |
||
|
|
|
|
|
|
|
n = 3..6 |
да |
стоимость |
|
ватель информируется об ошибке. |
||
|
St = 200 |
|
||||
|
|
|
|
|
||
|
|
|
|
|
|
|
нет |
|
|
|
Затем стоимость корректируется в |
||
|
|
|
|
|
|
|
стоимость |
|
|
|
зависимости от класса и наличия |
||
St = 0 |
|
|
|
скидки. Третий класс |
не учтён, |
|
|
|
|
|
|||
город не |
|
|
|
т.к. он не влияет на стоимость. |
||
выбран |
|
|
|
Для размещения |
на форме |
|
|
|
|
|
|||
|
|
|
|
списка городов использован ком- |
||
II класс |
нет |
I класс |
нет |
понент ListBox (свойства и способ |
||
|
|
|||||
да |
|
да |
|
формирования списка описаны в |
||
|
|
|
|
|||
St = St·1,25 |
|
St = St·1,5 |
|
работе 1). Для выбора одного из |
||
|
|
|
|
трёх взаимоисключающих классов |
||
скидка |
нет |
|
|
размещены три компонента Radio- |
||
|
|
|
|
|
|
|
да |
|
|
|
Button (один из них следует вклю- |
||
|
|
|
|
|
|
|
|
|
|
|
чить на этапе разработки формы), |
||
St = St·0,75 |
|
|
|
а для учёта скидки, которая может |
||
|
|
|
|
|||
|
|
|
|
быть предоставлена для любого из |
||
вывод St |
|
|
|
классов, – компонент CheckBox. |
||
|
|
|
|
Пример работы приложения пред- |
||
конец |
|
Рис. 5.11 |
|
ставлен на рис. 5.12. |
|
|
|
|
|
|
|||
|
|
|
|
66 |
|
|
procedure TForm1.Button1Click(Sender: TObject);
var st:real; n:byte; begin
n:=ListBox1.ItemIndex;
case n of
0: st:=300; 1,2: st:=100; 3..6: st:=200;
else
begin |
Рис. 5.12 |
|
|
st:=0; |
|
ShowMessage('не выбран город'); |
|
end; |
|
end; |
|
if RadioButton2.Checked then st:=st*1.25 else |
|
if RadioButton3.Checked then st:=st*1.5; |
|
if CheckBox1.Checked then st:=st*0.75; Label2.Caption:='в кассу '+FloatToStr(st)+' руб';
end;
Задание
I. Разработать алгоритм вычисления значения функции, пред-
ставить его в виде блок-схемы и реализовать, создав проект
|
|
|
x |
|
, x 0 |
|
|
x2 |
1, x 1 |
||||||
|
|
|
|
|
|||||||||||
|
|
|
|
|
sin(2 x) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
||||||||||
1. |
y |
|
|
, 0 x 1 |
2. |
y cos |
|
, |
|
x |
|
1 |
|||
|
2 |
|
|||||||||||||
|
|
|
|
2x |
|||||||||||
|
|
|
|
||||||||||||
|
x, x 1 |
|
|
0, x 1 |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1, x 1
3. y x3 , x 1x, x 1
67
|
|
0, x 1 |
|
x |
, x 0 |
|
|
||||||||||
|
|
e |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
x |
|
|
||||||
4. y |
x 1, 1 |
x 0 5. |
y cos |
|
|
, 0 |
x 1 |
||||||||||
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
||||
|
|
x, x 1 |
|
|
|
0, x 1 |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x2 , x 0 |
|
|
|
|
|
|
|
|
|
||||||
|
|
sin 2 |
|
|
|
|
|
|
|
|
2 |
, |
x 0 |
||||
|
y |
x |
|
x, 0 x |
|
|
|
|
|
||||||||
|
|
|
|
|
x |
|
|
||||||||||
7. |
|
|
|
|
|
|
8. |
y |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x 2, x 2 |
|||
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
x |
|
|
|
|
|
||||||||||
|
|
x, |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 x 1 , x 3
6. y x 11, x 3
7 x 1, x 3
|
|
|
|
|
|
|
cos x, x |
2 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x 0 |
||
9. |
y 0, |
2 |
|||
|
|
|
|
||
|
|
|
|
||
|
1, |
x 0 |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
II.Разработать алгоритм определения отношения точки
выделенной области (рис. 5.13) и реализовать его, создав проект
1. |
y |
|
2. |
y |
|
3. |
y |
|
|
|
|
|
|
|
|||
|
1 |
|
|
1 |
|
|
1 |
|
|
0 1 |
x |
|
0 1 |
x |
|
0 1 |
x |
y
4. 5.
1
0 1 |
x |
y
7. 8.
1
0 1 |
x |
y
6.
1
0 1 |
x |
y
9.
1
0 1 |
x |
y
1
0 1 |
x |
y
1
0 1 |
x |
Рис. 5. 13
68
III. Разработать справочную систему для информирования поль-
зователя о стоимости проезда в соответствии с вариантом табл. 5.5.
|
|
|
|
|
|
|
Таблица 5.5 |
|
|
|
Варианты заданий |
|
|
||
|
|
|
|
|
|
|
|
№ |
городов |
цен. категорий |
1 кл. |
2 кл. |
3 кл. |
возм. скидка |
и обратно |
1 |
7 |
4 |
1,5 |
1,3 |
0,75 |
25% |
нет |
2 |
8 |
3 |
2 |
1,5 |
0,8 |
нет |
да |
3 |
9 |
5 |
1,5 |
1 |
нет |
30% |
да |
4 |
10 |
5 |
1,4 |
0,8 |
нет |
нет |
да |
5 |
9 |
4 |
1,5 |
1,25 |
0,9 |
30% |
нет |
6 |
8 |
4 |
1,2 |
1,1 |
1 |
50% |
да |
7 |
7 |
5 |
1 |
0,9 |
0,7 |
нет |
да |
8 |
6 |
3 |
1,25 |
0,75 |
нет |
нет |
да |
9 |
7 |
4 |
2 |
1,5 |
1 |
20% |
нет |
Содержание отчёта
цель работы и задание;
для каждого из трёх заданий:
блок-схема алгоритма решения;
текст модуля проекта;
пример работы приложения с указанием компонентов;
выводы по работе.
Контрольные вопросы
1.Какой алгоритм называют разветвляющимся?
2.Что такое логическое выражение, как оно строится?
3.Приведите таблицу истинности основных логических операций.
4. Каков синтаксис полной и неполной форм условного оператора?
5.Что такое составной оператор, когда его используют?
6.Какую конструкцию реализует запись if x = 0 then else y:= 1?
7.Каков синтаксис оператора выбора и схема его работы?
8.В чём состоят отличия зависимого переключателя от флажка?
69
Лабораторная работа № 6
КОНТРОЛЬ СИНТАКСИСА ВВОДИМЫХ ДАННЫХ
Цель работы приобретение умений построения конструкций контроля вводимых числовых данных пользователем.
В предыдущих проектах при вводе чисел с компонентов формы приходилось рассчитывать только на аккуратность предполагаемого пользователя. В случае ошибочного наличия в числе недопустимого символа (например, буквы) происходит ошибка при попытке преобразовать содержимое поля редактирования Edit или LabeledEdit (свойство Text) из строки в число функциями преобразования StrToInt или StrToFloat, что может повлечь аварийную остановку работы приложения. Программист должен предусмотреть возможные некорректные действия пользователя и корректную реакцию приложения на них.
Предположим, что в проекте на форме расположен компонент
Edit1 для ввода вещественного числа. К нарушению синтаксиса, а в последствии невозможности преобразовать в число содержимое поля
Edit1.Text приведут:
наличие недопустимых символов в числе (буквы, спецсимволы, точка, знаки вопроса или восклицания и т.п.);
наличие двух и более запятых или знаков минуса;
наличие знака минуса не в начале числа;
отсутствие данных в поле вообще.
Для корректной работы приложения следует либо исключить ввод недопустимых символов, либо предотвратить работу функции преобразования StrToFloat при наличии синтаксических ошибок в числе и сообщить пользователю о них.
70