Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

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.

ЗАДАНИЯ

№1. Определить значение величины Z:

Var

A,B,Z:real;

Function F(x,y:real):real;

begin

f:=(x+y)/2

end;

Begin

A:=0;

B:=4;

Z:=F(a,b)+a/b;

Writeln(z)

End.

Давайте напишем структурную схему к заданию №1, для того, чтобы показать, как в схемах оформляются подпрограммы-функции и обращение к ним:

СТРУКТУРНАЯ СХЕМА ГЛАВНОЙ ПРОГРАММЫ

 


FUNCTION F(X,Y)

 

 

№2. Определить значение величины R:

Var

R,x,y:real;

Function UR(u,v:real):real;

begin

UR:=sqr(u)-sqr(v)

end;

Begin

x:=2;

y:=3;

R:=UR(UR(x+1,y-1),UR(5,3))+200;

Writeln(R)

End.

№3. Есть подпрограмма-функция FORM1:

Function FORM1(a,b,c:real):real;

begin

form1:=a+b/c-5

end;

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

RZ(p,Q)=-Q/2+sqrt(p).

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

D15=3+F*(u+v+3/g-5);

x2=u/((-z)/2+sqrt(sqr(a)+sqr(b)));

ABC=(-25/2+sqrt(z))*(7,8+x/25-5);

Recur=u+v/W-5+R/S-5.

На О.О.Ф. не исследовать. Считать, что все исходные данные удовлетворяют О.О.Ф.

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

y=COS 2+ln(5+x);

z=COSz1+ln(8x-8)+24.

На О.О.Ф. не исследовать. Считать, что все исходные данные удовлетворяют О.О.Ф.

№5. Диагональ делит выпуклый четырехугольник на два треугольника. Найти площадь четырехугольника ABCD, если известны длины всех его сторон и AC.

B

А C

D

№6. Определить значение переменной N1, которое будет вычислено в результате выполнения следующей программы:

Type

MAS=array[1..5] of integer;

Var

M:MAS;

K,N1:integer;

function F(K:MAS;N:integer):integer;

var

j,u:integer;

begin

u:=0;

for j:=1 to n do

u:=u+k[j];

F:=u end;

Begin

for k:=1 to 5 do

M[k]:=k;

N1:=F(m,5);

Writeln(N1)

End.

№7. Задана подпрограмма-функция, предназначенная для вычисления значения следующего выражения:

тип задан в главной программе

Function PROIZV(a:mas;N:integer):real;

var

P:real;

i:integer;

begin

P:=1;

for i:=1 to n do

p:=p*a[i];

proizv:=p

end;

Составить главную программу, которая с использованием подпрограммы-функции PROIZV будет вычислять значения величин:

№8. C использованием function вычислить

№9. В программе описаны три процедуры:

PROCEDURE P(x,y:integer);

begin

y:=x+1

end;

PROCEDURE Q(x:integer;var y:integer);

begin

y:=x+1

end;

PROCEDURE R(var x,y:integer);

begin

y:=x+1

end;

Правильны ли следующие обращения к процедурам? Если да, определить, что будет выдано на экран.

а) c:=2;

d:=0;

P(sqr(c)+c,d);

writeln(d);

б) c:=2;

d:=0;

Q(sqr(c)+с,d);

writeln(d);

в) c:=2; d:=0;

R(sqr(c)+c,d);

writeln(d);

№10. Определить, что будет выдано на экран в результате выполнения следующей программы:

Type

vect=array [1..2] of real;

Var

a:vect;

i:integer;

procedure R(var k:integer; var x:real);

begin

k:=2;

x:=0;

end;

Begin

a[1]:=1;

a[2]:=2;

i:=1;

R(i,a[i]);

Writeln(a[1],a[2])

End.

Напишем структурную схему к программе задания №140 для того, чтобы показать, как в схемах оформляются процедуры и обращения к ним:

СТРУКТУРНАЯ СХЕМА

ГЛАВНОЙ ПРОГРАММЫ

 

№11. Что будет выдано на экран следующей программой:

Var

a,b,c,d:integer;

procedure P(var b:integer; c:integer);

Var

d:integer;

begin

a:=5;

b:=6;

c:=7;

d:=8;

writeln(a,b,c,d)

end;

Begin

a:=1;

b:=2;

c:=3;

d:=4;

P(a,b);

Writeln(a,b,c,d)

End.

№12. Выполнить задание №4 с использованием процедур.

№13. Есть процедура, вычисляющая сумму элементов вектора Х:

тип описывается в главной программе

Procedure KR(X:MAS;N:integer;var S:real);

var

i:integer;

begin

S:=0;

For i:=1 to N do

s:=s+x[i]

end; {KR}

Составить программу с использованием описанной выше процедуры для нахождения суммы элементов одномерного вектора Y, в котором 10 элементов, а также определить значение величины

