求助!自己写完代码总感觉累赘太多,而又不知道哪里能化简!
小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
#include <stdio.h> #define MON 12
int reYearModu(int y); int leapTimeModu(int ye); int curYearDayModu(int yea,int mon,int da,int a[],int b[]); void resultModu(int d);
int main(int argc, const char * argv[]) { //定义年月日的变量 int year,month,day; //定义闰年平年每月的天数 int leapYearDay[MON] = {31,29,31,30,31,30,31,31,30,31,30,31}; int commYearDay[MON] = {31,28,31,30,31,30,31,31,30,31,30,31}; //提示用户输入信息 printf("请输入2006年以后的日期(年月日之间用“-”隔开):"); scanf("%d-%d-%d",&year,&month,&day); //验证用户输入 if (year<2006||(month<1&&month>12)) { printf("输入的日期错误,请输入2006年1月1日以后的日期!\n"); return 0; } //计算总共的天数=度过的年数*365+闰年多的1天*闰年次数+当年的天数 int sumYear = year-2006; int leapTime = leapTimeModu(year); int curYearDay = curYearDayModu(year, month, day, &leapYearDay[MON], &commYearDay[MON]); int sumDay; if (sumYear!=2006) { sumDay = sumYear*365+leapTime+curYearDay; }else{ sumDay = curYearDay; } //结算结果,并输出 resultModu(sumDay);
return 0; }
//判断是否是闰年 1是 0不是 int reYearModu(int y){ if ((y%4==0&&y%100!=0)||(y%400==0)) { return 1; }else return 0; } //已过闰年的次数 int leapTimeModu(int ye){ int t = 0; //若为闰年则次数加1 for (int i = 0; i<ye; i++) { if (reYearModu(ye)==1) { t++; } } return t; } //输入当前年的天数 int curYearDayModu(int yea,int mon,int da,int a[],int b[]){ int d; //判断当月份不为1月时,将之前的月份的日子相加 为1月时直接使用输入日期的值 if (mon!=1) { //判断闰年与平年 if (reYearModu(yea)==1) { for (int i = 0; i<mon-1; i++) { d+=a; } }else{ for (int i = 0; i<mon-1; i++) { d+=b; } } return d+da; }else{ return da; } }
//像用户输出结果 void resultModu(int d){
if (d%2==0) { printf("小明今天认识了帅哥!\n"); } if (d%3==0) { printf("小明今天认识了美女!\n"); } if (d%2!=0&&d%3!=0) { printf("小明今天没认识帅哥也没认识美女!\n"); } }
|