C言語関係掲示板

過去ログ

No.505.任意の年のカレンダーの表示

[戻る] [ホームページ]
No.3856

カレンダーの表示方法
投稿者---Wizard of Oz(2002/12/13 22:42:32)


任意の年をキーボードから入力し、その年のカレンダーを表示する方法が分かりません。どうか教えてください。

実行例は

カレンダーを表示する年を入力してください。2002
(以下2002年のカレンダーの表示)

となります。

No.3860

Re:カレンダーの表示方法
投稿者---eripong(2002/12/14 01:01:08)


http://fumiyuki-web.hp.infoseek.co.jp/tech/tech012/
でどうでしょう?

No.3867

Re:カレンダーの表示方法
投稿者---Wizard of Oz(2002/12/14 12:23:59)


お答えいただきありがとうございます。
今度試してみます。

No.3868

Re:カレンダーの表示方法
投稿者---かずま(2002/12/14 13:29:39)


#include <stdio.h>

void cal(int y)
{
    int  m, d, w, i, z;  char x[12][6][7] = { 0 };

    w = (y + (y-1)/4 - (y-1)/100 + (y-1)/400) % 7;
    for (m = 1; m <= 12; m++) {
        z = (m==2) ? 28+(y%4==0 && y%100 || y%400==0) : 30+(0x15aa>>m&1);
        for (i = 0, d = 1; d <= z; d++) {
            x[m-1][i][w] = d;
            if (++w == 7) w = 0, i++;
        }
    }
    printf("%36d年\n\n", y);
    for (m = 1; m <= 12; m += 3) {
        #define WEEK  " 日 月 火 水 木 金 土   "
        printf("%11d月%22d月%22d月\n" WEEK WEEK WEEK "\n", m, m+1, m+2);
        for (i = 0; i < 6; i++)
            for (z = -1; z < 2; z++) {
                for (w = 0; w < 7; w++)
                    printf(x[m+z][i][w] ? "%3d" : "   ", x[m+z][i][w]);
                printf(z==1 ? "\n" : "   ");
            }
        puts("");
    }
}

int main(void)
{
    int y;

    printf("カレンダーを表示する年を入力してください。");
    if (scanf("%d", &y) == 1) cal(y);
    return 0;
}


No.3933

Re:カレンダーの表示方法
投稿者---Wizard of Oz(2002/12/17 22:13:56)


試してみたのですが、エラー、警告が0にも関わらずプラグラムが実行されません。

No.3955

Re:カレンダーの表示方法
投稿者---かずま(2002/12/19 13:19:09)


> 試してみたのですが、エラー、警告が0にも関わらずプラグラムが実行されません。

printf("カレンダーを表示する年を入力してください。");
も実行されないのですか。

No.3960

Re:カレンダーの表示方法
投稿者---助太(2002/12/19 15:19:11)


このプログラムで、土曜日、日曜日の日付けを色をつけて表示するには
どうすればよいのですか。
たとえば、土曜日なら黄色、日曜日なら赤という風にです。


No.3961

Re:カレンダーの表示方法
投稿者---ともじ(2002/12/19 22:38:36)


こんばんは。

>このプログラムで、土曜日、日曜日の日付けを色をつけて表示するには
>どうすればよいのですか。
>たとえば、土曜日なら黄色、日曜日なら赤という風にです。

エスケープシーケンスを使うと色づけできます。
http://f1.aaa.livedoor.jp/~pointc/log440.html
    printf("%36d年\n\n", y);
    for (m = 1; m <= 12; m += 3) {
        #define WEEK  " \33[31m日\33[37m 月 火 水 木 金 \33[33m土\33[37m   "
        printf("%11d月%22d月%22d月\n" WEEK WEEK WEEK "\n", m, m+1, m+2);
        for (i = 0; i < 6; i++)
            for (z = -1; z < 2; z++) {
                for (w = 0; w < 7; w++) {
                    printf(!w ? "\33[31m" : (w == 6 ? "\33[33m" : "\33[37m"));
                    printf(x[m+z][i][w] ? "%3d" : "   ", x[m+z][i][w]);
                }
                printf(z==1 ? "\n" : "   ");
            }
        puts("");
        printf("\33[37m");
    }




No.3966

Re:土曜日と日曜日の日付けを色分け
投稿者---助太(2002/12/20 10:12:43)


>こんばんは。
>
>>このプログラムで、土曜日、日曜日の日付けを色をつけて表示するには
>>どうすればよいのですか。
>>たとえば、土曜日なら黄色、日曜日なら赤という風にです。
>
>エスケープシーケンスを使うと色づけできます。
>http://f1.aaa.livedoor.jp/~pointc/log440.html
><pre> printf("%36d年\n\n", y);
for (m = 1; m <= 12; m += 3) {
#define WEEK " \33[31m日\33[37m 月 火 水 木 金 \33[33m土\33[37m "
printf("%11d月%22d月%22d月\n" WEEK WEEK WEEK "\n", m, m+1, m+2);
for (i = 0; i < 6; i++)
for (z = -1; z < 2; z++) {
for (w = 0; w < 7; w++) {
printf(!w ? "\33[31m" : (w == 6 ? "\33[33m" : "\33[37m"));
printf(x[m+z][i][w] ? "%3d" : " ", x[m+z][i][w]);
}
printf(z==1 ? "\n" : " ");
}
puts("");
printf("\33[37m");
}
</pre>
>

上手く、土曜日と、日曜日の日付けが指定した色で
表示されませんでした。

カレンダーの表示結果が壊れて表示されました。
1週間が7日でなかったり、まったく出力されない月が
ありました。


