みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

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

投稿日時 - 2019-05-22 17:37:01

QNo.9619017

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

コードを読む労力やデバッグする気にはなれませんが、アドバイスだけ。
IDEなどのデバッグ機能を使っていますか?
このような計算や文字列操作のプログラムなら一発で原因が分かると思います。
ちょっとググって見てください。
趣味でもなんでも今後もプログラムを書かれるなら使った方が良いです。

投稿日時 - 2019-05-23 22:42:32

お礼

コメントありがとうございます。勉強にはVisual Studioを使っているのですが、その中でデバック機能は使っています

投稿日時 - 2019-05-24 09:00:29

あなたにオススメの質問

オススメのQ&Aはありません。