Алгоритм построения, обработки и преобразования матриц

Пример 10Ж ввод вещественной матрицы A(n x m).

writeln(‘Enter matrix ‘);

forI := 1 ton do{перебор строк}

Begin

forj := 1 tom do{перебор элементов строк}

read(a[i, j]);

readln;{переход к следющей строке}

end;

В соответствии с данными операторами матрица вводится построчно ввод строки нажатием клавиши .

Пример. Фрагмент программы по определению для заданной матрицы A(NxM) наибольшего значения из сумм элементов столбцов с указанием номера этого столбца.

{определение суммы элементов первого столбца}

S:=0;

fori:= 1 toN doS:=S+A[I,1]

Max:=S;{наибольшее значение из сумм элементов столбцов}

J_max:=1;{номер столбца с наибольшей суммой элементов}

forJ:=2 toM do{просмотр столбцов}

Begin

S:=0;{Сумма элементов J-столбца}

forI:=1 ton doS:=S+A[I,J];

Ifs max then

Begin

Max:=s:J_max:= j;

end;

end;

writeln(‘Наибольшая сумма элементов’,max,’в столбце’,j_max);

Задачи:

1)построение матрицы по заданной формуле для элемента

2)алгоритмы нахождения суммы, произведения, минимума, максимума организация счетчика для матрицы, для части матрицы, для строки, для столбца.

3)Менять строки и столбцы местами, вычеркивать строки и столбцы.

4)Умножение матрицы на вектор, на матрицу, сумма матриц, транспонирование матрицы, получение обратной матрицы.

Типизированные константы массивы

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

:=();

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

Пример: Задание в качестве типизированной константы одномерного массива их шести вещественных чисел.

Const

N=6;

Type

T_array = array[1..n] ofreal;

Const

A:T_array= (13.43,0.0,-1.0,10.0,-13.8,6.0);

Аналогично задаются типизированные константы для матриц:

:=((), . . , ())

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

array[1..n] of array[1..M].

Пример: Задание в качестве типизированной константы единичной матрицы A(4×4).

array[1..n] of array[1..M].

Const

n=4;

Type

T_matr= array[1..n,1..n] ofbyte;

Const

a:t_matr=(…..)

особенности компилятора TP при обработке массивов

1)Работа с элементами массива идет медленнее, ччем с простой переменной

2)Если индекс задается Const, то местоположение элемента определяется один раз на этапе компиляции,

Если индекс задается выражением или переменной, то местоположение элемента определяется каждый раз.

3){$R+} – устанавливает проверку всех индексов на заданные границы(устанавливают на время отладки)

{$R-} – снимает проверку(устанавливают при счете).

Var A:array[0..9] of integer

B:=A[10] – ошибка на этапе компилирования не обнаружится

B:=A[i+1] – индекс на этапе компилирования не анализируется,если

I=10 – ошибка на этапе счета

B:A[11] – ошибка счета.

Обработка текстов.

Тип string.

Var

1)s:string;

2)s:string[n];

S[0]- фактическая длина строки в литерном виде.

Ord(S[0]) – числовое значение дл. Строки

1)сравнение S:=’ABCDEF’; s:’ABCDFG’;

2)Строки можно обрабатывать посимвольно: s[i]

3)S:=;

4)Операция + s:=s1+s2;

Var

s:string;

s1,s2: string[7];

Begin

s1:=’123456′;

s2:=’ABCDEF’;

s:=s1+s2;

(s:=’123456ABCD’)

При вводе строк с клавиатуры следует учитывать что длинна буфера ввода составляет 128 символов, поэтому при использовании оператора Readln(S),

В строку S может быть введено не более 127 символов.

1)k:=length(s); k:(byte)

2)s:=concat(s1,s2,s3….sn);

3)s1:=copy(s,n,m); {слияние нескольких строк в одну}

s:=’Turbo Pascal7′;

s1:=copy(s,7,6); s:=’Pascal’;

4)Функция определения строки S1 в строку S: pos(s1,s);

Процедуры обработки строк.

1) Удаление из строки S некоторой её части: delete(s,n,m)

2) Включениие строки S1 в строку s начиная с n позиции insert(s,n,m)

3) Процедура перевода числа x в строку S str(x,s)

