dポイントプレゼントキャンペーン実施中!

明日提出の学校の宿題で、
(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 のようにソートせよ、とのことで、
構造体を使えば実現出来るようなのですが、勉強不足で手がつけれません…
回答し辛い質問だとは思いますがどうぞよろしくお願いします…!

A 回答 (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);

この回答への補足

ありがとうございましたっ!!!!
inthefloiさんのアドバイス(というかプログラムそのままですね…すみませ…;)
を全部繋げてみたら、なんとかソートまで実行できましたッ…!!
とっても判りやすい書き方で、読み直してみたらなんとか私にも
理解することが出来ました…
本当にありえないくらい勉強不足な私にこんなに付き合っていただいて、ありがとうございました…>д<;;
続きの最小二乗法に取り組んでいきたいと思います^^!

補足日時:2007/04/27 14:08
    • good
    • 0
この回答へのお礼

お礼させていただきます^▽^*ゝ

お礼日時:2007/04/27 16:12

色々大変そうですね(笑


最小二乗法以外の部分はおまけだろうから、あっさりできてもいいのかな・・・。

>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は変にスペースとか入れないようにしましょう。
    • good
    • 0

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;
}

本当に初歩的なことが判ってなくて申し訳ないです…
どうかアドバイスの方よろしくお願いします><;;!

補足日時:2007/04/27 06:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!