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

締切り済みの質問

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(" ");
}
}
}
}
}

よろしくお願いします。

投稿日時 - 2019-05-20 13:17:46

QNo.9618376

困ってます

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

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

回答(2)

ANo.2

> うるう年の&&の部分は!=にしているので大丈夫です。
試しに2000年がうるう年かどうか判定してみればわかります。

投稿日時 - 2019-05-21 10:32:35

お礼

コメントありがとうございます。&&の部分は変更しないので大丈夫です。
現在ここまで進んだのですがこの先がなかなか進めていません。教えていただけるとありがたいです。
こちらが現状です
#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++;
}
}
}
よろしくお願いします。

投稿日時 - 2019-05-21 11:03:18

ANo.1

>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)); //月を入力
このコメントの「入力」は「出力」のことですか?

投稿日時 - 2019-05-21 02:03:22

補足

コメントありがとうございます。自分なりにやってみてここまで出来たのですが、日数をうまく表示する方法を教えていただけないでしょうか?
#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;
}
}
うるう年の&&の部分は!=にしているので大丈夫です。

よろしくお願いします。

投稿日時 - 2019-05-21 09:15:01

あなたにオススメの質問