9684

Двумерные массивы Паскаля - матрицы

Реферат

Коммуникация, связь, радиоэлектроника и цифровые приборы

Двумерные массивы Паскаля - матрицы Положение элементов в двумерных массивах Паскаля описывается двумя индексами. Их можно представить в виде прямоугольной таблицы или матрицы. Рассмотрим двумерный массив Паскаля размерностью 3*3, то есть в ней...

Русский

2013-03-15

47.5 KB

40 чел.

Двумерные массивы Паскаля – матрицы

Положение элементов в двумерных массивах Паскаля описывается двумя индексами. Их можно представить в виде прямоугольной таблицы или матрицы.

Рассмотрим двумерный массив Паскаля размерностью 3*3, то есть в ней будет три строки, а в каждой строке по три элемента:

Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца. Таким образом, номер элемента определяется пересечением строки и столбца. Например, a [2,1]  – это элемент, стоящий во второй строке и в первом столбце.

Описание двумерного массива Паскаля.

Существует несколько способов объявления двумерного массива Паскаля.

Мы уже умеем описывать одномерные массивы, элементы которых могут иметь любой тип, а, следовательно, и сами элементы могут быть массивами. Рассмотрим следующее описание типов и переменных:

Пример описания двумерного массива Паскаля 

Type 

Vector = array [1..5] of <тип_элементов>;

Matrix= array [1..10] of vector;

Var m: matrix;

Мы объявили двумерный массив Паскаля m, состоящий из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i -й строке можно обращаться m [ i ], а каждому j -му элементу внутри i -й строки – m [ i , j ].

Определение типов для двумерных массивов Паскаля можно задавать и в одной строке:

Type 

Matrix= array [1..5] of array [1..10] of < тип элементов >;

или еще проще:

type 

matrix = array [1..5, 1..10] of <тип элементов>;

Обращение к элементам двумерного массива имеет вид: M [ i , j ]. Это означает, что мы хотим получить элемент, расположенный в i -й строке и j -м столбце. Тут главное не перепутать строки со столбцами, а то мы можем снова получить обращение к несуществующему элементу. Например, обращение к элементу M [10, 5] имеет правильную форму записи, но может вызвать ошибку в работе программы.

Основные действия с двумерными массивами Паскаля

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

type 

matrix= array [1..5, 1..10] of integer;

var 

  a , b : matrix ;

то в ходе выполнения программы можно присвоить матрице a значение матрицы b ( a := b ). Все остальные действия выполняются поэлементно, при этом над элементами можно выполнять все допустимые операции, которые определены для типа данных элементов массива. Это означает, что если массив состоит из целых чисел, то над его элементами можно выполнять операции, определенные для целых чисел, если же массив состоит из символов, то к ним применимы операции, определенные для работы с символами.

Ввод двумерного массива Паскаля.

Для последовательного ввода элементов одномерного массива мы использовали цикл for, в котором изменяли значение индекса с 1-го до последнего. Но положение элемента в двумерном массиве Паскаля определяется двумя индексами: номером строки и номером столбца. Это значит, что нам нужно будет последовательно изменять номер строки с 1-й до последней и в каждой строке перебирать элементы столбцов с 1-го до последнего. Значит, нам потребуется два цикла for , причем один из них будет вложен в другой.

Рассмотрим пример ввода двумерного массива Паскаля с клавиатуры:

Пример программы ввода двумерного массива Паскаля с клавиатуры 

type 

  matrix= array [1..5, 1..10] of integer;

var 

  a, : matrix;

  i, j: integer; { индексы массива } 

begin 

  for i :=1 to 5 do {цикл для перебора всех строк} 

     for j :=1 to 10 do {перебор всех элементов строки по столбцам} 

        readln ( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце} 

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

Вывод двумерного массива Паскаля на экран.

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

Пример программы вывода двумерного массива Паскаля 

for i :=1 to 5 do {цикл для перебора всех строк} 

begin 

  for j :=1 to 10 do {перебор всех элементов строки по столбцам} 

     write ( a [ i , j ]:4); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 4 позиции} 

  writeln ; {прежде, чем сменить номер строки в матрице, нужно перевести курсор на начало новой экранной строки} 

end ;

