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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

2483閲覧

ポインタのソーティング

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/01/20 17:47

編集2018/01/23 02:11

複数の実数値を読み込んで降順に並べ替えて表示するプログラムの作成
条件
・選択ソートで行う
・読み込む値の数はマクロ定義
・入力データはdouble型配列で、配列の要素を並び替えて表示する
・添字演算子[]を用いずに配列の要素を降順にソートする関数
void 関数名(*配列名,int n){}
を作成して、これを用いる
・ポインタxとポインタyが指すオブジェクトの値を交換する関数
void 関数名(double *x,double *y){}
を作成して、これを上の関数内で用いること
というプログラムを組めと言われたのですが、なぜ添字演算子を使わないのか、なぜポインタでやるのか、なぜいくつもの関数に分けてソーティングするのか意味が分からないし、意味がわからないのでプログラムも組めません。
どなたか解説願います
当方、理解の努力は当然しますが、プログラミング初心者ですので平易な表現だとなお助かります。

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

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

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

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

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

ozwk

2018/01/22 00:17

まあ編集したところで元の質問文見れるんですけどね
Zuishin

2018/01/22 00:37

ここで質問したことを関係者に知られると都合が悪いんでしょう。
guest

回答5

0

ベストアンサー

こんにちは。

・選択ソートで行う
・読み込む値の数はマクロ定義
・入力データはdouble型配列で、配列の要素を並び替えて表示する

質問の主旨から以上の条件だけならプログラムを作れるということでよさそうですね。
残りの条件の意味を解説してみますので頑張ってください。

関数void 関数名(*配列名,int n){}を作成して、これを用いる

このような関数を用意しておけば、また別のdouble型配列をソートしたい時、この関数を呼び出せば良いですね。優秀なプログラマは汎用性の高い関数に分解する努力を惜しまないものです。
ただ、どのような関数に分解するべきかは、それなりに経験を積まないと判断は難しいです。
そこで、初心者でも可能なように難しい部分(汎用性の高い関数を切り出せ)は問題に含めず、最初から分解しているのだろうと思います。
ハードルを上げすぎると初心者には厳しいですから。

オブジェクトの値を交換する関数void 関数名(double *x,double *y){}を作成

主旨は恐らく上記と同じと思います。このような関数はswap()関数として実装されることが少なくありません。

添字演算子[]を用いずに/ポインタxとポインタyが指すオブジェクトの値を交換する関数

まずは、上記までの条件を満たしたプログラムを、ポインタを使わず、代わりに[]を使って書いてみましょう。次に[]を使わずポインタを使ってプログラムしてみましょう。適切に無駄のないコードであれば後者の方がスッキリ書ける筈です。
[]とポインタを把握している初心者なら十分にできると思いますし、これを頑張るとかなり力が付くと思います。出題者は力をつけて欲しいのだろうと感じます。

投稿2018/01/20 18:40

Chironian

総合スコア23272

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

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

0

とりあえず C# 関係ないようなのでタグを外してください。
「なぜか」ということですが、言った人に聞いてください。
ここでは推測しかできません。

ただ推測で物を言うなら、このプログラムは実用ではなくあなたの技術向上のための練習です。
添字を使わずポインタを使うのはポインタの扱いに慣れるため、いくつもの関数に分けるのはモジュール化に慣れるためです。

ですので、サンプルコードを求めるなどもってのほかです。
初心者なら初心者らしく横着せず苦労してください。

投稿2018/01/20 17:55

Zuishin

総合スコア28660

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

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

Zuishin

2018/01/20 17:59

筋肉を鍛えるためにバーベルを持ち上げろと言われたら「フォークリフトを使えば簡単なのに意味がわからない」とフォークリフトを持ってきますか? 九九を覚えろと言われたら「電卓を使えばいいのに意味がわからない」と言いますか? あなたに意味がわからなくても教える方には意味があることなんだと思います。 納得いかなければ直接話し合ってください。
guest

0

各条件の意味がわからないのでしょうか?それとも、そのような条件を指定した出題者の意図がわからないのでしょうか?例えば、

・選択ソートで行う

ということについては、

  • 【条件の意味】ソートアルゴリズムの一つである選択ソートを使ったコードにせよという意味です。小さい値を順番に探していき、最初の方から順番に交換していくだけというアルゴリズムが選択ソートです。詳しくはソートについて解説しているサイトや書籍を参考にしてください。
  • 【出題者の意図】選択ソートは非常に遅く実用性は皆無ですが、アルゴリズムが単純であるため、他のソートアルゴリズムと比べて実装することは容易です。アルゴリズム実装の中でも初心者向けと言えます。自分でアルゴリズムを実装することで、指定されたアルゴリズムに従ってコードを作成するという技術力を養うことが出題者の意図だと思われます。また、クィックソートなどのより複雑で高速なソートアルゴリズムを後から学ぶことで、その実装上の違いによってどれだけの差異が出るのか、アルゴリズムの選択の大切さを学ばさせることも考えていると思われます。

と回答内容が全く異なりますが、後者がわからなくても前者がわかっていればコードは書けるはずです。

もし、後者、出題者の意図がわからないから解かない、つまり、主題者の意図がわからない問題は解かないという信念を持っているのであれば、今後の学習が大変厳しいです。なぜなら、出題者は言語やソートに関する多くの知識や経験に基づいて最適だと思われる問題を考えているため、なぜそれが最適であるかと理解するには、出題者と同じレベルの知識や経験が必要になるからです。ソートの話であっても、数あるソートの中から選択ソートを選んだ理由を理解するには、主要なソートを全て理解し、それらの性質、実装の難易度等を知っている事はもちろんのこと、そこから導きだされる今後のソートに関する学習計画がわかっていないと難しいでしょう。なるべく簡易な説明をしようとしても、実際に実装したことがなければ、本当の理解はできないと思います。そう、あらゆる問題というのは出題者が自分で回答したことがあるものであり、その回答したときの経験に基づいて問題を出すべきか、修正等が必要で無いかを判断しています。

つまり、「問題にある出題者の意図」を理解できるのは、少なくとも「実際に問題を解いた人」でないと難しいと言うことです。ですが、「問題にある出題者の意図」を理解できないうちは問題が解かないというのであれば、その人は永遠に「実際に問題を解いた人」にはなれません。卵が先か鶏が先かと同じで、互いに依存し合っているため、先に進めないからです。

まずは、出題者の意図、つまり、なぜそのような条件になっているのか、そういうことは一切考えずに言われた条件通り問題を解いてください。ほとんどの場合、解いた時点で出題者の意図も見えてきます。解いたけど、やっぱり出題者の意図がわからないという事があれば、より具体性を持って疑問点を示すようにしてください。

投稿2018/01/21 00:13

raccy

総合スコア21735

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

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

0

なぜ添字演算子を使わないのか、なぜポインタでやるのか、なぜいくつもの関数に分けてソーティングするのか意味が分からないし、意味がわからないのでプログラムも組めません。

添え字使って関数ひとつでなら書けるなら、まずそれ見せてよ。

投稿2018/01/20 23:02

episteme

総合スコア16614

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

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

0

天才とは、凡人にはなかなか理解できないものです。
ここはぐっとこらえて、先輩にあなたの実力を見せつけて差し上げましょう。
例えば、Cの標準ライブラリのqsort(3)と同様のものを条件を守って選択ソートで実装するというのはどうでしょうか?

C

1void selection_sort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*))

投稿2018/01/20 22:40

hichon

総合スコア5737

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

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

Zuishin

2018/01/21 23:55

void 関数名(*配列名,int n){} を作成して、これを用いるという条件から外れると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問