気温は,表1のようなになっている.この気温の部分のみがファイル (/tmp/1e/temperature.txt)に書かれており,そのフォーマット(書式)は次の ようになっている. -4pt
| 0時 | 1時 | 2時 | 3時 | 4時 | 5時 | 23時 | ||
| 1日 | 8.4 | 8.0 | 7.3 | 6.5 | 6.0 | 6.1 | 10.8 | |
| 2日 | 11.4 | 11.6 | 11.3 | 10.8 | 10.4 | 9.5 | 15.8 | |
| 3日 | 15.9 | 15.8 | 15.2 | 14.9 | 14.5 | 14.3 | 15.8 | |
| 30日 | 13.9 | 13.7 | 13.9 | 13.8 | 13.6 | 14.7 | 11.2 |
emacs /tmp/1e/temperature.txt
このファイルの気温を読み込んで,日々とその月の最高温度を表示するプログラムの例を リスト1に示す.ここではi日j時のデータを二次元 配列temp[i][j]に格納している.二次元配列については先週述べたので,ここでは 詳しく説明しない.
ファイルからデータを読み出すプログラムは,まだ学習していない.2年生のはじめに学習する ことになっているが,簡単に述べておく.ファイルからデータを読み出すために は,(1)ファイル情報を格納する変数の用意,(2)ファイルのオープン,(3)データの読み 込み,(4)ファイルのクローズ--という一連の動作を行う.実際には,リスト 1のとおりで,ファイル操作に関する部分を以下に示す.
1 #include <stdio.h>
2
3 int main(void){
4 FILE *fp;
5 double temp[31][24];
6 double max_day[31];
7 double max_nov;
8 int dates, hours;
9 int i, j;
10
11 dates = 30; // 日数と時間の設定
12 hours = 24;
13
14 fp=fopen("/tmp/1e/temperature.txt","r"); // ファイルをオープン
15
16 for(i=1; i<=dates; i++){ // ファイルからデータを読む
17 for(j=0; j<=hours-1; j++){
18 fscanf(fp, "%lf", &temp[i][j]);
19 }
20 }
21
22 fclose(fp); // ファイルをクローズ
23
24 /* --------------- 最大と最小、平均の計算 --------------------*/
25
26 max_nov = temp[1][0]; // 11月の仮の最高気温 1日の0時
27
28 // ---------- i日のループ -----------------------------
29 for(i=1; i<=dates; i++){ // iは、日にちを表す
30 max_day[i] = temp[i][0]; // i日の仮の最高気温 i日の0時
31
32 // ---------- j時のループ -----------------------------
33 for(j=0; j<=hours-1; j++){ // iは時刻を表す
34
35 if(temp[i][j] > max_day[i]){ // i日の最大気温の探索
36 max_day[i] = temp[i][j];
37 }
38
39 } // ----------j時のループの終わり --------------
40
41 if(max_day[i] > max_nov){ // 11月の最大気温の探索
42 max_nov = max_day[i];
43 }
44
45 } // ----------i日のループの終わり --------------
46
47
48 printf("\n\nTemperature November/2003 at Akita\n");
49 printf("------------------------------------\n");
50 printf(" day\tmax\n");
51 printf("====================================\n");
52
53 for(i=1; i<=dates; i++){
54 printf("%3d\t%5.1lf\n",i, max_day[i]);
55 }
56
57 printf("------------------------------------\n\n");
58
59
60 printf("max(Nov.) = %5.1lf\n", max_nov);
61
62 return 0;
63
64 }
Temperature November/2003 at Akita ------------------------------------ day max ==================================== 1 20.3 2 20.4 3 22.8 4 14.9 5 18.4 : : : : 29 15.7 30 15.1 ------------------------------------ max(Nov.) = 22.8
10人の英語の成績を処理するプログラムを考える.このプログラムは,次のような動作を する. -4pt
このプログラムのでは,メイン関数とユーザー定義関数diff_ave()で,同じ配列を 使用している.最初,配列seiseki[]には英語のテストの点数が格納されており,最 後には各人の平均値からの差が格納されている.実引数と仮引数のデータの渡す方法が普 通の変数と配列では異なる. -4pt
また,仮引数の書き方も変わっている.仮引数の配列はdata[]のようにして,配列
のサイズは不要である.二次元や三次元の仮引数の場合,fuga[][100]や
hoge[][200][300]のように,左端の配列のサイズを書かない.なぜ,このような変なこと
をするか?.これについては,ポインターを学習しないと理解できないので,ここでは説
明しない.
1 #include <stdio.h>
2
3 int diff_ave(int n, int data[]);
4
5 /*==============================================================*/
6 /* main function */
7 /*==============================================================*/
8 int main(void)
9 {
10 int seiseki[10], average, i, n;
11
12 n=10; // 学生数
13
14 for(i=0; i<n; i++){
15 printf("%d番の成績\t", i);
16 scanf("%d",&seiseki[i]);
17 }
18
19 average=diff_ave(n, seiseki); // 関数呼び出し
20
21 printf("平均点 = %d\n", average);
22 printf("平均点との差\n");
23
24 for(i=0; i<10; i++){
25 printf("%d番\t%d点\n", i, seiseki[i]);
26 }
27
28 return 0;
29 }
30
31 /*==============================================================*/
32 /* 平気値とその差の計算 */
33 /*==============================================================*/
34 int diff_ave(int n, int data[])
35 {
36 int i, sum=0, ave;
37
38 for(i=0; i<n; i++){ // 点数の合計の計算
39 sum += data[i];
40 }
41 ave = sum/n; // 平均値の計算
42
43 for(i=0; i<n; i++){ // 平均値との差の計算
44 data[i] = data[i] - ave;
45 }
46
47 return ave;
48 }