Как составить таблицу двумерного массива

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

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

Объявление int A[n] создает в памяти одномерный массив:
набор пронумерованных элементов, идущих в памяти последовательно.
К каждому элементу массива можно обратиться, указав один индекс —
номер этого элемента. Но можно создать и двумерный массив
следующим образом: int A[n][m].
Данное объявление создает массив из n объектов,
каждый из которых в свою очередь является массивом типа
int [m].
Тогда A[i], где i принимает значения от
0 до n-1 будет в свою очередь одним из
n созданных обычных массивов, и обратиться к элементу
с номером j в этом массиве можно через A[i][j].

Подобные объекты (массивы массивов) также называют двумерными массивами.
Двумерные массивы можно представлять в виде квадратной таблицы,
в которой первый индекс элемента означает номер строки, а второй
индекс – номер столбца. Например, массив
A[3][4] будет состоять из 12 элементов и его можно записать
в виде

A[0][0]  A[0][1]  A[0][2]  A[0][3]
A[1][0]  A[1][1]  A[1][2]  A[1][3]
A[2][0]  A[2][1]  A[2][2]  A[2][3]

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

int A[n][m];
for (int i = 0; i < n; ++i)
{   // Выводим на экран строку i
    for (int j = 0; j < m; ++j)
    {
	cout << A[i][j] << " ";
    }
    cout << endl;
    // Строка завершается символом перехода на новую строку
}

А считать двумерный массив с клавиатуры можно при помощи еще более простого алгоритма (массив вводится по строкам,
то есть в порядке, соответствующему первому примеру):

for (i = 0; i < n; ++i)
{
    for (j = 0; j < m; ++j)
    {
        cin >> A[i][j];
    }
}

Обработка двумерного массива

Обработка двумерных массивов производится аналогичным образом.
Например, если мы хотим записать в массив таблицу умножения,
то есть присвоить элементу A[i][j] значение
i * j, это можно сделать следующим образом
при помощи вложенных циклов:

for (i = 0; i < n; ++i)
{
    for (j = 0; j < m; ++j)
    {
        A[i][j] = i * j;
    }
}

Рассмотрим более сложную задачу и несколько способов ее решения.
Пусть дан квадратный двумерный массив int A[n][n].

Необходимо элементам, находящимся на главной диагонали проходящей
из левого верхнего угла в правый нижний (то есть тем элементам
A[i][j], для которых i == j) присвоить значение
1, элементам, находящимся выше главной
диагонали – значение 0, элементам, нахощящимся
ниже главной диагонали – значение 2.
То есть получить такой массив (пример для n == 4):

1 0 0 0
2 1 0 0
2 2 1 0
2 2 2 1

Рассмотрим несколько способов решения этой задачи. Элементы,
которые лежат выше главной диагонали –
это элементы A[i][j], для которых i < j,
а для элементов ниже главной диагонали i > j.
Таким образом, мы можем
сравнивать значения i и j и по ним
определять значение A[i][j]. Получаем следующий алгоритм:

for (i = 0; i < n; ++i)
{
    for (j = 0; j < n; ++j)
    {
	if (i < j)
	{
            A[i][j] = 0;
	}
	else if (i > j)
        {
	    A[i][j] = 2;
	}
	else
	{
            A[i][j] = 1;
        }
    }
}

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

Сначала заполним главную диагональ,
для чего нам понадобится один цикл:

for (i = 0; i < n; ++i)
{
    A[i][i] = 1;
}

Затем заполним значением 0 все элементы выше
главной диагонали, для чего нам понадобится в каждой из строк
с номером i присвоить значение элементам
A[i][j] для j=i+1, …,
n-1. Здесь нам понадобятся вложенные циклы:

for (i = 0; i < n; ++i)
{
    for (j = i + 1; j < n; ++j)
    {
        A[i][j] = 0;
    }
}

Аналогично присваиваем значение 2 элементам
A[i][j] для j=0, …,
i-1:

for (i = 0; i < n; ++i)
{
    for (j = 0; j < i; ++j)
    {
        A[i][j] = 2;
    }
}

Можно также внешние циклы объединить в один и получить еще одно,
более компактное решение:

