C言語で3次元配列を使い一年分のカレンダーを作成
カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。
現状です
#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 };
int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数
char *weekday[] = { "日","月","火","水","木","金","土" }; //各曜日
/*プロトタイプ宣言*/
int monthday(int year);
void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]);
void karenda(char box[N_MONTH][N_WEEK][N_WEEK]);
/*メイン*/
void main(void) {
int year, total;
char box[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる
/*画面制御の初期化*/
COORD coord;
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
printf("西暦を入力");
scanf("%d", &year); //年度の入力
total = monthday(year);
Array(total, box);
karenda(box);
}
/*求める月の前月までの総日数*/
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 % 7;
}
/*カレンダーの配列*/
void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]) {
int month, row, col, day;
col = total;
for (month = JAN; month < N_MONTH; month++) {
row = 1;
day = 1;
while (day <= mday[month]) {
box[month][row][col] = day;
if (col > SAT) { //土曜までいったら次の週
row++;
col = SUN;
}
day++;
col++;
}
}
}
/*カレンダーの出力*/
void karenda(char box[N_MONTH][N_WEEK][N_WEEK]) {
int month, week, day;
for (month = JAN; month < N_MONTH; month++) { //月の出力
printf("%3d\n", month + 1);
for (week = SUN; week < N_WEEK; week++) {
for (day = SUN; day < N_WEEK; day++) {
if (week == 0) { //曜日の出力
printf("%s", weekday[day]);
}
if (box[month][week][day] == 0) { //0なら空白
printf(" ");
}
else {
printf("%3d", box[month][week][day]);
}
}
printf("\n");
}
printf("\n");
}
}
今はこのような形で表示されます(空白は_で表しています)
日____月____火____水____木____金____土
________1___2___3___4___5
6___7___8___9__10__11__12
13_14__15__16__17__18__19
20_21__22__23__24__25__26
27_28__29__30__31
お礼
日付ごとの表示がばっちりいけました。 ナイスです。