• 締切済み

5×5マスにランダムに配置された数字をfopenで読み込み、行列と順にソートするには

9 20 1 19 5 21 4 8 18 10 23 2 16 3 11 7 22 13 6 12 24 25 14 17 15 というのをテキストファイルから読み込み、これをまず行でソートし、次に列でソートして、左上に小さい数が右下に大きい数がくるようにするにはどのように書いたらいいのでしょうか?ご教授お願いいたします

みんなの回答

回答No.3

ソートにこだわってるってことはファイルの読み込みはできてるんですよね。 あと、ソート自体も平気ですよね。 でソート自体は1行のデータを保存した状態にするのですか? 斜めもソートするのですか? 前者なら2次元配列で、それぞれの要素でソートすれば良いのでは? このとき行はmemcpyで1行まるごとコピーすればどうですか? このとき2次元配列に入れ間違えると縦、横がテレコになるのでご注意を。 後者なら全てのデータで小さい順に並べれば良いのだから、1次元配列で25個のデータをソートして、 出力で5×5で並べ直すだけだと思います。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

われわれ回答者はあなたの置かれている状況をまったく知りません C/C++の機能の何を使っていいのか、何は使ってはいけないのかなど Cランタイムに用意されているソートを使っても良いのか、ソートルーチンも自作しろなのか また、ソートの手法に限定はあるのか ご自分で何処までコードが書けるのかを提示しましょう また期待する結果も投稿したほうがいいでしょう それによりプログラムの構造自体を変更しないといけない場合があります 行内ソート      1 5 9 19 20    4 8 10 18 21   2 3 11 16 23   6 7 12 13 22  14 15 17 24 25 列内ソート   1 3 9 13 20   2 5 10 16 21   4 7 11 18 22   6 8 12 19 23  14 15 17 24 25 といった結果なのでしょうか それとも1行目が1から5、2行目が6から10、といった具合に左上から右下に向かって昇順にソートするのでしょうか 最初から全てを作る事を考えずに1行のソートについて考えた見ましょう 5x5程度なら構造が単純な『交換ソート』を実装すればいいかと思います 1行のソートが出来れば 5x5配列から1列をを抜き出してソートするのはさほど困難ではないと思います 1) ソートさせるデータを1時的な配列にコピーしてソートを実行 2) 結果を見ながら元の配列を書き換える これでソート機能は完成ですから 入力部分、出力部分を作成すれば無事全体が完成します 入力に関しては fopen、fgets、fgetc、fscanf、fcloseなどだろうと思います

回答No.1

言語と数字の区切り方、改行コードはどうなっているのですか? ソートといわれるのは、最終的に5×5のままでソート??

taiga728
質問者

補足

ちょっと環境を書くのを忘れていたのですが、 環境はC言語でUNIXです。 数字はブランクで\nで改行かと思います。 ソートは最終的にできれば 1 2 3 4 5 6 7 ... という形にしたいのですが、できないのでしょうか?