• ベストアンサー

二重配列について

はじめてプログラムを書くのですが教えていただきたいです。     時間,   値1, 値2, 値3     00:00, 3453, 7652, 2763 00:00, 3434, 9080, 7659 02:00, 3423, 7624, 7543 02:00, 4556, 4653, 3485 ・           ・ ・ 上記のような入力ファイルを二次元配列に入れたいんですが 行数が決まっていないためどのように配列を作ったらよいか わかりません。 また、配列にいれた後に時間ごとの平均値、最大値を求める方法なども ご教授していただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★二次元配列のポインタを使うのはどう。 ・最初にデータ数をカウントしてから二次元配列のポインタにメモリ確保します。  その後、二次元配列のポインタを使ってデータを読み込み、アクセスします。 ・他にも構造体を用意して確保、リスト構造を使ってデータを読み込む方法など  いろいろとあります。今回はどうしても二次元配列を使いたいのですよね。 ・下にそのサンプルを載せます。  解説はしませんので読み取って下さい。 サンプル: char buff[ 256 ]; int (*data)[4]; int lineno; int i; // 読み込み1(データ数のカウント) for ( lineno = 0 ; fgets(buff,sizeof(buff),fp) != NULL ; lineno++ ){  ; } // 二次元配列のポインタでメモリ確保 if ( (data = (int(*)[4])malloc(sizeof(int) * 4 * lineno)) == NULL ){  printf( "メモリが足りません。\n" );  exit( 1 ); } // 読み込み2(データの読み出し) rewind( fp ); for ( i = 0 ; fgets(buff,sizeof(buff),fp) != NULL ; i++ ){  data[ i ][ 0 ] = atoi( 1列目の文字列ポインタ ); ←atoi で使えるように工夫  data[ i ][ 1 ] = atoi( 2列目の文字列ポインタ );  data[ i ][ 2 ] = atoi( 3列目の文字列ポインタ );  data[ i ][ 3 ] = atoi( 4列目の文字列ポインタ ); } // おまけ(データ表示) for ( i = 0 ; i < lineno ; i++ ){  printf( "%04d %d, %d, %d\n", data[i][0], data[i][1], data[i][2], data[i][3] ); } その他: ・『平均値』はすべてのデータを加算して合計を求める。そしてデータ数で割るだけです。 ・『最大値』は最初のデータ値を max 変数にセットする。そして続くデータ値との大小比較  を行って max 変数よりもデータ値が大きくなったときに max 変数に代入します。 ・以上。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★追記。 ・fscanf() 関数を使えば data[i][0] ~ data[i][3] に整数値を簡単に読み込めますね。  ただし data[i][0] はちょっと工夫が必要です。 ・あと data[i][0] は時・分に分けたほうが良いのかな。  この場合は『int (*data)[4]』を『int (*data)[5]』にします。  その他いろいろと修正して下さい。4→5。 ・以上。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

ファイルの先頭の >時間,   値1, 値2, 値3  この行はどうするのでしょうか? ・例外として読み飛ばす ・データとして一応登録する など >平均を求める方法 小学校くらいで習っているはずなので思い出してください。 >最大を求める方法 値1, 値2, 値3をくらべて一番大きい値が最大ですね。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

Cという仮定で 答えではなくてアドバイスになりますがこういうデータの場合は2次元配列より構造体にして読み込んだ方がよさそうな気がします。 行数が不定なら一旦ファイルをfgetsで読み飛ばして行数のみ数えたらどうでしょう その行数分mallocで構造体の領域を確保します ファイルを先頭にfseekして改めて読み込みます。 サンプル #include <stdio.h> #include <malloc.h> typedef struct stdata { int h; int m; int v1; int v2; int v3; } STDATA; int main(void) { FILE* fp; int line = 0; char buf[256]; STDATA* data; int i; fp = fopen("test.dat", "r"); while (fgets(buf, sizeof(buf), fp)) { line++; } data = (STDATA*)malloc(sizeof(STDATA) * line); fseek(fp, 0, SEEK_SET); for (i = 0; i < line; i++) { fscanf(fp, "%d:%d, %d, %d, %d\n", &data[i].h, &data[i].m, &data[i].v1, &data[i].v2, &data[i].v3); } fclose(fp); for (i = 0; i < line; i++) { printf("%d:%d %d %d %d\n", data[i].h, data[i].m, data[i].v1, data[i].v2, data[i].v3); } free(data); return 0; }

関連するQ&A

専門家に質問してみよう