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

Разработка программ

.pdf
Скачиваний:
9
Добавлен:
02.05.2015
Размер:
440.75 Кб
Скачать

соответствующие формальные параметры процедуры, и управление передается процедуре

4.выполняются операторы процедуры

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

6.основной процесс продолжает выполняться с первого оператора, следующего после вызова процедуры

Вызов функции – общий вид: ... имя_функции (список фак-

тических параметров) ...; (может быть выражением или частью выражения в различных операторах, но не является отдельным оператором).

Выполнение:

1.выполнение основного процесса приостанавливается

2.вычисляются значения фактических параметров

3.вычисленные значения передаются в соответствующие формальные параметры функции, и управление передается функции

4.выполняются операторы функции

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

6.результат последнего выполненного оператора присваивания вида: имя_функции:=выражение принимается в качестве значения функции, и основной процесс продолжает выполняться

спервого оператора, следующего после вызова процедуры III. Параметры можно передавать по значению и по ссылке. Передача параметра по значению (параметры значения) - в

списке формальных параметров (в заголовке подпрограммы) они перечисляются без служебного слова var:

1.вычисляется значение фактического параметра (может быть любое выражение соответствующего типа)

2.это значение копируется в соответствующий формальный па-

31

раметр

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

4.по выходе из подпрограммы формальный параметр разрушается.

Передача параметра по ссылке (параметры переменные): в списке формальных параметров перед ними ставится служебное слово VAR. (при передаче параметра по ссылке фактический параметр должен быть переменной!!!):

1.в подпрограмму пересылается ссылка (адрес) на местоположение переменной - фактического параметра - в памяти ЭВМ

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

3.по выходе из подпрограммы этой области памяти возвращается имя переменной - фактического параметра и значение, записанное в нее подпрограммой, сохраняется.

IV. Переменные, описанные в тексте подпрограммы называются локальными переменными и доступны только внутри этой подпрограммы, для основной программы они не существуют.

