C语言 日历

输入年月例如2010年7月,显示输入的年月的日历。

h=(q+[(m+1)26/10]+k/4+j/4-2j)mod7
j表示年的第二位
k表示年的倒数第二位
m表示月
q表示日期
[x]表示x以内的最大的整数

0是星期六
1是星期日
2是星期一
3是星期二
4是星期三
5是星期四
6是星期五

#include <stdio.h>

#include <string.h>

//判断是否是闰年

bool isLeap(int year)

{

 if((year%4==0 && year%100 !=0) || (year%400==0))

 {

  return true;

 }

 return false;

}

//返回指定年,指定月的天数(即返回某月的天数)

int getDays(int year,int month)

{

 switch(month)

 {

 case 1:

 case 3:

 case 5:

 case 7:

 case 8:

 case 10:

 case 12:

  return 31;

 case 4:

 case 6:

 case 9:

 case 11:

  return 30;

 }

 if(isLeap(year))

 {

  return 29;

 }

 return 28;

}

//返回指定年月中该月的第一天的星期

int getWeekday(char date[])

{

 int j,k,m,q;

 j=date[1]-48;  

 k=date[2]-48;

 m=date[6]-48;

 q=1;

 return (q+((m+1)*26/10)+k/4+j/4-2*j)%7;

}

void showTips()

{

 printf("星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");

}

int main()

{

 char date[11];

 int i,year,month,days,weekday,temp;

 printf("请输入年月,格式为xxxx年x月,或者xxxx年xx月\n");

 gets(date);

 //strcpy(date,"2007年7月");

 

 year=0;

 for(i=0;i<4;i++)

 {

  year*=10;

  year+=date[i]-48;

 }

 //如果给定日期的月份是1位 即1~9

 if(strlen(date)==9)

 {

  month=date[6]-48;

 }

 //如果给定的日期的月份是2位 即10~12

 else 

 {

  month=(date[6]-48)*10+date[7]-48;

 }

 days=getDays(year,month);

 weekday=getWeekday(date);

 printf("星期六 星期日 星期一 星期二 星期三 星期四 星期五\n");

 temp=weekday;

 for(i=0;i<temp;i++)

 {

  printf("\t");

 }

 for(i=1;i<=days;i++)

 {

  printf(" %d\t",i);

  temp++;

  if(temp==7)

  {

   printf("\n");

   temp=0;

  }

 }

 printf("\n");

 return 0;

}

这是根据你提供的星期计算公式得出来的结果,所以不保证与当前的日历一致性,结果附图所示!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-22
// 提示输入年月, 用空格分开输入

#include<stdio.h>

/*得到所输入年月的第一天是星期几0~6*/
int getdate(int y,int m);

/*判断所输入的是否是闰月,是则返回1,否则返回0*/
int leap(int y);

/*打印输入月份月历表*/
void print(int y,int m);

int main()
{
int y,m;
printf("输入年份和月份:");
scanf("%d%d",&y,&m);
print(y,m);
return 0;
}

int getdate(int y,int m)
{
int w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;
int days=0;
switch(m)
{
case 12: days+=30;
case 11: days+=31;
case 10: days+=30;
case 9: days+=31;
case 8: days+=31;
case 7: days+=30;
case 6: days+=31;
case 5: days+=30;
case 4: days+=31;
case 3: if(leap(y)) days+=29;
else days+=28;
case 2: days+=31;
case 1: days+=0;
}
w=(w+days)%7;
return w; /*返回输入月份1号的星期*/
}

void print(int y,int m)
{
int w=getdate(y,m);
printf("\n\t\t%d年%d月的月历表:\n\n",y,m);
printf("\n==========================="
"========================\n\n");
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(leap(y)) month[1]=29;

printf("SUN\tMON\tTUE\tWED\tTHU\tFRI\tSAT\n");
int i,j;
for(i=0;i<w;i++) printf("\t");

for(i=w,j=1;j<=month[m-1];i++,j++)
{
if(i%7==0) printf("\n");
printf("%d\t",j);
}
printf("\n\n========================"
"===========================\n\n");
}

int leap(int y)
{
if((y%4==0&&y%100!=0)||y%400==0) return 1;
return 0;
}
相似回答