我在pascal中遇到问题:在下一个序列中生成前n个数字:1,1,2,2,2,3,3,3,3,4,4,4,4,4,...我为这些编写了一个代码,但问题是它不能按我想要的方式工作。
var
s,c: string;
n,i,j: integer;
begin
s:='';
readln(n);
begin
for i := 1 to n do
begin
if ( length(s)/2 -1 >= n) then
begin
Break;
end;
for j := 1 to i + 1 do
begin
str(i,c);
s:= s + c+',';
end;
end;
end;
答案 0 :(得分:2)
这是一个更短的版本,并且还删除了最后的额外逗号:它是一个完整的控制台程序(并添加元素数量的提示):
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i, j: Integer;
s: string;
nItems: Integer;
begin
s := '';
Write('Enter # of elements: ');
ReadLn(nItems);
for i := 1 to nItems do
for j := 1 to i + 1 do
begin
s := s + IntToStr(i) + ',';
end;
System.Delete(s, Length(s), 1); { Remove final comma )
WriteLn(s);
ReadLn;
end.
答案 1 :(得分:0)
我已经解决了我的问题,这里是正确的代码,如果你能改进它会很好。
var
s,c: string;
n,i,j: integer;
begin
s:='';
readln(n);
begin
for i := 1 to n do
begin
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then
begin
Break;
end;
str(i,c);
s:= s + c+',';
end;
end;
end;
Delete(s,length(s)-2,length(s));
write(s);
readln;
end.
答案 2 :(得分:0)
我会更改外部循环的工作方式,因此i
表示您所处的位置,并引入代表当前元素的第二个数字element
。然后每当内循环运行时递增element
。
s:='';
readln(n);
element:=1;
begin
for i := 1 to n do
begin
for j := 1 to i + 1 do
begin
str(element,c);
s:= s + c+',';
end;
element:=element+1;
end;
end;
答案 3 :(得分:0)
你可以改变你的内循环:
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then
begin
Break;
end;
str(i,c);
s:= s + c+',';
end;
首先,我建议你总是为了清晰而缩进,所以
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then
begin
Break;
end;
str(i,c);
s:= s + c+',';
end;
其次,您只需要begin
和end
将多个语句转换为单个语句,
因为你只有break
,所以它们是多余的 - 只需直接使用break:
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then Break;
str(i,c);
s:= s + c+',';
end;
接下来,请注意您正在重新计算c
非常多:
str(i,c);
suffix = c + ',';
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then Break;
s:= s + suffix;
end;
我不是那么热衷于使用break,因为它感觉像是一个goto,
所以也许您可以将其更改为repeat ... until
块:
str(i,c);
suffix = c + ',';
j := 1;
repeat
s := s + suffix;
j := j + 1;
until (j > i+1) or (length (s) > n*2);
(请注意,repeat
和until
带有隐式begin
和end
,因此您无需输入它们。)
现在你可能会说我已经通过使循环只增加j
不那么明显而降低了清晰度。
在这种情况下,无论你喜欢什么,我都不会感到强烈,但如果你经常使用休息,请考虑while
或repeat
是否适合你。
你对length (s) > n*2
的条件让我感到困惑(没有其他人把它放在他们的代码版本中)。
由于某种原因,你似乎想缩短它。你确定吗?我不是。
下面是没有限制的输出表,然后是输出的前n * 2项,以及第一个n * 2
字符串的字符,所以你可以检查。设计的break
语句是什么?
n: 1
output: 1,1
length: 2
n*2: 2
first n*2 numbers: 1,1
first n*2 characters: 1,
n: 2
output: 1,1,2,2,2
length: 5
n*2: 4
first n*2 numbers: 1,1,2,2
first n*2 characters: 1,1,
n: 3
output: 1,1,2,2,2,3,3,3,3
length: 9
n*2: 6
first n*2 numbers: 1,1,2,2,2,3
first n*2 characters: 1,1,2,
n: 4
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4
length: 14
n*2: 8
first n*2 numbers: 1,1,2,2,2,3,3,3
first n*2 characters: 1,1,2,2,
n: 5
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5
length: 20
n*2: 10
first n*2 numbers: 1,1,2,2,2,3,3,3,3,4
first n*2 characters: 1,1,2,2,2,
n: 6
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,6
length: 27
n*2: 12
first n*2 numbers: 1,1,2,2,2,3,3,3,3,4,4,4
first n*2 characters: 1,1,2,2,2,3,