
- •Контрольная работа 1. Матрицы.
- •Задача 1.1.
- •Задача 1.2.
- •Var I, j, id, jd : word;
- •Var I : word;
- •I, j, n : word;
- •Задача 1.3.
- •Var I, j : word;
- •Var I, j : word;
- •I, k : word;
- •Var b : Tb; Var k : word);
- •Var hi, hj : integer; nw, I : word;
- •I, k : word;
- •Задача 1.4.
- •Var I, j, jmax: word;
- •Var j : word;
- •Var I, j : word;
- •Задания.
- •Контрольная работа 2. Одиночные классы.
- •Задача 2.1.
- •Interface
- •Implementation
- •Var bufdat : cDate;
- •Задания.
Var I : word;
Begin
for i:=1 to m do a[i,nr]:=rCol[i];
End;
// Глобальные переменные и основная программа.
Var a, buf : Ta;
b, x : Tb;
d, r : double;
I, j, n : word;
BEGIN
// Формирование и вывод матрицы коэффициентов.
n:=4;
InA(n,n,a);
OutA(n,n,a);
// Формирование и вывод вектора правых частей.
for i:=1 to n do b[i]:=10-20*random;
for i:=1 to n do writeln(b[i]:7:2);
writeln;
// Вычисление главного определителя
d:=DeltaP4(a);
// Вычисление частных определителей, нахождение решения // системы линейных уравнений и вывод результата
for i:=1 to n do
begin
buf:=a; ReplCol(n, n, buf, i, b);
x[i]:=DeltaP4(buf)/d;
writeln(' x[',i,']=',x[i]:7:2);
end;
writeln;
// Проверка точности решения.
for i:=1 to n do
begin
r:=0;
for j:=1 to n do r:=r+a[i,j]*x[j];
writeln(' abs(error)=',abs(r-b[i]):19:17);
end;
readln
END.
Задача 1.3.
Дана квадратная матрица n=8 с элементами типа INTEGER, значения которых совпадают с индексами и вычисляются по формуле i*10+j. Составить программу формирования вектора из элементов, находящихся при обходе ее по пути в виде буквы «Z».
Эта задача обычно не вызывает затруднений, если есть хотя бы небольшие навыки работы с индексами. Проще всего представить перемещения по матрице в виде движения по шахматной доске одиночного ферзя, который может двигаться только линейно, либо по горизонтали или вертикали, либо по диагонали. Следовательно, индексы элементов, лежащие на траектории движения, тоже изменяются линейно. Путь обхода состоит из трех таких линейных участков – верхней строки, побочной диагонали и нижней строки. Зная начальную и конечную пару индексов, нетрудно подобрать закон их изменения.
Для одномерного результирующего массива тип объявлен явно с запасом, но зато позволяет обойти всю матрицу целиком или не обходить ее вообще.
Листинг 1.3а. Вариант с подбором закона изменения индексов. Заголовок программы опущен.
Const n=8;
Type Ta = array[1..n, 1..n] of integer;
Tb = array[0..n*n] of integer;
// Процедура формирования матрицы.
Procedure InA(m, n : word; Var a : Ta);
Var I, j : word;
Begin
for i:=1 to m do
for j:=1 to n do a[i,j]:=10*i+j;
End;
// Процедура вывода матрицы.
Procedure OutA(m, n : word; a : Ta);
Var I, j : word;
Begin
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j]:4);
writeln;
end;
writeln;
End;
// Глобальные переменные и основная программа.
Var a : Ta; b : Tb;
I, k : word;
BEGIN
InA(n,n,a);
OutA(n,n,a);
k:=0;
for i:=1 to n-1 do
begin inc(k); b[k]:=a[1,i]; end;
for i:=n downto 2 do
begin inc(k); b[k]:=a[n+1-i,i]; end;
for i:=1 to n do
begin inc(k); b[k]:=a[n,i]; end;
for i:=1 to k do write(b[i]:3);
readln;
END.
Программа получилась достаточно компактная, но у нее есть один недостаток, на который можно не обращать внимания, пока количество линейных участков на пути обхода невелико. Каждый участок требует индивидуального подбора закона изменения индексов, и, с увеличением количества участков, это занятие становиться утомительным и служит источником дополнительных ошибок.
Суть предлагаемой модификации алгоритма заключается в отказе от «ручного» подбора закона изменения индексов в основной программе. Имеет смысл создать отдельную процедуру, которая, используя свойство линейности, формировала индексы по заданным индексам начала и конца участка.
Процедура AddWay добавляет к вектору b элементы матрицы a, лежащие на пути от элемента с индексами ia,ja до элемента с индексами ib,jb. Здесь следует подчеркнуть, что процедура именно добавляет элементы, а не формирует вектор заново, поэтому перед ее первым применением актуальная размерность вектора k должна быть установлена в нуль. Количество добавляемых элементов определяется как максимальное значение модуля разности индексов начала и конца участка. Далее определяются величина шага по горизонтали и вертикали, которые могут принимать дискретные значения -1, 0, +1. В конце процедуры идет стандартный цикл добавления элементов к существующему вектору. На выходе процедура передает через параметры новое состояние вектора b и его размерность k. В основной программе достаточно обратиться к процедуре три раза по числу участков. Первый участок заканчивается на единицу раньше, а третий – начинается на единицу позже, чтобы не было дублирования граничных элементов.
Листинг 1.3б. Вариант с заданием индексов начала и конца участка. Заголовок и процедуры ввода-вывода опущены.
Procedure AddWay(a : Ta; n : word; ia,ja,ib,jb : word;