本帖最后由 lcx 于 2015-5-16 23:28 编辑
楼主善于提问的态度是值得肯定的,你如果是要打我脸直接来,你的程序虽然做了验证,但是稳定性能不足,直接写一个1-就内存错误,直接死循环。算法比楼主还差了一点,具体错误就在代码注释了,有问题就问。
#include <stdio..h> // 多了个点
int dayCount(int year,int mouth, int day);
// 定义一个日期的结构体
struct Date
{
int year;
int mouth;
int day;
};
int main()
{
struct Date d;
printf("请输入日期(输入格式:2006-1-1):");
scanf("%d-%d-%d", &d.year, &d.mouth, &d.day);
// 根据需求,必须输入2006年以后的日期
while (d.year < 2006)
{
printf("请输入正确的年份(2006年以后的年份):");
scanf("%d", &d.year);
}
// 对月份进行限制
while (d.mouth < 1 || d.mouth > 12)
{
printf("请输入正确的月份(范围1-12):");
scanf("%d", &d.mouth);
}
// 判断是否为闰年
if (d.year % 4 == 0 || d.year % 400 == 0) // 闰年的情况 差一个&&year%100!= 0;
{
// 如果是2月份那么天数,不能超过29 ,号位置放错
if (d.mouth == 2)
{
while (d.day < 1 || d.day > 29)
{
printf("请输入正确的日(范围1-29):");
scanf("%d", &d.day);
}
}
else if (d.mouth % 2 == 0) //如果是偶数月份,那么天数不应该超过30天 7月是31,8月也是31,逻辑错误。
{
while (d.day < 1 || d.day > 30)
{
printf("请输入正确的日(范围1-30):");
scanf("%d", &d.day);
}
}
else // 奇数月份天数不应该超过31天
{
while (d.day < 1 || d.day > 31)
{
printf("请输入正确的日(范围1-31):");
scanf("%d", &d.day);
}
}
}
else // 不是闰年的情况
{
if (d.mouth == 2) // 不是闰年,那么2月份天数不超过28天
{
while (d.day < 1 || d.day > 28)
{
printf("请输入正确的日(范围1-28):");
scanf("%d", &d.day);
}
}else if (d.mouth % 2 == 0)
{
while (d.day < 1 || d.day > 30)
{
printf("请输入正确的日(范围1-30):");
scanf("%d", &d.day);
}
}else
{
while (d.day < 1 || d.day > 31)
{
printf("请输入正确的日(范围1-31):");
scanf("%d", &d.day);
}
}
}
//这是什么算法?如果过了7、9、11天也认识美女?
int n = dayCount(d.year, d.mouth, d.day) % 5;
if (n == 1 || n == 2 || n == 3)
{
printf("%d-%d-%d认识的是美女", d.year, d.mouth, d.day);
}else if (n == 4 || n == 0)
{
printf("%d-%d-%d认识的是帅哥", d.year, d.mouth, d.day);
}
return 0;
}
int dayCount(int year,int mouth, int day)
{
// 定义两个变量,记录年单位和月单位与2006年1月1日之间相差的天数
int day1 = 0,day2 =0;
// 定义一个数组,数组存放的数据是按照月份大小需要增加的天数,例如1月份需要增加0天
// 2月份需要累积再加31,3月份就加59天(不是闰年)
int m[12] = {0, 31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31}; //12月不需要参与运算
// 判断是否为闰年
if ((year % 4 == 0 && year % 100 == 0)|| year % 400 == 0) //逻辑错误,!=100而不是==100。
{
// 判断是闰年,所以把数组中的28天改为29天
m[2] = 29; //下标从0开始,应该写m[1]
// 计算年单位相差的天数
day1 = (year - 2006) * 366;
// 计算月单位相差的天数,如果是1月份那么day2等于m[0]=0,
// 如果是2月份,那么day2等于m[1]+m[0] = 31.
for (int i = 0 ; i < mouth; i++)
{
day2 = day2 + m;
}
// 返回总的天数 只判断了一次是否是闰年,其他的闰年被无视了。
return day1+day2+day;
}
else // 不是闰年的情况
{
year = (year - 2006) * 365; //day1写成year 直接导致返回值day1为0
for (int i = 0 ; i < mouth; i++)
{
day2 = day2 + m;
}
return day1+day2+day; //day1=0;
}
}
|