プログラム言語 II TOP

配列(2)

例題7.2



1. sizeof 演算子
変数に割り当てられるメモリの大きさは,コンパイラにより変わります。例えば,整数型の変数に2バイト割り当てるコンパイラもあれば,4バイト割り当てるものもあります。割り当てられるメモリの大きさをプログラム中で調べるためのものが sizeof 演算子です。

 

講義で使うコンパイラで処理した場合の実行結果は次のようになります:

 


sizeof 演算子を使うと,配列の大きさを求めることができます。例えば,配列 a の大きさは

 sizeof a / sizeof a[0]

となります。


2. 配列の初期値
配列の要素にも初期値を設定することができます。

 int Coins[6] = { 500, 100, 50, 10, 5, 1 } ;

整数型の配列 Coins の各要素に,500,100,50,10,5,1 をこの順に初期値として格納します。なお

 int Coins[ ] = { 500, 100, 50, 10, 5, 1 };

と配列の大きさを省略することもできます(指定された初期値の個数が,配列の大きさとなる)。ただし,

 int Coins[7] = { 500, 100, 50, 10, 5, 1 };

とすると, Coins[6] には 0 が初期値として格納されます(初期値は配列の最初の要素から順に格納されるので,配列の大きさの方が指定された初期値の数よりも大きい場合,残りの要素には 0 が格納される)。

逆の場合は,コンパイル時に警告メッセージが出力されます。

 

このプログラムをコンパイルすると,次のような警告メッセージが出力されます。

 

なぜか,同じメッセージが繰り返し出力されています。

実行結果は次のようになります。

 


3. 配列引数
配列(全体)を引数とすることができます。

ただし,呼び出された関数の中で,仮引数である配列の要素の値を変更すると,対応する実引数(配列)の要素の値が変更されます。

復習 引数が単なる変数の場合は,仮引数の値を変更しても,対応する実引数の値は変わらない(関数(1))。


例1

 

実行結果

 


例2

 

実行結果

 

注意 配列仮引数の大きさは省略することができます。


例3

 

実行結果

 

注意1 前述したように,sizeof array で,配列 array 全体に割り当てられたメモリの大きさが求められます。それを配列 array の要素 array[0] に割り当てられたメモリの大きさで割ることにより,配列 array の大きさ(要素数)が求められます。

配列の各要素に割り当てられるメモリの大きさはすべて同じです。つまり,sizeof array / sizeof array[4] でも同じ結果に,この例ではなります。では,なぜ array[0] としているのでしょうか?

注意2 引数が配列の場合,実引数の配列自体が関数に渡されるようなことになります。関数の中では仮引数の配列名で参照されますが,実引数の配列を直接参照することになります(厳密な話は,ポインタの後になります)。

補足の例


4. 例題7.2
配列 Coins の各要素に,貨幣の金額が高いものから格納されます。そして,A_SIZE が配列 Coins の要素数(6)になります。

将来,200円硬貨など新しい硬貨が発行されたときでも,行番号 3 の行だけの変更で対応することができることに注目してください。

行番号 9 で,配列 Coins と同じ大きさの配列として NoOfCoins を宣言しています。この配列の各要素に釣銭として必要な硬貨の枚数が関数 CompChange により格納されます(行番号 16 Coins[n] の値の金額の硬貨の必要枚数が NoOfCoins[n] に格納される)。

行番号34〜37の繰返しにより,釣銭として必要な枚数を求めています。なお,この繰返しは,次のような while 文の繰返しで書くこともできます。

  i = 0;
  while ( Rem>0 ) {
    NC[i] = Rem / Coins[i];
    Rem %= Coins[i];
    i++;
  }


例えば,釣銭( Rem )が760円だとします。

  i = 0 : 760 を 500 で割った商 1 が NC[0] に格納される(つまり,500円硬貨が 1 枚必要)。
       760 を 500 で割った余り 260 が Rem に格納される(釣銭の残り)。

  i = 1 : 260 を 100 で割った商 2 が NC[1] に格納される。
       260 を 100 で割った余り 60 が Rem に格納される。

  i = 2 : 60 を 50 で割った商 1 が NC[2] に格納される。
       60 を 50 で割った余り 10 が Rem に格納される。

  i = 3 : 10 を 10 で割った商 1 が NC[3] に格納される。
       10 を 10 で割った余り 0 が Rem に格納される。

  Rem が 0 なので,繰返しを終了する(終了時点で, i の値は 4 であることに注意)。

  行番号39〜41の繰返しは i =4 で始まり,NC[4] と NC[5] に 0 が格納される(A_SIZE は 6)。


5. 演習  a) と b) の考え方の解説(array.pptx

a) 整数型の配列に格納してある値の中で,最大のものをみつけるプログラムを作りなさい。ただし,結果として,何番目に格納されている値いくつが最大であるかを表示する。 解答例

b) 整数型の配列に格納してある値を,大きい順(降順)に並べ替えるプログラムを作りなさい。 解答例
 
注意 データを順番に並べ替えることをソート(sort)するという。そのアルゴリズムはたくさんある(参考 練習問題7 3)。

c) 整数型の配列に値が昇順(小さい順)に格納されている。この中に指定された値(キーボードから入力する)があるかどうかを調べるプログラムを作りなさい。結果は,あるときは何番目(添字の値)に格納されているかを表示し,ないときは"ない"と表示する。

この問題では,配列(1)の演習cと異なり,配列中の値が昇順になっているでの,2分探索法(binary search)という方法が使える。

d) 紙幣も釣銭とするプログラムに変更しなさい。

例えば,釣銭が7600円ならば,5000円札が1枚,1000円札が2枚,500円硬貨が1枚,100円硬貨が1枚と出力する。


プログラム言語 II TOP