Замечание (это важно!): очень часто в программах студентов встречается ошибка, когда ввод с клавиатуры или вывод на экран массива пытаются осуществить следующим образом: readln (a), writeln (a), где а – это переменная типа массив. При этом их удивляет сообщение компилятора, что переменную этого типа невозможно считать или напечатать. Может быть, вы поймете, почему этого сделать нельзя, если представите N кружек, стоящих в ряд, а у вас в руках, например, чайник с водой. Можете вы по команде «налей воду» наполнить сразу все кружки? Как бы вы ни старались, но в каждую кружку придется наливать отдельно. Заполнение и вывод на экран элементов массива также должно осуществляться последовательно и поэлементно, т.к. в памяти ЭВМ элементы массива располагаются в последовательных ячейках.

Некоторые закономерности двумерного массива, которые помогут с лёгкостью решать любую задачу по двумерному массиву, не прибегая к чьей-либо помощи. Начнём с того, что любой двумерный массив представляет собой матрицу, т.е. набор чисел, каждое из которых, так сказать, «вставлено» в конкретную ячейку, имеющую свой индивидуальный адрес. Адрес – это два индекса, которые показывают на пересечении какой строки и какого столбца находится тот или иной элемент. Теперь конкретнее. Взгляни на рисунок.

| 11 12 13 14 15 16 17 18 19 |

| 21 22 23 24 25 26 27 28 29 |

| 31 32 33 34 35 36 37 38 39 |

| 41 42 43 44 45 46 47 48 49 |

| 51 52 53 54 55 56 57 58 59 |

| 61 62 63 64 65 66 67 68 69 |

| 71 72 73 74 75 76 77 78 79 |

| 81 82 83 84 85 86 87 88 89 |

| 91 92 93 94 95 96 97 98 99 |

На нём изображена квадратная матрица, т.е. матрица, у которой количество элементов по длине и ширине одинаково. В последующем мы будем пользоваться именно такой из-за её удобства. Это матрица размером 9 на 9 элементов, заполненная не произвольными числами, а индексами (или адресами) элементов. Вот как раз по этим индексам у нас и происходит обращение к элементам массива. Мы можем присваивать им значения, импортировать, сравнивать, производить какие-либо действия и давать им уже новое получившееся значение. Но чтобы все эти операции производить не вручную, а с помощью компьютера, надо выявить определённую закономерность с индексами элементов. Описав последнюю нужным образом и заключив в цикл, мы получим основную часть программы для решения определённой задачи на двумерный массив. Закономерность в 100% случаев заключается в одинаковом соотношении первых и вторых индексов для всех элементов, лежащих в определённом месте, к примеру, выше главной диагонали, на побочной диагонали, сверху от пересечения диагоналей, ну и т.д.

Перейдём к конкретным примерам. Допустим, нам надо найти сумму элементов на главной диагонали. Для начала напомним, что главная диагональ идёт начиная от верхнего левого угла до нижнего правого, а побочная, соответственно, из левого нижнего в правый верхний. Ну так вот, посмотри на первый и второй индекс каждого из элементов, лежащего на главной диагонали. Что ты видишь? Они равны! Поэтому в условии ты можешь смело писать:
if i=j then s:=s+a[i,j] , где s – переменная суммы, i – первый индекс, j – второй индекс.
Ну а теперь без объяснений: просто смотри на рисунок и сверяй.

  •  Индексы элементов, лежащих на главной диагонали равны (доказано ранее) т.е. i = j
  •  Первый индекс всех элементов выше главной диагонали меньше второго, т.е. i < j
  •  Первый индекс всех элементо ниже главной диагонали больше второго, т.е. i > j
  •  Для элементов побочной диагонали сумма первого и второго индексов равна «нарощенному» на единицу порядку матрицы, т.е. i + j = N+1 ,где N – порядок матрицы. Порядок матрицы – это количество элементов матрицы по вертикали или горизонтали. И элемент матрицы на побочной диагонали в общем виде будет иметь адрес a[i, N+1– i] , где a – название массива.
  •  Для элементов, находящихся над побочной диагональю должно выполняться равенство: i + j < N+1 ,т.е. в условии надо писать: if i + j < N+1 then …
  •  Для элементов ниже побочной диагонали в предыдущем неравенстве надо всего лишь сменить знак на противоположный, т.е. здесь у нас будет: i + j > N+1, а в условии: if i + j > N+1 then …
  •  Для элементов над пересечением диагоналей должны выполняться одновременно два неравенства: i + j < N+1 и i < j , т.е. в программе мы напишем if (i + j<N+1) and (i < j) then … (здесь скобки обязательны)
  •  Для элементов под пересечением диагоналей знаки обоих предыдущих неравенств должны быть противоположными и будет это выглядеть так: i + j > N+1 и i > j ,или в программе: if (i + j > N+1) and (i > j) then … (здесь скобки обязательны)
  •  Для элементов, находящихся справа от пересечения диагоналей справедлива закономерность: i + j < N+1 и i > j или в среде Pascal это будет выглядеть так: if (i + j<N+1) and (i > j ) then …
  •  Для элементов, слева от пересечения диагоналей верно соотношение: i + j >N+1 и i < j ,а в программе это будет отражено как: if (i + j > N+1) and (i < j) then …


 

