みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

C言語のプログラミングについて質問です。

以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。
仕様は以下に記載します。
入力:__、__、__、__、__EnterKeyで結果を表示。
以下のバブルソートの文のどこをいじれば良いでしょうか?
返答宜しくお願いします。
#include <stdio.h>

int main (void)
{
char data[256];
int val[100];
int i = 0;
int work;
int j;
int k;

printf("入力 = ");
scanf("%s",data);
for(i=0;i<100;i++){
val[i] = 0;
}
k=0;
for(i = 0;i<100 ; i++){
if(data[i] == 0x00){//data[i]がNULLだったら処理を抜ける
k++;
break;//enterキーでprintf出力
}
else if(data[i] == ','){//カンマだったら

/*printf("%d\n",k);*/
k++;
}
else{
if(data[i] >= 'A' && data[i] <= 'Z'){//data[i]にAからZが入ったら
val[k] = val[k] *16 + data[i] -'A'+10;
}
else if(data[i] >= '0' && data[i] <= '9'){//data[i]に0から9が入ったら
val[k] = val[k] *16 + data[i] -'0';
}
}
}
/*printf("k=%d\n",k);
for(i=0;i<k;i++){

printf("出力 = %d\n",val[i]);
}
*/
//バブルソート//
    for(i=0; i<k-1; i++)
{
if(val[i] < val[i+1])
{
}
else{
work = val[i];
val[i] = val[i+1];
val[i+1] = work;
}
}
for(i=0;i<k;i++)
{

printf("出力 = %d\n",val[i]);
}

}

投稿日時 - 2011-05-31 17:19:57

QNo.6777009

すぐに回答ほしいです

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

バブルソートは、for文を2重にする必要がありますね。
具体的には、//バブルソート//以下のfor文を、

for(j=0;j<k-1;j++)
{
for(i=0; i<k-1-j; i++)
{
~中略~
}
}

とすれば良いでしょう。
1重のループだと、例えばA,C,3,4などのように、最初に大きな数が来た場合、
i=0でAとCを比較した後、i=1のループでAが先頭に取り残されてしまいます。
プログラムの先頭の方に、使っていないjが定義されていますので、
2重ループを考えていたのでは?と思いました。

後、dataをvalに変換する際、val[k] *16は不要です。
valは0で初期化してありますので。

更に付け加えると、数値に変換する際の-'0'や-'A'は使わない方が無難です。
これは文字コードが0123~、ABCD~と並んでいる事が前提なので、
もしaAbBcC~と並んでいる場合は正しく動きません。
(見たことはありませんけどね)

投稿日時 - 2011-05-31 19:54:47

補足

素早い回答誠にありがとうございます。
基本的には今の文でバブルソートを行ってる処理部分を修正したいと思っています。
二つ目の値までは小さい順になるのですが、それ以降の16進数を入力するとおかしくなってしまいます。
変数:jは消すのを忘れてましたので関係ありませんでした。
誠に申し訳ありません。

投稿日時 - 2011-05-31 20:16:00

お礼

すみません。
確認したらできました。本当にありがとうございました。

投稿日時 - 2011-05-31 20:26:20

ANo.1

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

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

回答(1)

あなたにオススメの質問