4) Процедура перевода строки S в число x val(s,x,k) k – параметр целого типа фиксирует наличие ошибки k = 0 если нет ошибок k=номеру позиции то строка не может быть преобразована.

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

Пример: Дана строка символов. Группы символов, разделенные пробелами, будем называть словами. Найти наибольшую длину слов палиндромов(перевертышей). Если палиндромов нет, то ответом должно быть число 0.

Процедуры.

1)Заголовок процедуры или функции с описанием формальных параметров.

2)назначение.

3)Спецификация.

Спецификация:

Имя Тип Назначение

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

В Паскале существуют подпрограммы двух типов: процедуры и функции.

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

Синтаксис описания процедур.

**Процедура. Может иметь несколько выходных параметров.

ОПИСАНИЕ

{Заголовок}

procedure();

{раздел описания локальных объектов}

{раздел операторов}

Begin

end;

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

();

Понятие процедуры и основные определения.

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

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

**Алгоритм, непосредственно обрабатывающий конкретные данные и содержащий обращение к процедуре, или вызов, называется вызывающим, или главным.

**Исходные данные, или аргументы, и выходные данные, или результаты процедуры, при описании процедуры могут быть представлены в специфическом виде – в виде параметров – как описание и перечисление «мест», куда при выполнении процедуры должны быть подставлены фактические обрабатываемые данные.

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

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

Внутренние объекты процедуры, т.е. определяемые внутри процедуры, называются локальными (аналог промежуточных данных). Это – «собственные» объекты процедуры, не связанные с вызывающим модулем и недоступные в нем.

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

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

**Выполнение процедуры происходит так, как если бы вместо формальных параметров при вызове были подставлены фактические. А затем выполнялся бы алгоритм процедуры; таким образом, обрабатываются фактические параметры по алгоритму. Записанному для формальных параметров.

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

Связь между процедурой и основной программой.

1) С помощью механизма параметров. Там где возможно передавать результаты через фактические параметры-переменные.

2) С помощью глобальных переменных.

Злоупотребление глобальными связями делает программу запутанной, трудной в понимании, сложной в отладке.

Виды формальных параметров.

1) Параметры значения (с авторской версии), (входные) (A,B,C:; E,P:;…)

2) Параметры-переменные (выходные) (var A,B,C: ;….)

3)Параметры-const (const A,B,C:;…)

В качестве типа используется любой простой тип, string, file.

Если тип структурированный – указывается имя типа, а сам тип объявляется в основной программе.

4) Без типовые параметры (var A,B,C..)

5) Открытые параметры массивы (для одномерных) (var A:array of ;….)

6)Открытые строки (var S:openstring;….)

7)Процедурные и функциональные параметры.

Распределение памяти.

Все глобальные переменные программы и типизированные константы всех уровней вложенности размещаются в одном сегменте данных(64кб).

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

Пример: в массивах a(5,6)b(3,8) найти сумму положительных элементов каждой строки.

programex1;

Const

m = 8;

n = 5;

Type

matr = array[1..n, 1..m] ofreal;

vek = array[1..n] ofreal;

Var

a, b: matr;

va, vb: vek;

procedureenter(varc: matr; k, p: byte);

Var

i, j: byte;

Begin

writeln(‘enter array’);

fori := 1 tok do

Begin

forj := 1 top do

read(c[i, j]);

readln;

end;

end;

proceduresum(varc: matr; k, p: byte; varvc: vek);

Var

i, j: byte;

s: real;

Begin

fori := 1 tok do

Begin

s := 0;

forj := 1 top do

ifc[i, j]0 thens := s + c[i, j];

vc[i] := s;

end;

end;

procedure out(varvc: vek; k: byte);

Var

i: byte;

Begin

write(‘sum’);

fori := 1 tok do

write(vc[i],’ ‘);

end;

Begin

enter(a, 5, 6);

enter(b, 3, 8);

sum(a, 5, 6, va);

sum(b, 4, 8, vb);

out(va, 5);

out(vb, 3);

end.

Передача параметров – значений и парамметров – переменных

Механизмы передачи в процедуру параметров-переменных и параметров-значений принципиально отличается.

