teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

1回答

780閲覧

入力した数字を小さい順に並び変えるプログラミング

sora1111

総合スコア6

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2022/08/12 02:44

0

0

C言語のプログラミングで、
入力した数字を小さい順に並び変えるプログラミングを組んだのですが、
実行した結果
3 23 25 21 8 6 21 85 99 189
となり中途半端に小さい順になりません。
do のあとにflag=0とするとうまくいくのですが、
どうしてelseで入力するとうまくいかないのでしょうか

#include <stdio.h> #define N 10 /*要素の数*/ int main(void) { int a[N]={3,85,23,189,25,21,8,6,21,99}; int i,tmp, flag; do { for(i=0; i<N-1 ; i++) { if(a[i]>a[i+1]) { tmp=a[i];/*値の交換*/ a[i]=a[i+1]; a[i+1]=tmp; flag=1; } else { flag=0; } } }while(flag==1); for(i=0; i<N; i++) { printf("%d ",a[i]);/*結果出力*/ } printf("\n"); return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

よくわからないときはデバッグしましょう。想定と違うことがわかるはずです。
for文の最下行に以下を付与してもいいでしょう。

c

1printf("%d flag: %d\n", i, flag);

このソートプログラムのアルゴリズムは、本来

  • 配列の要素を先頭から順に次の要素と大小を比較、次の要素のほうが方が小さければ次の要素と値を入れ替えflagをたてる。
  • 配列をN-1までチェックし、flagが立っていれば(入れ替えが一度で発生していれば)再度配列の始めの要素からチェックする
  • (今回のチェックで入れ替え要素がないのに、入れ替えがあったことになってしまうため)再チェックす際は、前回立てたフラグをまず初期化する
    ではないでしょうか?
    flagに関して言えば、一度でも入れ替えがあればwhileの判定までflagを1のままにしておく です。

今の実装は

  • リスト「配列の要素を先頭から順に次の要素と大小を比較、次の要素のほうが方が小さければ次の要素と値を入れ替えflagをたてる。」
  • リスト「配列の要素を先頭から順に次の要素と大小を比較、次の要素と同じか次の要素の方が大きければflagをおろす(0にする)」
    これだと入れ替えが一度でも発生したか否かに関わらず、flagには配列の最後の比較n-2とn-1番目の比較の結果が反映されるだけです。
    その為、入れ替えが発生しているにも関わらずwhileループが終了してしまう場合が発生してしまいます。

想定通りでないときは、

  1. 本来のあるべき想定は何かを整理する。
  2. その想定が正しいことを確認する。
  3. その想定が問題なく実装されているかチェックしてみる
    といいと思います。

投稿2022/08/12 05:23

編集2022/08/12 05:46
Crimson_Tide

総合スコア509

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

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

sora1111

2022/08/16 07:51

初学者の自分にもわかるように詳しく教えていただきありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問