![]() |
|
Главная Промышленная автоматика. вставлены операторы п: = РУБЕЖ Х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.0016 |