c - 如何在模拟 24 小时之前或模拟 24 小时内停止执行的模拟程序
问题描述
有一个 500 加仑的水箱,用于在 24 小时内将鱼放入鱼苗。水箱漏水,每小时损失剩余水量的 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);
}
解决方案
您的程序中存在多个问题:
- 你应该包括
<stdio.h>
- 类型的
scanf()
转换规范double
是%lf
,不是%f
。 - 您应该测试 的返回值
scanf()
以避免无效输入的未定义行为。 - 循环迭代 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
应该返回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 加仑的确切时间,但它更复杂。
推荐阅读
- node.js - 羽毛js中的关联查询
- java - Spring @WebMvcTest 与 Spring Security
- r-markdown - 目录Rmarkdown中溢出文本的省略号或缩进
- javascript - webpack 块名称动态导入的公共路径问题
- javascript - 使用钩子获取数据需要很长时间
- swift - 有没有办法在 UITest 中使用 .selectedSegmentIndex 而不是 .buttons["name"]?
- expect - 期望脚本以交互方式回答问题
- javascript - 反应,axios,内容类型
- apache-kafka - Kafka - 未压缩主题与压缩主题
- java - 使用 Java API for Bitbucket 在空存储库中创建分支