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
お礼
とても分りやすく教えて頂き、有難うございます。 また、google UKにて語法を検索する手段も、大変参考になりました。 いつも悩むのは、和→英にするときに、どの様な語が一番適当なのかという事なのですが、今回のように辞書に載っている表現を自分で判断して展開しても良いのかまったく自信がないので、この様な勉強の手段を教えて頂いた事が大変有り難い事です。有難うございました。とても為になりました。