for (i = 0; i < n; ++i)
{   // Заполняем строку с номером i
    for (j = 0; j < i; ++j)
    {
	A[i][j] = 2;    // Сначала пишем 2 ниже диагонали
    }
    A[i][j] = 1;        // После завершения предыдущего цикла i==j, пишем 1
    for (++j; j < n; ++j)  // Цикл начинаем с увеличения j на 1
    {
        A[i][j] = 0;    // Записываем 0 выше диагонали
    }
}

Многомерные массивы

Можно объявлять не только двумерные массивы, но и массивы
с большим количеством измерений. Например,
объявление int A[n][m][l] создает трехмерный массив из
n*m*l элементов. Для обращения
к каждому элементу такого массива необходимо указать
три индекса: A[i][j][k], при этом
0 <= i < n,
0 <= j < m,
0 <= k < l.
Количество измерений в массиве может быть
практически бесконечным (т.е. достаточным
для решения любых практических задач).

Передача двумерных массивов в функцию

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

void f (int A[10][10])
{
   ...
}

int main()
{
    int B[10][10];
    f(B);
}

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

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

Одномерный массив int A[n] это почти то же самое, что
указатель на переменную типа int: int * A.

Тогда двумерный массив — это массив, каждый из элементов которого
является одномерным массивом, то есть указателем на какой-то адрес
целого числа в памяти. То есть двумерный массив — это массив
элементов типа int * или же это указатель на переменную
типа int *, то есть это переменная типа int **.

Итак, двойной указатель можно объявить так:

int ** A;

Теперь выделим память для массива A. Если мы хотим,
чтобы в массиве A было n элементов, каждый
из которых является указателем на тип int, то сделаем
это при помощи операции new:

A = new int * [n];

Теперь A указывает на область памяти, содержащей
n элементов, каждый из которых имеет тип int *
и указывает на некоторую область памяти, пока еще не выделенную.
Выделим эту память — сделаем все A[i] указателями
на область памяти из m элементов типа int:

for (int i =  0; i < n; ++i)
{
    A[i] = new int [m];
}

Функцию, получающую в качестве параметра двумерный массив, можно
объявлять так:

void  f (int ** A, int n, int m)

Как и в случае с одномерным массивом, передаваемым как указатель,
нам нужно одновременно передавать размеры массива — количество строк
n и количество столбцов m.

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

Форматирование чисел при выводе

Допустим, мы заполним массив таблицей умножения:
A[i][j]=i*j как в примере в начале раздела.
Если мы теперь попробуем вывести этот массив на экран,
разделяя элементы в строке одним пробелом, то из-за того,
что числа имеют различную длину
столбцы таблицы окажутся неровными:

0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 10 12 14 16 18
0 3 6 9 12 15 18 21 24 27

Для того, чтобы получить ровные столбцы необходимо,
выводить числа так, чтобы одно
выводимое число имело ширину, например, ровно в 3 символа,
а “лишние” позиции были бы заполнены пробелами.
Тогда получится следующая таблица:

0  0  0  0  0  0  0  0  0  0
0  1  2  3  4  5  6  7  8  9
0  2  4  6  8 10 12 14 16 18
0  3  6  9 12 15 18 21 24 27

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

for(int i = 0; i < n; ++i)
{
    for(int j = 0; j < m; ++j)
    {
        cout.width(3);
        cout << A[i][j];
    }
    cout << endl;
}

Заметим, что мы теперь не выводим пробел после каждого числа,
поскольку мы добавили этот пробел к ширине выводимого поля.
Функция width действует однократно, только на
следующее выводимый в поток значение, поэтому ее нужно вызывать
перед каждым выводом числа на экран.

Внимание! Если выводимое число или строка имеет большую длину,
чем это было установлено функцией width,
то это число или строка будут выведены полностью, а не будет
обрезано до указанного значения. То есть предпочтительней вывести
результат некрасиво, нежели неверно.

Упражнения

Общие требования к оформлению программ.

Считывание данных осуществляется функцией
void Read (int **& A, int & n, int & m). Эта
функция считывает размер массива в переменные n и m,
передаваемые по ссылке, выделяет память под хранение массива.

