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

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

ただいまの
回答率

91.02%

  • C

    3075questions

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

  • C++

    2931questions

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

ポインタのソーティング

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 386
退会済みユーザー

退会済みユーザー

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2018/01/22 09:17

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

    キャンセル

  • Zuishin

    2018/01/22 09:37

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

    キャンセル

  • 退会済みユーザー

    2018/01/22 12:38

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

回答 5

checkベストアンサー

+6

こんにちは。

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

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+6

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/21 02:59

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

    キャンセル

+4

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

・選択ソートで行う

ということについては、

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 08:55

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

    キャンセル

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3075questions

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

  • C++

    2931questions

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