複数の実数値を読み込んで降順に並べ替えて表示するプログラムの作成
条件
・選択ソートで行う
・読み込む値の数はマクロ定義
・入力データはdouble型配列で、配列の要素を並び替えて表示する
・添字演算子[]を用いずに配列の要素を降順にソートする関数
void 関数名(*配列名,int n){}
を作成して、これを用いる
・ポインタxとポインタyが指すオブジェクトの値を交換する関数
void 関数名(double *x,double *y){}
を作成して、これを上の関数内で用いること
というプログラムを組めと言われたのですが、なぜ添字演算子を使わないのか、なぜポインタでやるのか、なぜいくつもの関数に分けてソーティングするのか意味が分からないし、意味がわからないのでプログラムも組めません。
どなたか解説願います
当方、理解の努力は当然しますが、プログラミング初心者ですので平易な表現だとなお助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/22 00:37
回答5件
0
ベストアンサー
こんにちは。
・選択ソートで行う
・読み込む値の数はマクロ定義
・入力データはdouble型配列で、配列の要素を並び替えて表示する
質問の主旨から以上の条件だけならプログラムを作れるということでよさそうですね。
残りの条件の意味を解説してみますので頑張ってください。
関数void 関数名(*配列名,int n){}を作成して、これを用いる
このような関数を用意しておけば、また別のdouble型配列をソートしたい時、この関数を呼び出せば良いですね。優秀なプログラマは汎用性の高い関数に分解する努力を惜しまないものです。
ただ、どのような関数に分解するべきかは、それなりに経験を積まないと判断は難しいです。
そこで、初心者でも可能なように難しい部分(汎用性の高い関数を切り出せ)は問題に含めず、最初から分解しているのだろうと思います。
ハードルを上げすぎると初心者には厳しいですから。
オブジェクトの値を交換する関数void 関数名(double *x,double *y){}を作成
主旨は恐らく上記と同じと思います。このような関数はswap()関数として実装されることが少なくありません。
添字演算子[]を用いずに/ポインタxとポインタyが指すオブジェクトの値を交換する関数
まずは、上記までの条件を満たしたプログラムを、ポインタを使わず、代わりに[]を使って書いてみましょう。次に[]を使わずポインタを使ってプログラムしてみましょう。適切に無駄のないコードであれば後者の方がスッキリ書ける筈です。
[]とポインタを把握している初心者なら十分にできると思いますし、これを頑張るとかなり力が付くと思います。出題者は力をつけて欲しいのだろうと感じます。
投稿2018/01/20 18:40
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
とりあえず C# 関係ないようなのでタグを外してください。
「なぜか」ということですが、言った人に聞いてください。
ここでは推測しかできません。
ただ推測で物を言うなら、このプログラムは実用ではなくあなたの技術向上のための練習です。
添字を使わずポインタを使うのはポインタの扱いに慣れるため、いくつもの関数に分けるのはモジュール化に慣れるためです。
ですので、サンプルコードを求めるなどもってのほかです。
初心者なら初心者らしく横着せず苦労してください。
投稿2018/01/20 17:55
総合スコア28660
0
各条件の意味がわからないのでしょうか?それとも、そのような条件を指定した出題者の意図がわからないのでしょうか?例えば、
・選択ソートで行う
ということについては、
- 【条件の意味】ソートアルゴリズムの一つである選択ソートを使ったコードにせよという意味です。小さい値を順番に探していき、最初の方から順番に交換していくだけというアルゴリズムが選択ソートです。詳しくはソートについて解説しているサイトや書籍を参考にしてください。
- 【出題者の意図】選択ソートは非常に遅く実用性は皆無ですが、アルゴリズムが単純であるため、他のソートアルゴリズムと比べて実装することは容易です。アルゴリズム実装の中でも初心者向けと言えます。自分でアルゴリズムを実装することで、指定されたアルゴリズムに従ってコードを作成するという技術力を養うことが出題者の意図だと思われます。また、クィックソートなどのより複雑で高速なソートアルゴリズムを後から学ぶことで、その実装上の違いによってどれだけの差異が出るのか、アルゴリズムの選択の大切さを学ばさせることも考えていると思われます。
と回答内容が全く異なりますが、後者がわからなくても前者がわかっていればコードは書けるはずです。
もし、後者、出題者の意図がわからないから解かない、つまり、主題者の意図がわからない問題は解かないという信念を持っているのであれば、今後の学習が大変厳しいです。なぜなら、出題者は言語やソートに関する多くの知識や経験に基づいて最適だと思われる問題を考えているため、なぜそれが最適であるかと理解するには、出題者と同じレベルの知識や経験が必要になるからです。ソートの話であっても、数あるソートの中から選択ソートを選んだ理由を理解するには、主要なソートを全て理解し、それらの性質、実装の難易度等を知っている事はもちろんのこと、そこから導きだされる今後のソートに関する学習計画がわかっていないと難しいでしょう。なるべく簡易な説明をしようとしても、実際に実装したことがなければ、本当の理解はできないと思います。そう、あらゆる問題というのは出題者が自分で回答したことがあるものであり、その回答したときの経験に基づいて問題を出すべきか、修正等が必要で無いかを判断しています。
つまり、「問題にある出題者の意図」を理解できるのは、少なくとも「実際に問題を解いた人」でないと難しいと言うことです。ですが、「問題にある出題者の意図」を理解できないうちは問題が解かないというのであれば、その人は永遠に「実際に問題を解いた人」にはなれません。卵が先か鶏が先かと同じで、互いに依存し合っているため、先に進めないからです。
まずは、出題者の意図、つまり、なぜそのような条件になっているのか、そういうことは一切考えずに言われた条件通り問題を解いてください。ほとんどの場合、解いた時点で出題者の意図も見えてきます。解いたけど、やっぱり出題者の意図がわからないという事があれば、より具体性を持って疑問点を示すようにしてください。
投稿2018/01/21 00:13
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア5737
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。