質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

4445閲覧

xy平面上の点と原点の距離を求めたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/19 23:54

編集2020/07/20 00:14

xy平面上の10個の点(0~9番とすると)のxy座標を入力すると、原点に最も近い点までの距離とその点の番号を出力するプログラムを作りたいです。
また、同条件で、互いに最も近い2点間の距離とその2点の番号を出力するプログラムを作りたいです。

配列を用いて作ってみたのですが上手くいきませんでした。
もしよろしければご協力よろしくお願いします。

コードは以下の通りで、if文の条件式から分からなくなりました。

#include <stdio.h> #include <math.h> #define N 10 int main(void) { int i, j; double x[N], y[N], d[N], min; for(i = 0; i < N; i++) { printf("x[%1d] = ? ", i); scanf("%lf", &x[i]); printf("y[%1d] = ? ", i); scanf("%lf", &y[i]); d[i] = sqrt(x[i] * x[i] + y[i] * y[i]); if (d[i]) } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/07/19 23:57

「上手くいかない」を説明しなさい。 コードを呈示しなさい。
y_waiwai

2020/07/19 23:59

その配列を用いて上手く行かなかったというコードを提示しましょう
退会済みユーザー

退会済みユーザー

2020/07/20 00:09

申し訳ありませんでした。 コードは以下の通りで、if文の条件式から分からなくなりました。 #include <stdio.h> #include <math.h> #define N 10 int main(void) { int i, j; double x[N], y[N], d[N], min; for(i = 0; i < N; i++) { printf("x[%1d] = ? ", i); scanf("%lf", &x[i]); printf("y[%1d] = ? ", i); scanf("%lf", &y[i]); d[i] = sqrt(x[i] * x[i] + y[i] * y[i]); if (d[i]) } return 0; }
episteme

2020/07/20 00:11

質問は編集できます。 そのコードは質問の中に。
退会済みユーザー

退会済みユーザー

2020/07/20 00:15

丸投げするような質問でした。 大変申し訳ありませんでした。
guest

回答4

0

配列は使わなくてもできます。

C

1#include <stdio.h> // printf, scanf 2#include <math.h> // hypot 3 4#define N 10 5 6int main(void) 7{ 8 int min_index = 0; 9 double x, y, min_value; 10 for (int i = 0; i < N; i++) { 11 printf("x[%d] = ? ", i), scanf("%lf", &x); 12 printf("y[%d] = ? ", i), scanf("%lf", &y); 13 double d = hypot(x, y); // 底辺 x、高さ y の直角三角形の斜辺 14 if (i == 0 || d < min_value) min_value = d, min_index = i; 15 } 16 printf("min-index=%d min-value=%lf\n", min_index, min_value); 17}

投稿2020/07/20 02:04

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/20 10:16

皆様回答ありがとうございました。 アドバイスを参考に解決出来ました。
guest

0

10個の点をいちいちキー入力していられないのでそこは改変。ご自分でscanfに書き替えてください。

原点からの距離は、今回の問題では各点ごとに保存する必要はありません。現在の点の距離dと、これまでの最小の距離min_dだけで十分です。

xyは、この後「任意の2点間の距離」を求める処理を書くかもしれないので保存しておきます。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define N 10 6#define P_MIN -10 7#define P_MAX 10 8 9int main(void) 10{ 11 double x[N], y[N]; 12 srand(time(NULL)); 13 14 double min_d = sqrt(P_MAX * P_MAX * 2); 15 int min_i = -1; 16 for (int i = 0; i < N; i++) { 17 x[i] = (double)rand() / RAND_MAX * (P_MAX - P_MIN) + P_MIN; 18 y[i] = (double)rand() / RAND_MAX * (P_MAX - P_MIN) + P_MIN; 19 double d = sqrt(x[i] * x[i] + y[i] * y[i]); 20 //printf("%d番目の点(%5.2lf, %5.2lf)の原点からの距離は%5.2lf\n", i, x[i], y[i], d); 21 if (d < min_d) { 22 min_d = d; 23 min_i = i; 24 } 25 } 26 27 printf("原点からの距離が最小なのは%d番目の点(%5.2lf, %.2lf)で、距離は%5.2lf\n", min_i, x[min_i], y[min_i], min_d); 28 29 return 0; 30}

投稿2020/07/20 01:27

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/20 10:16

皆様回答ありがとうございました。 アドバイスを参考に解決出来ました。
guest

0

int i, j; double x[N], y[N], d[N], min, tmp; for(i = 0; i < N; i++) { printf("x[%1d] = ? ", i); scanf("%lf", &x[i]); printf("y[%1d] = ? ", i); scanf("%lf", &y[i]); d[i] = sqrt(x[i] * x[i] + y[i] * y[i]);//ここsqrtは要らないかも //if (d[i]) このif分は不要。 } //この後でソートのプログラムを記入すれば良いと思います。 // 参考URL //https://qiita.com/omu58n/items/7e2a1055a42ef738ab8b

投稿2020/07/20 00:56

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/07/20 01:00

ソートするのは(間違いではないけれど)オーバースペックでしょうね。 一番小さいひとつを特定すればいいのだから。
stdio

2020/07/20 08:22

やってみると勉強になるので、やってみたらいいと思うので編集はしませんが、確かにそうですね。 気を付けるところは、minの初期値に大きな数字(推奨値:DBL_MAX(doubleの最大値))を設定しておかないとダメってところですかね...
episteme

2020/07/20 08:36

min の初期値は「x[0],y[0] から求めた距離」でもえぇですな。
stdio

2020/07/20 09:05

d[0]の値ですね。 確かに... ループ回数が一つ減るから、そっちでも良いですね。
退会済みユーザー

退会済みユーザー

2020/07/20 10:16

皆様回答ありがとうございました。 アドバイスを参考に解決出来ました。
guest

0

ベストアンサー

「入力された x[10] の中から最も小さい x[i]を見つけ、i と x[i] をプリントする」なら、できますか?

[追記] できてないみたいなので

C

1// 入力された x[10] の中から最も小さい要素のインデクスと値をプリントする 2#include <stdio.h> 3#include <math.h> 4 5#define N 10 6 7int main(void) { 8 int i; 9 double x[N] = { 9.9, 7.7, 5.7, 3.7, 1.1, 2.2, 4.4, 6.6, 8.8, 10.10 }; 10 11 // とりあえず、「0番目が一番小さい」ことにしておく 12 int min_index = 0; 13 double min_value = x[0]; 14 for ( i = 0; i < N; i++) { 15 // より小さい値を見つけたら記録更新 16 if ( min_value > x[i] ) { 17 min_index = i; 18 min_value = x[i]; 19 } 20 } 21 22 printf("min-index=%d min-value=%lf\n", min_index, min_value); 23 24 return 0; 25}

これが理解できるなら
「入力された x[i],yi の中から原点からの距離が最も小さい要素の
インデクスと値をプリントする」
まであと一歩。

投稿2020/07/20 00:16

編集2020/07/20 01:29
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/20 00:48

例えばminを10000など大きな数としたとき、以下のようにしたのですが出力結果が明らかに違ってしまいます。 if (min >= d[i]) { min = d[i]; printf ("最小距離 = %d", d[i]) }
episteme

2020/07/20 00:57

僕の問いに答えていません。 「入力された x[10] の中から最も小さい x[i]を見つけ、i と x[i] をプリントする」 ができれば、件の問題はその応用です。
退会済みユーザー

退会済みユーザー

2020/07/20 10:15

皆様回答ありがとうございました。 アドバイスを参考に解決出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問