Главная Промышленная автоматика.

вставлены операторы

п: = РУБЕЖ Х0Д0В[2]; if ВОЗМОЖЕН ПАТ then

* Позднее была внесена еще одна поправка: после оператора с меткой ОЧИСТКА ДОСОК был добавлен оператор цикла для очистки массива <f 1 :5].

Алгоритм 50CJ получен из алгоритма 50 А. Белла (Bell А. G. «The Computer Journal*, 1970, № 2) в результате следующих изменений:

1) внесения нижеперечисленных поправок *

2) замены английских идентификаторов русскими, подобранными по смыслу выполняемых ими функций -в программе, и снабжения ряда узловых операторов смысловыми метками, разъясняющими работу программы;

3) замены процедур ввода - вывода системы Elliot Algol процедурами ввода - вывода системы БЭСМ - АЛГОЛ [29] {варианта процедур ввода-вывода языка АЛГАМС [41, вып. 3], получивщего щирокое распространение как в Советском Союзе (например, на машинах БЭСМ-6, М-220, БЭСМ-4, Минск-22 и др.), так и за рубежом}.

Поправки, внесенные редактором данного выпуска в программу алгоритма 50 А. Белла, целесообразно разбить на следующие группы. I. Ликвидация пата на первом ходе. II. Обеспечение выдачи информации об ошибках в исходной позиции. Ш. Исправление операторов превращения пешки. IV. Иоправление операторов взятия на проходе. V. Исправление операторов рокировки.

/. Ликвидация пата на первом ходе

В программе алгоритма 50 А. Белла не была предусмотрена опасность возиикно-

вения пата после первого хода белых. В тех случаях, когда программа алгорит.ма 50 рассматривала первый ход, приводящий к пату, раньше ключевого хода, приводящего к мату, она выдавала в качестве решения этот патовый ход. Так, при попытке решения нижеследующих десяти задач из газеты «Вечерняя Москва» в первых же двух задачах програ.мма А. Белла выдала в качестве ответа ход, в результате которого на доске возникал пат.

В частности, при попытке решения задачи (№ 2 из нижеприведенных десяти задач, программа алгоритма 50 выдала в качестве ответа ход Лс7 (пат) вместо правильного ответа Kpf5.

Для исправления этой ошибки в программе были сделаны следующие изменения-

1. В начале программы добавлено описание

Boolean ВОЗМОЖЕН ПАТ;

2. Ниже метки «НАЧАЛО:» в оператор цикла с заголовком

for Б1:=3 step 1 until РУБЕЖ Х0Д0В[1] do

вставлен оператор

ВОЗМОЖЕН ПАТ:= true;

3. Ниже предыдущего оператора в оператор цикла с заголовком

for Б2: = РУБЕЖ XOДOBI2]-2 step 1 until РУБЕЖ ХОДОВ{д do вставлен оператор г

ВОЗМОЖЕН ПАТ:= false;

4. Еще ниже вместо строк

ПЕЧАТЬ ПОЗИЦИИ; ОТВЕТ: goto КОНЕЦ;



НЕ MAT ЛИ ЭТО: begin ОБЗОР ХОДОВ (ПОЛЯ БЕЛЫХ, ДОСКА БЕЛЫХ,

ДОСКА ЧЕРНЫХ, п, МАТ1); ЭТО ПАТ НА ПЕРВОМ ХОДЕ: goto Б1 ПРОДОЛЖЕНИЕ end;

output ( .Т.РЕШЕНИЕ,/); goto ОТВЕТ; МАТ1: output {7/,Т,МАТ НА ПЕРВОМ ХОДЕ, V); ОТВЕТ: ПЕЧАТЬ ПОЗИЦИИ; ОДНО РЕШЕНИЕ НАЙДЕНО: goto КОНЕЦ;

. Выдача информации об ошибках в исходной позиции Программа А. Белла во всех случаях неправильного задания исходной позиции заканчивала свою работу без выдачи какой-либо информации о характере ошибки в исходной позиции.

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

MATl: output(7/,Т,МАТ НА ПЕРВОМ ХОДЕ,/"); были внесены следующие операторы.

1. Перед меткой «НАЧАЛО:» были вставлены строки

output {Т,ИСХОДНАЯ ПОЗИЦИЯ,/); ПЕЧАТЬ ПОЗИЦИИ;

2. Перед меткой «КОНЕЦ:» были вставлены строки

output( ,Т.ХОДЫ БЕЛЫХ ИСЧЕРПАНЫ,/); goto КОНЕЦ;

ОШИБКА: output(Т,ПЕРВЫМ ХОДОМ БЕРЕТСЯ КОРОЛЬ ЧЕРНЫХ,/);

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

ХОДЫ БЕЛЫХ ИСЧЕРПАНЫ Это послужило сигнало.м для обнаружения еще одной ошибки, описываемой ниже

в п. т.

Для облегчения использования программы и ее совершенствования многие узловые операторы были снабжены в алгоритме 50CJ дополнительными смысловыми метками, такими как ЕСТЬ ЛИ ШАХ ЧЕРНЫМ, УШЛИ ОТ ШАХА, ЧЕРНЫЕ БЕРУТ НАЗАД СВОИ ПЕРВЫЙ ХОД и т. п.

/. Исправление операторов превращения пешки

Программа алгоритма 50 неправильно работала в задачах, содержащих превращение пешки в фигуру.

Первая ошибка заключалась в следующем. Оператор с меткой «aal:» (в процедуре ВЫПОЛНЕНИЕ ХОДА) при превращении пешки в фигуру (кроме коня) уменьшает на единицу формальный параметр р, являющийся индексом переменных массива СПИСОК- В результате после вьшолнения обращений к процедуре ВЫПОЛНЕНИЕ ХОДА оказываются уменьшенными на единицу и фактические параметры 41, Б2 и 42. Поэтому при возвращении хода, сопровождавшегося превращением пешки, фактические значения параметра ОТ процедуры ВОЗВРАТ ХОДА должны быть не СПИСОК [Ч1+1], СПИС0К[Б2-Ы] или CnHC0KI42-f 1], как это было в программе А. Белла, а CnHC0KI41-f2], CnHCOKIB2-f2] или CnHCOKI42-f2] соответственно.

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

