• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のソートプログラム)

C言語のソートプログラム

このQ&Aのポイント
  • C言語のソートプログラムの作成方法について質問です。
  • 自分のパソコンにMicrosoft Visual C++ 2010 Expressをインストールして、任意の値nまでの配列を降順に並び替えるプログラムを作成しましたが、うまく動作しません。
  • プログラム上では正しく書いているつもりですが、どこが間違っているのか分かりません。ご指摘いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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を通らないような状態だと動作を追えない、とか、プログラムに変更が必要だとか、欠点もあるのですが、デバッガを操作しなくてもいいという利点もあります

N-kami
質問者

お礼

なるほど。 途中の過程を分かるようにすればいいんですね。 回答ありがとうございました。

その他の回答 (2)

回答No.2

>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の人も書いているけどこれおかしいぞ。 それと今時バブルソートなんて書いてアホらしいよ。 クイックソートくらい使えよ。 そうすれば先に突っ込んでいる最大値と最小値を先に求めてそこからクイックソートで使う ピボットを求めるのには多少は使えるかもしれないけど

N-kami
質問者

お礼

まだプログラミングは2か月ほどしかやっていないので 最近やっとバブルソートを習ったばかりです。 あとで自分で調べてみます。 回答ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>for(i=0;i<n;i++);{ { の直前についているセミコロンは本当に必要ですか?

N-kami
質問者

お礼

全く気づきませんっでした・・・ ご指摘ありがとうございました

関連するQ&A