締切済み

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

  • 困ってます
  • 質問No.9618376
  • 閲覧数81
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 80% (4/5)

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

よろしくお願いします。

回答 (全2件)

  • 回答No.2

ベストアンサー率 62% (409/657)

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

お礼率 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 };

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
  • 回答No.1

ベストアンサー率 31% (1600/5051)

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

お礼率 80% (4/5)

コメントありがとうございます。自分なりにやってみてここまで出来たのですが、日数をうまく表示する方法を教えていただけないでしょうか?
#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
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

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

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

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

ピックアップ

ページ先頭へ