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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1151閲覧

解決済みの質問なので大丈夫です

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/11 05:54

編集2020/10/11 08:07

ポインタの使い方やループについての質問をしましたが、予期せぬ指摘を受けたのでコードを削除させていただきました。

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

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

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

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

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

mjk

2020/10/11 08:00

引用元の問題があるならサイトへのリンクを明記すべきです。 問題を提供しているサイトや問題を作った方への敬意が欠けていると思います。 問題がオンラインのものであれば解説や模範解答や提出済みのコードがあるはずです。 それらを見たのか見ていないのかや見ても解決出来ないのかどうかも質問内容に書けるはずです。
退会済みユーザー

退会済みユーザー

2020/10/11 08:03

サイトの問題ではないです模範解答も解説もないです。 指摘する前にそれ以外の可能性も考えるべきではないのしょうか。
mjk

2020/10/11 08:09

>>問題がオンラインのものであれば そういうことを言うかもしれないと思い但し書きもしています。 オンラインでなければ学校の宿題なのか著作物なら著者や著書名を明記すべきです。 どちらにしても問題の出自を伏せてることは明白なので印象が悪いことに変わりはありません。 社会人の方でしたらそれくらい常識だと思います。 学生の方だとしてもそれくらい常識だということに注意したほうが良いと思います。
退会済みユーザー

退会済みユーザー

2020/10/11 08:14

友人から出された問題ですと明記する必要が感じられませんでしたので明記しませんでした。但し書きをしたとしても~すべきです。敬意が欠けていると思います。などこちらからも印象がとても悪いので返信したまでです。常識だの語られる筋合いはありません。どうぞこれからもいろんな可能性を考慮して指摘し続けてください。
guest

回答3

0

ベストアンサー

すでに指摘されている部分はいいとして
(私だったら、for( int s=i+1; s<n; s++)としそうですが、大した違いじゃないですね)

*k = fabs(t[0] - t[1]); に対応して
*a=0;
*b=1;
を設定しておかないと、最初の2つの要素の間が最小距離だったときに正しい答えが得られないことがあります。

また、mainも、悪いとは言いませんがポインタを変数に取らなくても

C

1int main(void) { 2 int n; 3 scanf("%d",&n); 4 double a[n]; 5 for (int i = 0; i < n; i++) { 6 scanf("%lf", &a[i]); 7 }//ここまで配列の作成と入力 8 int p1, p2;//最初距離のペアの配列番号を記憶する変数 9 double min;//最小距離 10 cal(&p1,&p2,&min, a, n); 11 printf("最も近いペア:(a[%d],a[%d]), 距離:%f\n", p1, p2, min); 12 return 0; 13}

で十分に思います。

さらに余計なことを言えば、fabs()が不安なら、二乗した値で比較する、という手もあります。

C

1 double tmp=t[i]-t[s]; 2 if (tmp*tmp < (*k)*(*k)) { 3 *k = tmp<0?-tmp:tmp; //最小距離の記憶

とかなんとか。

投稿2020/10/11 07:15

thkana

総合スコア7659

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

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

退会済みユーザー

退会済みユーザー

2020/10/11 07:41

最初に最小距離だけでなく、*a=0;*b=1;も書き加える必要があるというのは完全に頭に無かったです。稚拙なコードですがアドバイス頂けてとても嬉しいです。
退会済みユーザー

退会済みユーザー

2020/10/11 07:59

すみません。メインでポインタを使わなかった場合、返り値として最小値など受け取る必要がありますよね。ポインタ無しで済む方法が思い浮かびません。
guest

0

C

1 count++; 2 s = count;

の位置が間違っていると思います。

C

1void cal(int* a, int* b, double* k, double *t, int n){ 2 int s = 1, count = 1; 3 *k = fabs(t[0] - t[1]); 4 for (int i=0; i < n - 1; i++) { 5 for (s; s < n; s++) { 6 if (fabs(t[i] - t[s]) < (*k)) { 7 *k = fabs(t[i] - t[s]); //最小距離の記憶 8 *a = i; 9 *b = s; 10 } 11 } 12 count++; 13 s = count; 14 } 15}

投稿2020/10/11 06:32

Gak

総合スコア83

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

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

thkana

2020/10/11 06:46

> count > の位置が間違っていると思います。 それを指摘するなら、 int count=1; for(int i=0;i<n-1;i++){ count++; } と使われるcountの値ってほぼi+1と同じだっていうことの方が先じゃないかしら。(つまりcount変数の存在意義って...?)
Gak

2020/10/11 06:50

`s = i + 1;`にすればよい。というのは前の方の回答にあったので、 あくまで提示されたプログラムの間違いを回答しました。
thkana

2020/10/11 07:04

「前の方の回答」でいうなら「それは無意味だ」と言われているわけで、敢えてその「無意味」を活かすのもどうでしょう...まぁ、そういう考え方での回答なら「そうですか」としか言いようがないですけれど。
Gak

2020/10/11 07:24

考え方の違いですね。 `s = i + 1;`はプログラムの間違いの指摘ではなく、冗長な処理の指摘であり改善案の提示と考えたので、そもそも間違っていた点は指摘した方が良いと思いました。「そうですか」と流してください。
退会済みユーザー

退会済みユーザー

2020/10/11 07:39

お二方本当にありがとうございます。わざわざcountを使うのではなくiを使えばいいですよね、、自分のプログラムに合わせてアドバイス頂けてとても嬉しいです。
guest

0

関数 cal()内の

C

1 count++; 2 s = count;

は何をしたいのでょうか?
多分、ここが間違いで、

C

1 for (int i=0; i < n - 1; i++) {

の次に

C

1 s = i + 1;

としたら、どうでしょう?

また、最初から、数値を入れてますが、毎回入力するのは大変なので、テストの時は、

C

1 int n = 5; 2 double a[] = {-4, 4.5, -1.1, 4.2, 10.4};

として、初期値とした方が、楽と思います。

投稿2020/10/11 06:11

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問