Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_учебник_3.doc
Скачиваний:
33
Добавлен:
11.04.2015
Размер:
937.47 Кб
Скачать

Локальные переменные доступны только внутри процедур, в которых они определены!

А вот другой пример.

Рассмотрим следующую программу:

Var

s,t:real;

procedure ava(var z;real);

begin

z:=sqr(s)+sqr(t)

end;

Begin

Read(s,t);

ava(s);

ava(s);

Writeln(s)

End.

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

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

Пример 1

С использованием процедур без параметров оформить таблицу для вывода результатов при следующих вычислениях:

Таблица должна иметь следующий вид:

X

Y

Z

_____

_____

______

Решение

Так как в нашей таблице есть одинаковые строки, то вывод их удобно оформить один раз в виде подпрограмм-процедур, а в нужных местах программы поставить обращение к ним. У наc два вида строк повторяется в разных местах таблицы. Отметим на рисунке таблицы повторяющиеся строки разных типов знаками '+' и '~'.

1

- расставили номера позиций в строке для организации вывода таблицы

Наша таблица будет размещаться с левой стороны экрана с первой позиции.

11 21 31

-------------------------------------- +

! ! ! ! ~

! X ! Y ! Z !

! ! ! ! ~

-------------------------------------- +

! ! ! ! ~

! _____ ! ______ ! ______ !

! ! ! ! ~

-------------------------------------- +

Одна строка повторяется четыре раза, другая - три раза, следовательно, надо описать две процедуры: первая - будет выводить линию (строка отмечена плюсом на рисунке); вторая - будет выводить строку, отмеченную волной и имеющую вид:

! ! ! !

Напишем программу:

{ВЫВОД ТАБЛИЦЫ}

Var

x,y,z:real;

procedure LINIYA; {Рисуем линию}

Var

i:integer; { сама по себе }

begin { процедура не }

for i:=1 to 31 do { выполняется, }

Write('-') { пока к ней }

end; { не обратимся. }

procedure propusk;

begin

Writeln('!','!':10,'!':10,'!':10)

end;

Begin

Read(x);

if x>0 then y:=sqr(x)

else y:=x;

z:=cos(y)+x;

{ Вывод результатов в виде таблицы }

{ Сначала рисуем линию }

{ Она у нас вычерчивается в процедуре LINIYA, значит, чтобы ее начертить, к этой процедуре надо обратиться}

LINIYA;

{ Теперь надо нарисовать строку с пропусками, но т.к. после вычерчивания линии перевода строки не было, сделаем его }

Writeln;

propusk;

Writeln('!','X':5,'!':5,'Y':5,'!':5,'Z':5,'!':5);

propusk;

LINIYA;

Writeln;

propusk;

Writeln('!',X:8,'!':2,Y:8,'!':2,Z:8,'!':2);

propusk;

LINIYA

End.

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

procedure LINIYA;

Var

i:integer;

begin

for i:=1 to 31 do

write('-');

writeln

end;

В программе же уберем после вызова LINIYA оператор WRITELN.

В итоге программа будет иметь вид:

Var

x,y,z:real;

procedure LINIYA;

Var

i:integer;

begin

for i:=1 to 31 do

Write('-');

Writeln

end;

procedure propusk;

begin

Writeln('!','!':10,'!':10,'!':10)

end;

Begin

Read(x);

if x>0 then y:=sqr(x)

else y:=x;

z:=cos(y)+x;

LINIYA;

propusk;

Writeln('!','X':5,'!':5,'Y':5,'!':5,'Z':5,'!':5);

propusk;

LINIYA;

propusk;

Writeln('!',X:8,'!':2,Y:8,'!':2,Z:8,'!':2);

propusk;

LINIYA

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]