2016 [11] Восстановление кода
При копировании исходного кода программы произошла ошибка. Помогите определить, какие символы могут быть на месте ▲ и ▼, чтобы функция 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
r[i]:=chr((ord('0')- ord('(')) *
(ord('1')-ord(')'))- ord(#9) - (ord('?')-
ord('=')) * i);
r[i]:=chr(ord('!') – ord('!'));
if ((ord(r[ord('-')-ord('*')]) + ord(r[ord('-')-ord('+')]) *
(ord('2')-ord('('))+ ord(r[ord(')')-
ord('(')]) * (ord('2')-ord('('))*
(ord('2')-ord('('))+ord(r[0]) *
(ord('2')-ord('('))* (ord('2')-ord('('))*
(ord('2')-ord('('))) = 60859)
then
writeln('Yes')
else
writeln('No');
end;
|
void function()
{
int i = 'M' - '"';
char r['-'-▲];
for (i='#'-'#'; i<('&'-▼); i++)
{
*(r+i)=(char)(('0'-'(')*('1'-')')
-'\t'-(('?'-'=')*i));
}
*(r+i)='!'-'!';
if ((*(r+('-'-'*')) +('-'-'+')[r] *
('2'-'(')+(')'-'(')[r]*(('2'-'(')) * (('2'-'(')) +
*(r)*('2'-'(') * ('2'-'(') * ('2'-'(')) == 60859)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
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 – код символа ▲
<< Назад в раздел (Все задания)