При копировании исходного кода программы произошла ошибка. Помогите определить, какие символы могут быть на месте ▲ и ▼, чтобы функция function() всегда корректно выполнялась, и в результате ее выполнения на экран выводилось слово «Yes».
Листинг программы приведен ниже.
Паскаль |
Си |
procedure func(); var i,size:integer; r:array [0..ord('-')- ord(▲)] of char; begin i:=ord('M')–ord('"'); for i:=ord('#') – ord('#') to ord('&')-ord(▼) do
then
else
end; |
void function() { int i = 'M' - '"'; char r['-'-▲]; for (i='#'-'#'; i<('&'-▼); i++) {
} *(r+i)='!'-'!';
if ((*(r+('-'-'*')) +('-'-'+')[r] * ('2'-'(')+(')'-'(')[r]*(('2'-'(')) * (('2'-'(')) + *(r)*('2'-'(') * ('2'-'(') * ('2'-'(')) == 60859) {
} else {
} return; } |
Проанализируем исходный код программы на языке «Си». Заметим, что в соответствии с таблицей ASCII предложенный код можно преобразовать к следующему виду:
void function() //1
{ //2
int i = 43; //3
char r[45 - ▲]; //4
for (i=0; i<(38- ▼); i++) //5
{ //6
r[i]=(char)(55 - 2*i); //7
} //8
r[i]=0; //9
if ((r[3]+10*r[2]+100*r[1]+r[0]*1000) ==
60859) //10
{ //11
printf("Yes\n"); //12
} //13
else //14
{ //15
printf("No\n"); //16
} //17
return; //18
} //19
После преобразования исходного текста можно заметить, что на сообщение, выводимое на экран в результате выполнения функции function(), влияет только значение выражения r[3]+10*r[2]+100*r[1]+r[0]*1000, входящее в условие оператора if в строке 10. Следовательно, для того, чтобы на экран выводилось слово «Yes» необходимо инициализировать минимум первые четыре (с индексами 0-3) элемента массива r, обеспечив при этом выполнение равенства
r[3]+10*r[2]+100*r[1]+r[0]*1000 == 60859 (1)
Заметим, что инициализация элементов массива производится в цикле for в строках 5-8, где каждому элементу массива, начиная с первого (r[0]), присваивается уникальное значение в зависимости от его порядкового номера. При количестве итераций цикла не менее 4 обеспечивается выполнение равенства (1). Следовательно, значение выражение (38 - ▼) должно быть не менее 4: (38 - ▼) ≥ 4, т.е. код символа ▼ не должен превосходить 34: ▼ ≤ 34.
Далее определим область допустимых значений символа ▲. Для того, чтобы функция function() всегда корректно выполнялась, в строке 4 должно быть выделено необходимое количество памяти для массива r. Обратим внимание, что в строке 9 используется максимальное значение индекса массива r. Следовательно, в строке 4 необходимо задать размерность массива r не меньше ((38- ▼) + 1) , т.е. (45 - ▲) ≥ (39- ▼), а значит ▲ ≤ ▼ + 6.
(0≤ x≤ 34 и y≤ x+6), где x – код символа ▼, y – код символа ▲