案例来自于杜树春的书《实用有趣的C语言程序》,在学习练习的过程种我首先会自己写程序解决书中提出题目,之后再把书种的程序一字不差的边看边练。如果自己不能用程序解决问题,就直接用书中的程序练习。
1 输入年月日,计算这天星期几
具体计算公司
其中x是年份,C是这一天在这一年中累计是第多少天,(x-1)/4、(x-1)/100、(x-1)/400都是取整数部分
% 7
D是S对7取余数的结果,其值0-7分别对应星期天到星期六
下面是我写的代码
#include <stdio.h>
// 输入年月日,计算这天星期几
int main()
{
int i,yy,mm,dd,C=0,S,day,num;
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
printf("input year month day eg:1999 1 2\n");
scanf("%d%d%d",&yy,&mm,&dd);
if(yy<1 || mm<1 || mm>12 || dd >31|| dd<1)
printf("input error: %d %d %d",yy,mm,dd);
if(yy%4==0 && (yy%100!=0 || yy%400==0))
month[1]=29;
for(i=1;i<mm;i++)
C+=month[i-1];
C+=dd;
S=yy-1+(yy-1)/4-(yy-1)/100+(yy-1)/400+C;
num=S%7;
printf("S=yy-1+(yy-1)/4-(yy-1)/100+(yy-1)/400+C\n");
printf("%d-%d-%d is %s\n",yy,mm,dd,week[num]);
}
下面这个是参照书上的源码,感觉代码太长,可能是书前面的的案例才这样,容易理解
/*输入年月日,计算这天星期几*/
#include <stdio.h>
int main()
{
int a,b,c,d,s,z;
printf("请输入:年 月 日\n");
scanf("%d%d%d",&a,&b,&c);
if((a%4==0 && a%100!=0) || a%400==0)
{
if(b==1)d=c;
if(b==2)d=c+31;
if(b==3)d=c+60;
if(b==4)d=c+91;
if(b==5)d=c+121;
if(b==6)d=c+152;
if(b==7)d=c+182;
if(b==8)d=c+213;
if(b==9)d=c+244;
if(b==10)d=c+274;
if(b==11)d=c+235;
if(b==12)d=c+335;
}
else
{
if(b==1)d=c;
if(b==2)d=c+31;
if(b==3)d=c+59;
if(b==4)d=c+90;
if(b==5)d=c+120;
if(b==6)d=c+151;
if(b==7)d=c+181;
if(b==8)d=c+212;
if(b==9)d=c+243;
if(b==10)d=c+273;
if(b==11)d=c+304;
if(b==12)d=c+334;
}
s=a-1+(a-1)/4-(a-1)/100+(a-1)/400+d;
z=s%7;
if(z==0)printf("今天星期天.\n");
if(z==1)printf("今天星期一.\n");
if(z==2)printf("今天星期二.\n");
if(z==3)printf("今天星期三.\n");
if(z==4)printf("今天星期四.\n");
if(z==5)printf("今天星期五.\n");
if(z==6)printf("今天星期六.\n");
}
2 输入年月日,计算这天是这一年中的第几天
其实可以截取上面的部分程序即可,为了实现函数模块化,我练习了书中的代码,自己就没有另外编码了,如下
/*输入年月日,计算这天是本年度第几天*/
#include <stdio.h>
int main()
{
int sum_day(int month,int day);
int leap(int year);
int year,month,day,days;
printf("input: year month day\n");
scanf("%d%d%d",&year,&month,&day);
days=sum_day(month,day);
if(leap(year) && month>2)
days+=1;
printf("%d-%d-%d is %d day of %d",year,month,day,days,year);
}
int sum_day(int month,int day)
{
int day_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int i;
for(i=0;i<month-1;i++)
day += day_table[i];
return(day);
}
int leap(year)
{
int mark;
mark=year%4==0 && year%100!=0 || year%400==0;
return(mark);
}
3 输入年月日,计算这天从1990年1月1日起算是第几天
/*输入年月日,计算这天从1990年1月1日起算是第几天*/
#include <stdio.h>
typedef struct date
{
int year;
int month;
int day;
} DATA;
int countday(DATA);
int runyear(int);
int main()
{
int totalday;
DATA today;
printf("输入指定的年月日(yyyy mm dd)\n");
scanf("%d%d%d",&today.year,&today.month,&today.day);
totalday=countday(today);
printf("总天数是%d天\n",totalday);
printf("总小时数是%d天\n",24*totalday);
}
int countday(DATA currentday)
{
int i,year,totalday=0;
int permonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(year=1990;year<currentday.year;year++)
{
if(runyear(year))
totalday += 366;
else
totalday += 365;
}
if(runyear(currentday.year))
permonth[1]=29;
for(i=0;i<currentday.month-1;i++)
totalday += permonth[i];
totalday += currentday.day;
return(totalday);
}
int runyear(int year)
{
if(year%4==0 && year%100!=0 || year%400==0)
return 1;
else
return 0;
}
4 输入出生年月日和现在年月日,计算一共有多少天
/*输入出生年月日和现在年月日,计算一共有多少天 */
#include <stdio.h>
int main()
{
int year1,month1,day1,days1;
int i,year,month,day,days,dayss=0;
printf("输入出生年月日(yyyy mm dd)\n");
scanf("%d%d%d",&year1,&month1,&day1);
printf("输入现在年月日(yyyy mm dd)\n");
scanf("%d%d%d",&year,&month,&day);
days1=sum_day(month1,day1);
if(leap(year1) && month1>2)
days1 += 1;
days=sum_day(month,day);
if(leap(year) && month>2)
days += 1;
if(year1>year)
printf("输入年份错误%d>%d",year1,year);
else if(year1==year)
{
if(days1>days)
printf("输入月份和天数错误 %d-%d > %d-%d\n",month1,day1,month,day);
else
{
printf("总天数是%d天\n",days-days1);
printf("总小时数是%d小时\n",24*(days-days1));
}
}
else
{
for(i=year1+1;i<year;i++)
{
if(leap(i))
dayss += 366;
else
dayss += 365;
}
if(leap(year1))
dayss = dayss + days + 366 - days1;
else
dayss = dayss + days + 365 - days1;
printf("总天数是%d天\n",dayss);
printf("总小时数是%d小时\n",24*dayss);
}
}
int sum_day(int month,int day)
{
int i,totalday=0;
int permonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<month-1;i++)
totalday += permonth[i];
totalday += day;
return(totalday);
}
int leap(int year)
{
if(year%4==0 && year%100!=0 || year%400==0)
return 1;
else
return 0;
}