基础测试题:
/* 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/
我的代码:冗余比较多,凑合看.
#import <Foundation/Foundation.h>
//定义一个返回值为BOOL类型的函数,用来判断xxxx年是否是闰年 BOOL isLeapYear (int n) { if ((n % 4 == 0)&&(n %100 != 0)) return YES;
else if (n % 400 == 0) return YES;
else return NO; }
//定义一个函数来检测输入日期的合法性 BOOL dateIsLegal(int a,int b,int c) { if (a < 2006) return NO;
else if (a == 2006 && b == 1 && c == 1) return NO;
else return YES; }
int main(int argc, const char * argv[]) { //定义三个参数用来存放用户输入的年、月、日 int year,month,day;
printf("请输入2006年1月1日后的任意一天,格式按照2007-9-1形式书写:\n"); scanf("%d-%d-%d",&year,&month,&day);
//判别用户输入的日期是否合法 if (dateIsLegal(year, month, day)!=1) { printf("日期不合法,请输入2006-1-1后的日期\n"); return -1; //程序非正常退出 }
//算出相差的年的天数的和,例如如果输入的是2008-xx-xx,那么这个应该结果是2006年的总天数加上2007年的总天数;如果输入的时2006-xx-xx,那么这个结果应该为0; int sumDayofyear = 0; for (int i = 2006; i<year; i++) { if(isLeapYear(i)) sumDayofyear+=366; else sumDayofyear+=365;
}
//定义两个数组分别存放非闰年和闰年的12个月份的天数 int normalYear[12] ={31,28,31,30,31,30,31,31,30,31,30,31}; int leapYear[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
//算出相差月的天数的和; int sumDayofmonth = 0; for (int j =1; j<month; j++) { if (isLeapYear(year)) { sumDayofmonth+=leapYear[j-1]; } else sumDayofmonth+=normalYear[j-1]; }
// printf("sumDayofyear = %d\n",sumDayofyear); // printf("sumDayofmonth = %d\n",sumDayofmonth);
int sumDay = sumDayofyear + sumDayofmonth + day;
//判别小明今天认识的是谁 if ((sumDay%2 == 0)&&(sumDay%3!=0)) { printf("小明%d-%d-%d认识了一个美女\n",year,month,day); }
else if((sumDay%3 == 0)&&(sumDay%2!=0)) printf("小明%d-%d-%d认识了一个帅哥\n",year,month,day);
else if((sumDay%3 == 0)&&(sumDay%2 == 0)) printf("小明%d-%d-%d既认识了一个美女,也认识了一个帅哥\n",year,month,day);
else printf("小明今天谁也没认识\n");
//程序正常退出 return 0; }
|