А также другие работы, которые могут Вас заинтересовать

49846. Виды механической обработки материалов резанием 592.5 KB
  Характерным признаком его является непрерывность резания. Процесс фрезерования отличается от других процессов резания тем что каждый зуб фрезы за один ее оборот находится в работе относительно малый промежуток времени. Большую часть оборота зуб фрезы проходит не производя резания. Физические основы процесса резания: деформация при стружкообразовании сила резания и тепловые явления.
49847. ВЕРБАЛІЗАЦІЯ КОНЦЕПТУ ЖИТТЯ В ПАРЕМІЙНІЙ КАРТИНІ СВІТУ 166.5 KB
  У світлі сьогоденної антропоцентричної парадигми лінгвістики проблема взаємодії мови і культури набуває особливої актуальності. Мова акумулює надбання культури етносу, тому в ній втілені світогляд народу, його досвід, традиції тощо. Важливим терміном для дослідження взаємодії мови і культури є концепт.
49848. ИНФОРМАТИКА. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ 130.5 KB
  Информационные системы и технологии направлению подготовки дипломированного специалиста по специальности Информационные системы Общие положения Написание и защита курсовых работ важнейшая форма самостоятельной учебной и научной работы студентов осуществляемая под руководством преподавателя. Целью курсовой работы является подготовка студента к написанию и защите дипломной работы. Допускается вхождение курсовой работы в дипломную работу как в виде целостного раздела так и в виде отдельных фрагментов. Кроме того выполнение...
49849. ИЗУЧЕНИЕ ВЕНТИЛЬНОГО ФОТОЭФФЕКТА 137.5 KB
  В области границы раздела полупроводников р-типа и n-типа образуется так называемый запирающий слой, обедненный основными носителями заряда - электронами со стороны электронного полупроводника и дырками - со стороны дырочного полупроводника.
49850. Операции с одномерными массивами в Delphi 929.12 KB
  Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения привели к появлению систем программирования, ориентированных на так называемую быструю разработку, среди которых можно выделить Borland Delphi и Microsoft Visual Basic. В основе систем быстрой разработки (RAD-систем, Rapid Application Development — среда быстрой разработки приложений)
49851. Проект подстанции для ткацкого цеха №3 предприятия 2.17 MB
  Определяем установленную активную мощность оборудования цеха. Определяем установленную активную мощность технологического оборудования: Ру. Определяем активную установленную мощность для освещения: Р у. Определяем полную активную установленную мощность цеха: Р у = Ру.
49853. Метод вольт-фарадных характеристик барьера 1.96 MB
  Методы определения подвижности носителей заряда Методы определения времени жизни Введение. Метод является основным при контроле концентрации носителей заряда в эпитаксиальных слоях выращенных на сильнолегированной или полуизолирующей подложках. для концентрации свободных носителей Nx = [2 eεε02][d1 C2 dU]–1. Таким образом измеряя зависимость емкости барьера от напряжения смещения U можно вычислить концентрацию свободных носителей Nx которая для неоднородного полупроводника зависит от глубины x на которую проникает объемный...
49854. Оптимизация рабочего процесса двигателя 4ЧН8,2/7 2.07 MB
  Описание объекта исследования Оптимизация рабочего процесса Проектирование турбокомпрессора Газодинамический расчет компрессора Профилирование основных элементов турбокомпрессора Рабочее колесо компрессора