1) Если формальный параметр – параметр-переменная, то соответствующий ему фактический параметр – тоже переменная. Память отводится только под фактический параметр и процедуре предоставляется право работать с ним. При передаче параметров – переменных перед выполнением процедуры устанавливается ссылка на переменную – фактический параметр; иначе говоря, в процедуру передается адрес фактического параметра. Все действия процедуры, таким образом, выполняется над фактическим параметром. Если значение фактического параметра меняется , то это изменённое значение доступно в программе после завершения работы процедуры.

Поэтому выходные параметры процедуры необходимо специфицировать как параметры –переменные.

Следствие. Как var можно описывать входные массивы – параметры с целью экономии памяти (чтобы они не копировались во временную память) и времени на копирование.

2) Если формальный параметр – параметр-значение, то соответствующий ему фактический параметр может быть:

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

Обычно входные параметры процедуры делают переменными значениями.

programpp;

Var

x, y, z: real;

procedurep(vara: real; b: real);

Var

z: real;

Begin

z := a;

a := b;

b := z;

end;

procedureq(vara: real; b: real);

Begin

z := a;

a := b;

b := z;

end;

Begin

x := 1.1;

y := 2.2;

z := 3.3;

p(x, y);

writeln(x,’ ‘, y,’ ‘, z);

x := 1.1;

y := 2.2;

z := 3.3;

q(x, y);

writeln(x,’ ‘, y,’ ‘, z);

end.

На момент работы процедуры одноименная локальная переменная экранирует(закрывает) глобальную переменную.

Имена объектов описанных в некоторой подпрограмме считаются известными в пределах этой подпрограммы, включая все вложенные подпрограммы.

Функция. Вычисляет единственное значение.

Описание

{Заголовок}

Function():;

{раздел описания локальных объектов}

{раздел операторов}

Begin

:=

End;

Здесь ::=

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

::=()

programm1;

Const

n = 20;

Type

vek = array[1..n] ofinteger;

Var

x, y: vek;

u: integer;

procedurewwod(varc: vek);

Var

i: byte;

Begin

fori := 1 ton do

read(c[i]);

readln;

end;

functionspr(k, m: byte; varp, q: vek): integer;

Var

s: integer;

i: byte;

Begin

s := 0;

fori := k tom do

s := s + p[i] * q[i];

spr := s;

end;

Begin

wwod(x);

wwod(y);

ifspr(1, 15, x, y)0 thenu := spr(1, 20, x, y)

elseu := spr(10, 20, y, y);

writeln(‘u=’, u);

end.

Процедурный тип.

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

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

Определение такого типа аналогично заголовку подпрограммы, но без указания имени.

type{Процедурный тип}

PROC = procedure();

PP = Procedure;

{функциональный тип}

FUN = function():;

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

1)Элементами процедурного типа являются процедуры и функции, заголовки которых совпадают с заголовками в разделе type.

2)Допустимы операторы присваивания, в правых частях которых находятся идентификаторы подпрограмм.

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

Type

op=function(x,y:real):real;

Var

proces:op;

functionsum(a,b:real):real;

far;

Begin

sum:=a+b;

end;

functiondelen(a,b:real):real;

far;

Begin

delen:=a/b;

end;

begin….

ifvslov thenproces:=sum

elseproces:=delen;

write(proces(25.2,2.5+x));

….

end.

Конструкция proces(25.2,2.5+x) вызывает активизацию той функции, которая была присвоена переменной proces.

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

Пример.

Составить, универсальную процедуру печати значения для любых функций при х изменяющемся от a до b с шагом h. F1=x^4+x^2; f2=sinx*cosx;

programex1;

Type

fan= function(x:real):real;

{$F+} -//компиляция в режиме дальнего вызова.

functionf2(x:real):real; far

Begin

f2:=sin(x)+cos(x);

end;

functionf1(x:real):real; far;

Begin

f1:=sqr(sqr(x))+sqr(x);

end;

{$F-}

procedureTAB(f:fan; a,b,h:real);

Var

x:real;

l,n:word;

Begin

n:=round((a-b)/h);

x:=a;

fori:=0 ton do

Begin

writeln(x:12.f(x):14);

x:=x+h;

end;

end;

{main programm}

Begin

……

TAB(f2,0,1,0.1);

TAB(f1,5,7,0.1);

……

end.

Рекурсивные алгоритмы.

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

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