列挙体およびバブルソートに関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

列挙体およびバブルソートに関する質問

#1

投稿記事 by JJJuto » 3年前

曜日、時間を列挙体を使ってランダムに表示、その後曜日は日→月→・・・→土の順に、時間は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つのみが表示されます。

上記のソースの変数名などは試しで書いているので、適当です、ごめんなさい。

何が違うのかがいまいちよくわかっていないので、どこが違って、どう直せば良いのか知りたいです。

プログラム初心者でつい最近始めたばかりなので、丁寧に教えていただけると非常にありがたいです。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 列挙体およびバブルソートに関する質問

#2

投稿記事 by みけCAT » 3年前

まず、コードタグのスペルが違います。
JJJutoさんはcordと書いていますが、正しくはcodeです。

次に、必要なヘッダのインクルードや、構造体、定数の定義が無いのが間違っています。
再現可能な短いサンプルコードを提示していただくと、答えやすくなります。

最後に、配列の要素数の取得方法が違います。
配列の要素数は配列全体のサイズを配列の1要素のサイズで割ることで得られますが、
JJJutoさんのコード
JJJuto さんが書きました:
3年前

コード:

	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);
では同じ構造体の要素のサイズ同士を割っているため、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で殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re: 列挙体およびバブルソートに関する質問

#3

投稿記事 by JJJuto » 3年前

返信ありがとうございます!
cordのスペルを間違っていたこと、ご指摘されて初めて気がつきました!すみません!お恥ずかしい・・・。

次、サイトを利用させていただく際は、サンプルコードを見直します。

また、ソースのお治しありがとうございます。無事、ソートができました。

ただ、ソース後、dayの方が数字で表示されます。できれば、SUN,MON・・・といったように文字で表示したいのですが、どうすれば良いでしょうか・・・?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 列挙体およびバブルソートに関する質問

#4

投稿記事 by みけCAT » 3年前

JJJuto さんが書きました:
3年前
ただ、ソース後、dayの方が数字で表示されます。できれば、SUN,MON・・・といったように文字で表示したいのですが、どうすれば良いでしょうか・・・?
ソート前の表示と同様に、値で分岐して対応する文字を表示すれば良いと思います。
同じ長い処理を複数回書くのはあまり良くないので、関数化するのも良いでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re: 列挙体およびバブルソートに関する質問

#5

投稿記事 by JJJuto » 3年前

できました、ありがとうございました!

返信

“C言語何でも質問掲示板” へ戻る