Двумерные массивы – определение, описание матрицы

Pascal-Паскаль

Программирование. Двумерные массивы Pascal-Паскаль

  • Домашняя
  • Карта
  • Контакты
  • Скачено бесплатно: 18543
  • Куплено: 414
  • Pascal-Паскаль->Программирование. Двумерные массивы Pascal-Паскаль

Программирование. Двумерные массивы Pascal-Паскаль

  • Описание двумерного массива Паскаля
  • Основные действия с двумерными массивами Паскаля
  • Ввод двумерного массива Паскаля
  • Вывод двумерного массива Паскаля на экран
  • Представление двумерного массива Паскаля в памяти
  • Примеры решения задач с двумерными массивами Паскаля

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:
Расширение файла - что это, какие бывают, как найти, настроить

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

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

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

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

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

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

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

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

Элементы абстрактного массива в памяти машины физически располагаются последовательно, согласно описанию. При этом каждый элемент занимает в памяти количество байт, соответствующее его размеру. Например, если массив состоит из элементов типа integer , то каждый элемент будет занимать по два байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.

А сколько места займет массив, состоящий из массивов, т.е. матрица? Очевидно: S i^S j , где S i – количество строк, а S j – количество элементов в каждой строке. Например, для массива типа

потребуется 12 байт памяти.

Как будут располагаться в памяти элементы этого массива? Рассмотрим схему размещения массива M типа matrix в памяти.

Под каждый элемент M [i,j] типа integer выделяется две ячейки памяти. Размещение в памяти осуществляется «снизу вверх». Элементы размещаются в порядке изменения индекса, что соответствует схеме вложенных циклов: сначала размещается первая строка, затем вторая, третья. Внутри строки по порядку идут элементы: первый, второй и т.д.

Как мы знаем, доступ к любой переменной возможен, только если известен адрес ячейки памяти, в которой хранится переменная. Конкретная память выделяется для переменной при загрузке программы, то есть устанавливается взаимное соответствие между переменной и адресом ячейки. Но если мы объявили переменную как массив, то программа «знает» адрес начала массива, то есть первого его элемента. Как же происходит доступ ко всем другим элементам массива? При реальном доступе к ячейке памяти, в которой хранится элемент двумерного массива, система вычисляет ее адрес по формуле:

где Addr – фактический начальный адрес, по которому массив располагается в памяти; I , J – индексы элемента в двумерном массиве; SizeElem – размер элемента массива (например, два байта для элементов типа integer ); Cols – количество элементов в строке.

Читайте также:
Как начать программировать - советы новичкам

Выражение SizeElem * Cols *( I -1)+ SizeElem *( J -1) называют смещением относительно начала массива.

Сколько памяти выделяется для массива?

Рассмотрим не столько вопрос о том, сколько памяти выделяется под массив (это мы разобрали в предыдущем разделе), а о том, каков максимально допустимый размер массива, учитывая ограниченный объем памяти.

Для работы программы память выделяется сегментами по 64 Кбайт каждый, причем как минимум один из них определяется как сегмент данных. Вот в этом-то сегменте и располагаются те данные, которые будет обрабатывать программа. Ни одна переменная программы не может располагаться более чем в одном сегменте. Поэтому, даже если в сегменте находится только одна переменная, описанная как массив, то она не сможет получить более чем 65536 байт. Но почти наверняка, кроме массива в сегменте данных будут описаны еще некоторые переменные, поэтому реальный объем памяти, который может быть выделен под массив, находится по формуле: 65536- S , где S – объем памяти, уже выделенный под другие переменные.

Зачем нам это знать? Для того чтобы не удивляться, если при компиляции транслятор выдаст сообщение об ошибке объявления слишком длинного массива, когда в программе встретит описание (правильное с точки зрения синтаксиса):

Вы уже знаете, что, учитывая двухбайтовое представление целых чисел, реально можно объявить массив с количеством элементов равным 65536/2 –1=32767. И то лишь в том случае, если других переменных не будет. Двумерные массивы должны иметь еще меньшие границы индексов.

Примеры решения задач с двумерными массивами Паскаля

Задача: Найти произведение ненулевых элементов матрицы.

