2012-09-17 137 views
0

一串我在帕斯卡一個問題:產生下一個序列中的第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

我已經解決了我的問題,這裏是正確的代碼,這將是很好,如果你可以改善它。

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. 
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; 
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. 
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; 

其次,你只需要beginend把多個語句合併爲一個語句, 所以因爲你只有在那裏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; 

我不是所有的使用打破敏銳的,因爲它感覺很像一個跳轉, 所以也許你可以改變這種成塊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); 

(注意:repeatuntil配有一個隱含的beginend,所以你不必鍵入它們。)
現在你可能會說,我已經減少了清晰度,讓循環變得不那麼明顯,只是增加了j。 無論你喜歡什麼,我都不會對此感覺強烈,但如果你使用了很多休息,請考慮whilerepeat是否對你更好。

你的條件有關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,