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

Paskal_ucheb_posob_ch1_21_11_2011

.pdf
Скачиваний:
47
Добавлен:
09.04.2015
Размер:
943 Кб
Скачать

81

Упражнение 45.

Дана вещественная матрица 20x30, упорядочить ее строки по неубыванию первых элементов.

Program SQR;

Const N=20; M=30;

Type stroka=array[1..M] of real; matrica=array[1..N] of stroka; Var A : matrica; X : stroka; I,J,K: integer;

Begin

for I:=1 to n do

for J:= 1 to m do read( A[I,J] ) ;

for K:=N downto 2 do (* сортировка выбором*)

begin

(*поиск j-го номера max A[1..k,1]*)

J:=1; for I:=2 to K do

 

if A[I,1]>A[J,1] then

J:=i; (*перестановка

x:=A[K]; A[K]:=A[J];

i-ой и j-ой

A[J]:=X;

строки*)

end; for I:=1 to N do

 

begin

 

 

writeln(I,'-

stroka');

 

for J:=1 to M do write(A[I,J]); end End.

Упражнение 46.

Дан двумерный массив размерностью ММ[6,10]. Нужно суммировать положительные элементы каждой строки матрицы и сформировать из полученных сумм вектор VV.

Program vectorVV;

type mat1=array[0..5,0..9] of integer; vek1=array[0..5] of integer;

var mm:mat1; vv:vek1; s,i,j:integer;

Begin

for i:=0 to 5 do

82

for j:=0 to 9 do readln(mm[i,j]); for i:=0 to 5 do begin

s:=0;

for j:=0 to 9 do

if mm[i,j]>0 then s:=s+mm[i,j]; vv[i]:=s;

end;

for i:=0 to 5 do writeln(vv[i]) end.

Упражнение 47.

Дан двумерный массив вещественных чисел, содержащий 5 строк и 4 столбца. Строку, содержащую максимальный элемент массива, поменять местами со строкой, содержащий минимальный элемент.

Program smena;

type mmm=array[1..4] of real; var m:arrray[1..5] of mmm;

m1:mmm;

max,min:real;

maxi,mini:integer; Begin

writeln('введи исходный массив'); for i:=1 to 5 do

for j:=1 to 4 do readln(m[i,j]); max:=m[1,1]; min:=m[1,1]; maxi:=1; mini:=1;

for i:=1 to 5 do

for j:=1 to 4 do begin

if max<m[i,j] then begin max:=m[i,j]; maxi:=i;

end;

if min>m[i,j] then begin min:=m[i,j]; mini:=i;

end;

end;

m1:=m[maxi];

m[max]:=m[mini];

m[mini]:=m1;

83

writeln('массив после перестановки'); for i:=1 to 5 do begin

for j:=1 to 4 do write(m[i,j]);

writeln;

end;

end.

84

ЛЕКЦИЯ 12. ПРОЦЕДУРЫ И ФУНКЦИИ.

Описание процедуры. Оператор процедуры.

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

Общая форма записи заголовка процедуры:

PROCEDURE <имя>(<список формальных параметров>);

Список формальных параметров может включать в себя параметрызначения, параметры-переменные(перед ними должно стоять служебное слово VAR ), параметры-процедуры(перед ними должно стоять служебное слово PROCEDURE ).

После заголовка процедуры следуют разделы в том же порядке, что и в программе.

Вызов и выполнение процедуры осуществляются при помощи оператора процедуры:

<имя процедуры>(список фактических параметров>);

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

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

85

Например, ниже приведена программа, которая в первой вводимой с терминала строке подсчитывает количество точек, а во второй - количество букв 'А'. Подсчет символов реализован в процедуре ПОДСЧЕТ.

PROGRAM ПОД (INPUT,OUTPUT);

CONST ТОЧКА='.';

VAR S:INTEGER;

PROCEDURE ПОДСЧЕТ(СИМ:CHAR;

VAR КОЛ:INTEGER);

VAR C:CHAR;

BEGIN КОЛ:=0;WRITELN('Вводи строку');

REPEAT READ(C);

IF C=СИМ THEN КОЛ:=КОЛ+1

UNTIL EOLN

END;

BEGIN READLN;

ПОДСЧЕТ(ТОЧКА, S);

WRITELN('Кол-во точек=',S);

ПОДСЧЕТ('A',S); WRITELN('Кол-во букв А ',S)

END.

Процедура ПОДСЧЕТ имеет два формальных параметра: СИМ - входной параметр (параметр-значение) определяет символ, который подсчитывается в строке, и КОЛ - выходной параметр (параметр-переменная), через который передается в основную программу количество подсчитанных символов. Для того чтобы результат работы процедуры ПОДСЧЕТ был доступен в программе, он передается по ссылке. Фактический параметр, соответствующий формальному параметру СИМ, при первом вызове процедуры задается именем константы, определенной в основной программе, а при втором вызове - в явном виде. Обе формы задания правильны, так как в качестве фактического параметра, передаваемого по значению, может использоваться произвольное выражение соответствующего типа.

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

ОПРЕДЕЛЕНИЯ:

86

1. Переменные, описанные внутри процедур и функций, называются ЛОКАЛЬНЫМИ. Они порождаются при каждом входе в процедуру и уничтожаются при выходе из процедуры, т.е. локальные переменные существуют только при выполнении процедуры и недоступны в основной программе.

В языке ПАСКАЛЬ допускается любой уровень вложенности процедур и функций. Например, процедура, описанная в основной программе, в свою очередь, имеет описания внутренних процедур или функций. Для таких сложных программ имеются правила локализации имен, определяющие область действия любого имени.

2. Любое имя (константы, типа, переменной, процедуры или функции) определено только в пределах той процедуры или функции, в которой оно описано. Область действия распространяется на все внутренние процедуры или функции.

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

ПРАВИЛА.

1.Количество формальных и фактических параметров должно быть одинаково.

2.Порядок их следования - один и тот же.

3.Каждые формальный и фактический параметры должны совпадать по типу.

Упражнение 48.

Изменить процедуру "ПОДСЧЕТ" таким образом, чтобы она выдавала результат своей работы через глобальную переменную S.

PROGRAM POD1(INPUT,OUTPUT)0;

CONST ТОЧКА='.';

VAR S:INTEGER;

PROCEDURE ПОДСЧЕТ(СИМ:CHAR);

VAR C:CHAR;

BEGIN

S:=0;WRITELN('введите строку');

REPEAT READ(C);

87

IF C=СИМ THEN S:=S+1; UNTIL EOLN;

END;

BEGIN ПОДСЧЕТ(ТОЧКА);WRITELN('.-',S); 1:

ПОДСЧЕТ('A');WRITELN('A-',S); END.

88

ЛЕКЦИЯ 13. Часть 1. Описание функций.

Описание функций аналогично процедурам.

Результатом работы функции является одно cкалярное значение или одно значение ссылочного типа. Тип результата задается в заголовке функции.

FUNCTION <ИМЯ>(<cписок форм. парам.>):<тип результата>);

ПРАВИЛА

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

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

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

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

89

СЕМИНАРЫ. ЧАСТЬ VI.

Процедуры и функции.

Упражнение. 49.

Написать программу, которая вычисляла бы выражение:

Z = ( Sign X + Sign Y ) * Sign ( X+Y );

-1 a < 0 Sign a = 0 a = 0 .

1 a > 0

PROGRAM Sign ;

VAR X,Y,Z,a: REAL;

FUNCTION Sign(a:REAL):INTEGER;

BEGIN

IF a<0 THEN Sign:=-1 ELSE

IF a>0 THEN Sign:=1 ELSE

Sign:=0

END;

BEGIN

READ(X,Y);

Z:=(Sign(X)+Sign(Y))*Sign(X+Y));

WRITELN(Z)

END.

Упражнение 50.

Написать программу , которая вычисляла бы выражение:

Y = Sh(X) + tg2(X+1) - tg (2+Sh(X-1));

PROGRAM Shtg;

VAR X,Y:REAL;

90

FUNCTION Sh(Z:REAL):REAL;

VAR e:REAL;

BEGIN e:=exp(Z);

Sh=(e-1/e)/2

END;

FUNCTION tg(Z:REAL):REAL;

BEGIN tg:=Sin(Z)/Cos(Z)

END;

BEGIN

READ(X)

Y:=Sh(X)+tg(X+1)-SQR(tg(2+Sh(X-1)));

WRITELN(Y)

END.

Упражнение 51.

Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник напечатать площадь данного треугольника Определить процедуру, которая печатает площадь S треугольника, если таковой существует.

PROGRAM SQUE VAR a,b,c,d:REAL;

PROCEDURE PRINSQ(x,y,z:REAL); VAR p:REAL;

BEGIN

IF (x+y>z) AND (y+z>x) AND (z+x>y) THEN BEGIN p:=(x+y+z)/2; WRITELN(SQRT(p+(p-x)*(p-y*(p-z)));

END

ELSE WRITE('S=?'); END;

BEGIN

READLN(a,b,c,d);

PRINSQ(a,b,c);

PRINSQ(a,b,d);

PRINSQ(a,c,d);

PRINSQ(b,c,d);

END.

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