Решение:

  • Для решения данной задачи нам потребуются переменные: матрица, состоящая, например, из целочисленных элементов; P – произведение элементов, отличных от 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
  • Входными данными являются N , M – их значения введем с клавиатуры; матрица – ввод матрицы оформим в виде процедуры, заполнение матрицы осуществим случайным образом, т.е. с помощью функции random ().
  • Выходными данными будет являться значение переменной P (произведение).
  • Чтобы проверить правильность выполнения программы, необходимо вывести матрицу на экран, для этого оформим процедуру вывода матрицы.
  • Ход решения задачи:

обсудим сначала выполнение основной программы, реализацию процедур обговорим чуть позже:

  • введем значения N и M ;
  • Введем двумерный массив Паскаля, для этого обращаемся к процедуре vvod ( a ), где а – матрица;
  • Напечатаем полученную матрицу, для этого обращаемся к процедуре print ( a );
  • Присвоим начальное значение переменной P =1;
  • Будем последовательно перебирать все строки I от 1-й до N -й, в каждой строке будем перебирать все столбцы J от 1-го до M -го, для каждого элемента матрицы будем проверять условие: если a ij ? 0, то произведение P будем домножать на элемент a ij ( P = P * a ij );
  • Выведем на экран значение произведения ненулевых элементов матрицы – P ;

А теперь поговорим о процедурах.

Замечание (это важно!) Параметром процедуры может быть любая переменная предопределенного типа, это означает, что для передачи в процедуру массива в качестве параметра, тип его должен быть описан заранее. Например :

Вернемся теперь к нашим процедурам.

Процедура ввода матрицы называется vvod , параметром процедуры является матрица, причем она должна быть, как результат, передана в основную программу, следовательно, параметр должен передаваться по ссылке. Тогда заголовок нашей процедуры будет выглядеть так:

Читайте также:
Электронные цифровые технологии особенности использования, модели

Для реализации вложенных циклов в процедуре нам потребуются локальные переменные-счетчики, например, k и h . Алгоритм заполнения матрицы уже обсуждался, поэтому не будем его повторять.

Процедура вывода матрицы на экран называется print , параметром процедуры является матрица, но в этом случае она является входным параметром, следовательно, передается по значению. Заголовок этой процедуры будет выглядеть следующим образом:

И вновь для реализации вложенных циклов внутри процедуры нам потребуются счетчики, пусть они называются так же – k и h . Алгоритм вывода матрицы на экран был описан выше, воспользуемся этим описанием.

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

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

Как стать программистом

Обучение основам программирования на C для чайников.

Страницы

  • Программа курса программирования на Си
  • Образцовые решения домашних заданий.
  • K&R
  • F.A.Q.

Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 27 октября 2013 г.

Занятие 19. Двумерные массивы.

Прочитайте улучшенную версию этого урока “Двумерные массивы”.

В новой версии:

  • Ещё более доступное объяснение
  • Дополнительные материалы
  • 10 задач на программирование с автоматической проверкой решения
Что такое двумерный массив?
Рис.1. Двумерный массив. Общий вид.
Рис.2 Двумерный массив, объявление.
Как работать с двумерным массивом?
Рис.3. Двумерный массив инициализированный при объявлении
Рис.4. Двумерный массив, инициализированный не полностью.
Как работать с отдельным элементом массива.
Рис.5. Обращение к элементу двумерного массива.
Рис.6. Двумерный массив. Поэлементный вывод на экран.
Зачем нужны двумерные массивы?

Напишите в комментариях пожалуйста, понятен ли вам этот пример, или лучше его подробно расписать?

Если этот материал кажется вам полезным, расскажите о нем друзьям используя кнопки основных социальных сетей, расположенные ниже.

Напишите программу, работающую следующим образом. Создайте массив 10 на 10. Заполните его нулями. Считайте два произвольных целых числа с клавиатуры, меньших либо равных 10. Первое число количество строк, второе – количество столбцов. Напишите функцию, которая заполняет массив по спирали и выводит его на экран. Т.е. если бы мы ввели 6 и 7, то получили бы следующий массив.

При этом табличка приблизительно должна быть выровнена по центру окна вывода.

Готовое решение пользователя с ником “Дмитрий”. За проявленное упорство и трудолюбие, и как первый выполнивший правильно практическое задание, Дмитрий награждается печенькой:

Pascal: Занятие № 10. Двумерный массив в Pascal

Двумерный массив в Pascal

Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).

