#include <stdio.h>
int main()
{
long count = 0; // 用于存放一共活了多少天的变量
int year1, year2; // 生日年份和今天的年份
int month1, month2; // 生日月份和今天的月份
int day1, day2; // 生日日期和今天的日期
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每个月的天数
// 输入生日和今天的日期
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1);
printf("请输入今年日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2);
// 使用循环计算总天数
while (year1 <= year2) { // 遍历年份
// 计算闰年的 2 月份天数
days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
while (month1 <= 12) { // 遍历月份
while (day1 <= days[month1 - 1]) { // 遍历日期
// 如果到了今天的日期,跳出循环
if (year1 == year2 && month1 == month2 && day1 == day2) {
goto FINISH; // 跳出多层循环,到 FINISH 标签处继续执行
}
day1++; // 将日期加 1
count++; // 总天数加 1
}
day1 = 1; // 日期重新从 1 开始
month1++; // 月份加 1
}
month1 = 1; // 月份重新从 1 开始
year1++; // 年份加 1
}
FINISH:
printf("你在这个世界上总共生存了%d天\n", count); // 输出总天数
return 0;
}
------------------------------------------------------------------------------------
代码可以优化一下,下面是优化的写法
#include <stdio.h>
// 判断是否为闰年,返回二月份天数
int days_in_feb(int year)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 29; // 是闰年,二月份有29天
} else {
return 28; // 不是闰年,二月份有28天
}
}
int main()
{
long count = 0; // 计数器,用于统计生存天数
int year1, year2, month1, month2, day1, day2;
// 输入生日日期
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1);
// 输入今天日期
printf("请输入今年日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2);
// 遍历年份,从生日所在年份到今天所在年份
for (int year = year1; year <= year2; year++) {
int days_in_month; // 当前月份的天数
// 遍历月份,从1月到12月
for (int month = 1; month <= 12; month++) {
// 根据月份判断当前月份的天数
if (month == 2) { // 二月份需要判断是否为闰年
days_in_month = days_in_feb(year);
} else {
days_in_month = (month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31;
}
// 遍历日期,从1号到当月最后一天
for (int day = 1; day <= days_in_month; day++) {
// 判断当前日期是否在生日和今天之间
if (year == year1 && month < month1) { // 生日月份之前,跳过循环
continue;
}
if (year == year1 && month == month1 && day < day1) { // 生日当月,但日期在生日之前,跳过循环
continue;
}
if (year == year2 && month > month2) { // 今天月份之后,终止循环
break;
}
if (year == year2 && month == month2 && day > day2) { // 今天当月,但日期在今天之后,终止循环
break;
}
count++; // 统计生存天数
}
}
}
// 输出生存天数
printf("你在这个世界上总共生存了%ld天\n", count);
return 0;
}
在优化后的代码中,将计算闰年的逻辑封装成了一个名为 days_in_feb 的函数。该函数接受一个年份作为参数,并返回该年份二月份的天数。
在主函数中,使用 for 循环来遍历日期。首先遍历年份,在每个年份中遍历月份,在每个月份中遍历日期。
在遍历日期时,使用 if 语句来判断是否需要跳过或终止循环。如果当前日期比生日早,则跳过;如果当前日期比今天晚,则终止循环。如果当前日期是要计算的日期,则将计数器加 1。
这样,就避免了使用 goto 语句,使代码更加清晰和易读。同时,将计算闰年的逻辑封装成了函数,使代码更加模块化和可维护。
------------------------------------------------------------------------------------
这样写代码可以代码少一点,修改的时候比较方便
#include <stdio.h>
int main()
{
long count = 0; // 定义一个计数器,用于计算生存天数
int year1, year2, month1, month2, day1, day2; // 定义变量,分别存储生日和今天的年月日
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1); // 获取生日输入
printf("请输入今年日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2); // 获取今天日期输入
for (int year = year1; year <= year2; year++) { // 遍历从生日年份到今天年份之间的所有年份
for (int month = 1; month <= 12; month++) { // 遍历每个月份
// 计算当前月份的天数
int days_in_month = (month == 2) ? ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ? 29 : 28) : ((month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31);
// 计算当前月份的开始日期和结束日期
int start_day = (year == year1 && month == month1) ? day1 : 1;
int end_day = (year == year2 && month == month2) ? day2 : days_in_month;
// 累加当前月份的生存天数
count += end_day - start_day + 1;
}
}
printf("你在这个世界上总共生存了%ld天\n", count); // 输出生存天数
return 0;
}
|