Решение задачи осуществляется функцией, получающей в качестве
параметра массив (типа int **), его размеры, дополнительные
параметры при необходимости.

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

Типичный вид программы на примере задачи A:

void Read (int **& A, int & n)
{
    ...
}

void Fill (int ** A, int n)
{
    ...
}

void Print (int ** A, int n)
{
   ...
}

int main()
{
    int n;
    int ** A;
    Read(A, n);
    Fill(A, n);
    Print(A, n);
    return 0;
}

A: Максимум

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

Программа получает на вход размеры массива n и
m, затем n строк по m
чисел в каждой.

Ввод Вывод
3 4
0 3 2 4
2 3 5 5
5 1 2 3
1 2

B: Снежинка

Дано нечетное число n. Создайте двумерный массив из
n×n элементов, заполнив
его символами "." (каждый элемент массива является
строкой из одного символа). Затем заполните символами "*"
среднюю строку массива, средний столбец массива, главную диагональ
и побочную диагональ. В результате единицы в массиве должны образовывать изображение
звездочки. Выведите полученный массив на экран, разделяя элементы
массива пробелами.

Ввод Вывод
5
* . * . *
. * * * .
* * * * *
. * * * .
* . * . *

C: Шахматная доска

Даны два числа n и m. Создайте двумерный массив
размером n×m и заполните его символами "."
и "*" в шахматном порядке. В левом верхнем углу должна стоять точка.

Ввод Вывод
3 4
. * . *
* . * .
. * . *

D: Диагонали параллельные главной

Дано число n. Создайте массив
размером n×n и заполните его по следующему правилу. На главной диагонали
должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1.
На следующих двух диагоналях числа 2, и т.д.

Ввод Вывод
5
0 1 2 3 4
1 0 1 2 3
2 1 0 1 2
3 2 1 0 1
4 3 2 1 0

E: Побочная диагональ

Дано число n. Создайте массив
размером n×n и заполните его по следующему правилу:

Числа на диагонали, идущей из правого верхнего в левый нижний угол
равны 1.

Числа, стоящие выше этой диагонали, равны 0.

Числа, стоящие ниже этой диагонали, равны 2.

Полученный массив выведите на экран. Числа в строке разделяйте
одним пробелом.

Ввод Вывод
4
0 0 0 1
0 0 1 2
0 1 2 2
1 2 2 2

F: Поменять строки

Дан двумерный массив. Поменяйте в нем первую
и последнюю строку. Полученный массив выведите на экран.

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

Выведите массив на экран разделяя числа в строке одним пробелом.

Решение оформите в виде функции void SwapRows (int ** A, int n, int m).

Ввод Вывод
3 4
11 12 13 14
21 22 23 24
31 32 33 34
31 32 33 34
21 22 23 24
11 12 13 14

G: Поменять столбцы

Дан двумерный массив и два числа: i и j.
Поменяйте в массиве столбцы с номерами i и j
и выведите результат.

Программа получает на вход размеры массива n и
m, затем элементы массива, затем числа
i и j.

Решение оформите в виде функции void SwapColumns (int ** A, int n, int m, int i, int j).

Ввод Вывод
3 4
11 12 13 14
21 22 23 24
31 32 33 34
0 1
12 11 13 14
22 21 23 24
32 31 33 34

H: Симметричен ли массив?

Дано число n и массив размером n×n.
Проверьте, является ли этот массив симметричным относительно
главной диагонали. Выведите слово “YES”,
если массив симметричный, и слово “NO
в противном случае.

Решение оформите в виде функции bool IsSymmetric (int ** A, int n).

Ввод Вывод
3
0 1 2
1 2 3
2 3 4
YES

I: k-я диагональ

Дан квадратный двумерный массив размером n×n
и число k. Выведите элементы k-й по счету
диагонали ниже главной диагонали (т.е. если k == 1,
то нужно вывести элементы первой диагонали, лежащей ниже главной,
если k == 2, то второй диагонали и т.д.).

Значение k может быть отрицательным, например,
если k == -1, то нужно вывести значение первой
диагонали лежащей выше главной. Если k == 0,
то нужно вывести элементы главной диагонали.

Программа получает на вход число n, затем массив
размером n×n, затем число k.

