dポイントプレゼントキャンペーン実施中!

最近プログラミングを勉強し始めた初心者です。
今、配列について勉強していて
あるプログラムを作成しています。
それは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
・・・

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

A 回答 (2件)

>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がいくつになっているかは注意が必要です。
# そして、無視している警告の一つである未初期化のローカル変数の参照がこの後でも発生してます。
    • good
    • 1

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

    • good
    • 0
この回答へのお礼

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

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

お礼日時:2009/11/07 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!