Исходные данные для решения многих задач можно представить в табличной форме:

Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:

zavod1: array [1..4] of integer; zavod2: array [1..4] of integer; zavod3: array [1..4] of integer;

Или в виде двумерного массива так:

var A: array[1..3,1..4] of integer; begin

Читайте также:
Шестнадцатеричный код - расшифровка, преобразования

begin var a := new integer[3,4]; <. >end.

Описание, ввод и вывод элементов двумерного массива

Варианты описания двумерного массива (традиционный pascal)

    Описание массива в разделе переменных:

const N = 3; M = 4; var A: array[1..N,1..M] of integer;

const M=10; N=5; type matrix=array [1..M, 1..N] of integer; var A: matrix;

for i:=1 to N do for j:=1 to M do begin write(‘A[‘,i,’,’,j,’]=’); read ( A[i,j] ); end;

for var i:=0 to a.RowCount-1 do for var j:=0 to a.ColCount-1 do a[i,j]:=readinteger;

var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10 var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9

Следующий фрагмент программы выводит на экран значения элементов массива по строкам:

for i:=1 to N do begin for j:=1 to M do write ( A[i,j]:5 ); writeln; end;

begin var a := MatrRandomInteger(3,4,0,10); var a1 := MatrRandomReal(3,4,1,9); a.Println; a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой end.

Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:

Номер станции 1-й день 2-й день 3-й день 4-й день
1 -8 -14 -19 -18
2 25 28 26 20
3 11 18 20 25

Т.е. запись показаний в двумерном массиве выглядела бы так:

t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18;
t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20;
t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25;

Или в pascalabc.NET:

var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25); t.Println;

Объявление двумерного массива:

var t: array [1..3, 1..4] of integer;

  1. Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
  2. Распечатать показания термометров всех метеостанций за 2-й день.
  3. Определить среднюю температуру на 3-й метеостанции.
  4. Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.

Самостоятельно подумайте, как находится сумма элементов массива pascal.

const m = 5; n = 4; var a: array[1..m,1..n] of byte; s: array[1..n] of byte; i,j, sum: byte; begin randomize; for i := 1 to m do begin for j := 1 to n do begin . <инициализация элементов массива случайными числами>. <вывод элементов массива>end; writeln end; writeln (‘————‘); <для оформления> <обнуление значений массива суммы s[]:>. <поиск сумм элементов по столбцам:>for i := 1 to n do begin for j := 1 to m do begin s[i]:=. ; end; write(. ) ; end; <поиск общей суммы:>sum:=0; . <вычисление суммы элементов массива значений сумм по столбцам:>for . . write (‘ | sum = ‘, sum); readln end.

Методы матриц для работы со строками и столбцами:

begin var a := MatrRandomInteger(3,4); a.Println; a.Row(0).Sum.Println(); a.Row(1).Average.Println; a.Row(2).Product.Println; a.Col(0).Min.Println; a.Col(1).Max.Println; end.

Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).

Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).

Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:

1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4

Учитывая, что первая цифра в программе будет соответствовать счетчику i, а вторая — счетчику j, то из таблицы можно вывести формулы:

Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскаль имеет формулу:
n=i+j-1 (или j=n-i+1 )

где n — размерность квадратной матрицы

Решение:

var i,j,n:integer; a: array[1..100,1..100]of integer; begin randomize; writeln (‘введите размерность матрицы:’); readln(n); for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; writeln; for i:=1 to n do begin for j:=1 to n do begin if (i=j) or (n=i+j-1) then a[i,j]:=0; write(a[i,j]:3) end; writeln; end; end.

Читайте также:
Реферат по информатике на тему: "Информационно-поисковая система"

