2017-10-16 4 views
1

ありがとうございました。私はパスカルでプログラミングを始めなければなりません。それはJavaとPythonからの楽しい変化ではありません。私はGCDを返すための簡単なプログラムを試しましたが、最後にreadlnがあってもコンソールは開いたままになりません。あなたが使用しているパスカル知らないパスカル - 最大公約数 - 出力なし

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

'Read(A)'は1つの数値を読み込みますが、次の行に進むことはありません。私はむしろ 'Readln(A)'を使用して、1行に1つの数値を取得したいと思います。これはJavaとは異なりますが、私はJavaの方法も非常に直感的ではありません。 –

+1

どのパスカルを使用していますか? FreePascal、Delphi、GNU Pascal、何?特に高度な機能には違いがあります。 –

答えて

1

、私は、Windows用の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()、それはバッファリングライン入力に依存しながら、キャリッジリターンを待ちません。したがって、2つの数値を読み込みますが、は最後のキャリッジリターンを消費しません。つまり、入力バッファに残ります。プログラムがGCDを計算して表示すると、バッファに残っているキャリッジリターンは、最終的にreadlnによって直ちに読み取られるので、コンソールは直後に閉じます(readlnはキャリッジリターンを待つ必要はありません)。すでに—またはまだ—がバッファー中にある)。

代わりにreadln(a);などを使用すると、各番号が独自の行に入力され、関数はキャリッジリターンを待って消費します。これは、最後のreadlnが入力バッファでキャリッジリターンを検出しないため、を入力するまで待つことを意味します。を入力します。

+0

私はLazarusを使用しています。問題は、私がread(a、b)またはread(a)を使うときです。読み取り(b);毎回コンソールがポップアウトするだけです。私は両方の場合に入力を1つにして、別々の行に入れようとしました。運がない。しかし、私がreadlineをa、b、または別々に使うと、問題なく動作します。私は本当にキャッチがどこにあるのかは分かりません。たとえ欠陥があったとしても、最後には読んでいるので、どうしてそんなことをやめるのですか?例外も何もない。ただ... –

+0

@SamuelNovelinka:私が言ったように、あなたが 'Read()'を使うと、改行はバッファに残され、最終的な 'Readln'によって消費される状態になります。つまり、 'Readln'はあなたがenterを押すのを待つ必要はなく、コンソールウィンドウは直ちに閉じます。 **言い換えれば、 'Read'を使うと、最終的な' Readln'はすでにバッファー内のキャリッジリターンを見つけて、もう一回待たずに** ** –

+0

ああ、私は知っています。大いに感謝する。それは、その直後に2回目のreadlnがトリックを行うことを意味するでしょうか?私はそれが何とかアマチュアっぽいと思うし、それを使うつもりはないと思っています。 –

関連する問題