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