Computer Programing

2004-06


おいくらですか?

 前回は配列を紹介しました.まずは,この配列を用いるとよりプログラムが簡潔に書ける例を紹介します.

 商品の名前を入力するとその金額を表示してくれるプログラムを作ってみます.価格表

商品名 価格
りんご 100円
みかん 50円
もも 200円
ぶどう 250円

に対応したプログラムは次のようになります.

var name;

do
{
  name = prompt( '商品名は?', '' );
  if( name == 'りんご' ) document.write( 'りんごの値段は 100 円です<BR>' );
  else
  if( name == 'みかん' ) document.write( 'みかんの値段は 50 円です<BR>' );
  else
  if( name == 'もも' ) document.write( 'ももの値段は 200 円です<BR>' );
  else
  if( name == 'ぶどう' ) document.write( 'ぶどうの値段は 250 円です<BR>' );
} 
while( name != '' );

ここで,do〜while 文は,while 文の変形版で,繰り返しを続けるかどうかの条件判定を最後に行います.上の例では入力された文字列が空でなかったら繰り返しを続ける条件式となっています.while 文のときは最初に条件判定を行っていたため,一度も実行されずに通り過ぎることを防ぐために,条件文が成り立つように条件文に用いられる変数を初期化していましたが,do〜while 文では,その必要がありません.

 さて,これに次の商品を追加してみましょう.

商品名 価格
なし 80円
きうい 100円
いちご 250円

プログラムは次のようになります.

var name;

do
{
  name = prompt( '商品名は?', '' );
  if( name == 'りんご' ) document.write( 'りんごの値段は 100 円です<BR>' );
  else
  if( name == 'みかん' ) document.write( 'みかんの値段は 50 円です<BR>' );
  else
  if( name == 'もも' ) document.write( 'ももの値段は 200 円です<BR>' );
  else
  if( name == 'ぶどう' ) document.write( 'ぶどうの値段は 250 円です<BR>' );
  else
  if( name == 'なし' ) document.write( 'なしの値段は 80 円です<BR>' );
  else
  if( name == 'きうい' ) document.write( 'きういの値段は 100 円です<BR>' );
  else
  if( name == 'いちご' ) document.write( 'いちごの値段は 250 円です<BR>' );
} 
while( name != '' );

では,次に...という風に商品を追加していくたびに,プログラムコードが長くなっていってしまいます.この問題は配列を利用すると解決することができます.配列を使ったコードを次に示します.

var shouhin, kakaku, name, i;
var NUM = 4;

shouhin = new Array( 'りんご', 'みかん', 'もも', 'ぶどう' );
kakaku = new Array( 100, 50, 200, 250 );

do
{
  name = prompt( '商品名は?', '' );

  for( i = 0 ; i < NUM ; i++ )
  {
    if( name == shouhin[i] ) break;
  }
  if( i != NUM ) 
    document.write( shouhin[i], 'の価格は', kakaku[i], '円です<BR>' );
} 
while( name != '' );

ここで,

shouhin = new Array( 'りんご', 'みかん', 'もも', 'ぶどう' );

は,

shouhin = new Array( 4 );
shouhin[0] = 'りんご';
shouhin[1] = 'みかん';
shouhin[2] = 'もも';
shouhin[3] = 'ぶどう';

を一括して書く方法です.また,

shouhin = new Array( 4 );
shouhin = [ 'りんご', 'みかん', 'もも', 'ぶどう' ];

と書くこともできます.

 for 文で i を 0 から 3(NUM-1) まで変化させながら if 文を実行します.if 文では入力された名前(name)が配列に格納されている商品名と一致するかを判定しています.一致すると break 文が実行されます.break 文は一番近い繰り返しから抜ける文で,この場合は for 文をぬけます.もし,四つの商品名に一致すれば i が 0 から 3(NUM-1) の間に繰り返しが終了することになります.もし,どれにも一致しない場合は i が 4(NUM) になって繰り返しが終了します.それを次の if 文で調べて i が 4(NUM) ではないときは,商品名と価格を表示しています.

 このプログラムコードならば,商品が増えても,配列の設定の部分と,繰り返しの回数だけを変えればよいだけになります.このように,配列を利用すると,プログラムが,きれいに簡単に書けるようになります.


多次元配列

 上のプログラムでは商品名を配列 shouhin に,価格を配列 kakaku に格納しています.これを一つの配列にしまうことはできないのでしょうか.つまり,

商品名 価格
りんご 100円
みかん 50円
もも 200円
ぶどう 250円

の二列を別々の配列にしまうのではなく,まとめて一つの配列にしまえないだろうかということです.JavaScript では配列の配列を用いることで,このことが可能になります.これを多次元配列と呼びます.

多次元配列を用いて先のプログラムを書き換えると次のようになります.

var name, i, NUM = 4;
var shouhinkakaku = Array( 2 );
shouhinkakaku[0] = new Array( 'りんご', 'みかん', 'もも', 'ぶどう' );
shouhinkakaku[1] = new Array( 100, 50, 200, 250 );
 
do
{
  name = prompt( '商品名は?', '' );

  for( i = 0 ; i < NUM ; i++ )
  {
    if( name == shouhinkakaku[0][i] ) break;
  }
  if( i != NUM ) 
    document.write( shouhinkakaku[0][i], 'の価格は', shouhinkakaku[1][i], '円です<BR>' );
} 
while( name != '' );

 多次元配列は行列の計算など,いわゆる「表」の処理によく用いられます.


連想配列

 JavaScript には連想配列という独特の配列があります.連想配列を用いると先のプログラムは次のように書くことができます.

var name;
var shouhinkakaku = { 'りんご':100, 'みかん':50, 'もも':200, 'ぶどう':250 };

do
{
  name = prompt( '商品名は?', '' );
  if( shouhinkakaku[name] != null ) 
    document.write( name, 'の価格は', shouhinkakaku[name], '円です<BR>' );
} 
while( name != '' );

簡単に言うと添字の部分に数値以外のものを書くことができるということです.上のプログラムでは,添字に商品名を使って,shouhin['りんご'] にはりんごの価格を入れるという風にしています.連想配列は JavaScript 独特の文法ですが,うまく使うととても便利です.