№14. Пусть элементами круга являются: радиус (первый элемент) и диаметр (второй элемент). Составить подпрограмму, которая по номеру N одного из элементов и его значению вычисляла бы площадь круга (процедуру и функцию).

№15. Вычислить с использованием процедур и функций (два варианта) значение выражения:

№16. Cоставить программу для вычисления величины

В программе использовать процедуру.

№17. Составить подпрограмму, которая вычисляла бы сумму элементов некоторого столбца матрицы А размером [NxM]. C ее помощью вычислить сумму элементов пятого столбца матрицы Р размером [12x15] и 10 столбца этой же матрицы (задачу решить двумя способами: с помощью процедур и функций).

№18. Дана матрица 8х8, отображающая содержимое шахматной доски: 0 - нет фигуры, 1 - черные фигуры (их более 1), 2 - белая ладья (одна). Королей нет. Составить программу с использованием процедуры для определения количества черных фигур, стоящих под боем у белой ладьи.

№19. Для трех двухмерных массивов V(5,6), Y(7,3), F(4,10) найти средние арифметические значения элементов во всех строках всех массивов.

№20. Для трех двухмерных массивов A(6,5), B(4,7), C(7,4) найти средние арифметические значения элементов во всех столбцах всех массивов.

№21. Для трех двухмерных массивов D(3,9), E(5,5), F(6,10) найти средние арифметические значения элементов каждого массива.

№22. Для трех двухмерных массивов G(4,4), H(7,7), J(6,6) найти среднее арифметическое значение элементов всех массивов.

№23. Что будет на экране в результате выполнения следующих программ:

a) Uses crt;

Var

i,j:integer;

Function a(f:integer):integer;

function b(d:integer):integer;

begin

if d>5 then b:=10*d;

end;

begin

inc(f);

a:=b(i);

end;

Begin

clrscr;

Read(i);

Write(a(i),' ',i);

Readkey

End.

при 1) i=5;

2) i=10;

3) i=0?

б) Uses crt;

Var

i,j:integer;

Function a(f:integer):integer;

function b(d:integer):integer;

begin

if d>5 then b:=10 mod d

else b:=d div 3

end;

begin

inc(i);

f:=b(i);

a:=f-i

end;

Begin

clrscr;

Read(i);

Writeln(a(i),' ',i);

i:=a(i);

Writeln(a(i),' ',i);

Readkey

End.

при 1) i=5;

2) i=10;

3) i=0?

№24. Покажите, что выведет на экран следующая программа:

Program sample;

Var

x,a,variant:integer;

function recurs(z:integer):integer;

begin

if z<=5 then

recurs:=3

else

if z>=10 then

recurs:=10

else

recurs:=2*recurs(z-1)

end; {recurs}

Begin

Readln(variant);

x:=recurs(variant);

Writeln('x=',x);

x:=x-3;

x:=recurs(x);

Writeln('x=',x);

x:=x+variant;

a:=recurs(x);

Writeln('a=',a)

End.

при 1) variant=10;

2) variant=5;

3) variant=7.

№25. Перепишите заново функцию recurs из №24, не пользуясь рекурсией.

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

№27. Имеется следующая рекурсивная функция:

function testrec(number:integer):integer;

begin

if number=0 then

testrec:=0

else

testrec:=testrec(number-1)

end; {testrec}

а) Определите результаты трех вызовов testrec:

1) z:=testrec(3);

2) z:=testrec(4);

3) z:=testrec(6)

б) Какую математическую функцию реализует подпрограмма testrec?

в) Перепишите программу testrec, чтобы она делала то же самое, но без использования рекурсии.

9. ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННЫХ ПЕРЕЧИСЛЯЕМОГО ТИПА

Перечисляемый тип (или перечислимый) описывается путем перечисления имен КОНСТАНТ, представляющих упорядоченное множество его значений.

Первая константа имеет порядковый номер 0, вторая - 1 и т.д.

Пример:

type

Color=(White,Red,Blue,Yellow,Purple,Green,Orange,Black);

Day =(Mon,Tue,Wed,Thu,Fri,Sat,Sun);

В перечислении все имена должны быть различными.

Пример неправильного описания:

type Workday=(Mon,Tues,Wed,Thur,Fri,Sat);

Free=(Sat,Sun);

В данном случае описание неверно, так как тип константы Sat определен неоднозначно.

Стандартный тип Boolean можно было бы описать так:

type Boolean=(false,true);

На множестве значений любого перечисляемого типа определе­ны все возможные операции отношения _,!=, <>, <, <=, >= и >. Необходимо, чтобы оба операнда относились к одному и тому же типу. Значения порядковых номеров констант определяются очередностью их записи при описании типа.

На множествах значений порядковых типов определены стан­дартные функции:

ord(X) - порядковый номер X, например ord(Blue)=2;

pred(X) -значение, предыдущее X, например pred(Blue)=Red;

succ(X) -значение, следующее за X, например succ(Blue)=Yellow.




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 443; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.162 сек.