Двумерный массив. Работа с
элементами
Изменение значений некоторых
элементов, удовлетворяющих заданному
свойству
Решение таких задач похоже на решение для
одномерных массивов.
Пример 8
В массиве размерностью n*m к
элементам чётных столбцов прибавить
элемент первого столбца соответствующей
строки.
Procedure Substitation1(Var x: dmyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
For j: to m Div 2 Do {рассмотрим чётные столбцы
матрицы}
Inc(x[i,2*j],x[i,1]);
End;
Пример 9
Заменить все отрицательные элементы на
противоположные.
Procedure Substitation2(Var x: dmyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
For j:=1 To m Do
x[i,j]:=abs(x[i,j]);
End;
Заполнение двумерного массива
по правилу.
Пример 10
Составить программу, запрашивающую
координаты ферзя на шахматной доске и
указывающую поля доски, находящиеся под
боем.
Решение
- Заметим, что шахматную доску удобно
представить в виде двумерного массива
размером 8*8. Координаты ферзя можно
вводить двумя числами (номер строки и
номер столбца), но в шахматах принято
вводить букву и число. Буква отвечает за
номер строки, а число - за номер столбца.
Поэтому не будем отступать от традиций и
введём координаты именно таким образом. В
программе сделаем проверку правильности
ввода и если всё правильно, то переведём
букву в соответствующее ей число ('а'-1, 'b'-2,'c'-3,'d'-4,'e'-5,'f''-6,'g'-7,'h'-8),
тогда будет удобнее работать.
- Для решения надо ещё знать следующие
свойства шахматной доски. Все диагонали
делятся на восходящие и нисходящие.
Для любой восходящей диагонали сумма
номера строки и номера столбца постоянна
и для разных диагоналей - разная, то есть i
+ j = const1.
Для нисходящих - разность номера строки
и номера столбца постоянны и для разных
диагоналей - разная, то есть i - j = const2.
Это необходимо для того, чтобы определить
номера диагоналей, на которых поставлен
ферзь.
Вся программа будет такой:
Program Exampl_47;
Const n = 8;
Type dmyarray = Array[1..n, 1..n] Of Integer;
Var A : dmyarray;
c : Char;
str, stl : Integer; {str - номер строки, stl - номер
столбца.}
Function Place(ch: Char): Integer;
Var k : Integer;
Begin
Case ch Of
'a': k:=1; 'b': k:=2;'c': k:=3; 'd': k:=4;
'e': k:=5; 'f'': k:=6;'g': k:=7;
'h': k:=8;
End;
Place:=k;
End;
Procedure Init(k, l: Integer; Var x: dmyarray); {k -
номер строки, l - номер столбца, где
поставлен ферзь}
Var i, j : Integer;
Begin
For i:=1 To n Do
For j:=1 To n Do {если мы стоим в той же горизонтали
или вертикали, или восходящей диагонали,
или нисходящей диагонали, то данная клетка
подбоем, поэтому помечаем её 1, иначе - 0}
If (i=1) Or (j=1) Or (i+j=k+1) Or (i-j=k-1)
Then x[i,j]:=1 Else x[i,j]:=0;
x[k,l]:=2 {здесь стоит ферзь}
End;
Procedure Print(x: dmyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
Begin
Writeln('Введи координаты ферзя ');
Readln(c, stl);
If (c<'a') Or (c>'h') Or (stl<1) Or (stl>n)
Then Writeln ('некорректный ввод')
Else
Begin
str:= Place(c);
Init(str,stl, A);
Print(A);
End;
Readln;
End.
Можно функцию Place составить иначе:
Function Place(ch: Char): Integer;
Var k : Integer;
Begin
Place:=Ord(ch)- Ord('a')+1;
End;
В этом случае она будет более рациональна.
Пример 11
Заполнить массив А размером n*m
следующим образом, например, n = 6 и m
= 8:
01 02 03 04 05 06 07 08
16 15 14 13 12 11 10 09
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41
То есть заполняется в виде "змейки".
Решение
Для того, чтобы заполнить, надо вывести
правило заполнения, а оно в данном случае
будет таким: если ряд нечётный (то есть
номер строки - нечётное число), А[i, j] = (i-1)*m + j,
иначе (то есть когда строка чётная) А[i, j] = i*m -
j + 1. По этому правилу и составляем процедуру
заполнения:
Procedure Fill(Var x: dmyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
For j:=1 To m Do
If i Mod 2=1 Then x[i,j]:=(i-1)*m+j
Else x[i,j]:=i*m-j+1;
End;
Содержание