[10a2] CSVファイルからの計算2

以下はいくつかの都市の都市名、年平均気温、年間降水量のCSVデータ である。これがファイル「data1.csv」に入っているものとする。

city,temprature,precitipation
Sapporo,8.2,1129.6
Sendai,11.9,1204.5
Tokyo,15.6,1405.3
Kanazawa,14.1,2592.6
Oosaka,16.3,1318.0
Hiroshima,16.2,1511.8
Kouchi,16.4,2582.4
Fukuoka,16.2,1604.3
Naha,22.4,2036.8

これを読み込むのに以下のヘッダファイルにあるcsv_readを使うものと する。

// csv.h --- csv file read/write API.
struct csv { int num; char *cell[1]; };
typedef struct csv *csvp;
int csv_read(char *fname, int limit, csvp arr[]);
void csv_write(char *fname, int size, csvp arr[]);

テキストに掲載されている実装を一応示す。

// csv.c --- csv file read/write API impl.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "csv.h"
#define MAXLINE 1000
static char *readline(FILE *f) {
  char buf[MAXLINE], *str;
  if(fgets(buf, MAXLINE, f) == NULL) { return NULL; }
  int len = strlen(buf);
  if(buf[len-1] == '\n') { buf[--len] = '\0'; }
  str = (char*)malloc(len+1); strcpy(str, buf); return str;
}
static csvp read1(FILE *f) {
  char *arr[100], *s = readline(f); if(s == NULL) { return NULL; }
  int i = 0; arr[0] = s;
  for(arr[i++] = s; *s != '\0'; ++s) {
    if(*s == ',') { *s = '\0'; arr[i++] = s+1; }
  }
  csvp r = (csvp)malloc(sizeof(struct csv) + i*sizeof(char*));
  r->num = i; 
  for(i = 0; i < r->num; ++i) { r->cell[i] = arr[i]; }
  return r;
}
int csv_read(char *fname, int limit, csvp arr[]) {
  int size = 0; csvp line;
  FILE *f = fopen(fname, "rb"); if(f == NULL) { return -1; }
  while((line = read1(f)) != NULL) {
    if(size+1 >= limit) { size = -2; break; }
    arr[size++] = line;
  }
  fclose(f); return size;
}
void csv_write(char *fname, int size, csvp arr[]) {
  int i, j;
  FILE *f = fopen(fname, "wb"); if(f == NULL) { return; }
  for(i = 0; i < size; ++i) {
    fprintf(f, "%s", arr[i]->cell[0]);
    for(j = 1; j < arr[i]->num; ++j) { fprintf(f, ",%s", arr[i]->cell[j]); }
    fprintf(f, "\n");
  }
  fclose(f);
}

読み込んだ後、全都市の年間降水量の平均を出力するプログラムを作成 せよ(出力書式は "%8.3f\n" を使用し、入力でエラーがあった場合は何 も出力しない)。下請け関数は作らずmainのみで処理し、ファイル中の 都市数が変化してもプログラムを修正しないで済むようにすること。都 市数は1以上あると仮定してよい。

記号列 

コード 

選択肢

ア #include "csv.h"
イ #include <stdbool.h>
ウ #include <stdio.h>
エ #include <stdlib.h>
オ int main(void) {
カ }
キ return 0;
ク csvp data[1000];
ケ double data[1000];
コ int i, size = csv_read("data1.csv", 1000, data);
サ int s = 0;
シ double s = 0.0;
ス if(size <= 0) { return 0; }
セ for(i = 1; i < size; ++i) {
ソ for(i = 0; i < size; ++i) {
タ for(i = 0; i < size-1; ++i) {
チ printf("%8.3f\n", s / size);
ツ printf("%8.3f\n", s / (size-1));
テ printf("%8.3f\n", s / 9);
ト printf("%8.3f\n", s / 9.0);
ナ s += data[i]->cell[0];
ニ s += data[i]->cell[1];
ヌ s += data[i]->cell[2];
ネ s += atof(data[i]->cell[0]);
ノ s += atof(data[i]->cell[1]);
ハ s += atof(data[i]->cell[2]);

選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。