- ベストアンサー
C言語のソートプログラム
- C言語のソートプログラムの作成方法について質問です。
- 自分のパソコンにMicrosoft Visual C++ 2010 Expressをインストールして、任意の値nまでの配列を降順に並び替えるプログラムを作成しましたが、うまく動作しません。
- プログラム上では正しく書いているつもりですが、どこが間違っているのか分かりません。ご指摘いただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こういう「文法は正しいけど意味が違う」というのは、本職でもタマにやらかして、見つけるのに苦労するものです。 問題箇所は既に指摘があるので、見つけかたを。 そういうの間違いの探し方とてしては、次のようなものがあります。 ・デバッガを使って、動作を一つ一つ確かめる 例えば、for(i=0;i<n;i++);{ にブレークポイントを置いて、デバッグ実行します。すると、この行で実行が止まるので、変数の中身を調べたり、ステップ実行で1命令ずつ実行したりして、期待通りに動作しているかを調べます。 最初は操作などわからないと思いますが、覚えておくと便利です。 ・途中経過を出力する。 俗にprintfデバッグなどと呼ばれたりしますが、例えば次のようにprintfで途中経過を出力するようにします。 printf("forループ開始 i=0;j<%d\n",n); for(i=0;i<n;i++);{ printf("forループ開始 j=%d;j<%d\n",i+1,n); for(j=i+1;j<n;j++){ printf("実行中 i=%d,j=%d, a[i]=%d, a[j]=%d\n",i,j,a[i],a[j]); f(a[i]<a[j]){ printf("交換します i=%d,j=%d, a[i]=%d, a[j]=%d\n",i,j,a[i],a[j]); temp=a[i]; a[i]=a[j]; a[j]=temp; printf("交換しました i=%d,j=%d, a[i]=%d, a[j]=%d\n",i,j,a[i],a[j]); } } } これで、プログラムの流れが見えるようになります。 printfを通らないような状態だと動作を追えない、とか、プログラムに変更が必要だとか、欠点もあるのですが、デバッガを操作しなくてもいいという利点もあります
その他の回答 (2)
- corokorocoro
- ベストアンサー率29% (63/211)
>for(i=1;i<n;i++){ >if(max<a[i]){ >max=a[i]; >} >else if(min>a[i]){ >min=a[i]; >} >} これなんの意味がある? 完全に無駄な処理。 ソートが終了すればこんなことせずに最小値と最大値が出てくるだろ。 >for(i=0;i<n;i++);{ #1の人も書いているけどこれおかしいぞ。 それと今時バブルソートなんて書いてアホらしいよ。 クイックソートくらい使えよ。 そうすれば先に突っ込んでいる最大値と最小値を先に求めてそこからクイックソートで使う ピボットを求めるのには多少は使えるかもしれないけど
お礼
まだプログラミングは2か月ほどしかやっていないので 最近やっとバブルソートを習ったばかりです。 あとで自分で調べてみます。 回答ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
>for(i=0;i<n;i++);{ { の直前についているセミコロンは本当に必要ですか?
お礼
全く気づきませんっでした・・・ ご指摘ありがとうございました
お礼
なるほど。 途中の過程を分かるようにすればいいんですね。 回答ありがとうございました。