曜日、時間を列挙体を使ってランダムに表示、その後曜日は日→月→・・・→土の順に、時間は0→12にバブルソートするプログラムを書きたいです。
試しに下のように書いてみたところ、列挙体までは上手く表示できるのですが、バブルソートでつまずきます。
[cord]
int main(void)
{
struct WEEK week[7];
int i, j, tmp, changeday, a = sizeof(week[7].day) / sizeof(week[0].day);
int n,m,temp, changetime, b = sizeof(week[12].time) / sizeof(week[0].time);
srand((unsigned int)time(NULL));
for (i = 0; i < 7; i++){
week.day = rand() % 7;
week.time = rand() % 12;
switch (week.day) {
case SUN:
printf("SUN");
break;
case MON:
printf("MON");
break;
case TUE:
printf("TUE");
break;
case WED:
printf("WED");
break;
case THU:
printf("THU");
break;
case FRI:
printf("FRI");
break;
case SAT:
printf("SAT");
break;
}
printf("%2d ", week.time);
}
printf("\n\n");
printf("曜日を、日月火水木金土の順に並べ替えます。\n");
//バブルソート
for (i = 0; i < a - 1; i++)
{
changeday = 0;
for (j = a-1; j > i; j--)
{
if (week[j - 1].day > week[j].day)
{
// 入れ替える
tmp = week[j - 1].day;
week[j - 1].day = week[j].day;
week[j].day = tmp;
changeday = 1;
}
}
if (changeday == 0) break;
printf("\n");
}
printf("入れ替えました。\n");
for (i = 0; i < a; i++)
printf("%d ", week.day);
printf("\n");
printf("\n次に時間を入れ替えます。\n");
for (j = b - 1; j > i; j--) {
if(week[j - 1].time > week[j].time) {
//入れ替え
temp = week[j].time;
week[j].time = week[j - 1].time;
week[j - 1].time = temp;
}
printf("\n");
}
printf("入れ替えました。\n");
for (i = 0; i < b; i++)
printf("%d\n", week.time);
return 0;
}
[/cord]
実行すると、
曜日を入れ替えました。
3
といったように、数字1つのみが表示されます。
上記のソースの変数名などは試しで書いているので、適当です、ごめんなさい。
何が違うのかがいまいちよくわかっていないので、どこが違って、どう直せば良いのか知りたいです。
プログラム初心者でつい最近始めたばかりなので、丁寧に教えていただけると非常にありがたいです。
よろしくお願いします。
列挙体およびバブルソートに関する質問
Re: 列挙体およびバブルソートに関する質問
まず、コードタグのスペルが違います。
JJJutoさんはcordと書いていますが、正しくはcodeです。
次に、必要なヘッダのインクルードや、構造体、定数の定義が無いのが間違っています。
再現可能な短いサンプルコードを提示していただくと、答えやすくなります。
最後に、配列の要素数の取得方法が違います。
配列の要素数は配列全体のサイズを配列の1要素のサイズで割ることで得られますが、
JJJutoさんのコード
さらに、配列weekは7要素しかないため、week[7]もweek[12]も範囲外です。
評価はされないため致命的にはならない可能性が高いですが、あまり気分は良くないです。
とするべきでしょう。
*weekの代わりにweek[0]としてもいいです。
JJJutoさんはcordと書いていますが、正しくはcodeです。
次に、必要なヘッダのインクルードや、構造体、定数の定義が無いのが間違っています。
再現可能な短いサンプルコードを提示していただくと、答えやすくなります。
最後に、配列の要素数の取得方法が違います。
配列の要素数は配列全体のサイズを配列の1要素のサイズで割ることで得られますが、
JJJutoさんのコード
では同じ構造体の要素のサイズ同士を割っているため、aもbも1になり、配列の要素数は得られません。
さらに、配列weekは7要素しかないため、week[7]もweek[12]も範囲外です。
評価はされないため致命的にはならない可能性が高いですが、あまり気分は良くないです。
int i, j, tmp, changeday, a = sizeof(week) / sizeof(*week);
int n,m,temp, changetime, b = sizeof(week) / sizeof(*week);
*weekの代わりにweek[0]としてもいいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 列挙体およびバブルソートに関する質問
返信ありがとうございます!
cordのスペルを間違っていたこと、ご指摘されて初めて気がつきました!すみません!お恥ずかしい・・・。
次、サイトを利用させていただく際は、サンプルコードを見直します。
また、ソースのお治しありがとうございます。無事、ソートができました。
ただ、ソース後、dayの方が数字で表示されます。できれば、SUN,MON・・・といったように文字で表示したいのですが、どうすれば良いでしょうか・・・?
cordのスペルを間違っていたこと、ご指摘されて初めて気がつきました!すみません!お恥ずかしい・・・。
次、サイトを利用させていただく際は、サンプルコードを見直します。
また、ソースのお治しありがとうございます。無事、ソートができました。
ただ、ソース後、dayの方が数字で表示されます。できれば、SUN,MON・・・といったように文字で表示したいのですが、どうすれば良いでしょうか・・・?
Re: 列挙体およびバブルソートに関する質問
ソート前の表示と同様に、値で分岐して対応する文字を表示すれば良いと思います。
同じ長い処理を複数回書くのはあまり良くないので、関数化するのも良いでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)