2017-10-16 102 views
1

感謝您提前給予所有幫助。我必須從Pascal開始編程,並且相當誠實地說,Java和Python並不是那麼愉快的變化。我嘗試了一個簡單的程序來返回GCD,但控制檯甚至不會保持打開狀態,儘管在最後還是readln。Pascal - 最大公約數 - 無輸出

program App1Learning; 

var 
    a, b : integer; 

begin 
    read(a); 
    read(b); 
    while a <> b do 
    begin 
    if a < b then b := b - a; 
    if a > b then a := a - b; 
    end; 
    writeln(a); 
    readln; 
end. 
+0

我試圖通過在任何地方添加writelns進行調試,並以某種方式設法通過在讀取參數後添加一個readln來修復它...我只是不明白這些... read(a); (b); readln; –

+0

'閱讀(A)'會讀取一個數字,但不會前進到下一行。我寧願使用'Readln(A)'來獲得每行一個數字。這與Java不同,但我沒有發現Java的方式非常直觀。 –

+1

你使用哪種帕斯卡? FreePascal,Delphi,GNU Pascal,什麼?有差異,特別是在更高級的功能。 –

回答

1

不知道這帕斯卡您正在使用,我想這在FreePascal的3.0.0版:

program App1Learning; 

var 
    a, b : integer; 

begin 
    readln(a); 
    readln(b); 
    // Or, instead of the two previous lines: readln(a, b); 
    while a <> b do 
    begin 
    if a < b then b := b - a; 
    if a > b then a := a - b; 
    end; 
    writeln(a); 
    readln; 
end. 

Read(),而這取決於緩衝線路輸入,不等待回車,所以它會讀取兩個數字,但不會消耗最後的回車,即這仍然在輸入緩衝區。在程序計算GCD並顯示它之後,仍然在緩衝區中的回車將被最終的readln立即讀取,所以控制檯隨後關閉(readln不必等待回車,因爲它是已經在緩衝區中有—或仍然有—)。

如果您使用readln(a);等代替,每個數字將在其自己的行輸入,該函數等待回車並消耗它。這意味着最後的readln將不會在輸入緩衝區中找到回車符,因此它會一直等到您按輸入

+0

我使用拉撒路。問題是,當我使用read(a,b)或read(a)時;讀(b)中;每次都會彈出控制檯。我試圖在兩種情況下將輸入放在一個單獨的行中。沒有運氣。但是,當我使用readline時,無論是a,b還是單獨使用,它都可以工作,完全沒有問題。我真的不知道該抓到哪裏。即使出現了錯誤,我最終還是會有一個念頭,那爲什麼它會像這樣退出?沒有例外,沒有。只是...噗噗。 –

+0

@SamuelNovelinka:正如我所說的,如果使用Read(),換行符會留在緩衝區中,準備被最終的Readln使用。這意味着'Readln'不必等待你按下回車鍵,控制檯窗口立即關閉。 **換句話說,如果你使用'Read',最後的'Readln'已經在緩衝區中找到回車符,並且不再等待一個。** –

+0

哦,我知道了。萬分感謝。這是否意味着第二次讀取會執行這個技巧?我知道這聽起來不知何故是業餘的,我不打算使用它,只是想確保我做對了。 –