#include <stdio.h>
// 声明定义的几个函数
int getDays(int y, int m, int d);
int isLeapYear(int y);
int isDateTrue(int y, int m, int d);
// 新建两个int类型的全局数组分别用来存放闰年和非闰年每月的天数
int leapYearMonths[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int yearMonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, const char * argv[]) {
// 1. 定义3个int类型的变量分别用来存储年、月、日
int year, month, day;
// 2. 提示用户输入并接收日期,并对输入的数据进行筛选
do {
// 2.1 提示用户输入
printf("请输入一个2006-1-1之后的日期,中间用‘-’隔开:");
// 2.2 接收用户用户输入的年、月、日信息,并分别存储到year、month、day变量中
scanf("%d-%d-%d", &year, &month, &day);
} while (isDateTrue(year, month, day));
// 3. 调用getDays函数,计算输入日期距离2006-1-1的总天数
int sumOfDays = getDays(year, month, day);
// 4. 利用总天数计算小明当天结识帅哥还是美女
// 4.1 总天数如果能被3整除,就结识美女
if (sumOfDays % 3 == 0)
printf("小明这天结识了美女!\n");
// 4.2 总天数如果能被2整除,就结识帅哥
if (sumOfDays % 2 == 0)
printf("小明这天结识了帅哥!\n");
// 4.2 总天数如果既不能被2整除,也不能被3整除,就既不结识帅哥,也不结识美女
if ((sumOfDays % 2 != 0) && (sumOfDays % 3 != 0))
printf("小明这天既没有结识帅哥,也没有结识美女!\n");
return 0;
}
// 新建一个函数用来计算输入日期距离2006-1-1的总天数,接收年、月、日三个变量
int getDays(int y, int m, int d)
{
// 新建两个变量分别用来存储年份,月份相差的天数
int yearOfDays = 0, monthOfDays = 0;
// 计算输入年份与2006年之间相差的天数
for (int i = 2006; i < y; i++) {
// 如果是闰年,则年份的天数加上366
if (isLeapYear(i))
yearOfDays += 366;
// 如果不是闰年,则年份的天数加上365
else
yearOfDays += 365;
}
// 计算输入月份与1月1日之间相差的天数
for (int j = 1; j < m; j++) {
// 如果是闰年,就累加闰年所对应月份的天数
if (isLeapYear(y))
monthOfDays += leapYearMonths[j-1];
// 如果不是闰年,就累加非闰年所对应月份的天数
else
monthOfDays += yearMonths[j-1];
}
// 计算总天数并返回
int sumOfDays = yearOfDays + monthOfDays +d;
return sumOfDays;
}
// 新建一个函数用来判断是否是闰年
int isLeapYear(int y)
{
// 如果一个年份可以被4整除且不能够被100整除,或者可以被400整除,那么是闰年
if ( (y%4==0 && y%100!=0) || (y%400==0) )
// 如果是闰年,返回1
return 1;
else
// 如果不是闰年,返回0
return 0;
}
// 新建一个函数用来判断输入的日期是否合理,不合理返回1,合理返回0
int isDateTrue(int y, int m, int d)
{
// 如果年份小于2006、或月份小于1、或月份大于12、或日小于1,则日期不合理
if (y<2006 || m<1 || m>12 || d<1)
return 1;
// 如果是闰年
if (isLeapYear(y))
// 当天数大于当月所对应的最大天数,则不合理
return d > leapYearMonths[m-1];
// 如果不是闰年
else
// 当天数大于当月所对应的最大天数,则不合理
return d > yearMonths[m-1];
} |