anhedemo 发表于 前天 22:38

计算结果有偏差,C语言s1e17~18的作业,帮帮清澈大学生

本帖最后由 anhedemo 于 2025-11-24 22:41 编辑

#include <stdio.h>

int main()
{
    int dom[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//年里月天
    int i;
    int yearb, yeart, yeare, monb, mont, mone, dayb, dayt, daye, dayc, daysg, daysl;
    //day的后缀: b是生日/出生 t是今天 e是最后日子 c是计数器 sg是过去的天数 sl余下的天数
    int day = 0;//总天数
    printf("输入生日(xxxx空格xx空格xx):");
    scanf("%d%d%d", &yearb, &monb, &dayb);
    printf("输入今日:");
    scanf("%d%d%d", &yeart, &mont, &dayt);
    yeare = yearb + 80; mone = monb; daye = dayb;
    i = monb - 1;
    dayc = dayb;
   
   
for(;yearb <= yeare;yearb++)
    {      
      for(;i <= 11;i++)
            {
                if((yearb % 4 == 0 && yearb % 100 != 0) || (yearb % 400 == 0)){dom = 29;}
                else{dom = 28;}

                for(;dayc <= dom;dayc++)
                  {
                        day++;
                        if(yearb == yeart && i == mont - 1 && dayc == dayt){daysg = day;}
                        if(yearb == yeare && i == monb - 1 && dayc == dayb){daysl = day - daysg;goto Lable;}
                        
                  }
                dayc = 1;
            }
      i = 0;   
            
    }   
   
    Lable: printf("过去%d天,余下%d天,生命进程%.2f%%,总天数%d", daysg, daysl, (100 * daysg / (float)day), day);

    return 0;
}

FishC 发表于 前天 22:41

看到你的代码了,我来帮你分析一下问题所在并给出修正方案。

主要问题:
1. 数组初始化语法错误
2. 代码不完整,for循环没有结束
3. 闰年判断缺失
4. 天数计算逻辑需要完善

修正后的完整代码:


#include <stdio.h>

int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
    int dom[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 修正数组初始化
    int yearb, yeart, yeare, monb, mont, dayb, dayt;
    int totalDays = 0;
   
    printf("输入生日(xxxx空格xx空格xx):");
    scanf("%d%d%d", &yearb, &monb, &dayb);
    printf("输入今日:");
    scanf("%d%d%d", &yeart, &mont, &dayt);
   
    yeare = yearb + 80; // 80岁生日年份
   
    // 计算从今天到80岁生日的天数
    int currentYear = yeart;
    int currentMonth = mont;
    int currentDay = dayt;
   
    while (!(currentYear == yeare && currentMonth == monb && currentDay == dayb)) {
      totalDays++;
      currentDay++;
      
      // 处理月份和年份的进位
      int daysInMonth = dom;
      if (currentMonth == 2 && isLeapYear(currentYear)) {
            daysInMonth = 29; // 闰年2月有29天
      }
      
      if (currentDay > daysInMonth) {
            currentDay = 1;
            currentMonth++;
            if (currentMonth > 12) {
                currentMonth = 1;
                currentYear++;
            }
      }
    }
   
    printf("距离80岁生日还有: %d 天\n", totalDays);
    return 0;
}


主要修正点:

1. 数组初始化:使用 int dom[] = {...} 而不是 int dom = {...}

2. 添加了闰年判断函数 isLeapYear()

3. 使用循环逐天计算,确保准确性

4. 处理了月份进位和闰年2月的特殊情况

这个算法会从今天开始,一天一天地累加,直到到达80岁生日那天,确保计算结果的准确性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

anhedemo 发表于 昨天 14:46

FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。

主要问题:


数组初始化错在哪里

FishC 发表于 昨天 14:46

anhedemo 发表于 2025-11-25 14:46
FishC 发表于 2025-11-24 22:41
看到你的代码了,我 ...

数组初始化的错误在于语法不正确。

错误写法:
int dom = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

正确写法应该是:
int dom[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

区别:
- 错误写法缺少了 [] 来声明这是一个数组
- 在C语言中,初始化数组时必须使用方括号来表明这是一个数组变量

其他正确的数组初始化方式:

// 方式1:自动确定数组大小
int dom[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 方式2:明确指定数组大小
int dom = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


这个错误会导致编译失败,因为编译器无法识别 dom 是一个数组。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

anhedemo 发表于 昨天 14:49

FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。

主要问题:


为什么for循环没有结束,不是用了一个goto语句跳出吗

FishC 发表于 昨天 14:50

anhedemo 发表于 2025-11-25 14:49
FishC 发表于 2025-11-24 22:41
看到你的代码了,我 ...

在你的原始代码中,for循环确实没有结束,因为代码被截断了,缺少循环体和结束条件。即使你使用了goto语句来跳出循环,这种写法也不推荐,原因如下:


[*]goto语句会使代码流程难以跟踪,容易导致逻辑混乱和错误。
[*]在结构化编程中,应尽量使用break、continue或循环条件来控制流程,而不是goto。


在你的代码片段中:
for(;yearb
这里for循环没有指定完整的初始化、条件和迭代部分,也没有循环体,所以编译器会报错。

更好的做法是使用标准的循环结构,比如我在修正代码中使用的while循环,它通过条件判断来自然结束循环,代码更清晰易读。

如果你在完整代码中使用了goto,建议改为使用break语句或调整循环条件来替代,这样能提高代码的可维护性。

简单总结:for循环不完整是主要问题,goto不是解决方案,而是应该修复循环结构。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

anhedemo 发表于 昨天 14:54

FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。

主要问题:


原来的h计数逻辑有什么问题

FishC 发表于 昨天 14:55

anhedemo 发表于 2025-11-25 14:54
FishC 发表于 2025-11-24 22:41
看到你的代码了,我 ...

在你的原始代码中,天数计算逻辑(我假设“h计数”指的是“day计数”,即天数计算)存在几个关键问题,导致计算结果可能不准确或无法运行。以下是主要问题分析:

1. 循环结构不完整:
   你的代码中 for 循环被截断,缺少完整的初始化、条件和迭代部分,也没有循环体。例如:
   for(;yearb
   这会导致编译错误,因为循环没有结束,且没有有效的控制逻辑。

2. 闰年处理缺失:
   原始代码没有考虑闰年对2月天数的影响。闰年规则是:年份能被4整除但不能被100整除,或能被400整除。缺少闰年判断会导致2月天数始终为28天,与实际不符,从而计算错误。

3. 月份和年份进位逻辑不完善:
   当天数超过当月最大值时,需要进位到下一月,月份超过12时需要进位到下一年。你的代码中没有看到明确的处理逻辑,这可能导致日期计算卡在无效值(如2月30日)或无限循环。

4. 变量使用混乱:
   你定义了多个变量(如 dayc、daysg、daysl),但它们的用途不清晰,且没有在完整逻辑中发挥作用。例如,dayc 可能用作计数器,但如何更新和退出循环不明确。

5. 数组初始化错误:
   如前所述,数组 dom 初始化语法错误,缺少方括号,这会导致编译失败。

6. 使用 goto 语句的风险:
   你提到使用了 goto 语句来跳出循环,但 goto 会使代码流程难以跟踪,容易引入错误。在结构化编程中,应优先使用 break 或循环条件来控制流程。

总结:原始天数计算逻辑缺乏完整的循环控制、闰年处理和日期进位机制,导致无法准确计算从今天到80岁生日的天数。建议使用逐天累加的方法(如我在修正代码中所示),并确保处理闰年和月份边界。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 计算结果有偏差,C语言s1e17~18的作业,帮帮清澈大学生