C言語関係掲示板

過去ログ

No.1216 当月、次月のカレンダーに今日の日付の隣に*を付ける

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

カレンダーについて
投稿者---ゆう(2004/08/01 22:14:05)


以下のようなカレンダーを作っています。次月表示をさせる箇所のソースについて日付を正しく表示させる方法と、今日の日付(の左側)に印(*など)をつけるにはどうすればいいかをおしえてください。よろしくお願いします。





#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>

int  isleap(int year);

int main()
{
    static  char  days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};        //各月の日数指定
       int  i;          //ループ変数
       int  y, m, d, wd;        //年,月,日,曜
    time_t  t;
    struct  tm *tp;

    time(&t);
    tp = localtime(&t);
    y = 1900 + tp -> tm_year;
    m = tp -> tm_mon;
    d = days[m];
    wd = tp -> tm_wday - (tp -> tm_mday - 1) % 7;

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1);
    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }
    for(i=1; i<=d; i++){
        printf("%4d", i);
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }

    printf("\n");

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+2);
    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }


    for(i=1; i<=d; i++){
        printf("%4d", i);
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }


    printf("\n");
    
    return 0;

}

int  isleap(int  year)
{
    return (year % 400) || ((year % 100) && (year % 4));
}










No.16046

Re:カレンダーについて
投稿者---ドジマル(2004/08/02 09:57:39)


以下のように修正でいかがでしょうか?
12月を超えた時に問題が出るので、 m+2 はまずいと思います。


    printf("%14d年%2d月\n",y ,m+1);
    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }
    for(i=1; i<=d; i++){
        if (i == tp->tm_mday)
            printf(" *%2d", i) ;
        else
            printf("%4d", i);
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }

    printf("\n");

    wd = (wd + d) % 7 ;
    if (++m > 11) {
        m = 0 ;
        y++ ;
    }

    d = days[m] ;

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1); 
    printf(" 日 月 火 水 木 金 土");
    printf("\n");




No.16049

Re:カレンダーについて
投稿者---ゆう(2004/08/02 15:45:30)


ありがとうございます。
このプログラムを少し変えて、前の月か次の月のうち、選択したほうを基準にして、同様の表示をさせたいと思います。この場合どのようにすればいいでしょうか。以下のようにしてみましたが、全くうまくいきません。



#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>

int  isleap(int year);

int main()
{
    static  char  days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    //各月の日数指定
       int  i;                    //ループ変数
       int  y, m, d, wd;    //年,月,日,曜
       int  x;                    //コマンドの識別
    time_t  t;
    struct  tm *tp;

    time(&t);
    tp = localtime(&t);
    y = 1900 + tp -> tm_year;
    m = tp -> tm_mon;
    d = days[m];
    wd = tp -> tm_wday - (tp -> tm_mday - 1) % 7;

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1);
    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }
    for(i=1; i<=d; i++){
        if (i == tp->tm_mday){
            printf(" *%2d", i);
        }
        else{
            printf("%4d", i);
        }
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }

    printf("\n");
    printf("\n");

    wd = (wd + d) % 7 ;
    if (++m > 11) {
        m = 0 ;
        y++ ;
    }

    d = days[m] ;

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1); 
    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }

    for(i=1; i<=d; i++){
        printf("%4d", i);
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }

    printf("\n");

    printf("\n\n");

    printf("0:プログラムの終了");
    printf("\t");
    printf("1:1つ前の月の表示");
    printf("\t");
    printf("2:1つ後の月の表示");

    printf("\n\n");
    
    scanf("%d",&x);

    if (x == 0){
        return 0;
    }

    if (x == 1){
        if(wd < 0){
            wd += 7;
        }
        if(m == 1 && isleap(y)){
            d++;
        }


        printf("\n\n");
        printf("%14d年%2d月\n",y ,m);
        printf(" 日 月 火 水 木 金 土");
        printf("\n");

        for(i=0; i<wd; i++){
            printf("  ");
        }
        for(i=1; i<=d; i++){
            if (i == tp->tm_mday){
                printf(" %2d", i);
            }
            else{
                printf("%4d", i);
            }
            if((i + wd) % 7 == 0){
                printf("\n");
            }
        }

        printf("\n");
        printf("\n");

        wd = (wd + d) % 7 ;
        if (++m > 11) {
            m = 0 ;
            y++ ;
        }

        d = days[m] ;

        if(wd < 0){
            wd += 7;
        }
        if(m == 1 && isleap(y)){
            d++;
        }

        printf("%14d年%2d月\n",y ,m); 
        printf(" 日 月 火 水 木 金 土");
        printf("\n");

        for(i=0; i<wd; i++){
            printf("  ");
        }

        for(i=1; i<=d; i++){
            printf("%4d", i);
            if((i + wd) % 7 == 0){
                printf("\n");
            }
        }

        printf("\n");



        printf("\n\n");

    }

    if (x == 2){
        if(wd < 0){
            wd += 7;
        }
        if(m == 1 && isleap(y)){
            d++;
        }


        printf("\n\n");
        printf("%14d年%2d月\n",y ,m+1);
        printf(" 日 月 火 水 木 金 土");
        printf("\n");

        for(i=0; i<wd; i++){
            printf("  ");
        }
        for(i=1; i<=d; i++){
            if (i == tp->tm_mday){
                printf(" %2d", i);
            }
            else{
                printf("%4d", i);
            }
            if((i + wd) % 7 == 0){
                printf("\n");
            }
        }

        printf("\n");
        printf("\n");

        wd = (wd + d) % 7 ;
        if (++m > 11) {
            m = 0 ;
            y++ ;
        }

        d = days[m] ;

        if(wd < 0){
            wd += 7;
        }
        if(m == 1 && isleap(y)){
            d++;
        }

        printf("%14d年%2d月\n",y ,m+1); 
        printf(" 日 月 火 水 木 金 土");
        printf("\n");

        for(i=0; i<wd; i++){
            printf("  ");
        }

        for(i=1; i<=d; i++){
            printf("%4d", i);
            if((i + wd) % 7 == 0){
                printf("\n");
            }
        }

        printf("\n");



        printf("\n\n");

    }

    return 0;

}

