|
发表于 2023-3-25 15:52:31
|
显示全部楼层
- #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;
- }
复制代码 |
|