Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

Begin Eps := 1 / 2;

 

While 1.0 + Eps > 1.0 Do

г,Eps)

Eps := Eps / 2;

WriteLnOМашинный эпсилон*

End.

 

Задания

1.С помощью приведенной выше программы определите на Вашем компьютере величину машинного эпсилон.

2.Если на Вашем компьютере это возможно, определите машинное

едля удвоенной или повышенной точности представления веществен­ ных чисел.

3.Составьте программу определения машинного нуля. Проведите численный эксперимент на Вашем компьютере.

4.Результат выполнения следующей программы докапывает некор­ ректность сравнения на равенство двух вещественных чисел.

Program Test;

Var

X,

StepX

Real;

Begin

X := 0;

 

 

StepX

:= 0 .1;

 

 

Repeat

 

 

 

X :* X + StepX

End.

U ntil

X = 1E3

 

 

Проведите численный эксперимент, объясните результат.

5.

Попробуйте экспериментально доказать, что в “плавающей”

арифметике на ЭВМ не всегда выполняются законы ассоциативности: (я + у) + z = х + + z) и дистрибутивности: -f y)z = xz + yz.

6. Проведите эксперимент на исследование целочисленного перепол­ нения, т.е. установите, что происходит с целой переменной, когда ее значение превышает Maxlnt.

7.1.Подпрограммы-процедуры

Спонятием вспомогательного алгоритма вы уже знакомы. В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпро­ грамм: процедуры и функции.

Разберем этот вопрос на примере следующей задачи: даны два на­ туральных числа а и Ь. Требуется определить наибольший общий де­

литель трех величин: а 4- 6, \а - Ь|, а •6. Запишем это так: НОД(а -f Ь, - Ь|, а •6).

Идея решения состоит в следующем математическом факте'Гесли х\ у, z — три натуральных числа, то НОД(я,?/,г) = НОД(НОД(я,у), z). Иначе говоря, нужно найти НОД двух величин, а затем НОД получен­ ного значения и третьего числа (попробуйте это доказать).

Очевидно, что вспомогательным алгоритмом для решения поста­ вленной задачи является алгоритм получения наибольшего общего де­ лителя двух чисел. Эта задача решается с помощью известного алго­ ритма Евклида. Запишем его в форме процедуры на алгоритмическом языке.

Процедура Евклид(цел М, N, К); нач

пока М О

N

нц

 

если

М > N

то

М := М - N

иначе N :■ N - М кв

кц; К := М кон

Здесь М и N являются формальными параметрами процедуры. М и N — параметры-аргументы, К — параметр-результат. Основной алгоритм, решающий исходную задачу, будет следующим:

алг задача; цел а, Ъ, с;

нач ввод(а, Ъ);

ЕвхпидСа + b, |а - b|, с ); Евхшщ(с, a+b, с ); вывод(с)

хон

Основное отличие процедур в Паскале от процедур в Алгоритмиче­ ском языке (АЯ) состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как ре­ шение поставленной задачи программируется на Турбо-Паскале.

Program NODI;

{exaraple9.pas}

 

Var А, В, C: Integer;

 

 

Procedure

Evklid

(M, N

Integer; Var К

In te g e r);

Begin

 

 

 

 

 

 

While

M <> N Do

 

 

 

I f

M > N

 

 

 

 

Then M

M -

N

 

 

Else N

:=

N -

M;

 

 

К := M

 

 

 

 

 

End;

 

 

 

 

 

 

Begin

 

’ );

 

 

 

 

WriteCa*

 

 

 

 

ReadLn(A);

 

 

 

 

Write(>b=

’ );

 

 

 

 

ReadLn(B);

 

 

 

 

Evklid(A + B,

Abs(A - В ), C );

 

E vklid(С,

A *

В,

C );

 

 

W riteLn(’ НОД

= » ,

C)

 

 

End.

 

 

 

 

 

 

В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры (формальные-фактические). Существует и другой механизм обмена — через глобальные переменные. Но об этом — чуть позже. А сейчас рассмотрим синтаксическую диаграмму описания процедуры.

<описание процедуры>

------------------------------------><заголовок процедуры>— ; ) — > <блок>—►

< заголовок процедуры>

procedure—►•сСимя процедуры>

-> (^ 0 —»■<список формальных параметров>— К^Т)“

<формальные параметры> ::= <параметры-значения> |<параметры-переменные>

<иараметры - переменные>

< список переменных> —

<тип>->

-------------------------------------i— >■ Var

<параметры - значения>

 

— ►<тип>—

►< список переменных> —

Из диаграммы видно, что процедура может иметь параметры, а может быть и без параметров. Чаще всего аргументы представля­ ются кая параметры-значения (хотя могут быть и параметрамипеременными). А для передачи результатов используются параметрыпеременные.

Процедура в качестве результата может передавать в вызывающую программу множество значений (в частном случае — одно), а может и ни одного. Теперь рассмотрим правила обращения к процедуре. Об­ ращение к процедуре производится в форме оператора процедуры.

Соператор процедуры>

►<имя процедуры> - Т

—► < список фактических параметров>—*СТУ~

Есяи описана процедура с формальными параметрами, то и обраще­ ние к ней производится оператором процедуры с фактическими пара­ метрами. Правила соответствия между формальными и фактическими параметрами: соответствие по количеству, соответствие по последо­ вательности и соответствие по типам.

Первый вариант взаимодействия формапъных-фактических параме­ тров называется передачей по значению: вычисляется значение фак­ тического параметра (выражения) и это значение присваивается со­ ответствующему формальному параметру. Второй вариант взаимо­ действия называется передачей по имени: при выполнении процедуры имя формальной переменной заменяется на имя соответствующей фак­ тической переменной (в откомпилированной программе имени пере­ менной соответствует адрес ячейки памяти). В рассмотренном нами примере формальные параметры М и N явлД*°тся параметрамизначениями. Это аргументы процедуры. При обращении к ней Первый раз им соответствуют значения выражений а+Ь и abs(a-b); второй pan

— с и а*Ь. Параметр К является параметром-переменной. В неЙ полу­ чается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С

f Через эту переменную основная программа получает результат.

Теперь рассмотрим другой вариант программы, решающей ту же задачу. В ней используется процедура без параметров.

Program N0D2;

Integer;

Var А, В,

К, М, N

Procedure

Evklid;

 

Begin

While M <> N Do

If M > N

Then M :« M - N

Else N := N - M;

К := M

End;

Begin

Write(’a® O;

ReadLn(A);

Write Ob* 0;

ReadLn(B);

M:= A + B;

N:= Abs(A - B); Evklid;

M:= K;

N:* A * B; Evklid;

WriteLnC’HOfl равен 1, K)

End.

Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: обяасть действия описания.

Областью действия описания любого программного объекта (пере­ менной, типа, константы и т.д.) является тот блок, в котором рас­ положено это описание. Если данный блок вложен в другой (подпро­ грамма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока. Описания же, стоящие во внешнем блоке, называются тлобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание.

Впрограмме N0D1 переменные М, iV, К — локальные внутри про­ цедуры; переменные а, Ь, с — глобальные. Однако внутри процедуры переменные а, Ь, с не используются. Связь между внешним блоком и процедурой осуШествляется через параметры.

Впрограмме N0D2 все переменные являются глобальными. В про­ цедуре Evklid нет ни одной локальной переменной (нет и параметров).