回答 受付中

C言語で3次元配列を使い一年分のカレンダーを作成

  • すぐに回答を!
  • 質問No.9619017
  • 閲覧数41
  • ありがとう数2
  • 気になる数0
  • 回答数1

お礼率 80% (4/5)

カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。

現状です
#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

回答 (全1件)

  • 回答No.1

ベストアンサー率 45% (42/92)

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

お礼率 80% (4/5)

コメントありがとうございます。勉強にはVisual Studioを使っているのですが、その中でデバック機能は使っています
投稿日時 - 2019-05-24 09:00:29
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