Ввод Вывод
4
1 2 3 4
5 6 7 8
0 1 2 3
4 5 6 7
1
5 1 6
4
1 2 3 4
5 6 7 8
0 1 2 3
4 5 6 7
-2
3 8

J: Транспонировать прямоугольную матрицу

Дан двумерный массив размером n×m.
Симметричный ему относительно главной диагонали массив
называется транспонированным к данному. Он имеет размеры
m×n: строки исходного массива становятся
столбцами транспонированного, столбцы исходного массива
становятся строками транспонированного.

Для данного массива постройте транспонированный массив
и выведите его на экран. Решение оформите в виде функции
void Transpose (int ** Src, int ** Dst, int n, int m).

Ввод Вывод
3 4
11 12 13 14
21 22 23 24
31 32 33 34
11 21 31
12 22 32
13 23 33
14 24 34

K: Транспонировать квадратную матрицу

Дан двумерный массив размером n×n.
Транспонируйте его и результат запишите в этот же масссив.
Вспомогательный массив использовать нельзя.

Решение оформите в виде функции
void Transpose (int ** Src, int n).

Ввод Вывод
3
1 2 3
4 5 6
7 8 9
1 4 7
2 5 8
3 6 9

L: Поменять две диагонали

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

Решение оформите в виде функции
void SwapDiagonals (int ** Src, int n).

Ввод Вывод
3
1 2 3
4 5 6
7 8 9
7 2 9
4 5 6
1 8 3

M: Кинотеатр

В кинотеатре n рядов по m мест в каждом. В двумерном массиве
хранится информация о проданных билетах, число 1 означает, что
билет на данное место уже продано, число 0 означает, что место свободно.
Поступил запрос на продажу k билетов на соседние места в одном ряду.
Определите, можно ли выполнить такой запрос.

Программа получает на вход числа n и m. Далее идет n строк,
содержащих m чисел (0 или 1), разделенных пробелами. Затем дано число k.

Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест.
Если таких рядов несколько, то выведите номер наименьшего подходящего ряда. Если
подходящего ряда нет, выведите число 0.

Ввод Вывод
3 4
0 1 0 1
1 0 0 1
1 1 1 1
2
2
3 3
0 1 0
1 0 0
1 1 1
3
0

N: Прямоугольник Паскаля

Даны два числа n и m. Создайте массив n×m
и заполните его по следующим правилам:

Числа, стоящие в строке 0 или в столбце 0 равны 1
(A[0][j] = 1, A[i][0] = 1). Для всех остальных
элементов массива A[i][j] = A[i-1][j] + A[i][j-1], то есть
каждый элемент равен сумме двух элементов, стоящих слева и сверху
от него.

Выведите данный массив на экран, отводя на вывод каждого
элемента массива ровно 6 символов
(см. пример).

Ввод Вывод
4 6
     1     1     1     1     1     1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56

O: Ходы коня

На шахматной доске стоит конь. Отметьте положение коня на доске и все клетки,
которые бьет конь.