int  isleap(int  year)
{
    return (year % 400) || ((year % 100) && (year % 4));
}





No.16050

Re:カレンダーについて
投稿者---ドジマル(2004/08/02 16:42:41)


最初の問題の考え方
カレンダーの表示部分を別の関数に分けると考えやすくなります。
とりあえず、今日に日付には、印は付けません。
これを参考に、自分で考えてみて下さい。
それと、できましたら、コメントをつけて下さい。


#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>

int  isleap(int year);

/*  d は、その月の日数 wd は、曜日です。 */
void DispCal(int d, int wd)
{
int i ;

    printf(" 日 月 火 水 木 金 土");
    printf("\n");

    for(i=0; i<wd; i++){
        printf("  ");
    }
    for(i=1; i<=d; i++){
        printf("%4d", i);
        if((i + wd) % 7 == 0){
            printf("\n");
        }
    }

    printf("\n");
    printf("\n");
}


int main()
{
    static  char  days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    //各月の日数指定
       int  i;                    //ループ変数
       int  y, m, d, wd;    //年,月,日,曜
    time_t  t;
    struct  tm *tp;

    time(&t);
    tp = localtime(&t);
    y = 1900 + tp -> tm_year;
    m = tp -> tm_mon;
    d = days[m];
    wd = tp -> tm_wday - (tp -> tm_mday - 1) % 7;

    if(wd < 0){
        wd += 7;
    }
    if(m == 1 && isleap(y)){
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1);

    DispCal(d, wd) ;

    wd = (wd + d) % 7 ; /* 次の月の頭の曜日  */

    if (++m > 11) { /* 次の月が歳を越えるかチェック */
        m = 0 ;
        y++ ;
    }

    d = days[m] ;   /* 次の月の日数 */

    if(m == 1 && isleap(y)){  /* 潤年の2月の処理 */
        d++;
    }

    printf("%14d年%2d月\n",y ,m+1); 

    DispCal(d, wd) ;

    return 0;

}

int  isleap(int  year)
{
    return (year % 400) || ((year % 100) && (year % 4));
}




No.16051

Re:カレンダーについて
投稿者---ひまじん(2004/08/03 08:24:49)


#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>

int  isleap(int year);

void calendar(int y, int m, int today)
{
    static  char  days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    //各月の日数指定
    int  i, d, wd ;
    struct tm cal ;

    cal.tm_year = y - 1900 ;
    cal.tm_mon = m ;
    cal.tm_mday = 1 ;

    d = days[m];
    if(m == 1 && isleap(y))
        d++;

    if (mktime(&cal) != (time_t)-1) {
        wd = cal.tm_wday ;
        printf("%14d年%2d月\n",y ,m+1);
        printf(" 日 月 火 水 木 金 土\n");

        for(i=0; i<wd; i++)
            printf("  ");

        for(i=1; i<=d; i++){
            if (i == today)
                if (i < 10)
                    printf("  *%d", i);
                else
                    printf(" *%d", i) ;
            else
                printf("%4d", i);

            if((i + wd) % 7 == 0)
                printf("\n");
        }

        printf("\n\n");
    } else
        printf("関数 mktime の呼び出しエラーです。\n") ;
}

int main()
{
       int  i;           //ループ変数
       int  y, m, d ;    //年,月,日,
       int  x;           //コマンドの識別
    time_t  t;
    struct  tm *tp;

    time(&t);
    tp = localtime(&t);
    y = 1900 + tp -> tm_year;
    m = tp -> tm_mon;

    calendar(y, m, d = tp->tm_mday) ;

    if (++m > 11) {
        m = 0 ;
        y++ ;
    }

    calendar(y, m, 0) ;

    printf("\n\n");

    printf("0:プログラムの終了");
    printf("\t");
    printf("1:1つ前の月の表示");
    printf("\t");
    printf("2:1つ後の月の表示");

    printf("\n\n");
    
    scanf("%d",&x);

    switch (x) {
        case 1:
            if ((m -= 2) < 0) {
                y-- ;
                m = 11 ;
            }

            calendar(y, m, 0) ;
            if (++m > 11) {
          m = 0 ;
                y++ ;
            }

            calendar(y, m, d) ;
            break ;

        case 2:
            calendar(y, m, 0) ;
            if (++m > 11) {
                m = 0 ;
                y++ ;
            }

            calendar(y, m, 0) ;
            break ;
    }

    return 0;

}

int  isleap(int  year)
{
    return (year % 400) || ((year % 100) && (year % 4));
}