• 締切済み

C言語「3次元配列で1年間分のカレンダー作成」

C言語課題で3次元配列で与えられた年の1年間分のカレンダーを作成するという課題で日数の表示の方法が分かりません。回答などいただけると参考になりますので教えていただけるとありがたいです。 現在の状態です(この状態ではエラーは起きていません) #pragma warning(disable:4996) #include <stdio.h> #include <Windows.h> enum M_LIST { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, N_MONTH }; enum W_LIST { SUN, MON, TUE, WED, THU, FRI, SAT, N_WEEK }; char *weekday[] = { "SUN","MON","TUE","WED","THU","FRI","SAT"}; //曜日 int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 /*プロトタイプ宣言*/ int monthday(int year); void karenda(int total); /*メイン*/ void main(void) { int year; /*画面制御の初期化*/ COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); char cal[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる printf("西暦を入力"); scanf("%d", &year); //年度の入力 karenda(monthday(year)); } /*求める月の前月までの総日数*/ int monthday(int year) { int total = 0; /*求める年の前年までの総日数を求める*/ total = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1)%7; /*うるう年の判定*/ if ((year % 4) == 0 && (year % 100) != 0 && (year % 400) == 0) { mday[FEB] = 29; } else { mday[FEB] = 28; } return total; } /*カレンダー*/ void karenda(int total) { int month, row, day; for (month = JAN; month < N_MONTH; month++) { row = 0; day = 1; while (day <= mday[month]) { for (row = SUN; row < N_WEEK; row++) { if (day <= SAT) { day++; } } day++; } } } よろしくお願いします。 注)karenda(int total)にはprintfを使わず完成させたいです。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>COORD coord; >HANDLE hStdout; >hStdout = GetStdHandle(STD_OUTPUT_HANDLE); これって必要? >karenda(int total)にはprintfを使わず完成させたいです。 じゃあどこで何を出力するのですか? 1年間のカレンダーをなんかの方法で出力する必要はないんですか?

uzumechan
質問者

お礼

回答ありがとうございます。一応形は出来ました

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

質問No.9618376の続きですが、閏年の判定についてもmain()関数の返値型についても前の回答者のアドバイスは無視ですか。 >if ((year % 4) == 0 && (year % 100) != 0 && (year % 400) == 0) { year=2020のとき、&& で区切られた一つめの式は真、二つめの式も真、三つめの式は偽となって、来年が閏年ではないことになってしまいます。つまり、この書き方では閏年を正しく判定できません。 >char cal[N_MONTH][N_WEEK][N_WEEK] = { 0 };//3次元配列を宣言し0を入れる N_WEEKは1週間の日数を表すのだと思いますが、なぜそれがこの宣言に2回現れるのですか。 たとえば今月(2019年5月)だったら、cal[MAY][4][1]には何を代入したいのでしょうか。 >void karenda(int total) { 引数で渡されたtotalをこの関数内で全く使っていませんが、totalは何をするためにあるのですか。 また、配列calも全く使っていないですね。

uzumechan
質問者

お礼

回答ありがとうございます。一応形は完成しましたがまだ曜日がズレるところで止まっています