明日提出の学校の宿題で、
(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 のようにソートせよ、とのことで、
構造体を使えば実現出来るようなのですが、勉強不足で手がつけれません…
回答し辛い質問だとは思いますがどうぞよろしくお願いします…!
No.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さんのアドバイス(というかプログラムそのままですね…すみませ…;)
を全部繋げてみたら、なんとかソートまで実行できましたッ…!!
とっても判りやすい書き方で、読み直してみたらなんとか私にも
理解することが出来ました…
本当にありえないくらい勉強不足な私にこんなに付き合っていただいて、ありがとうございました…>д<;;
続きの最小二乗法に取り組んでいきたいと思います^^!
No.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は変にスペースとか入れないようにしましょう。
No.1
- 回答日時:
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Java Java配列の問題を教えてください。 乱数で20個出力し、最大、最小、合計、平均を求め、更に昇順にソ 3 2023/07/10 18:32
- ドライブ・ストレージ SSDを追加したら昔のHDDがおかしくなった 4 2023/03/23 13:25
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- ドライブ・ストレージ ハードディスクのデータ回復について 15 2022/08/22 14:55
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
なぜ?counterintuitive
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
あるディレクトリ内のファイル...
-
ファイル名「1.jpg ~10.jpg~...
-
C言語・要素除去
-
ブック.csvを開かずに他のブッ...
-
(VBA) Dir 関数で取得するファ...
-
EXCEL VBAのソートについて
-
VBScriptで重複レコードを削除...
-
コーディングの参考
-
mysqlで日本語の並び替え
-
listboxの並び替え
-
csvファイル内にてソートす...
-
LISTBOX 後から LBS_SORT を追加
-
多次元配列のソート方法
-
VB.NETでファイル名順にファイ...
-
vbでDataTableの抽出コピー
-
10個の整数を入力して小さい順...
-
リスト構造のソートで悩んでま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
ファイル名「1.jpg ~10.jpg~...
-
リスト構造のソートで悩んでま...
-
excel VBA の条件をつけての列...
-
C# DataGridView のヘッダーセ...
-
DataGridViewの複数列を連動し...
-
文字列をソートする方法
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
Excelですべての組合せ(重複組...
-
VBA基本構文の作り方 2列の...
-
列のどこをクリックしてもソー...
-
excel VBA リストビューの行...
-
あるディレクトリ内のファイル...
-
コレクションの数値をSortで並...
-
数字文字列のソート方法
-
VBScriptで重複レコードを削除...
-
2次元配列を複数項目でソートし...
-
10個の整数を入力して小さい順...
おすすめ情報