Ситкин. Информатика. Программирование в DELPHI
.pdfFile New Unit. В результате откроется окно редактора кода с шаб-
лоном модуля. Для сохранения модуля следует дать команду File Save выбрать нужную папку и дать имя файлу. Автоматически такое же имя получит и модуль. Имя модуля должно совпадать с именем файла, в котором сохранён текст модуля.
Чтобы воспользоваться средствами модуля в проекте, его необ-
ходимо подключить к этому проекту. Для этого необходимо в модуле проекта в разделе uses добавить имя нашего модуля через запятую к именам уже автоматически подключённых стандартных модулей. По-
сле последнего имени должна стоять точка с запятой. Кроме того, наш модуль нужно добавить к проекту командой Project Add to Project и в открывшемся окне найти и открыть файл модуля.
Пример 4.1
Разработаем проекты для вычисления значения выражения
z a |
x2 |
5 |
a2 |
y2 5 |
|
( y 2) |
2 5 |
, |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
x |
|
5 |
|
|
y |
|
5 |
|
|
y 2 |
|
5 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
где x и y переменные, a константа с использованием подпрограмм,
помещённых в собственный (пользовательский) модуль.
В предыдущей работе уже были разработаны функция и проце-
дура drob для вычисления значения типового выражения. Здесь оста-
ётся только создать свой модуль и переместить функцию и процедуру из проектов в пользовательский модуль в соответствии с его структу-
рой. Затем наш модуль необходимо подключить к обоим проектам,
чтобы они смогли воспользоваться подпрограммами, как и раньше, но уже расположенными в модуле. Поскольку обе подпрограммы будут
51
располагаться в одном модуле, их имена должны быть различны.
Представим два варианта пользовательского модуля
UNIT My_Unit; |
UNIT My_Unit; |
INTERFACE |
INTERFACE |
function drob1(t:real):real; |
const a=3; |
procedure drob(t:real; var d:real); |
var x,y,z,z1,z2,z3:real; |
IMPLEMENTATION |
function drob1(t:real):real; |
procedure drob(t:real; var d:real); |
procedure drob(t:real; var d:real); |
const c=5; |
IMPLEMENTATION |
var t1, t2:real; |
const c=5; |
begin |
var t1, t2:real; |
t1:=sqr(t)+c; |
procedure drob(t:real; var d:real); |
t2:=sqrt(abs(t))+c; |
begin |
d:=t1/t2; |
t1:=sqr(t)+c; |
end; |
t2:=sqrt(abs(t))+c; |
function drob1(t:real):real; |
d:=t1/t2; |
const c=5; |
end; |
var t1, t2:real; |
function drob1(t:real):real; |
begin |
begin |
t1:=sqr(t)+c; |
t1:=sqr(t)+c; |
t2:=sqrt(abs(t))+c; |
t2:=sqrt(abs(t))+c; |
drob1:=t1/t2; |
drob1:=t1/t2; |
end; |
end; |
END. |
END. |
|
|
В первом варианте (слева) подпрограммы перенесены в раздел реализации модуля, а их заголовки продублированы в разделе описа-
ний, чтобы подпрограммы были доступны из внешней среды.
52
Во втором варианте то же, плюс перенесены в раздел описа-
ний модуля константа a и переменные x, y, z и др., что даёт возмож-
ность не объявлять одно и то же дважды в проектах, а один раз в мо-
дуле. Кроме того, в разделе реализации объявлена константа c и пе-
ременные t1 и t2 теперь вне подпрограмм и однократно. Они будут,
как и раньше, «видны» обеим нашим подпрограммам, но «не видны» тем, кто подключит этот модуль, т.к. объявлены в разделе реализации
(для внутренних нужд модуля). А вот константа a и переменные x, y, z
объявлены в разделе описаний и «видны» и внутри, и вне модуля.
Задание
Создать пользовательский модуль и перенести в него пользова-
тельские подпрограммы из предыдущей работы. Подключить модуль к обоим проектам.
Содержание отчёта
цель работы и задание (с исходным выражением);
текст пользовательского модуля;
тексты модулей проектов;
пример работы приложений с указанием компонентов формы;
выводы по работе.
Контрольные вопросы
1.С какой целью в программировании используют модули?
2.Что такое модуль, какова их классификация?
3.Какова структура модуля, как включить модуль в проект?
4.Чем определяется область видимости переменной в модуле?
5.В каком случае модуль будет содержать только раздел описаний?
53
Лабораторная работа № 5
АЛГОРИТМЫ ВЕТВЛЕНИЙ
Цель работы приобретение умений разработки и программной реализации разветвляющихся алгоритмов.
Разветвляющийся алгоритм алгоритм, в котором на определённом этапе выбор очередного выполняемого действия производится в результате анализа условия.
В программировании условие это переменная или выражение логического типа, т.е. такие, которые могут принимать одно из двух возможных значений: True (истина) или False (ложь). Обычно логи-
ческое выражение строится из логических переменных, операций сравнения, логических и арифметических операций. Основные логические операции и результаты их выполнения над логическими аргументами (операндами) представлены в табл. 5.1.
|
|
|
|
|
Таблица 5.1 |
|
|
Таблица истинности для основных логических операций |
|||||
|
|
|
|
|
|
|
Логические |
|
Логические операции |
|
|||
операнды |
|
|
||||
|
|
|
|
|||
|
|
|
Логическое |
Логическое |
Логическое сло- |
|
A |
|
B |
отрицание |
умножение (и) |
жение (или) |
|
|
|
|
not A |
A and B |
A or B |
|
False |
|
False |
True |
False |
False |
|
False |
|
True |
True |
False |
True |
|
True |
|
False |
False |
False |
True |
|
True |
|
True |
False |
True |
True |
|
Логические операции могут выполняться только над операн-
дами (переменными или выражениями) логического типа. Результат операции – значение True или False. Операция not является одно-
54
местной и может выполняться только над одним операндом. Опера-
ции and и or выполняются минимум над двумя операндами, но могут быть распространены на несколько операндов. В этом случае резуль-
тат операции and принимает значение True, если все операнды при-
няли значения True, и False во всех остальных случаях. Результат операции or принимает значение True, если хотя бы один из операн-
дов принял значение True.
К операциям (отношениям) сравнения относят: меньше (<);
меньше или равно (<=); больше (>); больше или равно (>=); равно (=);
не равно (< >). Двойные неравенства записываются с использованием логических операций, например, (x > 1) and (x < 2).
Логические операции имеют следующий приоритет: в первую очередь выполняется not, затем and и в последнюю очередь or.
Операции сравнения имеют низший приоритет по сравнению с логи-
ческими и арифметическими операциями. Порядок выполнения опе-
раций можно устанавливать с помощью скобок.
Для логических переменных и выражений остаётся справедли-
вой конструкция оператора присваивания, например, a:=x>3; b:=(x>y)and(y<=0); c:= a or b;. Сначала вычисляется значение (True
или False) выражения, стоящего справа, а затем оно присваивается переменной слева. Логические переменные, как и другие, должны быть объявлены в разделе описаний
var a, b, c:boolean; x, y:real;
В программировании возможность реализовать разветвляю-
щийся алгоритм обеспечивается условными операторами и операто-
рами выбора.
55
Условный оператор. Неполная форма
Неполная форма условного оператора имеет вид if условие then оператор S
где if и then служебные слова; условие переменная или выра-
жение логического типа; оператор S оператор, выполняемый, ес-
ли условие приняло значение True. Блок-схема алгоритма, который реализует условный оператор в неполной форме, представлена на рис. 5.1. Принцип работы прост. Сначала вычисляется значение усло-
|
|
|
вия, если условие приняло значение True, |
условие |
нет |
то выполняется оператор S (ветвь «да»), |
|
|
|
||
да |
|
если же условие приняло значение False |
|
|
|
||
|
|
|
(ветвь «нет»), то оператор S пропускается, |
оператор S |
|
||
|
и выполняется оператор, следующий далее |
||
|
|
|
|
|
|
|
по тексту программы за условным. |
|
|
|
|
Рис. 5.1 |
|
||
|
|
Условный оператор. Полная форма
Полная форма условного оператора имеет вид
if условие then оператор S1 else оператор S2
здесь if, then и else служебные слова; условие переменная или
|
|
|
выражение |
логического |
типа; |
условие |
нет |
оператор S1 оператор, |
выпол- |
||
|
|
||||
да |
|
|
няемый, если условие приняло |
||
|
|
|
|
|
|
|
|
|
значение True; оператор |
S2 |
|
оператор S1 |
|
оператор S2 |
|||
|
|
|
|
||
|
|
|
оператор, |
выполняемый, |
если |
|
|
|
условие приняло значение False. |
||
Рис. 5.2 |
|
|
|
56
Соответствующая блок-схема алгоритма представлена на рис. 5.2.
На рис. 5.3 представлены два варианта использования условных операторов для вычисления значения кусочно-заданной функции
|
2 |
, |
x 0 |
y x |
|
||
x, |
|
x 0 |
с фрагментами соответствующих блок-схем алгоритмов.
y = x
x < 0 |
нет |
|
да
y = x2
y:= x;
if x < 0 then y:= sqr(x);
а
x < 0 |
нет |
|
|
|
|
да |
|
|
|
|
|
y = x2 |
|
y = x |
|
|
|
if x < 0 then y:= sqr(x) else y:= x;
б
Рис. 5.3
В первом варианте (рис. 5.3 а) ещё до условного оператора не-
полной формы функция у получает значение аргумента х, а затем, ес-
ли аргумент отрицательный, то происходит переприсвоение значения функции на квадрат аргумента, в противном случае оно останется неизменным. Во втором варианте (рис. 5.3 б) значение функции опре-
деляется внутри условного оператора полной формы при любом зна-
чении аргумента.
57
Операторы S, S1 и S2 (рис. 5.1 и 5.2), входящие в условные опе-
раторы, могут быть составными. Составной оператор это группа операторов, заключённых в операторные скобки begin и end. Опера-
торы, входящие в составной, в зависимости от условия, либо все вы-
полняются, либо все они пропускаются. Пример использования со-
ставных операторов в условном операторе представлен на рис. 5.4.
условие |
нет |
if условие then |
||
|
|
|
||
да |
|
|
|
begin |
|
|
|
оператор S11 ; |
|
|
|
|
|
|
|
|
|
|
|
оператор S11 |
|
оператор S21 |
|
оператор S12 ; |
|
|
end |
||
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
|
|
begin |
|
|
|
|
|
оператор S12 |
|
оператор S22 |
|
оператор S21 ; |
|
|
|
|
оператор S22 ; |
|
|
|
|
end; |
оператор S3 |
|
|
|
оператор S3 ; |
|
|
|
|
|
|
|
Рис. 5.4 |
|
|
|
|
|
Пример 5.1
Разработаем алгоритм и напишем проект для вычисления значе-
ния функции
x 1, |
x 2 |
|
|
2 x 1 . |
|
y 1, |
||
|
x 1 |
|
x, |
|
Функция задана на трёх интервалах разными зависимостями.
Однако поскольку область определения функции не имеет разрывов,
58
то достаточно проверить принадлежность аргумента x только двум интервалам и, если он не принадлежит ни первому, ни второму, то остаётся только третий. Кроме того, если введённый аргумент не принадлежит первому интервалу, т.е. не выполняется условие x 2,
это уже означает, что x 2, и при проверке принадлежности аргу-
мента x второму интервалу достаточно проверить только условие x < 1 (а не проверять условие 2 < x < 1). Таким образом алгоритм будет избавлен от избыточных проверок. Блок-схема алгоритма пред-
ставлена на рис. 5.5.
начало
ввод x
x 2 |
нет |
|
|
|
|
|
|
|
|
|
|
да |
|
|
нет |
||
|
|
x < 1 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
y = x 1 |
|
y = 1 |
|
y = x |
|
|
|
|
|
|
|
|
|
|
|
|
|
вывод у |
|
конец |
Рис. 5.5 |
Представленная на рис. 5.5 блок-схема представляет собой кон-
струкцию вложенного ветвления (поливариантное ветвление).
59
Реализуем теперь разработанный алгоритм в проекте. Для ввода значения аргумента x разместим на форме компонент LabeledEdit, для вывода значения у компонент Label, вычисление значения функции свяжем со щелчком (событием OnClick) для кнопки Button.
procedure TForm1.Button1Click(Sender: TObject); var x, y:real;
begin
x:=StrToFloat(LabeledEdit1.Text); if x<= 2 then y:= x 1
else if x<1 then y:=1
else y:= x;
Рис. 5.6
Label1.Caption:=’y=’+FloatToStr(y);
end;
Пример работы приложения представлен на рис. 5.6.
Пример 5.2
Разработаем алгоритм определения |
y |
|
|
|
|
||
отношения (принадлежит или не принад- |
|
|
|
лежит) точки плоскости с заданными ко- |
1 |
|
|
|
|
||
ординатами области, представленной на |
0 1 |
x |
|
рис. 5.7 и напишем проект, реализующий |
|
|
|
этот алгоритм. |
|
|
|
Основная |
задача заключается в |
Рис. 5.7 |
|
|
|
|
|
формулировании |
условий в виде сово- |
|
|
купности неравенств, описывающих множество точек, принадлежа-
щих выделенной области. Если введённые координаты точки удовле-
творяют условию принадлежности области, то следует вывести на
60