こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

プログラミング・C言語の配列(単純選択ソート)についてです

最近プログラミングを勉強し始めた初心者です。
今、配列について勉強していて
あるプログラムを作成しています。
それは10個の実数を入力して、入力された実数を降順に並び替えるものなのですが、
降順に並び替えることができません(泣
どこが違うのか教えていただきたいのですが・・・
よろしくお願いします。


#include <stdio.h>
#define NUMBER 10
int main(void)
{
int i, j, min, min_a, temp;
double zissu[NUMBER];

printf("%d個の実数を入力してください", NUMBER);
min=i;
printf("date[%d]:", i);
scanf("%lf", &zissu[i]);

for(j=i+1; j<NUMBER; j++) {
if(zissu[j] < zissu[min])
min_a =j;
}
temp = zissu[min];
zissu[min] = zissu[min_a];
zissu[min_a] = temp;
}

for(i = 0; i < NUMBER; i++)
printf("date[%d]=%lf \n", i, zissu[i]);
return (0);
}


【入出力例】
10個の実数を入力してください
data[0]:24.2
data[1]:2
・・・
data[9]:9
降順にソートしました
data[0] = 2
data[1] = 9
data[2] = 24.2
・・・

みたいにしたいのです。
よろしくお願いします

投稿日時 - 2009-11-07 16:47:06

QNo.5429037

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Wr5

>scanf(降順にソートしました)のことでしょうか?

ループの外にあるので、配列に値を入れられていません。
ということです。

>min=i;

未初期化の値を参照しています。

>printf("date[%d]:", i);

32ビット環境なら、ココで0が表示される確率は1/4294967296です。

>scanf("%lf", &zissu[i]);

高確率でバッファオーバーフローです。

iが100だったとします。
zissuの配列はdouble型が10個分しかありません。
100番目っていったいドコでしょうか?
iがちゃんと初期化されているのは、結果表示のforループの開始時になってからです。
# 今時のコンパイラなら、「未初期化のローカル変数の参照」とかの警告出ると思われますが…。

>具体的にどこい入れればいいのか教えていただきたいです。

大小判定する前…でしょう。

for(i=0;i<NUMBER;i++) {
 printf("date[%d]:", i);
 scanf("%lf", &zissu[i]);
}
といったところでしょうか…。
# scanf()が原因でおかしくなる可能性はありますけど。
# abcdとか文字列入力したり…

並び替えの処理も、
>for(j=i+1; j<NUMBER; j++) {
とやる場合のiがいくつになっているかは注意が必要です。
# そして、無視している警告の一つである未初期化のローカル変数の参照がこの後でも発生してます。

投稿日時 - 2009-11-07 23:45:20

ANo.1

 forループ内でscanf()を実行してません

投稿日時 - 2009-11-07 17:16:22

お礼

回答ありがとうございます。
scanf(降順にソートしました)のことでしょうか?
それを入れてコンパイルしようとしたのですが、エラーがでてどこに入れればいいのかわかりません。
お手数でなければ
具体的にどこい入れればいいのか教えていただきたいです。

それと
入力した実数が
降順通りに並び替えられません。(泣

投稿日時 - 2009-11-07 21:36:31

あなたにオススメの質問