用C语言编写一份日历系统

以月为分组显示当月的每天分别对应的是星期几。每组第一行显示星期名字从Sun顺次到Sat。从第二行开始确定本月1号显示位置并显示。然后,顺次显示2号,3号直到月末。每行最多显示7个数字(对应7天的日子)

这个就是计算每年的第一天和每个月的第一天是周几的问题。显示很简单
计算每年第一天是周几
int yy(int ye)
{
int y=ye%400; //400年一轮回,你可以计算一下400年的所有天数刚好是7的倍数

int day=y-1; //一年365天,364是7的倍数,那么一年多出一天

for(i=0;i<y;i++) //这里是加上闰年的一天

if(y%4==0&&y%100!=0)
day+=1;
return day%7;

}
定义一个数组
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31}
if(y%4==0&&y%100!=0&&y%400==0) //判断闰年的公式,我忘记了,呵呵
c[1]=29;
else
c[1]=28;

这里用来存储每个月的天数。可以使全局数组,这样的话就是改变2月份的天数而已
要是打印一年的日历,不需要计算每个月的第一天是周几,要是打印单独的月份,需要计算
可以用一个全局数组来存储
int z[12];
void yue(int ye,int k)
{
int y=ye%400,i;

if(y%4==0&&y%100!=0)
c[1]=29;

for(i=1;i<12;i++)
z[i]=(k+c[i-1])%7;

}

打印很简单
void pr(int k)
{
int i

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-05
/计算一年的一天是星期几
//最常见的公式:W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D,
//Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
#include<stdio.h>
int a[2][13]={0,31,29,31,30,31,30,31,31,30,31,30,31,
0,31,28,31,30,31,30,31,31,30,31,30,31};
int judge_year(int year) //判断平年润年
{
if(!(year%4) && year%100 || !(year%400)) return 1; else return 0;
}
int judge_today(int year,int month,int day) //判断某一天是星期几
{
int i,sum=0,today;
//printf("%d",a[1][2]);
if(judge_year(year)) //润年的情况
{
for(i=1;i<=month-1;i++)
sum=sum+a[0][i];
sum=sum+day;
}
else //平年的情况
{
for(i=1;i<=month-1;i++)
sum=sum+a[1][i];
sum=sum+day;
}
today=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+sum;
today%=7;
return today;
}
void main()
{
printf("\n");
printf("\n");
printf("\n");
printf("**武昀霏\n");
int year,month,i;
char key;
while(1)
{
printf("请输入日期:格式:年.月.\n");
scanf("%d.%d",&year,&month);
if(month>12 || month<1)
{
printf("请输入正确时间\n\n");
continue;
}
printf("%d年%d月日历:\n\n",year,month);
printf("日 一 二 三 四 五 六\n");
for(i=1;i<=4*judge_today(year,month,1);i++)
printf(" ");
for(i=1;i<=a[judge_year(year)][month];i++)
{
if(judge_today(year,month,i)==0) printf("\n");
printf("%-4d",i);
}
printf("\n\n");
printf("是否继续查询:(Y/N)");
getchar();
printf("\n");
scanf("%c",&key);
if(key=='n' || key=='N') break; }
}
第2个回答  2012-10-30
#include<stdio.h>
#include<stdlib.h>
void printfweek();
void underline();
int yeardays(int);
int daysofmonth(int,int);
void printhead(int);
int daysmonth(int month,int year);
void printdatas(int,int);
void menu2();
int main()
{
int year,month,firstweek,monthdays,n;
char c;
printf("请输入你要查询的年份:\n");
scanf("%d",&year);
printf("请输入你要查询的月份:\n");
scanf("%d",&month);
do
{
system("cls");
printf("~~~~~~~~~~~~~~\t\t%d年%d月 ~~~~~~~~~~~~~~\n",year,month);
printfweek();
underline();
firstweek=yeardays(year); //返回每年的元旦是星期几
monthdays=daysofmonth(month,year)%7; //返回
printhead((firstweek+monthdays)%7); //firstweek+monthdays代表的是每个月的第一天是星期几
n=daysmonth(month,year); //返回你输入月份的天数
printdatas(n,(firstweek+monthdays)%7); //打印每个月的的每一天
menu2();
scanf("%c",&c);
switch(c)
{

case'.':
{
printf("结束!");
break;
}
case'[':
{
printf("上一个月!\n");
month--;
if(month==0)
{
month=12;
year--;
}
continue;
}
case']':
{
printf("下一个月!\n");
month++;
if(month==13)
{
month=1;
year++;
}
continue;
}
case'=':
{
printf("自定义年月!\n");
system("cls");
printf("请输入你要查询的年份:\n");
scanf("%d",&year);
printf("请输入你要查询的月份:\n");
scanf("%d",&month);

}
}
}while(c!='.');
}
void printfweek()
{
printf("日 一 二 三 四 五 六 \n");
}
void underline()
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
int yeardays(int year) //返回指定年的元旦是星期几!
{
int firstweek;
firstweek=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;
return firstweek;
}
int daysofmonth(int month,int year) //每月的天数
{
switch(month)
{
case 1:return 0;
case 2:return 31;
case 3:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 60;
else
return 59;
}
case 4:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 91;
else
return 90;
}
case 5:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 121;
else
return 120;
}
case 6:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 152;
else
return 151;
}
case 7:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 182;
else
return 181;
}
case 8:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 213;
else
return 212;
}
case 9:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 244;
else
return 243;
}
case 10:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 274;
else
return 273;
}
case 11:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 305;
else
return 304;
}
case 12:
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 335;
else
return 334;
}
}
if(1<=month&&month<=12)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 31;
else if(month==4||month==6||month==9||month==11)
return 30;
else if(month==2)
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 29;
else
return 28;
}
}
}
void printhead(int firstweek) //打印每月的日历头(判定起始位置)
{
int i;
for(i=0;i<firstweek;i++)
printf(" ");
}
int daysmonth(int month,int year) //每月的天数
{
if(1<=month&&month<=12)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 31;
else if(month==4||month==6||month==9||month==11)
return 30;
else if(month==2)
{
if(((year%4==0 && year%100!=0)||year%400==0))
return 29;
else
return 28;
}
}
else
{
printf("错误\n");
exit(-1);
}
return 0;
}
void printdatas(int n,int m)
{
int i,count=m;
for(i=1;i<=n;i++)
{
printf("%d ",i);
count++;
if(count%7==0)
{
printf("\n");
underline();
printf("\n");
}
}
printf("\n");
}
void menu2()
{
printf("请选择下面的操作!\n");
printf("[ 上一个月!\n");
printf("[ 下一个月!\n");
printf("= 自定义年月!\n");
printf(". 结束!\n");
}
第3个回答  2012-07-09
知道阴历的月份的算法吗?
相似回答