我目前正在使用CRT来延迟创建大量随机数而不需要一堆数字相同(< - 非常糟糕的语法)。所以我使用了一个writeln来查看我的脚本生成的数字,它不允许我看到所有的数字。
For x := 1 to 100 Do
With people[x] Do
Begin
randomize;
people[x].Address:='4562 South abigail lane';
people[x].Phonenum:='555-555-1234';
people[x].licence:='ABC3456789';
people[x].tickets:=random(5);
People[x].age:=16+random(10000) mod 80 + 1;
delay(50);
writeln(people[x].age);
End;
所以你可以告诉它,检查数字会产生一些问题。所以,如果有可能,有人可以为我提供替代方案吗?
答案 0 :(得分:1)
我使用了一个writeln来查看我的脚本生成的数字,它不允许我查看所有数字。
你可以做的一件事是添加一行
readln;
在for
循环之后。这样,当您的应用程序到达该行时,您将需要按任意键。然后,您应该发现根本不需要delay(50);
行。
另外两件事:
1)将呼叫移至循环外的Randomize
。在程序开始时应该只调用一次。 FreePascal文档没有指定这一点,但它在使用Random的示例中进行了演示。 Delphi RTL documentation使这一点更加清晰:
不要将循环中的Randomize调用与对Random函数的调用组合在一起。通常,在所有对Random的调用之前,Randomize只调用一次。
2)(结合在下面的代码中),不再使用with
的习惯。与您最终花费在尝试追踪使用它造成的模糊错误的时间相比,使用它时节省时间是微不足道的。
Randomize;
for x := 1 to 100 do
begin
people[x].Address := '4562 South abigail lane';
people[x].Phonenum := '555-555-1234';
people[x].licence := 'ABC3456789';
people[x].tickets := random(5);
people[x].age := 16 + random(10000) mod 80 + 1;
//delay(50); pointless
writeln(people[x].age);
end;
readln;
答案 1 :(得分:1)
您可以使用crt单位的WindMaxY
来增加垂直屏幕缓冲区。
crt.WindMaxY := 110;
Randomize;
For x := 1 to 100 Do
...
现在,您可以向上滚动并观察先前写入的输出。
或者,您可以使用crt unit中的光标位置功能来检索光标位置并将其设置在您想要的任何位置。
下面的示例以易于阅读的10x10表格格式输出100个数字。请注意,我从示例中删除了不相关的代码,并且我还将循环计数器从0开始移动以便于计算,这可能需要修改数组。但是,当然,您可以选择修改代码示例。
var
x: Integer;
begin
Randomize;
WriteLn;
For x := 0 to 99 Do
Begin
GotoXY((x mod 10) * 6, WhereY - 1);
if WhereX = 1 then
GotoXY(1, WhereY + 1);
WriteLn(16 + Random(10000) mod 80 + 1);
End;
Readln;
end.
输出示例: