4 プログラム例

4.1 繰り返し文

以下のプログラムが作成できること。

4.2 アクセスカウンター

4.2.1 問題

教科書のP.186のLesson 5-2の問題である。
ホームページを閲覧しているときに、アクセスカウンターと呼ばれる「そのページが何 回閲覧されたか」を表示する仕組みがある。これは、ホームページにアクセスしたとき にあるプログラムが動くようになっていて、そのプログラムが何回実行されたかを調べ ている。すなわち、実行回数をファイルに保存しておき、プログラムを実行するときに はそのファイルを読み込んで実行回数に1を加えてまた保存するということを行っている わけだ。

このようなときに利用できるアクセスカウンタープログラムの基本として、プログラム の実行回数をカウントし、「○回目の実行です」と表示するプログラムを作成しなさい。
ただし、 とする。

4.2.2 ソースプログラム

次のようなソースプログラムが書ける。これをよく理解すること。

    #include <stdio.h>

    int main(void){
      FILE *fp;
      int access;
      
      /*--------------- ファイルのオープン(読み込みモード) ------------------------*/
      
      if((fp=fopen("/tmp/1e/up.log","r"))==NULL){
        printf("can not open the file\n");
        return 1;
      }
      
      fscanf(fp, "%d", &access);    /*-- ファイルからデータを読み込む --*/
      
      fclose(fp);                   /* -- ファイルのクローズ --*/
      
      
      
      /*--------------- 実行回数の表示 -----------------------------------------*/
      
      printf("%d 回目の実行です\n", access);
      
      
      /*--------------- ファイルのオープン(書き込みモード) ------------------------*/
      
      if((fp=fopen("/tmp/1e/up.log","w"))==NULL){
        printf("can not open the file\n");
        return 1;
      }
      
      fprintf(fp, "%d",access+1);     /*-- ファイルへデータを書き込む --*/
      
      fclose(fp);                     /*-- ファイルのクローズ --*/
      
      return 0;	
      
    }

4.3 温度のデータ処理

4.3.1 問題

問題として与えられたのは、以下の条件のプログラムの作成である。


表 1: 11月の気温
  0時 1時 2時 3時 $ \cdots$ 23時
1日 8.3 7.9 7.5 7.2 $ \cdots$ 9.8
2日 9.3 9.2 9.1 9.0 $ \cdots$ 6.3
3日 6.2 5.8 5.3 4.9 $ \cdots$ 12.0
$ \vdots$ $ \vdots$ $ \vdots$ $ \vdots$ $ \vdots$ $ \ddots$ $ \vdots$
30日 4.3 3.9 3.3 2.8 $ \cdots$ 3.8

4.3.2 ソースプログラム

次のようなソースプログラムが書ける。これをよく理解すること。

    #include <stdio.h>
    
    int main(void){
      FILE *fp;
      double temp[31][24];
      double max_day[31], min_day[31], av_day[31];
      double max_nov, min_nov, av_nov;
      double sum_day, sum_nov;
      int dates, hours;
      int i, j;
      
      /* --------------- 日数と時間の設定 --------------------------*/
      
      dates = 30;
      hours = 24;
      
      /* --------------- ファイルのオープン ------------------------*/
      
      if((fp=fopen("/tmp/1e/temperature.txt","r"))==NULL){
        printf("can not open the file\n");
        return 1;
      }
      
      
      /* --------------- ファイルからデータを読み込む ---------------*/
      
      for(i=1; i<=dates; i++){
        for(j=0; j<=hours-1; j++){
        fscanf(fp, "%lf", &temp[i][j]);
        }	
      }


      /* --------------- ファイルのクローズ -----------------------*/

      fclose(fp);      

      
      /* --------------- 最大と最小、平均の計算 --------------------*/
      
      max_nov = -9999;                  /* 11月の仮の最高気温 */
      min_nov = 9999;                   /* 11月の仮の最低気温 */
      sum_nov = 0.0;                    /* 11月の気温の合計の初期値 */
      
      for(i=1; i<=dates; i++){          /* iは、日にちを表す */
	
        max_day[i] = -9999;             /* i日の仮の最高気温 */
        min_day[i] = 9999;              /* i日の仮の最低気温 */
        sum_day = 0.0;                  /* i日の気温の合計の初期値 */
	
        for(j=0; j<=hours-1; j++){      /* jは時刻を表す    */       
          sum_day += temp[i][j];        /* 時刻毎の気温の合計 */
	  
          if(temp[i][j] > max_day[i]){  /* i日の最大気温の探索 */
            max_day[i] = temp[i][j];
          }
	  
          if(temp[i][j] < min_day[i]){  /* i日の最低気温の探索 */
            min_day[i] = temp[i][j];
          }      
        }
	
        av_day[i]=sum_day/hours;        /* i日の平均気温の計算 */
	
        sum_nov += av_day[i];           /* 11月1日までの平均気温の和 */
	
        if(max_day[i] > max_nov){       /* 11月の最大気温の探索 */
          max_nov = max_day[i];
        }
	
        if(min_day[i] < min_nov){       /* 11月の最低気温の探索 */
          min_nov = min_day[i];
        }   
	
      }
      
      av_nov = sum_nov/dates;           /* 11月の平均気温の計算 */
      

      /* --------------- 結果の表示 ----------- --------------------*/      
      
      printf("\n\nTemperature  November/2003 at Akita\n"); 	
      printf("------------------------------------\n");
      printf(" day     max     min    average \n");
      printf("====================================\n");
      
      for(i=1; i<=dates; i++){
        printf("%3d     %5.1lf   %5.1lf   %5.1lf\n",
        i, max_day[i], min_day[i], av_day[i]);
      }
      
      printf("------------------------------------\n\n"); 
            
      printf("max(Nov.)     = %5.1lf\n", max_nov);
      printf("min(Nov.)     = %5.1lf\n", min_nov);
      printf("average(Nov.) = %5.1lf\n\n", av_nov);
      
      
      return 0;	
      
    }

4.3.3 実行結果

実行結果、以下のようになる。

Temperature  November/2003 at Akita
------------------------------------
 day     max     min    average 
====================================
  1      20.3     6.0    12.1
  2      20.4     9.5    15.2
  3      22.8    13.9    17.8
  4      14.9     6.4    11.5
  5      18.4     4.3    10.6
  6      17.9    10.5    13.3
  :         :       :       :
  :         :       :       :
 25      10.6     7.6     9.2
 26       7.0     0.6     4.3
 27       7.3    -0.3     2.8
 28      12.2     0.1     6.0
 29      15.7     7.9    12.2
 30      15.1    11.2    13.4
------------------------------------

max(Nov.)     =  22.8
min(Nov.)     =  -0.5
average(Nov.) =   9.2


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年11月30日


no counter