IPB
ЛогинПароль:

> Внимание! Действует предмодерация

Подраздел FAQ (ЧАВО, ЧАстые ВОпросы) предназначен для размещения готовых рабочих программ, реализаций алгоритмов. Это нечто вроде справочника, он наполнялся в течение 2000х годов. Ваши вопросы, особенно просьбы решить задачу, не пройдут предмодерацию. Те, кто наполнял раздел, уже не заходят на форум, а с теми, кто на форуме сейчас, лучше начинать общение в других разделах. В частности, решение задач — здесь.

> Массивы. Матрицы. Типичные задачи.
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Содержание:
----- ----- ----- ----- -----


Одномерные и многомерные массивы (матрицы) в Паскале.


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

<имя типа> = ARRAY [<сп.индексов типов>] OF <тип>


Где
<имя типа> - правильный идентификатор.
ARRAY, OF - зарезервированные слова (массив, из)
[<сп.индексов типов>] - список из одного или нескольких индексных типов. (задается размерность массива)
<тип> - любой тип Паскаля, кроме файлового.
После описания типа массива, можно описывать переменные этого типа.

Можно не описывать отдельно тип массив, а описать конкретную переменную, как переменную типа массив:

<variable> : Array[<index>] OF <type>

Где
<variable> - правильный идентификатор.
Array, OF- зарезервированные слова.
<index> - индекс задающий размерность массива.
<type> - любой тип Паскаля, кроме файлового.

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

Вложенные массивы или многомерные или матрицы


Собственно определение матрицы - прямоугольная сетка чисел, справедливо и для многомерных массивов. По сути это и есть матрица.

Задать матрицу в Паскале можно следующим образом:
const
NN = 10; MM = 10;
type
matrix = array[1..NN] of array[1..MM] of integer;

В данном случае мы описали матрицу размеров NNxMM.
Т.е. матрица в понимании компилятора - это массив из массивов.

[e1,1] [e1,2] [e1,3] ... [e1,NN]
[e2,1] [e2,2] [e2,3] ... [e2,NN]
...
[eMM,1] [eMM,2] [eMM,3] ... [eMM,NN]

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

Если в программе два массива заданы одинаково, то одному массиву можно присвоить другой.
К элементам массива обращаются по индексам.
Пример.
{вывод на экран элемент массива A с индексом 5}
write(A[5]);

{ввод элемента массива A с индексом 6}
readln(A[6]);

{
присваиваем элементу массива с индексом 7 сумму эл-тов
массива A с индексами 5 и 6
}
A[7]:=A[5]+A[6];


Нуль-основанный символьный массив - это такой массив, в котором индекс первого элемента
равен нулю, а последнего - положительному ненулевому целому числу. Например:

Array [0..X] Of Char;


Если вы включаете расширенный синтаксис (с помощью директивы компилятора {$X+}), то
нуль-основанный символьный массив может быть инициализирован строкой, длина которой меньше
чем объявленная длина массива.
(в нулевом элемент такого массива хранится длинна строки. см. FAQ по строкам)

Работа с матрицами, ввод матрицы, операции над матрицами, распространенные задачи с матрицами.

Матрица - прямоугольная сетка чисел. Элементы матрицы - числа.
Каждый элемент матрицы имеет два индекса - номер строки и номер столбца, в котором он расположен.
Принято сначала указывать индекс строки, а затем индекс столбца.
Создадим тип матрицы:
const
NN = 10; { число СТРОК! }
MM = 10; { число СТОЛБЦОВ! }
type
TElem = integer;
Matrix = array[1..NN, 1..MM] of TElem;

Очень часто при решении задач, необходимо проходить по всем элементам строки\столбца\строк и столбуов.
Для этого используют цикл со счетчиком. (FOR ... TO ... DO )

Ввод матрицы:
Опишем процедуры ввода и вывода на экран матрицы.

const
NN = 10; { число СТРОК! }
MM = 10; { число СТОЛБЦОВ! }
type
TElem = integer;
Matrix = array[1..NN, 1..MM] of TElem;

(* Построчный ввод матрицы *)
Procedure ReadMatr(var A:Matrix; var n,m:word );
var i, j: word;
begin
repeat
write('Введите количество строк: '); readln(N)
until (N>0) and (N<=NN);
repeat
write('Введите количество столбцов: '); readln(m)
until (M>0) and (M<=MM);
For i:=1 to n do begin
For j:=1 to m do begin
write('A[',i,j,']= '); readln(A[i,j])
end
end
end;

(* Построчный вывод матрицы *)
Procedure PrintMatr(A:Matrix; n,m:word);
Var i, j: word;
begin
For i:=1 to n do begin
For j:=1 to m do write(A[i,j],' ');
writeln
end
end;

