Массивы. Матрицы. Типичные задачи. |
Массивы. Матрицы. Типичные задачи. |
Altair |
1.10.2004 11:57
Сообщение
#1
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Содержание:
----- ----- ----- ----- ----- Одномерные и многомерные массивы (матрицы) в Паскале. Задание массивов. Тип массив в Паскале задается следующим образом: <имя типа> = ARRAY [<сп.индексов типов>] OF <тип> Где <имя типа> - правильный идентификатор. ARRAY, OF - зарезервированные слова (массив, из) [<сп.индексов типов>] - список из одного или нескольких индексных типов. (задается размерность массива) <тип> - любой тип Паскаля, кроме файлового. После описания типа массива, можно описывать переменные этого типа. Можно не описывать отдельно тип массив, а описать конкретную переменную, как переменную типа массив: <variable> : Array[<index>] OF <type> Где <variable> - правильный идентификатор. Array, OF- зарезервированные слова. <index> - индекс задающий размерность массива. <type> - любой тип Паскаля, кроме файлового. Вкачестве индексных типов можно использовать любые порядковые типы, кроме longint Оюычно в качестве индекстного типа употребляется тип-диапазон, в котором задаются границы изменения индексов. Вложенные массивы или многомерные или матрицы Собственно определение матрицы - прямоугольная сетка чисел, справедливо и для многомерных массивов. По сути это и есть матрица. Задать матрицу в Паскале можно следующим образом: const В данном случае мы описали матрицу размеров NNxMM. Т.е. матрица в понимании компилятора - это массив из массивов.
Глубина вложения массивов произвольна. Т.е. можно задать двухмерный, трехмерный, четырехмерный и так далее массивы. Если в программе два массива заданы одинаково, то одному массиву можно присвоить другой. К элементам массива обращаются по индексам. Пример. {вывод на экран элемент массива A с индексом 5} Нуль-основанный символьный массив - это такой массив, в котором индекс первого элемента равен нулю, а последнего - положительному ненулевому целому числу. Например:
Если вы включаете расширенный синтаксис (с помощью директивы компилятора {$X+}), то нуль-основанный символьный массив может быть инициализирован строкой, длина которой меньше чем объявленная длина массива. (в нулевом элемент такого массива хранится длинна строки. см. FAQ по строкам) Работа с матрицами, ввод матрицы, операции над матрицами, распространенные задачи с матрицами. Матрица - прямоугольная сетка чисел. Элементы матрицы - числа. Каждый элемент матрицы имеет два индекса - номер строки и номер столбца, в котором он расположен. Принято сначала указывать индекс строки, а затем индекс столбца. Создадим тип матрицы: const Очень часто при решении задач, необходимо проходить по всем элементам строки\столбца\строк и столбуов. Для этого используют цикл со счетчиком. (FOR ... TO ... DO ) Ввод матрицы: Опишем процедуры ввода и вывода на экран матрицы. const Сообщение отредактировано: volvo - 13.01.2009 13:35 |
Altair |
1.10.2004 12:17
Сообщение
#2
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Подготовил AlaRic:
(в примерах звездочками обозначены элементы, которые будут просуммированы) Сумма элементов на главной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма элементов на побочной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не выше главной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не ниже главной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не ниже побочной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не выше побочной диагонали: s:=0; Пример (Показать/Скрыть)
Сумма всех элементов, стоящих не ниже главной диагонали и не принадлежащих к элементам, стоящим ниже побочной диагонали ("верхний треугольник"): s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не выше побочной диагонали и не стоящих выше главной диагонали ("нижний треугольник"): s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не выше главной диагонали и одновременно не стоящих ниже побочной диагонали ("левый треугольник"): s:=0; Пример (Показать/Скрыть)
Сумма элементов, стоящих не ниже главной диагонали и одновременно не стоящих выше побочной диагонали ("правый треугольник"): s:=0; Пример (Показать/Скрыть)
Сообщение отредактировано: volvo - 28.01.2010 16:10 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Atos |
2.10.2004 10:21
Сообщение
#3
|
Прогрессор Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: 9 |
Кстати, это очень хорошо, что Oleg_Z подготовил подробную справку да ещё ввод-вывод стандартного массива. Я думаю, можно будет, если новичкам понадобится какое-то задание на массив(статический), просто написать им процедуру , решающую задачу с массивом именно этого типа Matrix, и сразу отослать их к этой теме. Тогда будет меньше и лишей работы, и лишних вопросов.
Ну и глава про массивы из учебника Фаронова: http://www.borlpasc.narod.ru/docym/Faronov/gl4/gl4_5.html |
Altair |
4.10.2004 5:56
Сообщение
#4
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Вычисление произведения квадратных матриц. type Вычисление детерминанта (определителя) матрицы приведением к диагональному виду. (С) trminator program denominator; -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
20.10.2004 23:59
Сообщение
#5
|
Гость |
Вычисление произведения "сцепленных" матриц. Например: (2, 3) Х (3, 3) = (2, 3) (3, 2) Х (2, 5) = (3, 5) Type Вычисление детерминанта (определителя) матрицы с помощью рекурсии. Const Скачать: REC_DET.PAS ( 1.28 килобайт ) Кол-во скачиваний: 1307 |
Флогримм |
2.11.2004 21:13
Сообщение
#6
|
Бывалый Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: 4 |
Инициализация массивов случайными значениями
1. Одномерный массив const 2. Двумерный массив (матрица) const Цитата(Pascal Help) Random (функция) ------------------ Возвращает случайное число. Объявление: Function Random [ ( Range : Word) ] : < тип параметра >; Режим: Windows, Real, Protected Замечания: Если параметр Range не определен, то результатом будет случайное число типа Real в диапазоне 0 <= X < 1. Если параметр Range определен, то результатом будет случайное число в диапазоне 0 <= X < Range. Если Range равняется 0, то значение 0 и будет возвращено. Чтобы инициализировать генератор случайных чисел, вызовите процедуру Randomize или присвойте значение переменной RandSeed. |
Флогримм |
18.11.2004 8:01
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: 4 |
Заполнение массива по-спирали
(начиная с верхнего левого угла по часовой стрелке) program spirall; Пример заполнения (Показать/Скрыть)
Сообщение отредактировано: volvo - 8.03.2010 15:00 -------------------- Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
|
volvo |
29.12.2004 14:27
Сообщение
#8
|
Гость |
Как найти в массиве максимальную последовательность одинаковых символов?
Как найти в массиве максимальную возрастающую последовательность символов? |
volvo |
26.03.2005 20:16
Сообщение
#9
|
Гость |
|
volvo |
1.04.2005 17:42
Сообщение
#10
|
Гость |
Как вычислить заданный многочлен от матрицы A
|
volvo |
2.04.2005 14:58
Сообщение
#11
|
Гость |
Как вычислить ранг матрицы
(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 килобайт ) Кол-во скачиваний: 2000 |
Archon |
8.12.2008 16:15
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 618 Пол: Мужской Репутация: 24 |
Нахождение максимальных/минимальных элементов массива Как найти максимальный элемент массива const Как найти 2 максимальных элемента массива const Как найти k максимальных элементов массива const Для нахождения минимумов, нужно поменять все знаки сравнения на противоположные и, для порядка, изменить названия переменных. -------------------- Close the World...txeN eht nepO
|
Текстовая версия | 2.11.2024 6:16 |