计算结果有偏差,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;
} 看到你的代码了,我来帮你分析一下问题所在并给出修正方案。
主要问题:
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。
主要问题:
数组初始化错在哪里
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。
主要问题:
为什么for循环没有结束,不是用了一个goto语句跳出吗
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-11-24 22:41
看到你的代码了,我来帮你分析一下问题所在并给出修正方案。
主要问题:
原来的h计数逻辑有什么问题
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]