- ベストアンサー
明日までの宿題で困っています【ファイルの読み込み】
- 明日までの宿題で困っています【ファイルの読み込み】
- 明日提出の学校の宿題で、(x,y)の値が10組程入ったファイルを読み込んで、xのデータを見て昇順にソート(yの値も一緒に)したものを最小二乗法でデータを直線(y=ax+b)近似して係数a,bを算出せよ。という問題が出たのですが、ファイルの読み込みとソートの部分が理解できません。
- データは2.00,5.00 1.00,3.00のようにコンマで区切られており、これを1.00,3.00 2.00,5.00のようにソートする方法がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
構造体の使い方がわからないならqsortも使えないだろうな。 それもサンプルを書いておくので、残りは自分で頑張れ。 int vertex_compare(const void *v1, const void *v2) { double x1 = ((const vertex_t *)v1)->x; double x2 = ((const vertex_t *)v2)->x; if (x1 < x2) return -1; if (x1 > x2) return 1; return 0; } qsort(vertex, 10, sizeof(vertex_t), vertex_compare);
その他の回答 (2)
色々大変そうですね(笑 最小二乗法以外の部分はおまけだろうから、あっさりできてもいいのかな・・・。 >fp = fopen( "data.txt", "rb" ); /* テキストファイルをバイナリオープン */ 入力ファイルはテキストファイルでしょ? >for(i=0;i<10;i++){ >while(fscanf(fp,"%c",&c)!=EOF){/*ファイルの末尾まで*/ > vertex[i] = c; /*ここがエラー…*/ > printf("%c",c); } >} あまりにも不勉強ですな。例えばこんな感じ。 for(i=0;i<10;i++){ fscanf(fp,"%f,%f", &vertex[i].x, &vertex[i].y); /* %fでうまく値が拾えないときは、%lfにしてみてください */ /*printf("%f,%f", vertex[i].x, vertex[i].y);*/ } とりあえず読めればいいのだから、data.txtは変にスペースとか入れないようにしましょう。
C言語? 何がわからないのか、まるでわかりませんが… 1. 構造体を作る typedef struct { double x; double y; } vertex_t; 2. 10組ぶんの配列を作る vertex_t vertex[10]; 3. 配列vertexにファイルから10組の座標を読み込む fscanfを10回まわせば読めそうです 4. 配列vertexをメンバxをキーにしてソートする qsortを使うのが普通でしょう 5. 配列vertexからaとbを算出する まあ頑張ってください ※配列vertexを表示する関数を作って、3と4のあとに呼び出してやると安心して次に進めます。
補足
早い回答ありがとうございます! C言語です!記述忘れていました…すみません! 回答を読ませて頂いて、流れは「なるほど」と思えたのですが… やはり記述の仕方が全然思い浮かばない… まず、配列にファイルを読み込むと言うのはどのように記述すればよいのでしょうか…; 一応つぎはぎでここまでしてみたのですが… 配列への代入が全然違うみたいで… #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct{ double x; double y; }vertex_t; vertex_t vertex[10]; int main(void) { FILE *fp; char c; int i; fp = fopen( "data.txt", "rb" ); /* テキストファイルをバイナリオープン */ if( fp == NULL ) { puts( "data.txtが開けません" ); return 1; } for(i=0;i<10;i++){ while(fscanf(fp,"%c",&c)!=EOF){/*ファイルの末尾まで*/ vertex[i] = c; /*ここがエラー…*/ printf("%c",c); } } printf( "\n" ); fclose( fp ); return 0; } 本当に初歩的なことが判ってなくて申し訳ないです… どうかアドバイスの方よろしくお願いします><;;!
お礼
お礼させていただきます^▽^*ゝ
補足
ありがとうございましたっ!!!! inthefloiさんのアドバイス(というかプログラムそのままですね…すみませ…;) を全部繋げてみたら、なんとかソートまで実行できましたッ…!! とっても判りやすい書き方で、読み直してみたらなんとか私にも 理解することが出来ました… 本当にありえないくらい勉強不足な私にこんなに付き合っていただいて、ありがとうございました…>д<;; 続きの最小二乗法に取り組んでいきたいと思います^^!