HSP3 プログラミングの基礎T
前へ 目次へ 次へ 

(5) 配列変数(数値)

 変数に番号を付けて、大量のデータを管理できる仕組みである。

dim 配列変数名, 個数  … 整数用の配列変数の確保
ddim  配列変数名, 個数  … 実数用の配列変数の確保
配列変数(番号)  … 利用時の書き方

 

サンプル12, 34, 56, 78, 90のデータを変数に格納して、合計を計算する。

    a1 = 12
    a2 = 34
    a3 = 56
    a4 = 78
    a5 = 90
    wa = a1 + a2 + a3 + a4 + a5
    mes "合計は、" + wa + " です。"
    stop

実行「合計は、270 です。」と表示される。

 データの個数が5個なので、それほど大変な手間ではないが、データが100個、1000個と増えたとき、大変なことになることが予想できる。

試してみよう配列変数を使って計算する。

    dim a, 5            ;a(0)〜a(4)の5個の配列変数が使える。
    a = 12, 34, 56, 78, 90
    repeat 5
        wa = wa + a(cnt)
    loop
    mes "合計は、" + wa + " です。"
    stop

実行「合計は、270 です。」と表示される。

 2行目のa=12,34,56,78,90は、a(0)=12、a(1)=34、a(2)=56、a(3)=78、a(4)=90と書いたのと同じ働きをする。
 a(0)、a(1)、a(2)・・・の一つずつを配列変数の「要素」という。

試してみようデータを増やしてみる。データは、12, 34, 56, 78, 90, 14, 70, 25, 83, 69, 98, 76, 54, 32, 10とする。

    dim a, 15
    a(0) = 12, 34, 56, 78, 90
    a(5) = 14, 70, 25, 83, 69
    a(10) = 98, 76, 54, 32, 10
    repeat 15
        wa = wa + a(cnt)
    loop
    mes "合計は、" + wa + " です。"
    stop

実行「合計は、801 です。」と表示される。

 データの代入部分は、a = 12, 34, 56, 78, 90, 14, 70, 25, 83, 69, 98, 76, 54, 32, 10 と書いても良いが、1行に書ききれないときなどには、このような書き方がある。
 a(0)=12,34,56,78,90はa=12,34,・・・と同じである。a(5)=14,70,25,83,69は配列変数aの5番目から順に代入される。したがって、a(5)=14、a(6)=70、a(7)=25、a(8)=83、a(9)=69と書いたのと同じ働きをする。

二次元の配列変数
 dim  x, 5, 3 で x(0, 0) から x(4, 2) までの20個の配列変数が利用できる。次元の数は4次元までである。
    x(0, 0)  x(1, 0)  x(2, 0)  x(3, 0)  x(4, 0)
    x(0, 1)  x(1, 1)  x(2, 1)  x(3, 1)  x(4, 1)
    x(0, 2)  x(1, 2)  x(2, 2)  x(3, 2)  x(4, 2)

 

サンプル確保した配列変数の要素の個数を表示する。

    dim a, 5
    mes "配列の要素数=" + length(a)
    stop

実行「配列の要素数=5」と表示される。

 length関数は確保された配列変数の要素の個数を返却する。配列変数に格納されているデータの個数ではないことに注意すること。

試してみよう12, 34, 56, 78, 90のデータを配列変数に格納して、合計と平均を計算する。

    dim a, 5    ;←
    a = 12, 34, 56, 78, 90
    repeat length(a)
        wa = wa + a(cnt)
    loop
    av = double(wa) / length(a)
    mes "合計は、" + wa + " です。"
    mes "平均は、" + av + " です。"
    stop
    dim a, 25    ;←
    a = 12, 34, 56, 78, 90
    repeat length(a)
        wa = wa + a(cnt)
    loop
    av = double(wa) / length(a)
    mes "合計は、" + wa + " です。"
    mes "平均は、" + av + " です。"
    stop

実行左側は「合計は、270 です。」、「平均は、54.000000 です。」と表示される。
  右側は「合計は、270 です。」、「平均は、10.800000 です。」と表示される。

 左右の違いは、1行目の配列変数の確保する数を変更しただけである。
 double(wa)は、整数型の変数waを実数型に変換する関数である。

 

サンプル12.1, 34.1, 56.1, 78.1, 90.1のデータを配列変数に格納して、合計を計算する。

    ddim a, 5
    a = 12.1, 34.1, 56.1, 78.1, 90.1
    repeat 5
        wa = wa + a(cnt)
    loop
    mes "合計は、" + wa + " です。"
    stop

実行「合計は、270 です。」と表示される。 アレ?

 基本的に、数値用の変数は整数型のようである。したがって、wa=wa+a(cnt)の右辺の計算は最初のwaが整数型と判断されるため、整数の答えが表示される。

wa + a(cnt)  →   wa  →  逆に書くと  →   a(cnt) + wa  →   wa  となる。
整数型 実数型  →   整数型 実数型 + 整数型  →   実数型

試してみようdouble関数を使わずに正しい答え、実数値が表示されるようにする。変数waを実数型にする。 (wa=0.0)

    ddim a, 5
    a = 12.1, 34.1, 56.1, 78.1, 90.1
    wa = 0.0    ;←
    repeat 5
        wa = wa + a(cnt)
    loop
    mes "合計は、" + wa + " です。"
    stop

実行「合計は、270.500000 です。」と表示される。

 ループ内のwa=wa+a(cnt)の計算の前に、wa = 0.0 で変数waを実数値(0.0)で初期化している。ループ内のwa=wa+a(cnt)の右辺の計算は最初のwaが実数型なので正しく結果が求められる。


(6) 配列変数(文字列)

sdim  配列変数名, 文字数, 個数  … 文字列用の配列変数の確保
配列変数(番号)  … 利用時の書き方

 

サンプル3つの単語 language, programming, HSP3を順に配列変数に記憶させ、逆順で表示する。

    sdim s, 11, 3
    s = "language", "programming", "HSP3"
    mes s(2) + " " + s(1) + " " + s(0)
    stop

実行「HSP3 programming language」と表示される。

 最も文字数の多い単語は、programmingの11文字なので、sdim s,11,3で確保している。

試してみようrepeat命令を使って同じ処理をする。

    sdim s, 11, 3
    s = "language", "programming", "HSP3"
    ss = ""
    repeat 3
        ss = ss + s(2-cnt) + " "
    loop
    mes ss
    stop

実行「HSP3 programming language」と表示される。




☆ 配列変数について

 配列変数の要素は、代入された時点で自動的に確保される。したがって、配列変数を確保する命令dim(ddim, sdim)はなくても良い。これまでのサンプルプログラムでdim命令を削除して実行してみよう。
 しかし、メモリの有効利用、処理の効率を図るためにも事前に適切な配列変数を確保しておく方がよい。

 プログラムの中でいきなりa(100)=10のようにして、a(100)だけを使ってもエラーにはならない(x=a(100)はエラーになる)。しかし、a(100)だけを使うつもりでもa(0)〜a(99)の分も確保される(メモリを消費する)ので注意すること。

    dim a, 5
    mes "配列の要素数=" + length(a)
    a(100) = 1
    mes "配列の要素数=" + length(a)
    stop


前へ 目次へ 次へ 
2006, 2007 © Hiroshi Masuda 

 

 

inserted by FC2 system