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

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

Обычно двумерные массивы на языке программирования Pascal описываются так:

array [1..m, 1..n] of базовый_тип

Однако можно их описывать и по-другому:

array [1..m] of array [1..n] of базовый_тип

При этом описание может быть в разделе type и тогда создается новый тип, который можно использовать при объявлении переменных. Или массив может быть описан непосредственно в разделе переменных. m и n – это константы, их можно опустить и вставить конкретные значения, но лучше так не делать. Обычно подразумевают, что в интервале от 1 до m определяется количество строк, а в интервале от 1 до n – количество столбцов массива.

1 вариант – описание массива через раздел type:

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

2 вариант – описание массива в разделе переменных:

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

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

type a = array[1..10] of byte;
var b: array[1..100] of a;

Для обращения к элементу двухмерного массива необходимо указать имя массива и в квадратных скобках через запятую – значения двух индексов (первый указывает номер строки, а второй – номер столбца), на пересечение которых стоит элемент (например, a[i,2]:=6). В языке программирования Pascal допустимо разделение индексов с помощью квадратных скобок (например, a[i][5]:= 7).

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

type
	arr = array[1..4, 1..3] of integer;
const
	cords: arr = ((1,-1,3), (0,0,0), (1,4,0), (4,-1,-1));

Рассмотрим простой пример работы с двумерным массивом. Сначала заполним его данными, а затем выведем их на экран в виде таблицы.

var
    matrix: array[1..3,1..5] of integer;
    i, j: integer;
 
begin
    writeln ('Введите 15 чисел: ');
 
    for i := 1 to 3 do
        for j := 1 to 5 do
            read (matrix[i,j]);
 
    for i := 1 to 3 do begin
        for j := 1 to 5 do
            write (matrix[i,j], ' ');
        writeln
    end;
 
readln
end.

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

Когда пользователь вводит очередное число, то процедура read считывает его и помещает в ячейку с текущими индексами i и j. Когда i равна единице, значение j меняется пять раз, и, значит, заполняется первая строка таблицы. Когда i равна двум, значение j снова меняется пять раз и заполняется вторая строка таблицы. Аналогично заполняется третья строка таблицы. Внутренний цикл for в общей сложности совершает 15 итераций, внешний только 3.

Как пользователь вводит значения – не важно. Он может их разделять либо пробелом, либо переходом на новую строку.

Вывод значений двумерного массива организован в виде таблицы. Выводятся 3 строки по 5 чисел в каждой. Внутри строк числа разделяются пробелом.

На самом деле, это не совсем корректно написанная программа. Мы несколько раз используем цифры 3 и 5. А что если мы захотим поменять размерность массива? Придется просмотреть всю программу (представьте, что она очень большая) и исправить значения. Это неэффективно. Поэтому в программе следует использовать константы. В случае чего их значения можно поменять всего лишь в одном месте.
Вторая проблема – это «кривость» выводимой на экран таблицы значений матрицы, в случае если есть значения разной разрядности (однозначное, двузначное и т.д. числа). Неплохо бы под каждое число отводить равное количество знаков.
Вот так может выглядеть подправленный вариант программы:

const
    M = 3;
    N = 5;
 
var
    matrix: array[1..M,1..N] of integer;
    i, j: integer;
 
begin
    writeln ('Введите 15 чисел: ');
 
    for i := 1 to M do
        for j := 1 to N do
            read (matrix[i,j]);
 
    for i := 1 to M do begin
        for j := 1 to N do
            write (matrix[i,j]:5);
        writeln
    end;
 
readln
end.

Комментарии

С клавиатуры вводится двумерный массив чисел размерностью n m

  1. Вычислить сумму отрицательных элементов в каждой строке
  2. определить max элемент в каждой строке
  3. Переставить местами мах и мин десерт матрицы

Ответ на от Гость

var
        n, m: Integer;
        a: array [1..100, 1..100] of Integer;
        sum: LongInt;
        max1: Integer;
        max, min: array[1..2] of Integer;
        t: Integer;
        i, j: Integer;
 
begin
        WriteLn ('Введите сначала количество строк, затем количество столбцов');
 
        ReadLn (n, m);
 
        WriteLn ('Введите массив');
 
        for i := 1 to n do
                for j := 1 to m do
                        Read (a[i, j]);
 
        max[1] := 1; max[2] := 1;
        min[1] := 1; min[2] := 1;
 
        for i := 1 to n do begin
                sum := 0;
                max1 := a[i, 1];
 
                for j := 1 to m do begin
                        if a[i, j] < 0 then
                                sum := sum + a[i, j];
 
                        if a[i, j] > max1 then
                                max1 := a[i, j];
 
                        if a[i, j] > a[max[1], max[2]] then begin
                                max[1] := i;
                                max[2] := j;
                        end;
 
                        if a[i, j] < a[min[1], min[2]] then begin
                                min[1] := i;
                                min[2] := j
                        end
                end;
 
                WriteLn ('Сумма отрицательных элементов в', i, ' строке = ', sum);
                WriteLn ('Максимальный по значению элемент в этой же строке = ', max1)
        end;
 
        WriteLn ('Новый массив:');
 
        t := a[max[1], max[2]];
        a[max[1], max[2]] := a[min[1], min[2]];
        a[min[1], min[2]] := t;
 
        for i := 1 to n do begin
                for j := 1 to m do
                        Write (a[i, j], ' ');
 
                WriteLn
        end
end.

Помогите. Каждое число на главной и побочной умножить на 2 а остальные числа заменить еденицами