Материал: Информатика. учебное пособие для иностранных слушателей подготовительного отделения (включая подготовку на уровень магистратуры). Кононов А.Д., Кононов а.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Правила оформления процедур и функций аналогичны правилам оформления программ.

Заголовком процедуры служит ключевое слово PROCEDURE. За ним следует имя этой процедуры, оформляемое в соответствии с правилами написания идентификаторов, причем если предполагается оформлять внешнюю процедуру, то программист должен помнить, что имя должно быть не более чем шестисимвольным и символ подчеркивания во внешних именах не допускается. В круглых скобках после имени процедуры делается перечисление формальных параметров, вместо которых при вызове процедуры ей будут передаваться действительные значения параметров. За заголовком процедуры следуют те же разделы описаний, которые были рассмотрены для программы.

Функция – это подпрограмма, результатом работы которой является единственный параметр. Вызов функции поэтому может входить в состав выражения. Правила описания функции аналогичны правилам описания процедуры. Заголовок функции состоит из ключевого слова FUNCTION и имени функции с указанием формальных параметров функции и их типов.

Описание процедур и функций, внутренних по отношению к главной программе, может быть сделано как перед блоками основной программы (в разделе описаний процедур и функций), так и следом за основной программой. Например,

Program proba1;

(* разделы описаний меток, констант, типов, переменных *)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

(* раздел описаний процедур и функций *)

Procedure line (x,y,z);

type

t:integer;

l:char;

var

x,y,i,j : t;

z : l;

begin

for i:=x to j:=y do write(z);

end;

(* главная программа *)

begin

. . . . . . . . . . . . .

. . . . . . . . . . . . .

end;

(* описание функции *)

function max (x,y : real): real;

begin

if x > y then max:= x;

end;

Операторы языка, составляющие тело программы. Тело программы составляют блоки. Каждый блок начинается с ключевого слова BEGIN и заканчивается словом END. Они могут следовать друг за другом или входить один в другой. Последние называют вложенными. Например,

PROGRAM IT – IS – MY ;

(* разделы * )

begin (* операторы языка * )

begin (* операторы языка *)

end;

begin (* операторы языка*)

begin (* операторы языка *)

end

end

end.

Глубина вложенности блоков практически не ограничивается. Однако информационно и алгоритмически они должны быть правильно оформлены.

3.6. Операторы языка

Оператор – наименьшая часть работы программы, имеющая самостоятельное значение и вызывающая к исполнению ту или иную последовательность машинных команд. Операторы могут быть объединены в программный блок. Для передачи управления (условные и безусловные переходы) операторы могут помечаться метками. Действие метки распространяется на весь программный блок, в котором эта метка определена. Метка – это последовательность букв и цифр, начинающаяся с буквы или символа подчеркивания. Операторы состоят из ключевых слов и операндов и отделяются друг от друга символом « ; ». Различают операторы простые и структурные.

Простые операторы. К ним относятся операторы присваивания, перехода GOTO, вызова процедуры и пустой оператор.

Оператор присваивания. Например, А: = В + С;

Оператор перехода. Оператор состоит из зарезервированного ключевого слова GOTO и операнда – метки той части программы, которой необходимо передать управление.

Например,

1: begin

……..

end;

begin

……..

goto 10;

………

10 : a: = b + c

…….

goto 1;

end;

Переход возможен только к той метке, которая определена в этом блоке, в этой процедуре.

Пустой оператор. Оператор не указывает ни на какую операцию и состоит только из символа «;». Например,

a:= b + c; ; ;

;

;

d := e +f;

Несколько операторов, выполняемых последовательно, могут быть объединены в один составной. Такое утверждение идентифицируется ключевым словом BEGIN и заканчивается словом END. Например,

Begin

a:=b;

d:=a + c;

f:=d+1;

end;

Структурные операторы. Они включают в себя несколько ключевых слов с операндами. К структурным операторам относятся операторы для организации ветвлений программы, когда выполнение той или иной последовательности операций связано с проверкой некоторого условия. Проверка условия может выполняться с помощью операторов IF и CASE.

Оператор IF используется вместе с операторами THEN и ELSE. Например, если a =b, то переменной c присваивается значение переменной d и после этого выполняется вызов функции cos(d):

IF a = b then c := d;

a:=cos(d);

В том случае, если a≠b, параметр c не определен. Придадим ему, например, нулевое значение, и тогда a будет равно 1:

