Computer Programing

2004-05


合計点を計算してみよう

 今回は様々な成績集計をしてみましょう.まずは,テストの点数の合計点を計算するプログラムです.前回の繰り返し足し算プログラムを手直しして作ったものが,次のプログラムです.

var point = 0, sum = 0;

while( point >= 0 )
{
  point = parseInt( prompt( '点数を入力してください', '0' ) );
  if( point >= 0 ) sum = sum + point;
}
document.write( '合計点は', sum, '点です<BR>' );

 このプログラムでは,負の点数を入れると終わるようになっています.while 文の条件式 point >= 0 がその条件を与えています.ここで,>= というのは,左辺が右辺以上だったら成り立つという条件演算子です.また,終了のために入力された負の値を合計点に加えないように if 文を使っています.  また,なにもしないで終わらないために,一番最初の条件判定が成り立つように point に 0 を代入しています.また,合計点がきちんと 0 点から始まるように sum に 0 を代入しています.変数を宣言した時点では,どのような値が入っているかわからないので,このように初期化することが大事なこともよくあります.


最初に人数を入力する形式にしてみる

 前のプログラムは負の点数を入れるまで点数を入力できるというものでした.次に,まず最初に人数を入力する形式のプログラムにしてみましょう.前のコードを強引に変更してみると,次のようになると思います.

var point = 0, sum = 0, num = 0, all;

all = parseInt( prompt( '人数を入力してください', '0' ) );
while( all > num )
{
  point = parseInt( prompt( '点数を入力してください', '0' ) );
  sum = sum + point;
  num++;
}
document.write( num, '人の点数の合計点は', sum, '点です<BR>' );

while 文の中で何個の点数を入力したかをカウントします.そして,繰り返し条件を入力すべき人数の値がそのカウントより大きいとすることで,人数分の入力をすると繰り返しを終了するようにしています.

 このように決まった回数繰り返しを行うには for 文を使うとよりきれいに書けます. for 文は

  for( 初期処理 ; 繰り返し条件 ; 繰り返し後処理 ) 繰り返し文

と書きます.初期処理は for 文を実行するときに一番最初に実行される処理です.そして,繰り返し条件が満たされるとき,繰り返し文を実行します.次に繰り返し後処理を実行し,再度繰り返し条件の判定に戻ります.繰り返し条件が満たされない場合は,for 文の実行を終了します.たとえば,次のコードは 0 から 10 を表示するプログラムです.

var i;
for( i = 0 ; i <= 10 ; i++ )
{
  document.write( i, '<BR>' );
}

最初に i に 0 が代入されます.条件文を判定すると 0 <= 10 は成り立ちますので, i(0) が表示されます.<= は,左辺が右辺以下のときに成り立つ演算子です.次に i に 1 が足されて,再度条件判定を行います.これを繰り返し,i が 10 のときまでは成り立つので表示が行われます.そして,i が 11 になったとき条件式が成り立たなくなるので繰り返し処理が終わります.

 これを利用して先のプログラムコードを書き直すと次のようになります.

var point = 0, sum = 0, num = 0, i;

num = parseInt( prompt( '人数を入力してください', '0' ) );
for( i = 0 ; i < num ; i++ )
{
  point = parseInt( prompt( '点数を入力してください', '0' ) );
  sum = sum + point;
}
document.write( num, '人の点数の合計点は', sum, '点です<BR>' );

このように for 文を使うと,カウント処理を繰り返し文の中に含めなくてよくなります. while 文を使うほうがよいか,for 文を使うほうがよいかは,慣れてくるとわかってきますので,とりあえずはどちらか好きなほうを使うのがよいでしょう.


平均点を表示してみる

 合計点と人数がわかれば,平均点は簡単に求められます.平均点を表示するプログラムを次に示します.

var point = 0, sum = 0, num = 0, i;

num = parseInt( prompt( '人数を入力してください', '0' ) );
for( i = 0 ; i < num ; i++ )
{
  point = parseInt( prompt( '点数を入力してください', '0' ) );
  sum = sum + point;
}
if( num > 0 )
{
  document.write( num, '人の点数の平均点は', sum/num, '点です<BR>' );
}
else
{
 document.write( '点数が一つも入力されませんでした<BR>' );
}

人数が 0 の場合に平均点を強引に計算しようとすると,0 による割り算を行ってしまうので,num が 0 より大きいときだけ平均点を計算し,表示するようにしてあります.


