Каталог примеров

Массивы в Паскале

Составить программу, запрашивающую координаты ферзя на шахматной доске и указывающую поля доски, находящиеся под боем. Заметим, что шахматную доску удобно представить в виде двумерного массива размером 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; Можно функцию Place составить иначе Function Place(ch: Char): Integer; Var k : Integer; Begin Place:=Ord(ch)- Ord('a')+1; End; В этом случае она будет более рациональна.