- 締切済み
C言語で3次元配列を使い一年分のカレンダーを作成
C言語課題で「三次元配列を定義して、与えられた年の1年間分のカレンダーを作成する」という課題があるのですが三次元配列を使い一年分のカレンダーがなかなか出来ません。 教えていただけるとありがたいです。 どうかよろしくお願いします!!!! 現状はこの状態です。 #pragma warning(disable:4996) #include <stdio.h> #define WEEK 6 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[] = { "日,月,火,水,木,金,土" }; //曜日 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; 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); /*うるう年の日数*/ if ((year % 4) == 0 && (year % 100) != 0 && (year % 400) == 0)mday[FEB] = 29; { } return total; } /*カレンダー*/ void karenda(int total) { int month, week, day; int box = total % 7; char cal[N_MONTH][WEEK][N_WEEK]; //3次元配列の宣言 for (month = 0; month < N_MONTH; month++) { printf("%d\n", (month + 1)); //月を入力 for (week = 0; week < WEEK; week++) { for (day = 0; day < N_WEEK; day++) { if (day < box){ printf(" "); } } } } } よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- m-take0220
- ベストアンサー率60% (477/782)
> うるう年の&&の部分は!=にしているので大丈夫です。 試しに2000年がうるう年かどうか判定してみればわかります。
- asuncion
- ベストアンサー率33% (2127/6289)
>char *weekday[] = { "日,月,火,水,木,金,土" }; //曜日 自分だったら、 char *weekday[] = { "日", "月", "火", "水", "木", "金", "土" }; とします。 >void main(void) { main()の型がvoidっていうのはたぶんまずいと思います。 自分だったら int main(void) { と書きます。 >printf("西暦を出力"); >scanf("%d", &year); //年度の出力 この2行の「出力」は「入力」が正しいですか? >/*うるう年の日数*/ >if ((year % 4) == 0 && (year % 100) != 0 && (year % 400) == 0)mday[FEB] = 29; { year % 400 の直前の&&は、||ではありませんか?だって、閏年の定義って、確か 西暦が4で割り切れれば閏年 ただし、100で割り切れれば平年 ただし、400で割り切れれば閏年 ですよね? >char cal[N_MONTH][WEEK][N_WEEK]; //3次元配列の宣言 これが3次元配列であることは見ればわかります。そういうコメントより、 N_MONTH WEEK N_WEEK の意味を書く方がよっぽど意味があるでしょう。 >printf("%d\n", (month + 1)); //月を入力 このコメントの「入力」は「出力」のことですか?
補足
コメントありがとうございます。自分なりにやってみてここまで出来たのですが、日数をうまく表示する方法を教えていただけないでしょうか? #pragma warning(disable:4996) #include <stdio.h> #define WEEK 6 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 }; 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; 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); /*うるう年の判定*/ 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, week, day; int box = total % 7; //1月1日の曜日 char cal[N_MONTH][WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる int cnt = 1; for (month = 0; month < N_MONTH; month++) { printf("%d\n", (month + 1)); //月を出力 printf(" 日 月 火 水 木 金 土\n"); for (week = 0; week < WEEK; week++) { for (day = 0; day < N_WEEK; day++) { if (week == 0 && box > 0) { printf(" "); box--; } else if(){ printf("%3d",); } } printf("\n"); } cnt; } } うるう年の&&の部分は!=にしているので大丈夫です。 よろしくお願いします。
お礼
コメントありがとうございます。&&の部分は変更しないので大丈夫です。 現在ここまで進んだのですがこの先がなかなか進めていません。教えていただけるとありがたいです。 こちらが現状です #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[] = { "日,月,火,水,木,金,土" }; //曜日 int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 /*プロトタイプ宣言*/ int monthday(int year); void karenda(); /*メイン*/ 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 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++) { } day++; } } } よろしくお願いします。