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 …


 

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

14362. Эмоции человека 696.69 KB
  Кэррол Э. Изард Эмоции человека ния которые я делил с моими психотерапевтическими пациен тами людьми требующими от нас развития науки об эмоциях которая улучшит многие важные службы связанные с помощью человеку. Младенцы и дети являются величаишими у
14363. Безпека життєдіяльності. Практичні роботи 1.84 MB
  ЗМІСТ ПЕРЕДМОВА €œБезпека життєдіяльності€ є інтегрованою науковою дисципліною яка ґрунтується на наукових досягненнях фундаментальних наук. Одним із стратегічних завдань модернізації вищої освіти в Україні у контексті вимог єдиного європейського освітнього п...
14364. ИССЛЕДОВАНИЕ ПРОВОДНИКОВ 1-го РОДА С ПОМОЩЬЮ МОСТА ПОСТОЯННОГО ТОКА 339.5 KB
  Лабораторная работа №31 ИССЛЕДОВАНИЕ ПРОВОДНИКОВ 1го РОДА С ПОМОЩЬЮ МОСТА ПОСТОЯННОГО ТОКА 1. Цели и задачи: необходимо определить сопротивления проводников с помощью моста постоянного тока и расчет удельное сопротивление для каждого проводника. 2. Приборы и...
14365. КОЛЬЦА НЬЮТОНА 808.5 KB
  Работа N 71.1. КОЛЬЦА НЬЮТОНА Прежде чем приступить к работе необходимо ознакомиться с введением по теме Интерференция и дифракция. ЦЕЛЬ РАБОТЫ: измерить длины волн излучения ртутной лампы и радиус кривизны линзы из анализа интерференционной картины в виде колец Ньют
14366. ОПРЕДЕЛЕНИЕ СКОРОСТИ УЛЬТРАЗВУКА ОПТИЧЕСКИМИ МЕТОДАМИ 405 KB
  СВЕТ ЗВУК X Z Введение по теме 72. ОПРЕДЕЛЕНИЕ СКОРОСТИ УЛЬТРАЗВУКА ОПТИЧЕСКИМИ МЕТОДАМИ УЛЬТРАЗВУК И ОПРЕДЕЛЕНИЕ НЕКОТОРЫХ МОЛЕКУЛЯРНЫХ ПАРАМЕТРОВ. Ультразвук  это упругие волны с частотами выше условной границы восприятия чел...
14367. ПОЛЯРИЗАЦИЯ СВЕТА 1.12 MB
  Введение по теме 73. ПОЛЯРИЗАЦИЯ СВЕТА Часть электромагнитного излучения лежащая в диапазоне длин волн от 400 до 760 нм воспринимается человеческим глазом и называется светом. Световая волна характеризуется вектором напряженности электриче
14368. КВАНТОВАЯ ОПТИКА. ЛАЗЕРЫ 110.5 KB
  КВАНТОВАЯ ОПТИКА Введение по теме 74. ЛАЗЕРЫ Квантовые свойства света проявляются при испускании и поглощении его веществом. Количественными характеристиками этих процессов являются спектры испускания и поглощения. Вид спектров поглощения и испускания зависит от при...
14369. ЭЛЕКТРИЧЕСТВО ПОСТОЯННЫЙ ЭЛЕКТРИЧЕСКИЙ ТОК 4.5 MB
  Описания лабораторных работУчебной лаборатории физического эксперимента физического факультета СПбГУ Часть IV ЭЛЕКТРИЧЕСТВО ПОСТОЯННЫЙ ЭЛЕКТРИЧЕСКИЙ ТОК Данное пособие содержит описания лабораторных работ по разделу Электричест
14370. Расчет коэффициента внутреннего трения жидкости по методу Стокса 99.5 KB
  Лабораторная работа №17 по дисциплине Физика на тему: Определение коэффициента внутреннего трения жидкости по методу Стокса 1. Цели и задачи: целью данной работы является определение коэффициента динамической вязкости исследуемой жидкости при температур...