C言語関係掲示板

過去ログ

No.298.任意の年月のカレンダを表示させるプログラム

[戻る] [ホームページ]

No.1796

任意の年月のカレンダを表示させるプログラム
投稿者---高橋(2002/06/24 18:20:13)


任意の年月のカレンダを表示させるプログラムを教えてください
途中までのプログラムは以下にあります。



/*日付を表す構造体データ型 date_typeの定義*/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

typedef struct{
int year,month,day;
} date_type;


/*日数を計算する関数として、次の式がよく知られている。
西暦1925年12月27日(日曜日)から西暦Y年M月D日までの日数は、
365*(Y-1926)+[Y/4]-[Y/100]+[Y/400]+[30.6*(M+19)]+D-525
によって求めることができる。ただし、[x]は、ガウス記号(小数点以下切捨て)
で、1,2月は前年の13,14月とする。たとえば、1989年2月3日までの日数は、
Y=1988,M=14,D=3として、計算する。
*/

int days(date_type *d)
{
int Y,M,D;
Y=d->year; /*「構造体ポインタ->「メンバ名」*/
M=d->month;
D=d->day;
if(M==1||M==2){
M+=12;Y--;
}
return (365*(Y-1926)+(Y/4)-(Y/100)+(Y/400)+(int)(30.6*(M+1))+D-525);
}

/*

(1)誕生日の曜日を求める。
  誕生日を入力すると、生まれてから今日までの日数および
  誕生日の曜日を求めるプログラムを作成せよ。
(2)任意の年月のカレンダーを表示する。
  年と月を入力すると、その月のカレンダーを出力するような
  プログラムを作成によ。

*/
/*今日の日付をシステムからとってくる*/
date_type *getdate(void)
{
date_type *dp;
time_t current;
struct tm *local;

dp=(date_type *)malloc(sizeof(date_type));
time(&current);
local=localtime(&current);
dp->year=local->tm_year+1900;
dp->month=local->tm_mon+1;
dp->day=local->tm_mday;

return dp;

}

/*ある月のカレンダーを表示する。*/

void print_calender(date_type *d)
{
/*その月の1日の曜日(日->0,・・・,土->6を求める*/
int first_day_of_month(date_type *d)
{
date_type temp=*d;
temp.day=1;
return(days(&temp)%7);
}


/*その月の日数を求める*/
/*days(翌月の1日)-days(その月の1日)*/

int days_in_month(date_type *d)
{
date_type temp1,temp2;
temp1=temp2=*d;
temp1.day=temp2.day=1
temp1.month++;
return days(&temp1)-days(&temp2);
}

/*カレンダーを表示する*/
/*土曜日を書いたら改行する*/

}

int main(int argc,char *argv[])
{
date_type birthday,*today;
int day_of_week;
char *youbi[]={"日","月","火","水","木","金","土"};

if(argc !=4){
fprintf(stderr,"usage>birth Y M D\n");
exit(1); /*強制終了 終了コード=1*/
}
birthday.year=atoi(argv[1]);
birthday.month=atoi(argv[2]);
birthday.day=atoi(argv[3]);
day_of_week=days(&birthday)%7; /*7で割った余り*/


printf("誕生日の %d年,%d月,%d日は%s曜日です。\n",
birthday.year,
birthday.month,
birthday.day,
youbi[day_of_week]);
today=getdate();
printf("生まれてから今日(%d年%d月%d日)は%d日目です。\n",
today->year,today->month,today->day,
days(today)-days(&birthday));

while(getchar!=' ');
return 0;
}

No.1797

Re:任意の年月のカレンダを表示させるプログラム
投稿者---かずま(2002/06/24 21:08:30)


> 任意の年月のカレンダを表示させるプログラムを教えてください
> 途中までのプログラムは以下にあります。

関数は入れ子にできません。getchar は変数ではありません。
void print_calender(date_type *d)
{
    int w = first_day_of_month(d);
    int n = days_in_month(d);
    int i;
    for (i = 0; i < 7; i++)
        printf("%3s", youbi[i]);
    printf("\n%*s", w*3, "");
    for (i = 1; i <= n; i++) {
        printf("%3d", i);
        if (++w % 7 == 0)
            printf("\n");
    }
    for (; w < 42; w += 7)
        printf("\n");
}