var A:array[1..5,1..5] of integer; i,j:integer; sum,sum1,sum2:integer; begin randomize; for i:=1 to 5 do for j:=1 to 5 do A[i,j]:=random(10); write (‘Исходный массив A: ‘); for i:=1 to 5 do begin writeln; for j:=1 to 5 do write (A[i,j]:2,’ ‘); end; sum1:=0; for i:=1 to 5 do for j:=1 to 5 do if (i-j=1) then sum1:=sum1+A[i,j]; sum2:=0; for i:=1 to 5 do for j:=1 to 5 do if (j-i=1) then sum2:=sum2+A[i,j]; sum:=sum1+sum2; writeln; writeln(‘Сумма = ‘,sum); end.

  • минимальный элемент, лежащий ниже побочной диагонали;
  • произведение ненулевых элементов последней строки.

    Рассмотрим еще один пример работы с двумерным массивом.

    var index1,index2,i,j,N,M:integer; s,min,f:real; a:array[1..300,1..300] of real; begin N:=10; M:=5; for i:=1 to N do begin for j:=1 to M do begin a[i,j]:=random(20); s:=s+a[i,j]; write(a[i,j]:3); end; writeln; end; f:=s/(N*M); writeln(‘srednee znachenie ‘,f); min:=abs(a[1,1]-f); for i:=1 to N do begin for j:=1 to M do begin if abs(a[i,j]-f)

    Урок 5 — Двумерные массивы. Теория и примеры

    Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы ( kij ). Двумерные массивы абсолютно аналогичны математическим матрицам.

    В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:

    Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.

    Описать матрицу в программе можно несколькими способами:

    1) В разделе описания переменных:

    Var Mas: Array[1..n, 1..m] of ;

    2) При помощи одномерного массива, элементами которого являются одномерные массивы.
    Пример:

    Переменная Mas – матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.

    3) Предыдущий способ можно упростить так:

    4) И снова сократив запись, получим:

    Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:

    Например, для заполнения массива случайнми числами:

    Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:

    В следующей программе массив сначала заполняется числами с клавиатуры, а затем выводиться на экран.

    Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.

    Сумма всех элементов квадратной матрицы:

    Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):

    Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1 или j=n+1-i :

    Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):

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

    Сумма элементов выше и на главной диагонали квадратной матрицы:

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

    Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :

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

    Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:

    Читайте также:
    Системное программное обеспечение компьютера - классификация и виды

    При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:

    Подсчет сумм элементов по строкам:

    Подсчет сумм элементов по столбцам:

    Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:

    Суммы элементов по диагоналям, параллельным главной диагонали.

    Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:

    Var sum:array[-n+1..n-1] of integer;

    Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

    Суммы элементов по диагоналям, параллельным побочной диагонали.

    Суммы элементов по периметрам двумерного массива.

    Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n.

    Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1 , т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.

    Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1 .

    Затем считаем элементы по двум паралельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1] .

    Урок информатики по теме “Двумерные массивы”

    Цели:

    • образовательные: способствовать формированию представления о двумерном массиве и основных свойств квадратных матриц; рассмотреть действия, которые можно выполнить над матрицами; познакомить с типовыми алгоритмами обработки матриц на языке Pascal; создать условия для формирования умения решать алгоритмы с двумерными массивами;
    • развивающие: создать условия для развития умений работать за ограниченный промежуток времени, развития навыков самостоятельной работы, развития навыков работы с конспектом.
    • воспитательные: содействовать созданию на уроке психологического комфорта для работы, воспитанию собранности, ответственного отношения к своему труду, повышения мотивации к учебной деятельности.

    Тип урока: комбинированный.

    Методы обучения: лекция, самостоятельная работа.

    Формы организации: фронтальная работа, индивидуальная работа.

    Оборудование: задания для работы в классе (индивидуальные карточки, задание на компьютере), записи на доске.

    Ход урока:

    1. Организационный момент .

    Приветствие.
    Сообщается тема.
    Ставиться цель урока и задачи.

    2. Актуализация полученных знаний

    Устно проговариваются основные моменты предыдущей темы: “Одномерные массивы”. Фронтальный мини опрос по основным определениям.

    3. Целеполагание, постановка задач:

    4. Лекция

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

    : array [н_индекс_1..в_индекс_1, н_индекс_2 ..в_индекс_2] of

    A: array[1..n,1..m] of integer;

    Для того чтобы использовать элемент массива, надо указать имя массива и индекс элемента. Первый индекс соответствует номеру строки, второй – номеру столбца. Например:

    for i:=1 to n do
    for j:=1 to n do
    a[i,j]:= random (100);

    При инициализации двумерных массивов каждая строка заключается в дополнительную пару круглых скобок:

    Аналогом массивов языка Паскаль в математике являются матрицы. Матрица, у которой число строк равно числу столбцов, называется квадратной. A(n,n) – квадратная матрица

    Основные свойства квадратных матриц:

    1. Квадратные матрицы имеют главную и побочные диагонали. Например, для матрицы А на главной диагонали лежат элементы 1,5 и 9, а на побочной – 3, 5 и 7.

    .

    i=j – элементы расположены на главной диагонали;
    i> j – элементы расположены ниже главной диагонали;
    i n+1– элементы расположены под побочной диагональю;

    2. Квадратная матрица, у которой все элементы, исключая элементы главной диагонали, равны нулю, называется диагональной матрицей

    .

    3. Диагональная матрица, у которой все элементы, стоящие на главной диагонали, равны 1 , называется единичной матрицей

    4. Если в матрице A (m,n) поменять местами строки и столбцы, то получится матрица A t (m,n), которая называется транспонированной матрицей.

    Основные действия, которые можно выполнять над матрицами

      суммировать;
    • находить разность;
    • произведение матрицы на некоторое число;
    • произведение двух матриц.

    Типовые алгоритмы обработки матриц на языке Паскаль
    Вывод матрицы в виде таблицы:

    for i:= 1 to n do
    begin
    for j:= 1 to m do
    write (a[i,j]:4);
    writeln
    end;

    randomize;
    for i:=1 to m do
    begin
    for j:=1 to n do
    begin
    a[i,j]:=random(100)-10;
    write(a[i,j]:4);
    end;
    writeln;
    end;

    for i:= 1 to n do
    for j:= 1 to m do
    if j>m then write (a[i,j]:4)
    else writeln (a[i,j]:4);

    for i:= 1 to n do
    begin
    for j:= 1 to m do
    c[i,j]:=a[i,j]+ b[i,j]
    end;

  • Транспонирование матрицы – зеркальное отражение ее элементов относительно главной диагонали. Сделать это можно, введя новый массив:
  • for i:= 1 to n do
    for j:= 1 to n do
    b[i,j]= a[j,i];

    5. Первичный контроль

    “Контурная карта” 2 варианта

    1 вариант
    Исправьте неточности в описании двумерного массива:

    Var
    A= array[1..n,1..m] of integer;

    … … двумерных массивов каждая строка заключается в дополнительную пару круглых скобок:

    Вставьте пропущенные определения:

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

    Вставьте пропущенные определения:

    Матрица, у которой число строк равно числу столбцов, называется …. ….. .

  • Найдите ошибки в алгоритме:
  • for i:= 1 to n do
    begin
    for j:= 1 to m do
    c[i,j]:=a[i,j]+ a[i,j]
    end;

    Какую типовую задачу выполняет алгоритм?

    2 вариант

    1. Исправьте неточности в описании массива:

    const
    n=4; m=3;
    type
    mas:array[1..m,1..n] of integer;
    Вставьте пропущенные определения:

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

    Вставьте пропущенные определения:

    Диагональная матрица, у которой все элементы, стоящие на главной диагонали, равны … , называется единичной матрицей

    Вставьте пропущенные определения:

    Квадратная матрица, у которой все элементы, исключая элементы главной диагонали, равны нулю, называется … … .

    randomize;
    for i:=1 to m do
    begin
    for j:=1 to n do
    begin
    a[i,j]:=random(100)-10;
    end;
    end;

    Какую типовую задачу выполняет алгоритм?

    А теперь сверимся: Приложение 1

    Алгоритмы на языке Паскаль
    Написать программу, которая для целочисленной матрицы 3х4 определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке. Приложение 2

    program sred_n;
    const m=3;
    n= 4;
    var
    a: array[1..m,1..n] of integer;
    i,j,n_pos_el:integer;
    sred:real;
    begin
    for i:=1 to m do
    for j:=1 to n do read(a[i,j]);
    sred:=0;
    for i:=1 to m do begin
    n_pos_el:=0;
    for j:=1 to n do begin
    sred:=sred+a[i,j];
    if a[i,j]>0 then inc(n_pos_el);
    end;
    writeln(‘V’,i,’-oi stroke’,n_pos_el,’polozitelnix elementov’);
    end;
    sred:=sred/m/n;
    writeln(‘Srednee arifmeticheskoe:’,sred:6:2);
    end.

  • Написать программу, которая для прямоугольной целочисленной матрицы 3х4 определяет номер самого левого столбца, содержащего только положительные элементы. Если такого столбца нет, выводится сообщение. Приложение 3
  • program num_posit;
    const m=3;
    n=4;
    var
    a: array[1..m,1..n] of integer;
    i,j,num:integer;
    all_posit:boolean;
    begin
    randomize;
    for i:=1 to m do
    begin
    for j:=1 to n do
    begin
    a[i,j]:=random(100)-10;
    write(a[i,j]:4);
    end;
    writeln;
    end;
    num:=0;
    for j:=1 to n do begin
    all_posit:=true;
    for i:=1 to m do
    if a[i,j] 1.04.2008

    BestProg

    Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы

    Данная тема есть продолжением темы «Понятие массива. Одномерные массивы» .

    Содержание

    • 1. Двумерные массивы. Примеры описания и использования
    • 2. Инициализация двумерных массивов. Пример
    • 3. Инициализация массивов строк. Примеры
    • 4. Многомерные массивы. Примеры описания и использования
    • 5. Инициализация многомерных массивов. Пример
    • Связанны темы

    Поиск на других ресурсах:

    1. Двумерные массивы. Примеры описания и использования

    В языке C++ существует возможность использовать двумерные и многомерные массивы. Двумерный массив – это список одномерных массивов.

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

    Пример 1. Описание двумерного массива Matr целых чисел размером 3×4.

    Доступ к элементам массива (рисунок 1):

    Рисунок 1. Доступ к элементам матрицы Matr

    Чтобы обнулить двумерный массив Matr нужно написать следующий код:

    Пример 2. Описание двумерной матрицы Matrix вещественных чисел размером 10×10.

    Доступ к элементам матрицы:

    Пример обнуления матрицы Matrix :

    2. Инициализация двумерных массивов. Пример

    Инициализация двумерных и многомерных массивов подобна инициализации одномерных массивов . В этом случае список инициализаторов любой размерности берется в фигурные скобки.

    Инициализация двумерных (многомерных) массивов может быть:

    • с указанием размера массива;
    • без указания размера массива («безразмерная» инициализация).

    Пример 1. Инициализация двумерного массива M вещественных чисел размером 3×4. Устанавливается размер массива.

    Если в перечне указать не все элементы группы, тогда недостающие элементы будут дополняться нулевыми значениями автоматически (рисунок 2).

    Рисунок 2. Дополнение массива нулями

    Пример 2. «Безразмерная» инициализация массива B целых чисел.

    Пример 3. «Безразмерная инициализация массива B с дополнением нулями (рисунок 3).

    Рисунок 3. «Безразмерная» инициализация массива B с заполнением нулями

    Второй индекс массива (столбец) обязательно должен быть указан. В противном случае компилятор выдает сообщение об ошибке.

    3. Инициализация массивов строк. Примеры

    Массив строк также есть двумерный массив символов.

    Равно как и с другими типами данных, инициализация массива строк может быть:

    • с указанием размера строки;
    • без указания размера строки («безразмерная» инициализация).

    Пример 1. Инициализация массива строк с указанием длины строки. Описывается двумерный массив строк размером 5×60 символов.

    В вышеприведенном примере каждая строка может содержать до 60 символов. Если длина строки меньше, чем 60, то значение других символов равно 0 (рисунок 4).


    Рисунок 4. Представление двумерного массива строк в памяти компьютера

    Пример 2. «Безразмерная» инициализация массива строк

    Вышеприведенный код можно записать по другому

    При «безразмерной» инициализации массива строк не нужно «вручную» подсчитывать длину (количество символов) строки. Это осуществляется автоматически на этапе компиляции.

    В вышеприведенном примере длина первой строки равна 16 символов (рисунок 5). Длина второй строки равна 10. Длина третьей строки равна 12 символов. В конце каждой строки следует нулевой символ ‘’ .

    Таким образом, использование безразмерной инициализации позволяет экономить память, выделенную под массив.

    Рисунок 5. Представление строки при «безразмерной» инициализации

    Двумерные массивы паскаль

    Двумерный массив в Паскале представляет собой таблицу, состоящую из нескольких одномерных массивов. Двумерные массивы Pascal называют матрицей. Положение элементов в матрице обозначается двумя индексами.

    Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:

    Каждый элемент обладает 2-мя индексами. Первый — номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.

    1. Описание двумерного массива Паскаля.
    2. Основные действия с двумерными массивами Паскаля
    3. Ввод двумерного массива Паскаля.
    4. Вывод двумерного массива Паскаля на экран.
    5. Представление двумерного массива Паскаля в памяти
    6. Какой размер памяти выделяется для массива?
    7. Решим задачу с двумерным массивом Паскаля.

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

    Имеется ряд методов объявления двумерного массива.

    Рассмотри способ, в котором указывается тип элемента и переменные.

    В данном варианте матрица mas состоит из 4 строк, в каждой из которых 9 столбцов. При этом мы можем обратиться к любой i -й строке через mas [ i ], а к j -му элементу внутри i строки – m [ i , j ].

    Во втором и третьем способе матрицу можно задать в одну строку.

    Как и в предыдущем варианте, матрица имеет 4 строки и 9 столбцов, обращение к какому-либо элементу массива имеет вид: mas [ i , j ]. Значит, что элемент, расположен в i -й строке и j -м столбце. Важно не перепутать строки со столбцами, иначе произойдет ошибка в ответе.

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

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

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

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

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

    Проанализируем образец ввода двумерного массива Паскаля с клавиатуры:

    Способ заполнения двумерного массива Паскаля зависит от поставленной задачи. Например, функцию random (N) позволяет заполнять матрицу случайными величинами a[i,j]:=random(25)-10. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.

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

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

    Примечание! Использовать операторы readln ( a [ i , j ]), writeln именно в таком виде, в противном случае компилятор не сможет считать и напечатать элемент. Ввод в программу операторов в таком виде readln (a), writeln (a) не допустим, так как а – это переменная типа массив.

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

    В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа integer, будут занимать по 2 байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.

    В матрице для каждого элемента типа integer потребуется 2 байта памяти. Рассмотрим пример.

    В данном случае необходимо 24 байт памяти.

    Модель размещения массива M типа matrix в памяти.

    Для любого элемента предоставляется две ячейки памяти, размещение осуществляется от первой строки до нижней, в порядке изменения индекса.

    Между переменной и адресом ячейки устанавливается соответствие, однако, при объявлении матрицы программе известно только адрес начала массива, к остальным элементам адрес вычисляется по формуле:

    где Addres – местоположение первого элемента, выделенного для массива; I , J – индексы элемента в двумерном массиве; SizeElemt – размер элемента массива (например, 2 байта для элементов типа integer ); sum – количество элементов в строке.

    SizeElemt * sum *( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.

    Какой размер памяти выделяется для массива?

    Чтобы программа работала нормально, компьютер выделят память сегментами по 64 Кбайт. Один из сегментов отводится для данных, которые обрабатываются программой. Для каждой переменной отводится свой сегмент. Например, если переменная состоит из массива, то он не сможет занимать места больше, чем 65536 байт. Естественно, кроме массива в сегменте могут находится и другие переменные, поэтому объем памяти вычисляется по формуле 65536- S , где S – размер памяти, ранее отведенные под другие переменные.

    Рассмотрим пример, в котором:

    С точки зрения синтаксиса запись верная, но компилятор выдаст ошибку об объявлении слишком длинного массива.

    Можно без труда подсчитать количество элементов, которые допустимы по формуле: 65536/2 –1=32767. Однако, других переменных не должно быть. Матрицы обладают еще меньшими пределами индексов.

    Решим задачу с двумерным массивом Паскаля.

    Задача: Вычислить произведение ненулевых элементов матрицы.

    Решение:

    • Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
    • Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
    • Выходными параметром получим P (произведение).
    • Выведем матрицу на экран, для проверки работы программы.

    А теперь поговорим о процедурах.

    Примечание! Тип массива должен быть определен заранее. Например:

    Для того чтобы вводимая матрица была передана в программу как результат следует воспользоваться процедурой vvod , В таком случае матрица будет передаваться по ссылке. В таком случае процедура выглядит следующее:

    Print – процедуры вывода на экран матрицы, которая передается по значению.

    Для реализации вложенных циклов внутри процедуры нужно ввести счетчики – k и h . Алгоритм вывода матрицы на экран был описан выше, используем это описанием.

    Итак, опишем ход выполнения программы.

    • Ввод значений N и M ;
    • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
    • Переменной, которая отвечает за произведение P, присвоим значение 1;
    • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
    • Выводим на экран результат произведения ненулевых элементов матрицы – P
    Рейтинг
    ( Пока оценок нет )
    Понравилась статья? Поделиться с друзьями:
    Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: