1 前回の復習と本日の内容

1.1 前回の復習

1.1.1 プログラム例

前回の講義では,ファイルからデータを読み込んで配列に格納し,配列の内容を関数に受 渡して,処理することを学んだ.ここで,理解すべき内容は, -4pt のふたつである.

それぞれについて,リスト1のプログラムを例にして説明する.この プログラムは,つぎに示すデータをファイルから読み込んで,全ての整数の合計値と各列 の平均値を計算するプログラムである.データは,10000行4列,合計4万個の整数である.


-76797  99987   53528   -43172
-34698  44783   -106207 -106631
-83424  31615   18774   -4134
78694   -886    64632   103022
-86516  -99744  -51044  -11396
90058   54995   -39364  -36610
-78969  106494  -5209   -95276
75913   32002   39260   106490
24615   -14585  -44056  97291
-77175  -42889  98034   -53226
96100   9434    50013   67420

   この辺は長いので省略

100747  -2875   37515   4509
77468   12111   76950   82072
-102787 41331   75324   -96228
-53535  -6367   65795   -62947


   1 #include <stdio.h>
   2 
   3 int cal(int hoge[][4]);                           // プロトタイプ宣言
   4 
   5 double ave0, ave1, ave2, ave3;           // 各列の平均値はグローバル変数とする
   6 
   7 //===========================================================================
   8 // main 関数
   9 //===========================================================================
  10 int main(void)
  11 {
  12   FILE *in_file;
  13   int i,data[10000][4], sum_data;
  14   
  15   in_file = fopen("/home/yamamoto/tmp/program/int_data.txt", "r");
  16 
  17   for(i=0; i<10000; i++){
  18     fscanf(in_file,"%d%d%d%d",
  19 	   &data[i][0],&data[i][1],&data[i][2],&data[i][3]);
  20   }
  21 
  22   fclose(in_file);
  23 
  24   sum_data = cal(data);
  25 
  26   printf("sum all = %d\n", sum_data);
  27   printf("average = %f\t%f\t%f\t%f\n", ave0,ave1,ave2,ave3);
  28 
  29   return 0;
  30 }
  31 
  32 //===========================================================================
  33 // データ処理のためのユーザー定義関数
  34 //===========================================================================
  35 int cal(int hoge[][4]){
  36   int i;
  37   int sum0=0, sum1=0, sum2=0, sum3=0;
  38 
  39   for(i=0; i<10000; i++){
  40     sum0+=hoge[i][0];
  41     sum1+=hoge[i][1];
  42     sum2+=hoge[i][2];
  43     sum3+=hoge[i][3];
  44   }
  45 
  46   ave0=sum0/10000.0;
  47   ave1=sum1/10000.0;
  48   ave2=sum2/10000.0;
  49   ave3=sum3/10000.0;
  50 
  51   return sum0+sum1+sum2+sum3;
  52 }



\fbox{実行結果}

sum all = -15594426
average = -612.222100   377.635000      -430.162000     -894.693500

1.1.2 ファイルからのデータの読み込み

例題のリスト1のプログラムでは,ファイルに保存されているデー タを配列に格納する方法を理解しなくてはならない.

ファイルからデータを取得するには,(1)ファイル情報を格納する変数の用意する,(2)ファ イルをオープンする,(3)ファイルからデータを読み込む,(4)ファイルをクローズすると いう一連の動作が必要である.リスト1では次のようにしている.

  FILE *in_file;

  in_file = fopen("/home/yamamoto/tmp/program/int_data.txt", "r");

  for(i=0; i<10000; i++){
    fscanf(in_file,"%d%d%d%d",
	   &data[i][0],&data[i][1],&data[i][2],&data[i][3]);
  }

  fclose(in_file);

1.1.3 関数への配列データの受渡し

例題のリスト1のプログラムで学習する第二のポイントは,ユーザー 定義関数に配列のデータを渡す方法である.このプログラムでは呼び出し側では配列名の みを,ユーザー定義関数では配列名と左端を空欄とした要素数を記述している.こうする ことにより,ユーザー定義関数に配列のデータを渡すことができる.

ユーザー定義関数に単純型の変数を渡す場合と配列を渡す場合では,次の点で大きく異な る.注意が必要である.

  sum_data = cal(data);

    長いので省略


  int cal(int hoge[][4]){

    ここに関数での処理の内容を書く.

  return sum0+sum1+sum2+sum3;
}

1.2 本日の学習内容

本日はつぎに示す内容の理解を目指し,プログラムの作成の練習を行う.これは前回の授 業と同一の内容であるが,さらに理解を深める.合わせて,これまで学習してきたC言語 のプログラム方法--ループ文等の制御構造や関数--の使い方の訓練も行う.




ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年1月12日


no counter