学校でプログラミングの課題が出たので自分のパソコンに
Microsoft Visual C++ 2010 Express
をインストールして作ってみました。
それが以下のプログラムです。
これは任意の値nを入力してa[n]までの配列をつくり
それを降順に並び替えるものです。
#include <stdio.h>
#define N 10000
int main(){
int a[N],i,j,max,min,n,temp;
n=0;
printf("n=");
scanf("%d",&n);
if(N<n){
return 0;
}
else if(n<=0){
return 0;
}
else if(n<=N){
for(i=0;i<n;i++){
printf("a[%d]",i);
scanf("%d",&a[i]);
}
max=min=a[0];
for(i=1;i<n;i++){
if(max<a[i]){
max=a[i];
}
else if(min>a[i]){
min=a[i];
}
}
printf("a[i]のソート結果\n");
for(i=0;i<n;i++);{
for(j=i+1;j<n;j++){
if(a[i]<a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n;i++){
printf("a[%2d]=%d\n",i,a[i]);
}
printf("Max=%d\n",max);
printf("Min=%d\n",min);
}
}
これを実行すると
最初に入力した配列の順番のまま表示されてしまいます。
例えば
n=4
a[0]7
a[1]4
a[2]6
a[3]1
a[i]のソート結果
a[0]7
a[1]4
a[2]6
a[3]1
のようにです。
しかしプログラミング上では
for(i=0;i<n;i++);{
for(j=i+1;j<n;j++){
if(a[i]<a[j]
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
のようにiとjを比較して
a[0]がa[1]より大きければa[0]とa[1]を交換する。
あとはa[0]とa[2], a[0]とa[3]...a[3]とa[4]まで
for文の続く限り繰り返すように書いたはずです。
まだ勉強し始めた私にはどこが間違っているのか分からないので
分かる方はご指摘をお願いします。
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を通らないような状態だと動作を追えない、とか、プログラムに変更が必要だとか、欠点もあるのですが、デバッガを操作しなくてもいいという利点もあります
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の人も書いているけどこれおかしいぞ。
それと今時バブルソートなんて書いてアホらしいよ。
クイックソートくらい使えよ。
そうすれば先に突っ込んでいる最大値と最小値を先に求めてそこからクイックソートで使う
ピボットを求めるのには多少は使えるかもしれないけど
まだプログラミングは2か月ほどしかやっていないので
最近やっとバブルソートを習ったばかりです。
あとで自分で調べてみます。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
【C言語教えてください】sin波...
-
scanfに文字が入力されたときに...
-
ガウスの消去法、後退代入について
-
C言語プログラミング
-
defineで定数が置き換えられな...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
分数を表示するプログラム(長...
-
switch分のケースを範囲数?に...
-
カレンダーのプログラムについて
-
C言語初心者です。次の問題で質...
-
C言語です
-
じゃんけんゲームの応用
-
BMI値から体型を判定するプログ...
-
(C言語)めちゃくちゃな値にな...
-
なぜgccはstdio.hをインクルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報