我试图将此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);
}
Pascal代码:
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.
谢谢,对不起我的英语水平
答案 0 :(得分: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.
Pascal有一个原生的布尔类型,因此我更改了数组a的声明。我已经包含了一个例程SetUp来显式初始化它。我不确定你的阵列b来自哪里。
顺便说一句,如果SetUp将某个元素的值设置为false,那么您将获得的所有输出都是一系列空行。
答案 1 :(得分: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程序没有提供正确的结果,我也不会感到惊讶。
如果对于接近99的n
值,您将得到堆栈溢出错误(或其等效的运行时编号),这也不会让我感到惊讶。如果用户输入n > 99
的值,如果堆栈溢出错误没有出现,这可能会导致范围检查错误。
我尝试使用n = 80
,这需要很长时间,所以我 Ctrl + C &#39b。
或者,您可以使用
a: array[1..100] of Boolean;
但这与C程序不匹配。在C中,所有数组都是从零开始的。如果原始C程序正常工作,那么我的Pascal翻译也应该。
答案 2 :(得分:0)
错误201似乎是范围检查错误(http://www.freepascal.org/docs-html/user/userap4.html)。
在过程--server http://192.168.1.27:3000
中,即使您尚未初始化bt
,也要将u
与n+1
进行比较。这可能会导致奇怪的结果,因为它可能是任何有效的整数。与某些其他语言不同,但与C类似,Pascal不会将变量初始化为默认值(http://www.freepascal.org/docs-html/ref/refse23.html)。