Программа получает на вход координаты коня на шахматной доске в шахматной
нотации (то есть в виде “e4”, где сначала записывается номер
столбца (буква от “a” до “h”, слева направо), затем
номеру строки (цифра от 1 до 8, снизу вверх).

Клетку, где стоит конь, отметьте буквой “K”, клетки, которые
бьет конь, отметьте символами “*”, остальные клетки заполните точками.

Выведите на экран изображение доски.

Ввод Вывод
b6
* . * . . . . .
. . . * . . . .
. K . . . . . .
. . . * . . . .
* . * . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

P: Ходы ферзя

Решите предыдущую задачу для ферзя. Ферзь обозначается буквой “Q”.

Ввод Вывод
c4
. . * . . . * .
. . * . . * . .
* . * . * . . .
. * * * . . . .
* * Q * * * * *
. * * * . . . .
* . * . * . . .
. . * . . * . .

Q: Заполнение змейкой

По данным числам n и m заполните двумерный массив размером n×m
числами от 1 до n×m “змейкой”, как показано в примере.
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.

Ввод Вывод
3 5
   1   2   3   4   5
10 9 8 7 6
11 12 13 14 15

R: Заполнение диагоналями

По данным числам n и m заполните двумерный массив размером n×m
числами от 1 до n×m “диагоналями”, как показано в примере.
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.

Ввод Вывод
3 5
   1   2   4   7  10
3 5 8 11 13
6 9 12 14 15

S: Поворот прямоугольного массива

Дан прямоугольный массив размером n×m.
Поверните его на 90 градусов по часовой стрелке,
записав результат в новый массив размером m×n.

Выведите получившийся массив. Числа при выводе разделяйте одним пробелом.

Ввод Вывод
3 4
11 12 13 14
21 22 23 24
31 32 33 34
31 21 11
32 22 12
33 23 13
34 24 14

T: Поворот квадратного массива

Дан квадратный массив. Поверните его на 90 градусов по часовой стрелке.
Результат запишите в этот же массив, вспомогательный массив использовать нельзя.

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

Ввод Вывод
3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3

U: Таблица умножения

Даны числа n и m. Создайте двумерый массив размером n×m
и заполните его таблицей умножения по формуле A[i][j] = i * j.
При заполнении массива нельзя использовать вложенные циклы.

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

Ввод Вывод
4 6
   0   0   0   0   0   0
0 1 2 3 4 5
0 2 4 6 8 10
0 3 6 9 12 15

V: Заполнение в шахматном порядке

Даны числа n и m. Заполните массив размером n×m в шахматном порядке:
клетки одного цвета заполнены нулями, а другого цвета — заполнены числами натурального
ряда сверху вниз, слева направо. В левом верхнем углу записано число 1.

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

Ввод Вывод
3 5
   1   0   2   0   3
0 4 0 5 0
6 0 7 0 8

W: Заполнение спиралью

По данным числам n и m заполните двумерный массив размером n×m
числами от 1 до n×m по спирали, выходящей из левого верхнего угла и закрученной
по часовой стрелке, как показано в примере.
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.

Тесты к этой задаче закрытые.

Ввод Вывод
4 5
   1   2   3   4   5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8

X: Сапер

На поле для игры в сапер клеточки с минами обозначаются символом “*”,
а в каждой пустой клеточке записано число от 0 до 8, равное количеству мин
в 8 клетках, соседних с данной.

Дан список мин на поле. Постройте по данному списку изображение поля.

Программа получает на вход числа N и M — количество строк и столбцов на поле,
а также количество мин на поле K. Далее идет K пар чисел — координат мин.
Первое число — номер строки, второе число — номер столбца.

Выведите изображение поля на экран, клетки при выводе разделяйте одним пробелом.

Тесты к этой задаче закрытые.

Ввод Вывод
3 2 2
1 1
2 2
* 2
2 *
1 1
2 2 0
0 0
0 0

Y: Крестики-нолики

Напишите программу, которая по изображению поля для игры в «Крестики-нолики» определит, могла ли такая ситуация возникнуть в результате игры с соблюдением всех правил.

Напомним, что игра в «Крестики-нолики» ведется на поле 33. Два игрока ходят по очереди. Первый ставит крестик, а второй – нолик. Ставить крестик и нолик разрешается в любую еще не занятую клетку поля. Когда один из игроков поставит три своих знака в одной горизонтали, вертикали или диагонали, или когда все клетки поля окажутся заняты, игра заканчивается.

Вводится три строки по три числа в каждой, описывающих игровое поле. Число 0 обозначает пустую клетку, 1 – крестик, 2 – нолик.
Числа в строке разделяются пробелами.

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

Тесты к этой задаче закрытые.

Ввод Вывод
1 1 1
1 1 1
1 1 1
NO
2 1 1
1 1 2
2 2 1
YES
1 1 1
2 0 2
0 0 0
YES
0 0 0
0 1 0
0 0 0
YES
1 1 1
2 2 2
0 0 0
NO

Z: Городской план

План города представляет собой прямоугольник, разбитый на (ntimes m) квадратиков.
Каждый квадратик может быть занят зданием или быть свободным. Если два соседних (по стороне)
квадратика заняты зданием, то это — оно и то же здание.

Программа получает на вход два числа (n) и (m), затем идет
(n) строк по (m) символов в каждой — план города.
Символ “.” обозначает свободную клетку, символ
#” обозначает здание.

Выведите число зданий на плане.

Тесты к этой задаче закрытые.

Ввод Вывод
6 6
.#####
#....#
#.##.#
#.#..#
#....#
######
2

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

Содержание:

  • Двумерный массив в Pascal
  • Описание, ввод и вывод элементов двумерного массива
  • Главная и побочная диагональ при работе с двумерными матрицами в 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)

  1. Описание массива в разделе переменных:
  2. const N = 3;
          M = 4;
    var A: array[1..N,1..M] of integer;
  3. Описание массива через раздел type:
  4. const
      M=10;
      N=5;
    type
      matrix=array [1..M, 1..N] of integer;
    var A: matrix;