分散を計算してみよう

 次に点数の集計で平均点と共に重要な値である分散を計算するプログラムを作ってみます.分散とは平均点と各点数の差の平方和を人数で割ったものです.たとえば,30,40,50の分散は,平均点が40なので,

 { (30-40)(30-40) + (40-40)(40-40) + (50-40)(50-40) } / 3 = 66.666

です.

 このように分散を求めるためには平均点と各点数の差を計算する必要があります.平均点はすべての点数を入力した後でないと計算できません.つまり,すべての点数を入力した後に差を計算しなければなりません.したがって,すべての点数の入力が終わるまで,入力された点数のすべてを記憶しておく必要があります.たとえば次のような感じです.

var d1,d2,d3,ave,bunsan;
d1 = parseInt( prompt( '1つ目の点数を入力してください', '' ) );
d2 = parseInt( prompt( '2つ目の点数を入力してください', '' ) );
d3 = parseInt( prompt( '3つ目の点数を入力してください', '' ) );
ave = (d1+d2+d3)/3;
bunsan = ((d1-ave)*(d1-ave)+(d2-ave)*(d2-ave)+(d3-ave)*(d3-ave))/3;

このプログラムは 3 人の点数を集計できます.これを 4 人用,5 人用としていくには,変数を d4, d5,... と増やしていかなければならなく,汎用的ではなくなります.これを解決するには配列と呼ばれるものを使います.


配列

 配列とは複数の変数をひとまとめに扱う仕組みです.変数には一つの値をしまうことができましたが,配列は複数の値をしまうことができます.変数が一つの箱のようなものならば,配列は複数の箱をひとまとめにしたものです.そして,何番目の箱(一つ一つの箱を配列要素と呼びます)にしまうかは添え字で指定します.たとえば,5つの箱を持った配列を使うときには,

var a = new Array(5);

と宣言します.そして,その配列の要素にアクセスするには

配列名[添え字]

と書きます.たとえば,2番目の要素に値をしまうには,

a[1] = 10;

と書きます.2 番目なのにかぎ括弧[ ]の中に 1 を書くのは,添え字は 0 から始まるからです.また,3 番目の要素を画面に表示するには,

document.write( a[2] );

と書きます.


配列を利用して

 この配列を使えば,入力された点数を簡単に記憶するようなコードがかけます.

var point, sum = 0, num = 0, i, ave, bunsan = 0;

num = parseInt( prompt( '人数を入力してください', '0' ) );
if( num > 0 )
{
  point = new Array( num );
  for( i = 0 ; i < num ; i++ )
  {
    point[i] = parseInt( prompt( '点数を入力してください', '0' ) );
    sum = sum + point;
  }
  ave = sum / num;

このプログラムは先の平均値を計算するプログラムの前半を書き直したものです.一つ一つの点数を入力するときに i の値が 1 づつ増えるので,それを添え字として利用しています.

同様に分散もすべての点数が入力され,平均点が計算された後に,次のようにして計算することができます. 

  for( i = 0 ; i < num ; i++ )
  {
    bunsan = bunsan + ( point[i] - ave ) * ( point[i] - ave );
  }
  bunsan = bunsan / num;
}

これに表示を加えたプログラムを次に示します.

var point, sum = 0, num = 0, i, ave, bunsan = 0;

num = parseInt( prompt( '人数を入力してください', '0' ) );
if( num > 0 )
{
  point = new Array( num );
  for( i = 0 ; i < num ; i++ )
  {
    point[i] = parseInt( prompt( '点数を入力してください', '0' ) );
    sum = sum + point[i];
  }

  ave = sum / num;
  document.write( '平均点は', ave, '点です<BR>' );
    
  for( i = 0 ; i < num ; i++ )
  {
    bunsan += ( point[i] - ave ) * ( point[i] - ave );
  }
  bunsan /= num;
  document.write( '分散は', bunsan, 'です<BR>' );
}

ここで,/= という演算子は a /= b と書いた場合,a = a / b と同じ意味になる演算子です./= 以外にも,+=, -=, *= などがあります.


演習

 全員の点数と平均点との差の一覧を表示するプログラムを作ってみよう.たとえば,10点,23点,30点だったら,

平均点は21点です.
各人の平均点からの差は次のとおりです.
-11 点
2 点
9 点

のように表示するようにしてください.

発展課題

 平均点以上の人が何人いるか,平均点未満の人が何人いるかを表示するプログラムを作ってみよう.

発展課題2

 点数棒グラフを描くプログラムを書いてみよう. たとえば,10点,23点,45点だったら,

**
****
*********

のような感じです.この場合,5点刻みで * を描いています.つまり(点数/5)個の * を描いた場合です.