• ベストアンサー

二重配列について

はじめてプログラムを書くのですが教えていただきたいです。     時間,   値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

  • テキストファイルを二次元配列に

    お世話になります。 テキストファイルを1行ずつ読み込んで二次元配列に格納するプログラムですが、 //最大行数 #define LINE_MAX 10 //行内最大文字数 #define INPUT_MAX 128 char str[LINE_MAX][INPUT_MAX]; というようにして実現しています。 これを行数が分からないテキストファイルでも大丈夫なようメモリを動的に確保したいと考えています。 二つの次元の内、一つを動的に確保するにはどのようにしたら良いでしょうか。

  • 配列(testを使って)

    2 つの実数ベクトル(3 次元)A とBの足し算をしてその結果を表示するプログラムを書きなさい。ただし、ベクトルの値はキーボードから入力する。 testを使った配列によってこのプログラムを作りたいのですが3次元ってところが難しくてわかりません。 誰か分かる人いませんか?

  • 多次元配列の行列

    1番 キーボードから3×3の行列の要素を2次元配列に入力した後、その値を表示するプログラムをさくせいせよ 2番 キーボードから3×4の行列の要素を2次元配列に入力した後、転置行列を出力するプログラムをさくせいせよ 3番 2つの行列A(3×3行列)、B(3×3行列)の買う要素の値をキーボードから2つの配列に入力し、2つの行列、並びに、それらの和、差、積の行列を出力するプログラムを作成せよ(Bに単位行列を入れて検算せよ) 4番 2行3列の行列と3行2列の積を求めるプログラムを作成せよ どなたかわからないでしょうか?? 数が多くてすみません。 わかる方お願いします!!

  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • フォームを通さずに2次元配列の値の受け渡しについて教えてください

    お世話になります。 以前にも質問させて頂きましたが、うまくいかずもう1度質問させてください。 phpで2次元配列の値の受け渡しについて教えてください。 A.phpファイルからB.phpファイルに2次元配列の値をフォームを通さずにPOSTで渡したいと考えています。 処理上、2次元配列のままB.phpファイルに値を渡したいと考えています。 そもそもPOSTで2次元配列を送ることはできるのでしょうか? その他の方法で2次元配列のままB.phpファイルに渡すことが出来るのであれば、その方法も教えて頂きたいのですが。 たとえば [A.php] $DATA = array( array('name'=>"tanaka", 'age'=>"20"), array('name'=>"sasaki", 'age'=>"30"), ); をB.phpファイルに送るにはどうすれば良いのでしょうか? ※2次元配列のサイズは可変です。 どなたか教えて頂けないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • VBで配列の初期化について

    VBやVBAで1次元・2次元配列を、プログラムの中の 値の(リテラル的)記述で初期化する方法はどうすれば良いのでしょうか。1次元配列にはx=Array()で代用してきましたが、さて、行と列がある表のような、値データを2次元配列にセットしようとして、ハテナと行き詰まりました。配列名(要素)=値を要素数だけ繰り返す方法以外に、例えば A[][]={(a、b、c)(d、e、f)(g,h,i)}のような、書き方は出来ないのでしょうか。 複数のArrayをArreyの()内に入れてみましたがも上手く行かないようですが。 有り無しについて教えていただけたらと思います。 市販の解説書数書には触れた記述は見つかりませんでした。

  • perl 配列の要素数について

    配列の要素数について質問させていただきます。 プログラムの中で、以下のようにファイルの内容を1行ずつ読み込み、配列に入れています。  open (IN, "ファイル名");  @data = <IN>;  close (IN); こういった形で配列に入れていった場合、入れられる最大行数(=最大要素数)はどれくらいになるのでしょうか。 現在100万行のテキストファイルは、問題なく読み込めているようでした。 ご存知の方がおられましたら、ご回答いただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 多次元配列(リファレンス)

    @dat=( [1,2,3], [4,5,6], [7,8,9]) という多次元の配列を作ったときに,$size=@datとすれば行列の行数が得られますが,列数を取得するためにはどうすればよいのでしょうか。 つまりこの場合$dat[0][0]に1が, $dat[0][1]に2が, そして$dat[0][2]には3が入っていますから,3という(列数の)値を取得したいのです。

    • ベストアンサー
    • Perl
  • 配列の問題

    配列の問題です。 n個の要素を持つ一次元配列の値(変数値)をまったく逆に入れ替えるプログラムを作りたいのですが、この場合どのようにして逆を表現すればよいのかわかりません。 (nの値は読み込み、配列は奇数個でも偶数個でも使えるプログラムでなければなりません) 参考書を見ながら作ってみたのですが…だめでした。 プログラム初心者です。アドバイスお願いします。 int main(void) { int i,n; int vc[n]; printf("n個の要素を持つ一次元配列をつくる\n"); printf("nの値を入力してください\n"); scanf("%d",&n); for (i=0;i<n+1;i++) vc[i]=i+1; for (i=0;i<5;i++) printf("vc[%d]=%d\n",i,vc[i]); printf("この配列を逆に入れ替えると\n); return 0; }

専門家に質問してみよう