如何在模拟 24 小时之前或之时停止执行的模拟程序
How to a simulation program that stops executing before or at simulated 24 hours
有一个 500 加仑的水箱用于
24小时内将鱼煎成Fish Fry。水箱漏水,每小时流失剩余水量的 10%。如何修复我的代码,使其在 24 小时后或油箱容量达到 100 加仑后停止执行。出于某种原因,我似乎无法全神贯注于 for 循环。
int main()
{
double add, gal = 500, vol, newVol, hour;
printf("Please enter additional water added per hour: ");
scanf("%f", &add);
for (int hour = 0; hour <= 24; hour++)
{
vol = gal * 0.90 + add;
}
printf("The volume is %f gallons after %d hours. \n", &vol, &hour);
}
您可以使用 gettimeofday() 函数获取初始时间(进程启动时),然后再次重复使用 gettimeofday() 获取当前时间。当 Current time 和 INitial time 相差 24 Hrs 时,跳出循环。
参考检查http://man7.org/linux/man-pages/man2/gettimeofday.2.html
您的程序存在多个问题:
- 你应该包括
<stdio.h>
double
类型的 scanf()
转换规范是 %lf
,而不是 %f
。
- 您应该测试
scanf()
的 return 值以避免在无效输入时出现未定义的行为。
- 循环迭代 25 次而不是 24 次。
- 更新卷的表达式
vol = gal * 0.90 + add;
不正确:您应该更新 gal
或仅使用 vol
。此外,如果在每小时开始时加水,则应 vol = (gal + add) * 0.90;
,但水箱不能容纳超过 500 加仑。如果在每小时结束时加水,您应该在加水之前测试它是否达到 100 加仑。
- 您没有测试
100
加仑的限制
-
printf
格式以及参数不正确:它应该是 printf("The volume is %f gallons after %f hours. \n", vol, hour);
或更好的 printf("The volume is %f gallons after %d hours. \n", vol, hour);
并且 hour
应该定义为 int
.
main
应该 return 0
.
这是更正后的版本:
#include <stdio.h>
int main() {
double add, gal = 500, vol;
int hour;
printf("Please enter additional water added per hour: ");
if (scanf("%lf", &add) != 1) {
printf("invalid input\n");
return 1;
}
for (vol = gal, hour = 1; hour <= 24; hour++) {
vol = vol * 0.90;
if (vol <= 100)
break;
/* water is added at the end of each hour */
vol += add;
/* the tank cannot hold more than 500 gallons */
if (vol > gal)
vol = gal;
}
printf("The volume is %f gallons after %d hours.\n", vol, hour);
return 0;
}
您可能想要计算体积下降到 100 加仑的确切时间,但这更复杂。
据我了解,这只是一个不需要实时的模拟。
只需添加以下行:
if (vol <= 100) break;
所以它退出for循环。
附带说明一下,您的代码中肯定还有其他错误。例如,vol
将始终是相同的值。此外,用于 for
循环的变量 hour
与您在外部使用的变量不同(例如在 printf
中)。你应该做类似的事情来让它工作:
vol = gal
for (hour = 0; hour <= 24; hour++)
{
vol = vol * 0.90 + add;
if (vol <= 100) break;
}
有一个 500 加仑的水箱用于 24小时内将鱼煎成Fish Fry。水箱漏水,每小时流失剩余水量的 10%。如何修复我的代码,使其在 24 小时后或油箱容量达到 100 加仑后停止执行。出于某种原因,我似乎无法全神贯注于 for 循环。
int main()
{
double add, gal = 500, vol, newVol, hour;
printf("Please enter additional water added per hour: ");
scanf("%f", &add);
for (int hour = 0; hour <= 24; hour++)
{
vol = gal * 0.90 + add;
}
printf("The volume is %f gallons after %d hours. \n", &vol, &hour);
}
您可以使用 gettimeofday() 函数获取初始时间(进程启动时),然后再次重复使用 gettimeofday() 获取当前时间。当 Current time 和 INitial time 相差 24 Hrs 时,跳出循环。
参考检查http://man7.org/linux/man-pages/man2/gettimeofday.2.html
您的程序存在多个问题:
- 你应该包括
<stdio.h>
double
类型的scanf()
转换规范是%lf
,而不是%f
。- 您应该测试
scanf()
的 return 值以避免在无效输入时出现未定义的行为。 - 循环迭代 25 次而不是 24 次。
- 更新卷的表达式
vol = gal * 0.90 + add;
不正确:您应该更新gal
或仅使用vol
。此外,如果在每小时开始时加水,则应vol = (gal + add) * 0.90;
,但水箱不能容纳超过 500 加仑。如果在每小时结束时加水,您应该在加水之前测试它是否达到 100 加仑。 - 您没有测试
100
加仑的限制 -
printf
格式以及参数不正确:它应该是printf("The volume is %f gallons after %f hours. \n", vol, hour);
或更好的printf("The volume is %f gallons after %d hours. \n", vol, hour);
并且hour
应该定义为int
. main
应该 return0
.
这是更正后的版本:
#include <stdio.h>
int main() {
double add, gal = 500, vol;
int hour;
printf("Please enter additional water added per hour: ");
if (scanf("%lf", &add) != 1) {
printf("invalid input\n");
return 1;
}
for (vol = gal, hour = 1; hour <= 24; hour++) {
vol = vol * 0.90;
if (vol <= 100)
break;
/* water is added at the end of each hour */
vol += add;
/* the tank cannot hold more than 500 gallons */
if (vol > gal)
vol = gal;
}
printf("The volume is %f gallons after %d hours.\n", vol, hour);
return 0;
}
您可能想要计算体积下降到 100 加仑的确切时间,但这更复杂。
据我了解,这只是一个不需要实时的模拟。
只需添加以下行:
if (vol <= 100) break;
所以它退出for循环。
附带说明一下,您的代码中肯定还有其他错误。例如,vol
将始终是相同的值。此外,用于 for
循环的变量 hour
与您在外部使用的变量不同(例如在 printf
中)。你应该做类似的事情来让它工作:
vol = gal
for (hour = 0; hour <= 24; hour++)
{
vol = vol * 0.90 + add;
if (vol <= 100) break;
}