2016-07-23 71 views
1

我试图将此C++代码转换为Pascal,但我得到错误201.有人可以帮我修复它吗?需要帮助修复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. 

谢谢,以及用于我的水平英语抱歉

+2

FWIW,与C++类似,它看起来更像C语言。 –

回答

0

错误201似乎是一个范围检查错误( http://www.freepascal.org/docs-html/user/userap4.html)。

在程序bt中,即使您尚未初始化u,您仍在比较un+1。这可能会导致奇怪的结果,因为它可能是任何有效的整数。与某些其他语言不同,但与C相似,Pascal不会将变量初始化为默认值(http://www.freepascal.org/docs-html/ref/refse23.html)。

+0

“Pascal不会将变量初始化为默认值”在Delphi中通常不是这样。全局是,但本地人不是,除非他们是管理类型,如*字符串*。 – MartynA

+0

我看到'void bt(int 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来自哪里。

顺便说一句,如果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中,所有数组都是从零开始的。如果原始C程序正常工作,那么我的Pascal翻译也应该如此。