Переменные, определенные в разделе описания программы называются глобальными. Любой подпрограмме доступны все глобальные переменные за исключением тех, с чьими именами совпадают имена ее параметров или локальных переменных. В этом случае говорят, что имя переменной переопределено. Если имя некоторой переменной переопределено, то в области действия переопределенной программы имеет силу уже новая связь между именем и типом, и глобальная переменная с таким именем в этой области действия уже не доступна ( если только она не передается как параметр.

Пример трассировки программы с процедурой.

1.Program prim4;

2.var n,t: real; x:char;

3.procedure P(x,y: real);

4.var n:real;

32

5.begin

6.n:=x+t;

7.t:=y;

8.writeln(n,t,x);

9.end;

10.begin

11.read(n);

12.t:=n/2;

13.x:=’+’;

14.P(n,0.8);

15.writeln(n,t,x)

16.end.

 

Таблица трассировки.

 

 

Входные данные: 1

 

 

 

 

 

 

Строка

Ход выполнения

n

t

x

 

 

 

10

вход в prim4

?

?

?

 

 

 

11

 

1

 

 

 

 

 

12

 

 

0.5

 

 

 

 

13

 

 

 

‘+’

 

 

 

14

вызов P

 

 

 

 

 

 

 

 

 

 

 

n

x

y

5

вход в P

 

 

 

?

1

0.8

6

 

 

 

 

1.5

 

 

7

 

 

0.8

 

 

 

 

8

вывод 1.5, 0.8, +

 

 

 

 

 

 

9

выход из Р

 

 

 

 

 

 

 

возврат в prim4

 

 

 

 

 

 

15

вывод 1, 0.8, +

 

 

 

 

 

 

16

Выход из Prim4

 

 

 

 

 

 

Результат: 1.5 0.8 + Вывод 0.8 +

Замечание.

1.В процедуре P параметры x и y являются параметрами значениями. Поэтому при вызове процедуры (строка 14) для этих параметров выделяются дополнительные ячейки памяти, куда

33

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

2.Во второй строке программы описываются глобальные переменные n, t, x. В процедуре Р параметры x, y, n являются локальными. Так как локальные переменные n, x имеют те же имена, что и глобальные переменные, то последние не доступны во время работы процедуры Р, что отражено в таблице трассировки соответствующей штриховкой.

3.Глобальная переменная x является переменной символьного типа (char) и ей может быть присвоен любой символ. Операции с символьными переменными и константами ограничены только их сравнением. Символы в программе должны быть заключены в апострофы. Если символ является апострофом, то в программе он записывается четыремя апострофами.

Пример трассировки программы с функцией.

1Program Parameters;

2Var a,b:integer;

3Function add1(x:integer;var y:integer):integer;

4Begin

5X:=x+1;

6Y:=y+1;

7Add1:=x+y;

8Writeln(x,y)

9End;

10Begin

11A:=0; b:=0;

12Writeln(add1(a,b),a,b)

13End.

Таблица трассировки

Строка

Ход выполнения

A

B

34

10

Вход в Parameters

?

?

 

 

11

 

0

0

 

 

12

Вызов add1

 

 

 

 

 

 

 

(y)

x

Add1

4

Вход в add1

 

 

0

?

5

 

 

 

1

 

6

 

 

1

 

 

7

 

 

 

 

2

8

Вывод: 1 1

 

 

 

 

9

Выход из add1

 

(b)

 

 

12Вывод: 2 0 1

13Выход из Parameters

Результат: 1 1 Вывод: 0 1

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

Процедуры ввода

Элементом информации в операциях простого ввода и вывода является символ. Набор символов компьютера определяется таблицей ASCII, каждый символ в наборе имеет порядковый номер (код). В общем случае набор содержит две группы: отображаемые и управляющие символы. К отображаемым относятся буквы, цифры, пробел, знаки арифметических операций, препинания, скобки и другие знаки, встречающиеся в печатных текстах. Вторую группу составляют управляющие символы, которые используются в основном при передаче данных. Управляющие символы обычно записываются в угловых скобках, напри35

мер, <ctrl/z> - конец файла.

Существуют две стандартные функции :

ord(a) - определяет код ASCII символа, хранящегося в переменной а ,

chr(n) - определяет символ ASCII под кодом n.

Информация в компьютере хранится в файлах. Входные и выходные данные для программ Паскаля хранятся обычно в текстовых файлах. Текстовый файл - последовательность, состоящая из нуля или более строк, где каждая строка - последовательность , состоящая из нуля или более символов и заканчивающаяся маркером конца строки. Маркер конца строки представляет из себя два символа - <CR> (возврат каретки) и <LF> (конец строки), которые имеют коды 13 и 10 и не отображаются на экране и в тексте.

Для доступа к файлу в программе на Паскале необходимо, в первую очередь, сделать две вещи:

1.описать файловую переменную. Имя этой переменной в последующем будет использоваться внутри программы как имя файла (который на самом деле существует и хранится на диске);

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

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

Ввод данных в Паскале осуществляется с помощью двух стандартных процедур - read и readln. Общий вид: read([f],а1,...,аn);

readln(а1,...,аn);

где [f] –переменная типа текстовый файл, задающий файл ввода (является необязательным параметром, если не указан, то в качестве входного файла принимается файл input и ввод осу-

36

ществляется с клавиатуры), а1, ..., an - имена переменных. Выполнение операторов процедур ввода приводит к считы-

ванию значений из файла в переменные в том порядке, в котором они перечислены в операторах read и readln. Чтобы изобразить состояние файла, из которого происходит ввод, мы будем использовать маленькую направленную вверх стрелку (^), указывающей на текущую позицию в файле. Она всегда будет указывать на первый символ той части файла, которую осталось прочитать. Таким образом, в любой момент времени та часть (возможно пустая), которая находится слева от стрелки, уже прочитана, а ту (возможно, пустую) часть, которая расположена справо от нее, еще остается прочитать. В случае ввода с клавиатуры положение курсора и текущей позиции совпадают.

Оператор readln может использоваться без списка переменных, тогда его выполнение просто приводит к переходу курсора на первую позицию следующей строки. В зависимости от типа переменной считывание значений происходит по-разному. Правила работы процедуры ввода удобно рассмотреть на примере работы процедуры ввода read(x) с одним параметром, поскольку действие процедуры ввода с несколькими параметрами эквивалентно работе нескольких процедур ввода с одним параметром, то есть

Read(a1,a2,..,an) эквивалентно Read(a1); read(a2), .., read(an) Readln(a1,a2,..,an) эквивалентно Read(a1); read(a2);, ..,

read(an); readln

1. x – символьная переменная (char).

1.1. Символ, находящийся в текущей позиции, присваивается переменной, заданной в качестве параметра процедуры (х).

1.2. Текущая позиция во входном файле передвигается на один символ.

2. Х – переменная целочисленного типа (integer).

2.1.Все пробелы и маркеры конца строки, предшествующие числу, пропускаются.

2.2.Читается целое число и процесс ввода завершается, когда очередной символ не может быть частью целого числа.

37

3. Х – переменная вещественного типа (real).

3.1.Все пробелы и маркеры конца строки, предшествующие числу, пропускаются.

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

Процедура readln без параметров пропускает остаток теку-

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

Пример:

Переменные a,b,c имеют тип Char, x,y - тип Integer, z - тип real. Входные данные:

_ _ 3_ _45_11<CR><LF> 1561_183_ _5<CR><LF>

_ _ _ 006_001<CR><LF>

(здесь символ _ означает один пробел ).

1.Записать значения этих переменных после выполнения следующих последовательностей операторов (значения символьных переменных заключаются в кавычки):

№1 read(a); read(b); read(x); read(y); readln (c ); read(z); Ответ: a = «_» , b = «_» , x = 3, y = 45, c = «_» , z = 1561.0 №2 read(x); read(y); read(z); read(a); read(b); read(c);

Ответ: x = 3 , y = 45 , z = 11.0 , a = не отображаемый символ с кодом 13 , b = не отображаемый символ с кодом 10 , c = «1».

№3 readln(x,a); read(b); readln; read(y,c,z);

Ответ: x = 3 , a = «_» , b = «1» , y = 6 , c = «_» , z = 1.0

2.Составить программу, использующую эти операторы (для №2).

program prim12;

{описание переменной f типа текстовый файл} var f:text;

a,b,c:char;x,y,z:integer; begin

{оператор assign связывает имя переменной f с текстовым фай-

38

лом textf} assign(f,'textf');

{оператор reset открывает файл, связанный с f} reset(f);

{чтобы программа считывала данные из файла, связанного с f, имя этой файловой переменной необходимо ставить перед списком вводимых переменных}

read(f,x);

read(f,y);

read(f,z);

read(f,a);

read(f,b);

read(f,c);

{теперь выведем значения переменных на экран} writeln('x=',x);writeln('y=',y);writeln('z=',z); writeln('a=',a); writeln('b=',b);writeln('c=',c);

{значения переменных a и b на экране не отобразятся, однако мы можем вывести

коды ASCII значений этих символьных переменных} writeln(ord(a)); writeln(ord(b));

end.

3. Записать представленную последовательность операторов в виде эквивалентной последовательности операторов процедур read с одним параметром и readln без параметров.

№1 Ответ: read(a); read(b); read(x); read(y); read(c ); readln ; read(z); №2 Ответ: read(x); read(y); read(z); read(a); read(b); read(c); (без изменений)

№3 Ответ: read(x) ; read(a); readln; read(b); readln; read(y); read ( c); read(z);

4.Записать представленную последовательность операторов в виде эквивалентной последовательности с минимально воз-

можным количеством процедур read и readln . №1 Ответ: readln(a,b,x,y,c); read(z);

№2 Ответ: read(x,y,z,a,b,c);

39

№3 Ответ: readln(x,a) ; readln(b); read(y,c,z);

Процедуры вывода

Вывод информации в Паскале обеспечивается двумя стандартными процедурами - write и writeln. Выполнение этих процедур приводит к выводу в выходной файл (по умолчанию - стандартный файл output, т.е. вывод на экран) параметров процедуры в том порядке, в котором они перечислены.

Исчерпав весь список параметров, оператор процедуры write завершает свою работу, и курсор остается в текущей строке, а выполнение writeln заканчивается переходом курсора в начало следующей строки. Употребление оператора процедуры writeln без параметров приводит к переходу курсора на следующую строку. Как и в случае процедур ввода, процедура вывода с несколькими параметрами эквивалентна действию нескольких процедур с одним параметром:

Write(a1,..,an) write(a1);..write(an) Writeln(a1,..,an) write(a1);..write(an);writeln

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

1.а (вывод без форматирования)

2.а: m

3.a: m : n

где а - параметр, m и n - выражения, которые должны принимать положительные целочисленные значения, и позволяют форматировать вывод .

1.а - вывод без форматирования: Значение параметра выводится, начиная с текущей позиции курсора, и занимает ровно столько позиций, из скольки символов это значение состоит, например:

Операторы

На экране (файл output)

write (‘Вывод строки символов’);

Вывод строки символов

x:=100;

 

write(x);

100

40