IF a=b then c:=d else c:=0;

a:=cos(c);

Операторы IF могут быть вложенными один в другой. Например,

IF A<>0 THEN IF B<>9 THEN A=B THEN C:=D ELSE C:=0;

Оператор из предыдущего примера вложен в оператор IF B<>0, который, в свою очередь, тоже вложен в оператор IF A<>0.

Оператор CASE служит для ветвления программы по определенному признаку. Этим признаком является текущее значение выражения, стоящего за ключевым словом CASE и называемого селектором. Тип и значения селектора должны соответствовать типу и значениям меток, идентифицирующих ту или иную последовательность операций. Например,

case (x+y-1) of

2 : a:=b;

3 : a:=sin(x);

4 .. 9 : a:=cos(x);

10 : a:=sin(x+y);

else a:=1;

end;

Управление от оператора CASE будет передано метке 2, если выражение (x+y-1) равно 2, аналогично – метке 3; метке 4 .. 9, если значение выражения соответственно будет 4, 5, 6, 7, 8 или 9. Если всех значений выражения программист заранее не может предвидеть, он должен обязательно включить оператор else.

Для организации повторного или многократного прохождения той или иной последовательности операций программист может воспользоваться операторами для организации цикла:

WHILE, REPEAT, FOR.

Оператор WHILE указывает на то, что, пока выполняется следующее за ним условие, должно повторяться выполнение последовательности операций, следующей за оператором DO. Например,

while a=b do c:= a + b;

Если при первой же проверке условия a=b окажется, что a ≠ b, то оператор c:= a +b не будет выполнен ни одного раза.

Оператор REPEAT. Иногда программисту необходимо, чтобы выполнение тела цикла предшествовало проверке условия и, таким образом, было выполнено хотя бы один раз. Например,

repeat c:=a+b until a<> b;

Повторять выполнение c:= a+b до тех пор, пока выполняется условие a=b. Даже если a не будет равно b при первой проверке, все равно первый раз (и единственный) оператор c:=a + b все таки будет выполнен. Этим и отличается использование оператора REPEAT от WHILE.

Оператор FOR указывает на то, что для каждого элемента последовательности значений, присваиваемых некоторой переменной (параметру цикла), в этом операторе должна повторно выполняться некоторая группа операций. Например,

for i :=1 to 100 do a := b+1;

Иными словами, для всех I =1,2,3,..,100 необходимо вычислять значение переменной a = b + 1. Переменная i должна быть порядкового типа и не меняться при вычислении выражения в теле цикла, стоящем после do.

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

with record do begin

. . . . . . . . . . . . . . . . . . . . . . .

year := 5;

month := 2;

day :=15;

. . . . . . . . . . . . . . . . . . . . . . .

end;

3.7. Организация ввода – вывода

Для ввода исходных данных, над которыми должны выполнятся преобразования в программе, используются операторы READ и READLN. Можно вводить данные целого, вещественного и символьного типа. Разделителем между числами служит пробел или ENTER (конец строки ). Символы при вводе не разделяются. Оператор READLN осуществляет переход к началу новой строки после ввода значения последней переменной в списке.

Вывод данных разрешает выводить значения всех стандартных типов. Общий вид операторов вывода значений целого, логического, символьного и строкового типа:

WRITE ( a : m); (1)

WRITELN ( a: m); (2)

где а – выводимое выражение, m – переменная или выражение целого типа; означает общее число позиций для вывода. Оператор (2) в отличие от (1) осуществляет переход к началу новой строки после окончания вывода значения последней переменной в списке объектов вывода.

При выводе вещественных чисел помимо задания общего количества позиций под выводимую величину можно задать количество позиций в дробной части числа

WRITE (b : m : n); (3)

WRITELN( b : m: n); (4)

где b – выводимое выражение, m – общее число позиций, n – количество позиций после запятой.

Контрольные вопросы и упражнения

1. Ответить на следующие вопросы:

а) можно ли вводить с помощью оператора READ значения булевского типа?

б) почему параметрами процедуры ввода READ могут быть только переменные, а не числа или выражения?

в) если в качестве исходных данных задано пять чисел, то можно ли ввести пятое из них, не вводя первые четыре?

2. Что получится в результате выполнения операторов:

а) write (‘A’:3,2:1); writeln (5*3.2);

б) writeln (5<6,5<=6:8); writeln (‘КОНЕЦ’);

в) writeln (5*3.3:4:1, ‘РЕЗУЛЬТАТ’) ?

