明日までの宿題で困っています【ファイルの読み込み】
- 明日までの宿題で困っています【ファイルの読み込み】
- 明日提出の学校の宿題で、(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のようにソートする方法がわかりません。
- ベストアンサー
明日までの宿題で困っています【ファイルの読み込み】
明日提出の学校の宿題で、 (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 のようにソートせよ、とのことで、 構造体を使えば実現出来るようなのですが、勉強不足で手がつけれません… 回答し辛い質問だとは思いますがどうぞよろしくお願いします…!
- maruhage
- お礼率33% (1/3)
- C・C++・C#
- 回答数3
- ありがとう数2
- みんなの回答 (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; } 本当に初歩的なことが判ってなくて申し訳ないです… どうかアドバイスの方よろしくお願いします><;;!
関連するQ&A
- 2元一次不定方程式の説明で意味がわかりません
自分の使っているテキストに 282x+113y=1 .......(1) (ax+by=n) これは右辺=1で0ではないから、すでに教えたように(1)をみたす(x.y)の値を一組見つければいい。 でもxとyの係数であるa,bの値が282と113とかなり大きな値なので、これを見つけるのが大変だ。 したがってこれがax+by=n型の方程式の応用問題ということになる。 この応用問題の特徴は (1) 右辺のn=1であり (2) 左辺のaとbは互いに素な整数である。 つまり ax+by=1の形であれば、係数a,bが(1)のようにかなり大きな値であっても解くことが出来る。 と書かれているのですが、 なぜ「つまり ax+by=1の形であれば、係数a,bが(1)のようにかなり大きな値であっても解くことが出来る」ということになるのかが読み取れません。 この中のどこに、この理由が書いてあるのでしょうか? 理解できる方がいましたらよろしくお願いします。
- ベストアンサー
- 数学・算数
- エクセルで1次近似式の傾きについて
1次近似で、y=ax+bの近似式を求める場合、 傾きaは、SLOPE(yのデータ,xのデータ) y切片bは、INTERCEPT(yのデータ,xのデータ) で求めています。 そこでグラフを描いて近似式を表示する際に、グラフオプションでy切片=0にするとSLOPEで求めた傾きと違う値になってしまい悩んでいます。 y切片=0にした場合のy=aXのaを出す関数があるのでしょうか?どなたか教えて下さい。宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- 連立方程式です。お願いします
A、Bの2人がXとYについての連立方程式 aX-3Y=12 5X-bY=8 をといたのですが、AはXの係数aの値を まちがえて8と書いたので、解はx=2, Y=4/3 となった。 Bは正しく解いて、解のうちYの値はY=-2であることがわかった。このとき、a,bのあたいをそれぞれ求めなさい。 回答よろしくおねがいします
- 締切済み
- 数学・算数
- 宿題が解けません。
高校の数学1で宿題が出ましたが全然分かりません。 教えてください。 問題(1) a>0 のとき, 関数 y=x²-8x+9(0≦x≦a)の最大値と最小値を求めよ。 問題(2) 2x+y=1, x≧0, y≧0 を満たすx,y について,次の問いに答えよ。 (1)xがとり得る値の範囲を求めよ。 (2)3x²+y²の最大値と最小値を求めよ。 問題(3) 放物線 y=x²+ax+bをx軸方向に1,y軸方向に-3だけ平行移動した放物線が 2点(3,0),(0,3)を通るとき,定数a,bの値を求めよ。 全部で4問です。 途中の式も書いていただけると助かります。 よろしくお願いします
- 締切済み
- 数学・算数
- 相関係数の計算
指数関数 y = B * e^ax 式(*) で近似できるデータがあります。 その近似がどのくらい正しいかを調べたいのですが 曲線の相関係数というのが分かりません。そのために 上式の対数を取って直線関係にしました。 相関係数をエクセルで計算できるからです。 ln(y) = ax + ln(B) この場合の相関係数は、式(*) の相関係数として使えるので しょうか? 適当な方法があるのだと思いますが ご存じの方がいらっしゃいましたら教えてください。
- 締切済み
- その他(学問・教育)
- 近似直線の傾きとSlope関数で求めた傾きについて
近似直線の傾きとSlope関数で求めた傾きについて Excelでxとyについてのプロットデータに近似直線を追加しグラフにしました。そのときグラフ上にy=aX+bのような近似式を表示することができます。 ことのきの近似式の傾きaと、同じプロット点を使いSlope関数で求めたときの傾きとは別物なのでしょうか。同じになると思っていたのですが、同じ値にならないもので・・・。
- 締切済み
- その他MS Office製品
お礼
お礼させていただきます^▽^*ゝ
補足
ありがとうございましたっ!!!! inthefloiさんのアドバイス(というかプログラムそのままですね…すみませ…;) を全部繋げてみたら、なんとかソートまで実行できましたッ…!! とっても判りやすい書き方で、読み直してみたらなんとか私にも 理解することが出来ました… 本当にありえないくらい勉強不足な私にこんなに付き合っていただいて、ありがとうございました…>д<;; 続きの最小二乗法に取り組んでいきたいと思います^^!