No.3969

Re:土曜日と日曜日の日付けを色分け
投稿者---助太(2002/12/20 12:13:24)


>上手く、土曜日と、日曜日の日付けが指定した色で
>表示されませんでした。
>
>カレンダーの表示結果が壊れて表示されました。
>1週間が7日でなかったり、まったく出力されない月が
>ありました。

申し訳ありませんでした。
ちゃんと表示できました。おかしかったのは私の方でした。
ただし、月と、プロンプトが黄色で表示され白色にはなりませんでした。


No.3970

Re:土曜日と日曜日の日付けを色分け
投稿者---ともじ(2002/12/20 13:13:50)


>ただし、月と、プロンプトが黄色で表示され白色にはなりませんでした。
    printf("%36d年\n\n", y);
    for (m = 1; m <= 12; m += 3) {
        #define WEEK  " \33[31m日\33[37m 月 火 水 木 金 \33[33m土\33[37m   "
        printf("%11d月%22d月%22d月\n" WEEK WEEK WEEK "\n", m, m+1, m+2);
        for (i = 0; i < 6; i++)
            for (z = -1; z < 2; z++) {
                for (w = 0; w < 7; w++) {
                    printf(!w ? "\33[31m" : (w == 6 ? "\33[33m" : "\33[37m"));
                    printf(x[m+z][i][w] ? "%3d" : "   ", x[m+z][i][w]);
                }
                printf(z==1 ? "\n" : "   ");
            }
        puts("");
        printf("\33[37m");    /* ←ここ忘れませんでしたか? */
    }




No.3975

Re:土曜日と日曜日の日付けを色分け
投稿者---助太(2002/12/21 02:08:58)


> printf("\33[37m");
忘れていました。
ありがとうございます。


No.3963

添付されたソースの処理について質問
投稿者---すすむ(2002/12/19 23:24:57)


C言語の勉強をはじめたばかりのものですが、

構造体の配列は2次元配列までしかできないと思っていました。

しかし、ここに添付されているソースでは、3次元配列が使われて
います。3次元配列とはどのようなもの、イメージなのですか。

char x[12][6][7] = { 0 };
3次元配列にどうように解釈すればよいのですか。
printf(x[m+z][i][w] ? "%3d" : " ", x[m+z][i][w]);
printf(z==1 ? "\n" : " ");
このような処理は、初めてみるのですが、「:」や「?」の処理は
何をしているのですか。

以下のコードの流れを教えてください。
void cal(int y)
{
int m, d, w, i, z; char x[12][6][7] = { 0 };

w = (y + (y-1)/4 - (y-1)/100 + (y-1)/400) % 7;
for (m = 1; m <= 12; m++) {
z = (m==2) ? 28+(y%4==0 && y%100 || y%400==0) : 30+(0x15aa>>m&1);
for (i = 0, d = 1; d <= z; d++) {
x[m-1][i][w] = d;
if (++w == 7) w = 0, i++;
}
}
printf("%36d年\n\n", y);
for (m = 1; m <= 12; m += 3) {
#define WEEK " 日 月 火 水 木 金 土 "
printf("%11d月%22d月%22d月\n" WEEK WEEK WEEK "\n", m, m+1, m+2);
for (i = 0; i < 6; i++)
for (z = -1; z < 2; z++) {
for (w = 0; w < 7; w++)
printf(x[m+z][i][w] ? "%3d" : " ", x[m+z][i][w]);
printf(z==1 ? "\n" : " ");
}
puts("");
}
}

No.3964

Re:添付されたソースの処理について質問
投稿者---silver fox(2002/12/20 02:24:11)


>char x[12][6][7] = { 0 };
>3次元配列にどうように解釈すればよいのですか。

今回のテーマであるカレンダーを思い浮かべれば分かりやすくないですか?
 お近くにカレンダーは無いですか?よく見て下さい。横が7日(1週間)縦が月
によっては6週間必要になるときがありますよね?それがさらに12ヶ月とこれ
で3次元配列の完成だと思いますが。

>printf(x[m+z][i][w] ? "%3d" : " ", x[m+z][i][w]);
>printf(z==1 ? "\n" : " ");
>このような処理は、初めてみるのですが、「:」や「?」の処理は

こちらを参照して下さい。

>以下のコードの流れを教えてください。

 100とか400とかが垣間見えている部分はうるう年の算出ですね。あとは先程ま
での説明を理解すれば解析は難しくないと思います。


No.3967

Re:添付されたソースの処理について質問
投稿者---すすむ(2002/12/20 10:33:08)


返事ありがとうございます。

>>printf(x[m+z][i][w] ? "%3d" : " ", x[m+z][i][w]);
>>printf(z==1 ? "\n" : " ");
>>このような処理は、初めてみるのですが、「:」や「?」の処理は
>
>こちらを参照して下さい。
http://www9.plala.or.jp/sgwr-t/c/sec14.html#s14-3

別の処理に置き換えると、
/*
x[m+z][i][w]の値がNULL値だったら半角スペースを表示し、
そうでなかったら、配列の値を表示する。
if (x[m+z][i][w] == '\0') {
printf(" ") ;
} else {
printf("%3d", x[m+z][i][w]) ;
}

/*
zの値が1の時は、改行し、zの値が1以外の時は、半角スペースを表示する。
if (z == 1) {
printf("\n") ;
} else {
printf(" ") ;
}
ということですか。


No.3968

Re:添付されたソースの処理について質問
投稿者---silver fox(2002/12/20 11:00:52)


>ということですか。

ということです。