2016-07-23 2 views
1

Я пытаюсь преобразовать этот код на C++ в Pascal, но я получаю ошибку 201. Может кто-нибудь помочь мне исправить это? Коднужна помощь, чтобы исправить ошибку 201 в Pascal

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. 

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

+2

FWIW, который больше похож на C, чем на C++. –

ответ

0

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

«Паскаль не инициализирует переменные по умолчанию» В Delphi обычно не работает. Глобалы есть, но locals нет, если они не управляются типами, такими как * string *. – MartynA

+0

Я вижу 'void bt (int u)', поэтому u, вероятно, инициализируется. –

+0

'u' - это параметр, переданный функции' bt', поэтому он инициализируется (в 'main' он называется как' bt (1) '), а' n' должен быть инициализирован 'scanf' ... возможно , Код OP не проверяется. –

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.

Btw, если 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 не проверяет диапазон, поэтому там он не дает вам ошибки. Но ваш Pascal имеет, и этот цикл, вероятно, потому, что вы получаете ошибку времени выполнения 201.

Я не знаю, что должна делать эта программа, но меня не удивило бы, если бы программа C не принесла правильный результат ,

Меня также не удивило бы, если бы значения n были близки к 99, вы получили бы ошибку переполнения стека (или ее эквивалентное количество времени выполнения). Если пользователь вводит значения для n > 99, это, вероятно, вызовет ошибку проверки диапазона, когда-то, если ошибка переполнения стека не будет первой.

Я попытался с n = 80, и он принял возрастов, так что я Ctrl + C «эд его.


В качестве альтернативы можно использовать

a: array[1..100] of Boolean; 

, но это не соответствует программе C. В C все массивы основаны на нуле. Если исходная программа C работает правильно, тогда мой перевод Pascal также должен быть.

Смежные вопросы