3. Что будет напечатано программой:

а) program aba;

var a,b:integer;

` begin

read (a,b,a);

writeln (a,b,a)

end.

если для ввода заданы числа 1, 2 и 3?

б) program print1;

var x:integer;

begin

x:=2; writeln(’x+1’)

end.

в) program sq;

var b,c,d:real;

begin

read(b,c);

d:=sqrt(sqr(b) – 4*c);

writeln(’x1=’, (- b + d)/2, ’ x2=’,(- b – d)/2)

end.

если в качестве исходных данных заданы числа 1.0 и -2.0?

г) program time; var fi:real; h,m:integer; begin read

(fi); h:=trunc(fi/30); m:=trunc

(fi – 30*h/0.5); writeln (h,’_’, m) end.

Записать текст этой программы в более наглядной форме

д) program print2;

var x:real; t:boolean;

begin

read(x); t:= x< round(x);

read(x) y:= t and (x<trunc(x));

writeln (t)

end.

если для ввода заданы числа 1.5; -0.8?

  1. Найти ошибки в каждой из следующих программ:

а) program A;

const d = 5;

begin

d:= sqr(d);

writeln(‘d*2=’,d)

end.

б) program B;

const k = true;

var x:real;

begin

read(x); writeln (ord(x) = k)

end.

в) program C;

var a,b,c : integer;

begin

read(a,b); writeln( (a+b+c)/3)

end.

г) program D;

var x:real;

begin

read(x);

y:=sqrt(x) + 1;

writeln(y)

end.

д) program E;

const B = 2.5;

var a,b,c : real;

begin

read(a,c); writeln(a*c > b)

end.

3.8. Вызов процедур и функций

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

Вызов процедуры (функции) должен сопровождаться соответствующим указанием – директивой.

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

Перечень действительных параметров и их типы должны соответствовать списку и типам формальных параметров. Поэтому программист, перед тем как написать вызов, должен ознакомиться с описанием вызываемой процедуры.

Допустим, что необходимо воспользоваться процедурой, описание которой было сделано до написания главной программы, т. е. в разделе описания процедур. Например,

PROGRAM IT _IS_MY ;

(* разделы описания меток, констант, типов, переменных *)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

(* раздел описаний процедур и функций * )

PROCEDURE line ( x, y, z );

type

t: integer;

l: char;

var

x, y, i, j: t;

z : l;

begin

for i : = x то j := y do write ( z ) ;

end;

Тогда вызов этой процедуры в одном из последующих блоков главной программы I T –IS – MY будет оформляться следующим образом:

( * главная программа * )

begin

a: = ‘ * ‘;

x: = 10;

j : = 50;

line ( x, y, a );

end.

Однако если описание процедуры ( функции ) выполнено вслед за написанием блоков программы, а вызов такой процедуры необходимо сделать в одном из блоков, то в этом случае необходимо воспользоваться директивой FORWARD. Она укажет на то, что описание процедуры следует за её вызовом. Например,

(* главная программа *)

begin

a: = ‘ *’ ;

x: = 10;

y : = 50;

line ( x, y, z ); forvard;

end

( * описание процедуры line *)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Если вызываемая процедура является внешней по отношению к программе, то здесь могут быть два случая:

1. Внешняя процедура написана на языке Паскаль.

2. Внешняя процедура написана на каком–то другом языке.

В первом случае вызов необходимо оформить с использованием директивы EXTERNAL. Например,

line (a, b, c); external;

Во втором случае вместо директивы FORWARD необходимо указать директиву NONPASCAL. Например,

line (a, b, c); nonpascal;

При вызове внешней процедуры в списке параметров указываются не формальные параметры, которые объявлялись в описании процедуры, а действительные, которые объявлены в вызывающей программе. Действительные параметры при вызове процедуры заменяют формальные и фактически будут участвовать как операнды в выполнении процедуры. Поэтому последовательность написания действительных параметров и их типы должны строго соответствовать списку и типам формальных параметров, дабы избежать ошибок в результатах.

Программисту необходимо помнить о следующих ограничениях:

1. Если в качестве параметров допускаются процедуры и функции, то это могут быть такие процедуры и функции, собственные параметры которых являются значениями.

2. Действительными параметрами не могут быть стандартные процедуры и функции.

3. Компоненты упакованных структур не могут быть действительными параметрами.

Источник: https://studfile.net/preview/16567430/