No.1846

Re:任意の年月のカレンダを表示させるプログラム
投稿者---高橋(2002/06/27 12:44:23)


かずま氏のヒントをもとに次のようにつくることが出来ました。
任意の年、月を書き込むとその月のカレンダーが表示されます。
ありがとうございました
/*課題:カレンダー */
/*任意の年月のカレンダーを表示する。
  年と月を入力すると、その月のカレンダーを出力するような
  プログラムを作成によ。*/

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

typedef struct{
int year,month,day;
} date_type;

int days(date_type *d)
{
int Y,M,D;
Y=d->year; /*「構造体ポインタ->「メンバ名」*/
M=d->month;
D=d->day;
if(M==1||M==2){
M+=12;Y--;
}
return (365*(Y-1926)+(Y/4)-(Y/100)+(Y/400)+(int)(30.6*(M+1))+D-525);
}


/*ある月のカレンダーを表示する。*/
/*その月の1日の曜日(日->0,・・・,土->6を求める*/
int first_day_of_month(date_type *d)
{
date_type temp=*d;
temp.day=1;
return(days(&temp)%7);
}

/*その月の日数を求める*/
/*days(翌月の1日)-days(その月の1日)*/


int days_in_month(date_type *d)
{
date_type temp1,temp2;
temp1=temp2=*d;
temp1.day=temp2.day=1;
temp1.month++;
return days(&temp1)-days(&temp2);
}

/*カレンダーを表示する*/
/*土曜日を書いたら改行する*/

int main(int argc,char *argv[])
{
date_type birthday,*today;
int day_of_week,w,i,n;
char *youbi[]={"日","月","火","水","木","金","土"};

if(argc !=3){
fprintf(stderr,"usage>birth Y M \n");
exit(1); /*強制終了 終了コード=1*/
}
birthday.year=atoi(argv[1]);
birthday.month=atoi(argv[2]);

w=first_day_of_month(&birthday);
n=days_in_month(&birthday);
for(i=0;i<7;i++)
printf("%3s",youbi[i]);
printf("\n%*s",w*3,"");
for(i=1;i<=n;i++){
printf("%3d",i);
if(++w%7==0)
printf("\n");
}
for(w=1;w<42;w+=7)
printf("\n");
return 0;
}

No.1849

Re:任意の年月のカレンダを表示させるプログラム
投稿者---かずま(2002/06/27 18:30:24)


> かずま氏のヒントをもとに次のようにつくることが出来ました。
>       for(w=1;w<42;w+=7)
>           printf("\n");
これって、改行を6回行いますよね。何の意味があるんですか。
カレンダーを表示すると、5行になる月と、6行になる月があります。1998年2月
のように 4行のときもありますが。私は行数を 6 にそろえようと思って、w が
42になるまで改行するようにしたつもりです。なんで、w=1 を入れるんですか。

でも、よく考えたら、出力する改行は w が 35未満のときは 2つ。そうでない
ときは、1つですから、もっと簡単に書けますね。

では、ちょっと変なプログラムをお見せしましょう。よい子は真似をしないように。
#include <stdio.h>
#include <stdlib.h>

void cal(int y, int m)
{
    int d = 30 + (0x15aa >> m & 1);
    if (m == 2) d = 28 + (y%4==0 && y%100 || y%400==0);
    y -= m < 3;
    y = (y + y/4 - y/100 + y/400 + ".143614625035"[m] - '0') % 7;
    printf("日 月 火 水 木 金 土\n%*s", y*3, "");
    for (m = 1; m <= d; m++) printf("%2d%c", m, " \n"[++y%7==0]);
    puts("\n" + (y >= 35));
}

int main(int m, char **y)
{
    if (m == 3 && (m = atoi(y[2])) >= 1 && m <= 12)
        cal(atoi(y[1]), m);
    return 0;
}