Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ситкин. Информатика. Программирование в DELPHI

.pdf
Скачиваний:
142
Добавлен:
18.07.2019
Размер:
1.49 Mб
Скачать

File 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