Computer Programing

2004-04


繰り返し足し算できるようにしてみよう

 前回は足し算プログラムを作りました.ユーザが自由に入力できるようにすることで,いちいちプログラムを書き直さなくても様々な計算ができるようになりました.足し算プログラムのコードを次に示しておきます.

var a,b,ans;
a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
b = parseInt( prompt( '二つ目の数値を入力してください', '' ) );
ans = a + b;
document.write( a , '+' , b , '=' , ans , '<BR>' );

 しかし,これでは1回の足し算で終了してしまいます.電卓などでは複数の数を足していくことができます.そこで,複数の数の足し算ができるようにしてみましょう.まずは簡単に3個の場合は次のようにすればよいでしょう.

var a,b,ans;

a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
b = parseInt( prompt( '二つ目の数値を入力してください', '' ) );
ans = a + b;
document.write( '答えは', ans, 'です<BR>' );

b = parseInt( prompt( '次の数値を入力してください', '' ) );
ans = ans + b;
document.write( '答えは', ans, 'です<BR>' );

では,4個の場合はどうなるでしょう.たぶん,こんな感じでしょう.

var a,b,ans;

a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
b = parseInt( prompt( '二つ目の数値を入力してください', '' ) );
ans = a + b;
document.write( '答えは', ans, 'です<BR>' );

b = parseInt( prompt( '次の数値を入力してください', '' ) );
ans = ans + b;
document.write( '答えは', ans, 'です<BR>' );

b = parseInt( prompt( '次の数値を入力してください', '' ) );
ans = ans + b;
document.write( '答えは', ans, 'です<BR>' );

では,5個の場合は,6個の場合は,と考えると,同じような文がどんどん続くことになるのがわかると思います.これは大変です.もっときれいな書き方はないのでしょうか?


while を用いた繰り返し

 上のコードを見てみると,三つ目の数値を入力して足し算結果を表示するところと,四つ目の数値を入力して足し算結果を表示しているところがまったく同じであることがわかると思います.つまり同じ処理を繰り返しているのです.同じ処理を繰り返す場合,while 文を使うと同じ処理をまとめることができます.while 文を使った繰り返し足し算プログラムを次に示します.

var a,b,ans;

a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
b = parseInt( prompt( '二つ目の数値を入力してください', '' ) );
ans = a + b;
document.write( '答えは', ans, 'です<BR>' );

while( true )
{
  b = parseInt( prompt( '次の数値を入力してください', '' ) );
  ans = ans + b;
  document.write( '答えは', ans, 'です<BR>' );
}

このように書くと,波括弧{ }間の処理が繰り返し実行され,繰り返し足し算をしてくれるようになります.ただ,このコードを実行すると,大変なことが起こります.それは繰り返しが永遠に続き,終わらないのです.これを無限ループというのですが,これを終了させるには WEB ブラウザを強制終了させなければなりません.

 なんらかの方法で足し算の終了を指示する必要があるようです.とりあえず,今回は0が入力されたら終了することにしましょう.そのようにする場合は,while 文のところを

while( b != 0 )

とします.このように書くと b が 0 と異なっていたら { } の中を実行することになります. while 文は次のように書きます.

while( 条件式 ) 処理文;

まず,条件式が成り立っていると処理文を実行します.実行が終わると再び条件式を判定し,成り立っていれば再度処理文を実行し,成り立っていなければ,その繰り返し処理は終了します.また,複数の処理文を繰り返し実行したいときは,

while( 条件式 )
{
  処理文;
  処理文;
    :
}

と,複数の文を波括弧{}で囲みます.


条件式と条件演算子

 条件式は式の仲間です.前回説明したとおり,式は値を演算子で結合したもので,条件式も同じ形です.ただ,式が生成する値は成り立っていることを示すtrue か成り立っていないことを示すfalse の二種類だけです.これを真偽値(論理値)と呼び,数値や文字列と同じ値の一つです.一番最初に while( true ) と書いた true は,この true です.つまり,常に条件式が成り立っていることにしたので,繰り返しが永遠続くことになったのです.

 条件式を構成する演算子が条件演算子で,同値(==),異値(!=),大小(>,<)があります.たとえば,

3 == 3
2+1 != 2
3 > 1+1
'abc' == 'abc'

は成り立つので true が生成されます.また,

3 == 5
2 != 2
3 > 5+1
'ABC' == 'abc'

は成り立たないので false が生成されます.先ほどの

b != 0

は,変数 b にしまわれている値が 0 と異なるときは成り立つので true が生成され,0 のときは成り立つので false が生成されます.そのため,0 が b に入れられると,while により繰り返し処理が終了するわけです.

 ここで,複数の条件式を組み合わせて,一つの条件式にすることもできます.これには && と || を使います.&& で結合された場合,両方の条件式が成り立てば true が生成されます.|| で結合された場合,どちらかの条件式が成り立てば true が生成されます.たとえば,

2 == 2 && 3 != 2
2 == 2 || 3 != 3

は成り立つので true が生成されます.また,

2 == 2 && 3 != 3
2 == 3 || 3 != 3

は成り立たないので,false が生成されます.


