3 配列の受け渡し

これも、本当はちょっと難しいが、参照渡しよりも簡単に思える。ポインターと併せて説 明するのが普通であるが、ここではそれを行わない。配列のデータを関数間でどのように すれば、受け渡せるか、分かって欲しい。本当に細かいことは、2年生以降とする。

3.1 例(成績処理プログラム)

10人の英語の成績を処理するプログラムを例に示す。これは、10人分のテストの点数を読み込んで、 平均点と各人の平均点からの差を計算するものである。具体的には、次のような動 作をするプログラムである。 このプログラムの核は、メイン関数とプログラマーが作成した関数 diff_ave()で、同じメモリー上の配列を共有することである。

これは、非常に簡単で、次のようにする。たとえば、呼び出し元でhoge[100]という 配列を関数kansu()に送りたいのならば、

	kansu(hoge);
として、コール (call) すれば良い。一方、呼び出された関数側では、それを配列名 fugaとして使いたいならば、
	戻り値の型 kansu(fuga[]){
	  処理内容
	}
とする。これは、例のプログラムをよく見て欲しい。このようになっているはずである。

2次元以上の配列の場合も同じようになる。ただし、呼び出された側では、配列のサイズ が必要となる。たとえば、呼び出し元で、

	int hoge[100], fuga[200][300], foo[400][500][600];
	
	kansu(hoge, fuga, foo);
とする。そうして、呼び出された関数側では、それを配列名a,b,cとして使いたいならば、
	戻り値の型 kansu(a[], b[][300], c[][500][600]){
	  処理内容
	}
とする。要するに呼び出された関数側では、配列のサイズの左端を書かなくても良いので ある。書いても良いが、一般的には書かない習慣となっている。書かない方が、間違える 確率が減るからだろう。

	#include <stdio.h>

	int diff_ave(int n, int data[]);

	/*==============================================================*/
	/*   main function                                              */
	/*==============================================================*/
	int main(void){
	  int seiseki[10], average, i;
	  char temp;

	  for(i=0; i<10; i++){
	    printf("%d番の成績 = ", i);
	    scanf("%d%c",&seiseki[i], &temp);
	  }
  
	  average=diff_ave(10, seiseki);     /*  関数呼び出し */

	  printf("平均点 = %d\n", average);
	  printf("平均点との差\n");

	  for(i=0; i<10; i++){
	    printf("%d番 = %d\n", i, seiseki[i]);
	  }

	  return 0;
	}

	/*==============================================================*/
	/*   平気値とその差の計算                                          */
	/*==============================================================*/
	int diff_ave(int n, int data[]){
	  int i, sum, ave;

	  sum=0;                      /* 初期化 */

	  for(i=0; i<n; i++){         /* 点数の合計の計算 */
	    sum = sum + data[i];
	  }

	  ave = sum/n;                /* 平均値の計算 */

	  for(i=0; i<n; i++){         /* 平均値との差の計算 */
	    data[i] = data[i] - ave;
	  }

	  return ave;
	}
図 3: 配列を受け渡す場合のメモリーの内容。これも、正確ではなく、大体の のイメージである。
\includegraphics[keepaspectratio, scale=1.0]{figure/call_dimension.eps}

3.2 練習問題(配列の受け渡し)

3.2.1 配列の循環

次のような、配列の内容を循環させるプログラムを作成せよ。

3.2.2 三角関数

次のような、三角関数の値を一度に計算するプログラムを作成せよ。


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年2月15日


no counter