アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語での万年カレンダーのソースコートを教えてもらったのですが意味がわからないところがあります


#include <stdio.h>

int weekday(int y,int m,int d)
{
if ( m < 3 ){
m += 12 ;
y -- ;
}

return (y+y/4-y/100+y/400+(m*13+8)/5+d)%7 ;
}

int main()
{
int y,m,d,sw,ew ;

printf("年 : ");
scanf("%d",&y);

printf("月 : ");
scanf("%d",&m);

sw = weekday(y,m,1);
ew = weekday(y,m+1,1);

if ( sw <= ew ){
ew = ew - sw + 28 ;
}
else {
ew = 35 - sw + ew ;
}

printf("%4d / %d\n",y,m);
printf("日 月 火 水 木 金 土");
for (d=0 ;d<37 ;d++){

if (!(d%7)){
printf("\n");
}

if ( d < sw || d >= ew+sw ){
printf(" ");
}

else {
printf("%2d ",d-sw+1);
}
}
return 0 ;
}

sw = weekday(y,m,1);
ew = weekday(y,m+1,1);
のところから下の部分なのですがどういう場合分けをしているのですか?
一部分でもいいので教えていただけるとありがたいです。

A 回答 (1件)

曜日を0~6として


weekdayは指定した年月日から曜日を求める関数
swは当月の1日の曜日
ewは翌月の1日の曜日から当月の日数に変換しています。
dは月曜日からの通しのカウントですね
dがsw~sw+ewの範囲が当月の日付になります。
日付はswの分だけずれているのでマイナスして表示しています。

2010/06の場合
sw=2,ew=4
ew=4-2+28 = 30
dが2~32の間は日付を表示する

2010/07の場合
sw=4,ew=0
ew=35-4+0 = 31
dが4~35の間は日付を表示する

質問の部分は当月と翌月の曜日の前後による月の日数計算の場合分けですね
カレンダーを見ながらなら理解し易いと思います。
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございました!

お礼日時:2010/07/04 11:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!