нужна помощь, чтобы исправить ошибку 201 в Паскале

Я пытаюсь преобразовать этот код 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.

Спасибо, и извините за мой уровень английского

1

Решение

Мой 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, все, что вы получите, — это серия пустых строк.

1

Другие решения

Как можно более точное преобразование будет:

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 работает правильно, то мой перевод на Паскаль также должен.

1

Ошибка 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).

0
По вопросам рекламы [email protected]