- 締切済み
C言語についての問題です。
この問題はできるのでしょうか?? 教えてください。 /*例題*/ 観測回数 3 X座標 X軸方向の流速 34.333 9.762 Y座標 Y軸方向の流速 448.111 -17.032 サイズ サイズの変化量 9.000 2.000 0.000 0.000 3 34.333 9.762 448.111 -17.032 9.000 2.000 0.000 0.000 3 20.615 5.329 688.385 -17.115 13.000 -1.000 0.000 0.000 3 1.200 0.200 1018.667 -17.333 15.000 1.000 0.000 0.000 3 0.375 0.042 1065.000 -17.500 8.000 2.000 0.000 0.000 3 53.750 17.114 22.333 -16.758 12.000 1.000 0.000 0.000 ・ ・ ・ ・ ・ 2 2014.273 -0.352 1233.727 17.727 11.000 3.000 0.000 0.000 2 2014.000 -0.625 1282.500 17.500 12.000 4.000 0.000 0.000 1 22.088 19.302 3.971 -20.493 34.000 6.000 0.000 0.000 1 19.636 16.812 122.909 -17.326 11.000 -6.000 0.000 0.000 のデータが6000個あります。 まず観測回数で昇順にソートして、その昇順に表示したものを x軸方向の流速 + y軸方向の流速 で昇順にソートして並べて表示する問題です。 x座標、y座標、サイズ、サイズの変化量は今ないものとします。 良ければプログラムおしえていただきたいのですが??
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
「丸投げなんですが・・・」のコメントぐらいは書くべきであると思いますが、お手上げのようですから作ってみました。 データは有効桁数が7桁ほどですので float を使うことにすると、必要配列サイズは「40 × 6000 = 240000」の240kバイトほどになります。まあ、さして大きな配列ではありませんので、ローカル変数として処理することにしました。 ここでのキーポイントは、測定回数毎にさらにソートしなければならないことです。幸い、Cには qsort() 関数が用意されていますので、それを使うことにしました。なお、流速の比較ですが、ここではスカラー量についての対比としてみました。 /* Using qsort() program by gcc on Mac OSX * file neme: sako.c * compile: gcc sako.c * execution: ./a.out <data_file> */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 6000 #define OFF 0 #define ON -1 struct view { short times; float x_pos; float x_val; float y_pos; float y_val; float siz; float siz_val; float dummy; float scal; }; /* プロトタイプ宣言 */ float scalar(float, float); int data_comp(const void *, const void *); int main(int argc, char *argv[]) { int judge, count, loop_flag, i; int buff_size[10]={0}; FILE *fp; struct view *ptr, temp, data[MAX]; if (argc != 2) perror("Argument"), exit(1); if ((fp = fopen(argv[--argc], "r")) == NULL) perror("fopen"), exit(1); /* ファイルの昇順読み込み */ judge = 1; count = 0; do { loop_flag = OFF; while(fscanf(fp, "%d", &temp.times) != EOF) { fscanf(fp, "%f %f", &temp.x_pos, &temp.x_val); fscanf(fp, "%f %f", &temp.y_pos, &temp.y_val); fscanf(fp, "%f %f", &temp.siz, &temp.siz_val); fscanf(fp, "%f %f", &temp.dummy, &temp.dummy); if (temp.times == judge) { temp.scal = scalar(temp.x_val, temp.y_val); data[count++] = temp; loop_flag = ON; } } buff_size[judge++] = count; rewind(fp); } while (loop_flag != OFF); /* 入力内容の出力 */ printf("File contents:\n"); for (i = 0; i < count; i++) { ptr = &data[i]; printf("\t%d: v(%8.3f,%8.3f)= %8.5f\n", ptr->times, ptr->x_pos, ptr->y_pos, ptr->scal); } /* 任意区間における昇順ソーティング */ for (i = 0; i < judge - 1; i++) qsort(&data[buff_size[i]], buff_size[i + 1] - buff_size[i], sizeof(struct view), data_comp); /* 結果の出力 */ printf("Result:\n"); for (i = 0; i < count; i++) { ptr = &data[i]; printf("\t%d: v(%8.3f,%8.3f)= %8.5f\n", ptr->times, ptr->x_pos, ptr->y_pos, ptr->scal); } return 0; } float scalar(float x, float y) { return sqrt((double)(x*x + y*y)); } int data_comp(const void *_a, const void *_b) { struct view *a = (struct view *)_a; struct view *b = (struct view *)_b; if (a->scal < b->scal) return -1; else if (a->scal > b->scal) return 1; else return 0; }
- SnowShower
- ベストアンサー率40% (140/348)
- titokani
- ベストアンサー率19% (341/1726)
考え方としては、 観測回数で昇順にソートしつつ、 観測回数が同じだったら、x軸方向の流速 + y軸方向の流速が(大きいor少ない)ほうを上にもってくる。 という感じになります。 ところで、 x軸方向の流速 + y軸方向の流速 これってベクトル演算になるんですよね?ただ足しただけではだめだと思いますので、要注意。
- hidebun
- ベストアンサー率50% (92/181)
>この問題はできるのでしょうか?? >教えてください。 できます。確実に。他の言語でもできるでしょう。 あなたが日本語で書いた処理をプログラムに直せば良いです。 ただ、あなたのプログラミングスキルがわからないので、 どこをどう教えればよいのか、わかりません。
お礼
ありがとうございます。 プログラミングに関しては初心者で6000個のデータを観測回数で昇順にソートすることはできました。 その昇順に表示したものを x軸方向の流速 + y軸方向の流速 で昇順にソートして並べて表示する問題のところが良くわかりません。