{ тестовая программа}
var
n, m: word;
a: matrix;
begin
Readmatr(a,n,m);
PrintMatr(a,n,m)
end.


Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Как вычислить ранг матрицы

(by SKVOZNJAK)
Исходный код
const
max_rows = 3;
max_cols = 4;
MaxNij=4;

type
TType = real;
mxType =
array[1 .. max_rows, 1 .. max_cols] of TType;

{ Матрица, ранг которой требуется определить }
const
arr: mxType =
(( 1, -2, -3, 0),
( 2, 3, 8, 7),
(-1, 1, 1, -1));

{ Дополнительные функции }
function incr_(var x: integer): integer;
begin
incr_ := x; inc(x)
end;
function decr_(var x: integer): integer;
begin
decr_ := x; dec(x)
end;
function minusOnePower(n: integer): integer;
begin
minusOnePower := (1 - 2*byte(odd(n)));
end;

{ Нахождение определителя матрицы }
function opr(const a: mxType; k: word): TType;
var
B: mxType;
i, j, E: word;
q: integer;
s: TType;
begin
if k = 2 then { Условие выхода из рекурсии }
Opr:= a[1, 1] * a[2, 2] -
a[1, 2] * a[2, 1]

else begin
s := 0;
for E := 1 to K do begin
for i := 2 to K do begin
q := 1;
for j := 1 to K do
if (j <> E) then
B[pred(i), incr_(q)] := a[i, j]
end;
s := s + minusOnePower(E) *
a[1, E] * Opr(B, pred(k))
end;
Opr := s
end
end;

function get_rang(ni, nj: integer;
a: mxType): integer;
type
TVariant = (Process, Ok, Stop); { Тип текущего процесса }
var
T1, T2: mxType; { Временные массивы }

{ Для создания всех возможных перестановок строк и столбцов.
Элемент 0 служит для предотвращения переполнения }
Pi, Pj: array[0 .. maxNij] of byte;
i, j,
k: integer; { Размер квадратной матрицы для расчета определителя}

{ Служат для построения перестановок строк и столбцов }
whatInPi: array[1 .. max_rows] of boolean;
whatInPj: array[1 .. max_cols] of boolean;

f, f2: TVariant; { Флаги }
Opred: TType;
const
flag: boolean = false;
rang: integer = 0;
begin
k := 1;
for i := 1 to pred(ni) do Pi[i] := i;
Pi[ni] := pred(ni);

while not flag do begin
{ Подготовка массивов перестановок }
for i := 1 to pred(nj) do Pj[i] := i;
Pj[nj] := pred(nj);

{ Построим все комбинации по строкам }
f := Process;
while f = Process do begin
i := ni;
inc(Pi[i]);
while (i <> 0) and (Pi[i] > ni) do begin
{ Получение следующих комбинаций }
Pi[decr_(i)] := 1;
inc(Pi[i])
end;

if i = 0 then begin
f := Stop; flag := true
end
else begin
{ Проверка повторений элементов в комбинации }
for i := 1 to ni do
WhatInPi[i] := false;

i := 1;
while (i <= ni) and (not WhatInPi[Pi[i]]) do
WhatInPi[Pi[incr_(I)]] := true;

if i > ni then f := Ok
end;

end;

{ Построим все комбинации по столбцам }
f2 := Process;
while (f2 <> Stop) and (not flag) do begin

f2 := Process;
while f2 = Process do begin
i := nj;
inc(Pj[i]);
while (i <> 0) and (Pj[i] > nj) do begin
Pj[decr_(i)] := 1;
inc(Pj[i])
end;

if i = 0 then f2 := Stop
else begin
for i := 1 to nj do
WhatInPj[i] := false;

i := 1;
while (i <= nj) and (not WhatInPj[Pj[i]]) do
WhatInPj[Pj[incr_(i)]] := true;

if i > nj then f2 := Ok
end;
end;

if f2 = Ok then begin
{ Составление матрицы }
for i := 1 to ni do
for j := 1 to nj do
T1[i, j] := a[Pi[i], j];

for i := 1 to k do
for j := 1 to k do
T2[i, j] := T1[i, Pj[j]];

{ Считаем определитель }
if k > 1 then Opred := Opr(T2, k)
else Opred := T2[1, 1];

if Opred <> 0 then f2 := Stop
end
end;

if (Opred <> 0) and (not flag) then begin
rang := incr_(k);
for i := 1 to pred(ni) do Pi[i] := i;
Pi[ni] := pred(ni)
end;

flag := (k > ni) or (k > nj) or flag
end;
get_rang := rang
end;

begin
writeln('rang = ', get_rang(max_rows, max_cols, arr))
end.


Исходный текст программы (без комментариев) можно скачать здесь:
Прикрепленный файл  _RANG.PAS ( 3.54 килобайт ) Кол-во скачиваний: 2151
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 19:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name