ちょっと整理

 さて,先ほどのプログラムですが,二つ目の数値入力と表示のところが,繰り返し処理ときわめて似ています.これをまとめてみましょう.単純に

var a,b = 1,ans = 0;

a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
while( b != 0 )
{
  b = parseInt( prompt( '次の数値を入力してください', '' ) );
  ans = ans + b;
  document.write( '答えは', ans, 'です<BR>' );
}

とすると,一つ目の数値が合計に入りません.そこで,一つ目の数値を合計を表す ans に代入しておきます.

a = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
ans = a;

これで,一つ目の数値も合計に入るようになります.また,a に入れられた値は ans に入れられ,その後 a は使われていません.そこで,入力された値をすぐに ans に入れてしまってもよいはずです.すると,先のプログラムは次のようになります.このように,同じプログラムでもいろいろなコードが考えられます.より見やすいコードを書いたほうが,間違いが起こりにくくなります.

var b = 1, ans;
ans = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
while( b != 0 )
{
  b = parseInt( prompt( '次の数値を入力してください', '' ) );
  ans = ans + b;
  document.write( '答えは', ans, 'です<BR>' );
}

加減算プログラムに挑戦

 では,足し算だけでなく加減算プログラム作りに挑戦してみましょう.これまでは足し算だけでしたが引き算もできるようにしてみます.このためには,数値を入れるだけではなく,演算の種類(+か-)も入力してもらう必要があります.そして,入力された演算の種類によって,実行する計算を変える必要があります.

 加減算機のプログラムの流れは次のようになります.なお,今回は演算の種類として = が入力されたら終了するようにします.

  1. 数値を入力
  2. 演算の種類を入力(+,-,==)
  3. = なら終了
  4. 加算なら数値を入力し,合計に足す
  5. 減算なら数値を入力し,合計から引く
  6. 演算の種類の入力に戻る

演算の種類の入力は数値の入力と同じように prompt を使えます.prompt は文字列を入力するための関数ですので,文字の入力に使えます.問題は + が入力されたら加算を,- が入力されたら減算をする点です.


条件分岐

 何かの条件によって,異なる処理を行いたいときには if 文を使います.if 文は

if( 条件式 ) 処理1
       else  処理2

と書きます.条件式が成り立てば処理1が,成り立たなければ処理2が実行されます.処理1や処理2が複数の文からなる場合は,while のときと同じように,それらの文を { } で囲みます.

if( 条件式 )
{
  処理1
   :
}
else
{
  処理2
   :
}

また,

if( 条件式1 )
{
  処理1
}
else if( 条件式2 )
{
  処理2
}
else
{
  処理3
}

のように書くと,条件式1が成り立てば処理1が実行され,成り立たないときは条件式2の判定に移ります.そして,条件式2が成り立てば処理2が,成り立たなければ処理3が実行されます.


加減算プログラム

 これで + が入力されたら加算を,- が入力されたら減算をするようにできると思います.まずは繰り返しなしのものを書いてみると次のようになります.

var ans, type, b;

ans = parseInt( prompt( '一つ目の数値を入力してください', '' ) );

type = prompt( '演算の種類を入力してください +, -, =', '' );
if( type == '+' )
{
  b = parseInt( prompt( '次の数値を入力してください', '' ) );
  ans = ans + b;
}
else
if( type == '-' )
{
  b = parseInt( prompt( '次の数値を入力してください', '' ) );
  ans = ans - b;
}
document.write( '答えは', ans, 'です<BR>' );

一つ目の数値の入力,演算の種類の入力を要求し,演算の種類として'+'が入力されると,次に入力される数値と一つ目の数値との和を表示します.演算の種類として'-'が入力されると,一つ目の数値から次に入力される値を引いた数値が表示されます.

 次に繰り返しを入れてみます.'='が入力されたら終了するようにしたかったので,while 文の条件式を type != '=' としてみます.type には演算の種類がしまわれます.演算の種類として '=' が入力された場合,'+' とも '-' とも異なるので,足し算処理,引き算処理共に実行されません.そして,次に while 文の条件判定が行われ,b != '=' が成り立たなくなるので,繰り返し処理が終了し,プログラム実行が終わります.なお,使用を宣言されたばかりの変数には何も入っていないので,一番最初の while の条件判断では b != '=' は成り立ち,1回目の繰り返し処理が無事実行されます.

var ans, type = '', b;

ans = parseInt( prompt( '一つ目の数値を入力してください', '' ) );
while( type != '=' )
{
  type = prompt( '演算の種類を入力してください +, -, =', '' );
  if( type == '+' )
  {
    b = parseInt( prompt( '次の数値を入力してください', '' ) );
    ans = ans + b;
  }
  else
  if( type == '-' )
  {
    b = parseInt( prompt( '次の数値を入力してください', '' ) );
    ans = ans - b;
  }
  document.write( '答えは', ans, 'です<BR>' );
}

演習

加減乗除機を作ってみましょう.


発展課題

作ったプログラムで ÷(/)0をしてみてください。たぶん、変な答えが出てくると思います。それはあたりまえですね。0による割り算はしてはいけないからです。では、0で割り算はできないようにしてみてください。

たとえば、

/
0

を入力すると、計算はせずに、

0による割り算は出来ません

と表示してみましょう。