C语言编程

要求编写一个程序,使该程序可以输入年月而输出正确的月历,注意闰年,大小月,这个怎么搞啊,希望各位高手指教啊,要具体的思路,程序最好有解释,标注出每行的含义,呵呵呵,我是初学者

刚才给你的还有一些小问题,又改了一下,现在OK了。
给,已经编译运行确认,注释已经足够详细了吧:)

#include <stdio.h>
int main(void)
{
int i,j,k,m,mon,y;
int day(int n,int m);//函数的声明
int month(int n,int y);
int year(int y);
printf("Please input year:");
fflush(stdin);
scanf("%d",&y);
printf("Please input month:");
fflush(stdin);
scanf("%d",&mon);
if(y<1)//输入的如果是0或者负数,报错
printf("I can't tell you this year ^_^\n");
else
{
i=year(y);//年处理函数,判断是否是闰年,这个函数的返回值是本年的第一天是周几
printf("The year is %d , month is %d\n",y,mon);

j=month(mon,y);//月处理函数,这个函数返回的是每个月需要扣除的天数。
k=day(i,j);//日处理函数,需要传递的参数是这个月的第一天是周几i,还有这个月需要扣除的天数j。
i=k;
}
return 0;
}

int year(int y)//判断是否是闰年
{
int x,i,j=0;
for(i=1;i<y;i++)//在这里,用公元元年为基础来推断
{
if((i%4==0)&&(i%100!=0))
j++;
else if(i%400==0)
j++;//只要是闰年j就加1,这个是为了算天数的时候补上闰年多的那天
}
x=((y-1900)*365+1+j)%7;//这个就是判断查询年份1月号是周几
return x;//返回的这个x就是本年第一天是周几
}

int month(int n,int y)//这个函数是用来处理月份的
{
printf("============%d.%d=============\n",y,n);
if(n==1||n==3||n==5||n==7||n==8||n==10||n==12)//我设置每个月有31天,所以这几个月返回的需要扣除的天数就是0
return 0;//返回的是需要扣除的天数,这几个月不需要扣除
else if(n==4||n==6||n==9||n==11)
return 1;//这几个月需要扣除一天
else if(n==2)//2月真是麻烦,需要单独处理。如果是闰年就扣除2天,如果不是就扣除3天
{
if((y%4==0)&&(y%100!=0))
return 2;
else if(y%400==0)
return 2;
else return 3;
}
}

int day(int n,int m)//这个是日处理函数
{
int i,j,day[31],k;
for(i=0;i<31;i++)
day[i]=i+1;
printf("Sun Mon Tue Wed Thu Fri Sat\n");//打印出上面的周数
if(n<7)
{
if(n<0) n+=7;
for(i=0;i<n;i++)
{
for(j=0;j<3;j++) printf(" ");
printf(" ");
}

for(i=0;i<31-m;i++)
{
printf("%3d ",day[i]);
if((i+1+n)%7==0)//每7天就换一行重新开始输出
printf("\n");
}
}
printf("\n");
k=(31-m+n)%7;
return k;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-03-20
去书城5楼找一些算法的书来看看。
第2个回答  2009-03-20
/*
*计算任意年、月的第一天距2007-1-1有多少天,然后利用余运算得出那一天的
*星期数,就可以显示本月月历。主程序直接使用的函数就是显示月历的函数
*void cal(int y,int m)。显示月历的函数只要是调用判断指定年、月第一天
*是星期的函数int mweek(int y,int *m),这个函数关键是调用的关键是计算
*两个日志之间相差天数的函数int days*(int y1, int m1, int y2, int m2)。
*/
#include <stdio.h>

/*函数返回y年m月的天数:28、29、30、31*/
int mdays(int y,int m){
int d=31;
if (m==4||m==6||m==9||m==11) d=30;
else if (m==2) d=(y%4==0 && y%100!=0 || y%400==0)?29:28;
return d;
}

/*函数返回y年的天数:365、366*/
int ydays(int y){
int d=0;
d=(y%4==0 && y%100!=0 || y%400==0)?366:365;
return d;
}

/*返回两个日期之间的天数:y1-m1-1、y2-m2-1*/
int days(int y1, int m1, int y2, int m2){
int x,y=1;
if (y1>y2 || y1==y2 && m1>m2){
y=-1;
x=y1;y1=y2;y2=x;x=m1;m1=m2;m2=x;
}
x=0;
while(y1+1<y2){x+=ydays(y1);y1++;}
while(y1!=y2 || m1!=m2){
x+=mdays(y1,m1);
m1++;
if(m1>12){m1=1;y1++;}
}
return x*y;
}

/*计算y年m月1日是星期几:0~6*/
int mweek(int y,int m){
int d;
d=days(2007,1,y,m)+1;/*2007-1-1 is MON*/
d%=7;
if (d<0)d+=7;
return d;
}

/*显示y年m月的日历*/
void cal(int y,int m){
int i,j;
printf("SUN\tMON\tTUE\tWED\tTHU\tFRI\tSAT\n");
j=mweek(y,m);
for (i=0;i<j;i++)printf("\t");
for (i=1;i<=mdays(y,m);i++){
printf("%d\t",i);
j++;
if (j>6) {printf("\n");j=0;}
}
}

/*主程序*/
main(){
int y,m;
while(1){
printf("\nEnter year to display calendar (0 to exit):");
scanf("%d",&y);
if (y==0) break;
while(1){
printf("\nEnter month in %d to display calendar (1-12, 0 to Exit):",y);
scanf("%d",&m);
if (m>0 && m<13) cal(y,m);
else break;
}
}
}
第3个回答  2009-03-20
什么叫输出正确的月历??
第4个回答  2009-03-20
大致要注意以下几点:
1.通常编万年历都是以1900年1月1日,星期一为标准。
2.闰年判断方法:
两个条件满足其一,假设年份为n。
则满足 n%4==0 && n%100!=0 或者n%400==0;其实编程的时候这2句是写在一起的 n%4==0 && n%100!=0 || n%400==0(因为&&优先级比||高,所以加不加括号都没问题)
3.月份,无非就是大、小月外加闰2月的判断。这个简单。
4.通过2,3两步可以得到,从1900年1月1日起到输入的月份的1日为止共经过多少天,假设这个天数为x。则“星期n”可以通过 x%7得到(0就是星期一,1就是星期二,依次)。

思路就是上面这些,晚年历基本都这么做的。要是真有什么不一样,也就是基准日期的选择。因为我见过有人用公元0年1月1日,星期天做基准(估计是信上帝的。。。不过据说究竟是星期日还是星期天,他们自己内部都没统一:)题外话,略过即可)
第5个回答  2009-03-20
Any Questions, please contact me
可以利用库函数反向检查输入的是否是正确的.

绝对简单
使用函数
mktime
localtime
#include <time.h>