Я пытаюсь преобразовать этот код C ++ в Pascal, но я получаю ошибку 201. Может кто-нибудь помочь мне исправить это?
Код C ++:
int n;
bool a[100];
void show()
{
for (int i=1; i<=n; i++)
if (a[i])
printf("%d ", i);
printf("\n");
}
void bt(int u)
{
if (u==n+1)
{
show();
return ;
}
a[u]=0;
bt(u+1);
a[u]=1;
bt(u+1);
}
main()
{
scanf("%d", &n);
bt(1);
}
Паскаль код:
type data = integer; var i,n:integer; a:array[0..100] of integer; b:array[0..100] of integer;
procedure show; var i:data; begin
for i:=1 to n do
begin
if (b[i]=0) then
writeln(a[i]);
end; end;
procedure bt(i:data); var u:data; begin
if (u=n+1) then
begin
show();
end
else
b[u]:=0;
bt(u+1);
b[u]:=1;
bt(u+1);
end;
begin
write('Nhap n ');
readln(n);
bt(1); end.
Спасибо, и извините за мой уровень английского
Мой c ++ немного ржавый, но это не похоже на точный перевод для меня. Попробуйте что-то вроде этого:
type
data = integer;
var
// i,
n : integer;
a : array[0..100] of boolean; // integer;
// b : array[0..100] of integer;
procedure SetUp;
var
i : Integer;
begin
for i := 0 to 100 do
a[i] := True;
end;
procedure show;
var
i : data;
begin
for i := 1 to n do
begin
if a[i] then
write(i);
end;
writeln;
end;
procedure bt(i : data);
var
u : data;
begin
if ( u = n + 1) then
begin
show();
end;
/// else
// b[u] := False;
bt(u + 1);
a[u] := True;
bt(u+1);
end;
begin
SetUp;
write('Nhap n ');
readln(n);
bt(1);
readln;
end.
Паскаль имеет родной логический тип, поэтому я изменил объявление массива a. Я включил подпрограмму SetUp для явной инициализации. Я не уверен, откуда твой массив b.
Кстати, если SetUp устанавливает значения элементов a в false, все, что вы получите, — это серия пустых строк.
Как можно более точное преобразование будет:
program StackOverflow1;
{$APPTYPE CONSOLE}
var
n: Integer;
a: array[0..99] of Boolean;
procedure show;
var
i: Integer;
begin
for i := 1 to n do // This is very suspicious!
if a[i] then
Write(i, ' ');
Writeln;
end;
procedure bt(u: Integer);
begin
if u = n + 1 then
begin
Show;
Exit;
end;
a[u] := False;
bt(u + 1);
a[u] := True;
bt(u + 1);
end;
begin
Writeln('enter n:');
Readln(n);
bt(1);
end.
Линия
for i := 1 to n do // for (int i=1; i<=n; i++)
выглядит так, как будто это должно было быть
for i := 0 to n - 1 do // for (int i=0; i<n; i++)
C не имеет проверки диапазона, поэтому он не дает вам ошибки. Но ваш Паскаль имеет, и этот цикл, вероятно, поэтому вы получаете ошибку времени выполнения 201.
Я не знаю, что должна делать эта программа, но меня не удивило бы, если бы программа на C не дала правильный результат.
Также меня не удивит, если для значений n
близко к 99, вы получите ошибку переполнения стека (или эквивалентный номер времени выполнения). Если пользователь вводит значения для n > 99
это, вероятно, приведет к ошибке проверки диапазона, если ошибка переполнения стека не возникнет первой.
Я пробовал с n = 80
и это заняло целую вечность, поэтому я Ctrl+С‘редактировать.
В качестве альтернативы, вы можете использовать
a: array[1..100] of Boolean;
но это не соответствует программе на Си. В C все массивы начинаются с нуля. Если оригинальная программа на C работает правильно, то мой перевод на Паскаль также должен.
Ошибка 201 представляется ошибкой проверки диапазона (http://www.freepascal.org/docs-html/user/userap4.html).
В процедуре bt
сравниваешь u
с n+1
даже если вы не инициализировали u
, Это может привести к странным результатам, так как это может быть любое допустимое целое число. В отличие от некоторых других языков, но так же, как и в C, Pascal не инициализирует переменные по умолчанию (http://www.freepascal.org/docs-html/ref/refse23.html).