1. В процедуре ВЫПОЛНЕНИЕ ХОДА после метки «aal:» строки if qfyPOBEHb]= 1 Л (НА>56 VHA<9) then



begin p:=p-1; были заменены строками

if abs(qyPOBEHb]) = 1 Д (HA>56 у HA<9) then begin p:=p-1; qPPOBEHb]:=-1;

и оператор

if ДОСКА СВ0ИХ[НА]=2 then p:=p+l был заменен оператором

if ДОСКА СВОИХНА]=2 then begin р: = р+1; qyPOBEHb]: = 1 end

2. Перед меткой «аа2:» оператор ДОСКА CBOHX[HA]: = qyPOBEHb];

был заменен оператором

ДОСКА СВ0ИХ1НА]: = abs (qfyPOBEHb]);

3. Оператор

bbl: ДОСКА СВОИХ[-HA]:=qiiyPOBEHb]; был заменен оператором

bbl: ДОСКА СВ0ИХ11-HA]: = abs(q[yPOBEHb]);

4. В процедуре ВОЗВРАТ ХОДА строка

begin ДОСКА CBOHXfOBPATHO KiyPOBEHb]]: = qiyPOBEHb]; была заменена строкой

begin ДОСКА СВОИХ[ОБРАТНО KiyPOBEHb]]: = abs(qiyPOBEHb]);

5. В конце программы перед меткой «42 ПРОДОЛЖЕНИЕ:>

оператор

ВОЗВРАТ Х0ДА(СПИС0К[Ч2+1], ДОСКА ЧЕРНЫХДОСКА БЕЛЫХ, ПОЛЯ ЧЕРНЫХ); был заменен оператором

ВОЗВРАТ XOДA(CПИCOK[if qiyPOBEHb]=-I then Ч2+2 else Ч2+1], ДОСКА ЧЕРНЫХ,ДОСКА БЕЛЬ1Х,П0ЛЯ ЧЕРНЫХ);

6. Ниже перед меткой «Б2 ПРОДОЛЖЕНИЕ:» оператор

ВОЗВРАТ Х0ДА(СПИС0К1Б2+1], ДОСКА БЕЛЫХ,ДОСКА ЧЕРНЫХ,

ПОЛЯ БЕЛЫХ); выл заменен оператором

ВОЗВРАТ ХОДА(СПИСОКрГ qiyPOBEHb]=-1 then Б2+2 else Б2+1],

ДОСКА БЕЛЫХ,ДОСКА ЧЕРНЫХ,ПОЛЯ БЕЛЫХ);

7. Перед меткой «41 ПРОДОЛЖЕНИЕ:» оператор

ВОЗВРАТ Х0ДА(СПИС0К[Ч1+1],Д0СКА ЧЕРНЫХ.ДОСКА БЕЛЫХ, ПОЛЯ ЧЕРНЫХ); был заменен оператором

ВОЗВРАТ XOflA(CnHCOK[if ql[yPOBEHb]=-1 then 41+2 else 41+1], ДОСКА ЧЕРНЬ1Х,Д0СКА БЕЛЬ1Х,П0ЛЯ ЧЕРНЫХ);

Вторая ошибка в операторах превращения пещки в фигуру состояла в том, что в программе А. Белла операторы с метками аа2-ааб* помещались после оператора с меткой aal и выполнялись яа каждом превращении пещки, в то время, как эти операторы должны выполняться только по одному разу иа каждом новом ходе. Четырехкратное выполнение на одном и том же ходе операторов с метками ааЗ и аа4 приводило к неверным результатам в тех случаях, когда превращение пещки в фигуру сопровождалось взятием фигуры противника. Так, при попытке рещения указанной ниже задачи 1№ 3 типа Валодао-таск из газеты «64» (когда превращение черной пешкв h3 в фигуру сопровождалось взятием ладьи) вместо правильного ответа d4 программа напечатала текст.

В программе алгоритма 50 это метки А2-А6. (Прим. ред.)





0 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 35 [36] 37 38 39 40 41 42 43

0.0018