Ввод двумерного массива m x n с клавиатуры:

ввод двумерного массива

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

«Красивый» вывод элементов двумерного массива m x n:

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

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

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

Результат:

   8   2   1   3
   5   8   0   8
   6   3   9   3
   3.3   4.7   3.7   5.4
   2.9   1.7   2.3   4.0
   8.3   3.7   8.4   1.4

Рассмотрим следующую задачу: Получены значения температуры воздуха за 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;

Задание array 1: Необходимо:

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

Дополните код:

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var t: array [1..3, 1..4] of integer;
s,i,j:integer;
begin
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;
{1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день}
writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]);
 
{2. Показания термометров всех метеостанций за 2-й день}
for i:=1 to ... do 
   writeln ('2-е задание: ',t[...,...]);
 
{3. Определим среднее значение температуры на 3-й метеостанции:}
i:=3;
s:=0;
for j:=1 to 4 do 
   s:=...; {сумматор}
writeln('3-е задание: ', s/4);
{распечатаем всю таблицу}
for i:=1 to 3 do
    for j:=1 to 4 do
        writeln(t[i,j]);
{4. Распечатаем станции и дни с температурой 24-26 гр}
writeln('4-е задание: ');
for i:=1 to 3 do
    for ... ... do
        if (...) and (...) then
           writeln('станция ', i, ' день ', j)
end.

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

Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]

Задание array 4.
Найти сумму всех элементов массива (переменная sum) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s). Дополните код.
двумерный массив в pascal

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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.

Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:

2 8 1 9  : sum = 20
3 1 7 2  : sum = 13
4 5 6 2  : sum = 17

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

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.

Результат:

  86  62  80  33
  51   4  36  65
  78  30   5  16
261 
39 
187200 
51 
62 

Главная и побочная диагональ при работе с двумерными матрицами в 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

Если индексы начинаются с нуля (pascalAbc.NET):

0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3

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

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

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

Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1

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

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

Решение:
Вывод элементов главной диагонали
Вывод элементов побочной диагонали

Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями

Показать решение:

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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.

PascalAbc.Net

1
2
3
4
5
6
7
8
9
10
11
12
begin
  var n := readinteger('введите размерность матрицы:');
  var a := matrRandomInteger(n, n, -10, 10);
  a.Println(6);
  for var i := 0 to n - 1 do
  begin
    a[i, i] := 0;
    a[i, n - i - 1] := 0;
  end;
  writeln();
  a.Println(6);
end.

Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы

1 7 3 7
2 1 8 3
5 7 6 4
8 2 3 1
-------
sum1 = 9
sum2 = 30

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

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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.

Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскаль

Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскальдиагонали матрицы Паскаль

Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
диагонали матрицы Паскаль
главная и побочная диагональ матрицы паскаль

Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:

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

    Пример: В двумерном массиве размером N х M определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    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)<min then begin
          min:=abs(a[i,j]-f);
          index1:=i;
          index2:=j;
        end;
      end;
    end;
    writeln('naibolee blizkiy ',index1,' ',index2);
    end.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

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

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

    {$CODEPAGE UTF8}
    program Print2dArray;
    const
      rowCount = 4; {количество строк}
      colCount = 6; {количество столбцов}
    var
      arr : array [1..rowCount, 1..colCount] of integer;
      row, col : integer;
    begin
      randomize;
      {заполнение массива случайными числами}
      for row := 1 to rowCount do
        for col := 1 to colCount do
          arr[row, col] := random(100);
    
      writeln('Печать массива');
      for row := 1 to rowCount do
        begin
          for col := 1 to colCount do
            write(arr[row, col]:4);
          writeln;
        end;
      readln;
    end.  
    

    Результат табличного вывода массива в консоль

    Вывод массива по одному элементу в строке, с названием массива и значениями индексов

      writeln('Печать массива');
      for row := 1 to rowCount do
        for col := 1 to colCount do
          writeln('A[', row,', ', col, '] =', arr[row, col]:4);
    

    Результат поэлементного вывода массива в консоль

    Смотрите также:

    Просмотров 8.4к. Обновлено 23 ноября 2020

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

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

    двухмерный массив paskal

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

    Содержание

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

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

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

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

    Type
    Vector = array [1..9] of <тип элементов>;
    Matrix= array [1..4] of vector;
    Var mas: matrix;

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

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

    Type
    Matrix= array [1..4] of array [1..9] of < тип элементов >;
    или еще проще:
    type
    matrix = array [1..4, 1..9] of <тип элементов>;

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

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

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

    type
    matrix= array [1..4, 1..9] of integer;
    var
       a , b : matrix ;

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

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

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

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

    type
       matrix= array [1..4, 1..9] of integer;
    var
       a, : matrix;
       i, j: integer; { индексы массива }
    begin
       for i :=1 to 4 do {цикл перебора всех строк}
          for j :=1 to 9 do {цикл перебора элементов строки по столбцам}
             readln ( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}

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

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

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

    for i :=1 to 4 do {цикл перебора всех строк}
    begin
       for j :=1 to 9 do {цикл перебора всех элементов строки по столбцам}
          write ( a [ i , j ]:3); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 3 позиции}
       writeln ; 
    end ;

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

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

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

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

    Matrix = array [1..4, 1..3] of integer ;

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

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

    массив Паскаля в памяти

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

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

    Addres + SizeElemt * sum *( I -1)+ SizeElem *( J -1),

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

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

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

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

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

    Type myArray= array [1..50000] of integer;

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

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

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

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

    Решение:

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

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

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

    Type
    Matrix=array [1..10, 1..10] of integer;
    ..............................
    procedure primer (a: matrix);
    ..............................

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

    Procedure vvod ( var m : matrix );

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

    Procedure print ( m : matrix );

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

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

    • Ввод значений N и M ;
    • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
    • Переменной, которая отвечает за произведение P, присвоим значение 1;
    • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
    • Выводим на экран результат произведения ненулевых элементов матрицы – P
    Program proizvedenie;
    Type
       Matrix=array [1..10, 1..10] of integer;
    Var
       a: matrix;
       n, m, i, j: byte;
       P: integer;
    Procedure vvod (var m: matrix);
    Var k , h : byte ;
    Begin
       For i :=1 to n do 
          For j :=1 to m do 
             M[i,j]:= random(10);
    End;
    Procedure print (m: matrix);
    Var k, h: byte;
    Begin
       For i:=1 to n do
       begin
          For j:=1 to m do
             Write (M[i, j]: 4);
          Writeln;
       end ;
    End ;
    Begin {начало основной программы}
       Writeln ('Введите размерность матрицы:');
       Readln(N, M);
       Vvod(a);
       Print(a);
       P:=1;
       For i:=1 to N do
          For j:=1 to M do
             If a[i, j]<>0 then p:=p*a[i, j];
       Writeln ( p );
    End .

    Добрый день друзья.

    Сегодня затронем новую тему. Двумерные массивы. Или их еще
    называют матрицы.   

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

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

    • Ещё более доступное объяснение
    • Дополнительные материалы
    • 10 задач на программирование с автоматической проверкой решения

    Что такое двумерный массив?

    Двумерный массив это прямоугольная таблица с определенным
    количеством строк и столбиков.  Каждая
    строка и каждый столбик имеют свой порядковый номер. На рисунке изображен
    двумерный массив, который имеет 6 строк и 7 столбцов.

    Рис.1. Двумерный массив. Общий вид.

    Обратите внимание, что столбцы и строки нумеруются, начиная
    с нуля, как и в одномерных массивах.

    Сразу же покажу, как объявить двумерный массив. В сущности,
    ничего нового. Синтаксис прост и очень похож на объявление обычного массива и
    любой другой переменной.  Сначала
    указываем тип данных, затем имя массива, а после в квадратных скобках его
    размерность, то есть количество строк и количество столбиков.  На рисунке ниже мы объявили двумерный массив
    размерностью 6 на 7.

    Рис.2 Двумерный массив, объявление.

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

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

    Следующий естественный вопрос:

    Как работать с двумерным массивом?

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

    Листинг 19.1

    int arr [2][4]
    = {{1,2,4,29},{3,4,6,1}};

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

    Рис.3. Двумерный массив инициализированный при объявлении

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

    Листинг 19.2

    int arr [2][4]
    = {{1,2,4},{3,4}};

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

    Рис.4. Двумерный массив, инициализированный не полностью.

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

    Как работать с отдельным элементом
    массива.

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

    Рис.5. Обращение к элементу двумерного массива.

    Обращение к конкретному элементу происходит так же, как и в
    одномерном массиве. Сначала пишут имя массива, а затем, в квадратных скобках
    номер строки и номер столбика.  Опять
    напоминаю, сначала идет номер строки, а потом номер столбика. Не путайте это. А
    так же, помните, что нумерация идет не с единицы, а с нуля.  Это очень частая ошибка, всегда следите за
    этим.

    Помните, когда мы хотели пройтись по всему одномерному
    массиву, мы использовали цикл for,
    который изменял наш индекс. Так как в двумерном массиве у нас два индекса (
    один для строки и один для столбца), то для того, чтобы пройтись по всему
    массиву нам потребуется два вложенных цикла for. Разберите следующий пример. 

    Листинг
    19.3

    #include <stdio.h> 

    int main (){ 

          int arr [2][4] = {{1,2,4},{3,4}}; 

          for (int i=0; i<2;
    i++){ // 1
    цикл
     

                for (int j=0; j<4;
    j++) // 2
    цикл
     

                      printf(«%dt»,arr[i][j]); 

                printf(«n»); 

          } 

    return 0; 

    }  

    Данная программа, выводит последовательно все элементы
    массива. Результат её работы, представлен на следующем рисунке.

    Рис.6. Двумерный массив. Поэлементный вывод на экран.

    Как  работает
    вложенный цикл, вам уже должно быть понятно.

    Сначала переменной i присваивается значение нуль,
    проверяется условие 0<2, и так как оно выполняется, программа начинает
    выполнять тело первого цикла. В теле первого цикла программа опять попадает в
    цикл, теперь уже второй. Переменной j присваивается значение 0 и проверяется
    условие 0<4. Оно истинно, поэтому выполняется тело второго цикла. Оно состоит
    из одной инструкции вывода на экран элемента arr[i][j]. Так как на данном шаге у
    нас i=0 j=0, то выводится значение элемент
    из нулевой строки и нулевого столбика. В нашем примере это элемент число 1.
    Тело второго цикла закончилось, происходит увеличение j на единицу j=1.

    Проверка условия 1<4. Выполнение тела второго цикла:
    вывод на экран элемента arr[0][1]
    в нашем случае это 2. И так далее …

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

    Зачем нужны двумерные массивы?

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

    Например, рассмотрим такую задачку. Пусть нам нужно было бы
    найти среднее арифметическое всех оценок по всем предметам.  Если бы у нас было четыре одномерных массива,
    то нам пришлось бы писать четыре цикла, в каждом из них считать среднее
    арифметическое оценок по одному предмету, потом 
    находить среднее арифметическое этих четырех чисел. Если оценки у нас
    хранятся в двумерном массиве, нам достаточно будет просто пройтись по всем
    элементам массива, используя два вложенных цикла for, и найти среднее арифметическое.

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

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

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

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

    Практическое задание.

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

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

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

    Понравилась статья? Поделить с друзьями:
  • Как найти детализацию счета
  • Как найти машину в сша
  • Как найти внутреннюю энергию газа зная работу
  • Как найти декартовы координаты вектора
  • Как найти песню если знаю только мотив