next up previous
Next: 関係演算子 Up: 無題 Previous: 練習

if文

次に示すプログラムは整数の和差積商と剰余を計算するものです。

program arithmetic(input,output);
var i, j : integer;
begin
    read(i,j);
    writeln('i = ', i);
    writeln('j = ', j);
    writeln('i + j = ', i + j);
    writeln('i - j = ', i - j);
    writeln('i * j = ', i * j);
    writeln('i div j = ', i div j);
    writeln('i mod j = ', i mod j)
end.

次に実行例(2と3との計算例)を示します。

sino% pc arithmetic
sino% ./arithmetic
2 3      (←これが入力された2つの整数)
i =          2
j =          3
i + j =          5
i - j =         -1
i * j =          6
i div j =          0
i mod j =          2
sino%

次に、2と0とを与えて実行すると次のようになります。

sino% ./arithmetic
2 0
i =          2
j =          0
i + j =          2
i - j =          2
i * j =          0
i div j = libm-290 : UNRECOVERABLE (訳:復旧不能)
  Scalar integer value divided by a scalar integer zero.
(訳:整数値が整数0により割り算されてしまいました)
Abort (core dumped)
sino%

``Abort''というのは日本語訳は「失敗」ですが、Unixでのエラーの種類の一 種で、異常終了の場合に起るものです。gif 数学では、0による割り 算は未定義ですが、Pascalではエラーが発生してプログラムが異常終了してし まいます。

このようなことが発生しないようにするためには、二番目の整数が0ではない かあらかじめチェックしておくことが必要になります。ここでは、そのような ときには割り算は計算せずに警告文を表示するようにプログラムを変更するこ ととします。

program arithmetic(input,output);
var i, j : integer;
begin
    read(i,j);
    writeln('i = ', i);
    writeln('j = ', j);
    writeln('i + j = ', i + j);
    writeln('i - j = ', i - j);
    writeln('i * j = ', i * j);
    if j = 0 then 
        writeln('The 2nd input should be non-zero.')
    else 
    begin
        writeln('i div j = ', i div j);
        writeln('i mod j = ', i mod j)
    end
end.

ここでは、整数型変数jの値が0でないかどうかチェックをするために、 if文というものを利用しています。

if文は、

    if 論理型の式 then 文1 else 文2
という形をしていてます。「論理型の式」は、計算すると論理値(true もしくはfalse)というものが結果の値となるような式です。

j = 0は、変数jが整数0と等しいときにtrueという 値が計算結果になり、そうでないときfalseという計算結果になります。 イコール=関係演算子とよばれるものの一種です。

if文の意味は、「論理型の式」の計算結果がtrueのとき「文1」が実行 され、そうでないとき、「文2」が実行される、というものです。

従って、プログラム例のような

    if j = 0 then 文1 else 文2
というif文では、変数jの値が0に等しいときには、文1が実行されて、 等しくないときには、文2が実行されるのです。

このプログラムでは、「文1」でなすべき作業は警告文を表示するという作業 だけですから、writeln文一つですむわけですが、「文2」では商の表 示をするwriteln文と余りの表示をするwriteln文の二つの文を実 行する必要があります。このようなときに用いられるのが複合文です。

複合文は、

begin 文1 ; 
      文2 ;  
      … 
      文n 
end.
というふうに、1つ以上の文をセミコロンで区切ったものをbegin endで囲んだものです。1つのときは単にbeginendで囲むだけ です。複合文の意味は、並んだ文を左から順に実行するというものです。

従って、

    begin
        writeln('i div j = ', i div j);
        writeln('i mod j = ', i mod j)
    end
という二つのwriteln文から構成される(一つの)複合文は商を表示した あと、剰余を表示するわけです。




Mon Jun 30 01:42:14 JST 1997