【问题标题】:How to a simulation program that stops executing before or at simulated 24 hours如何在模拟 24 小时前或模拟 24 小时内停止执行的模拟程序
【发布时间】:2019-03-26 06:58:07
【问题描述】:

有一个 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);

}

【问题讨论】:

  • 简单:记下开头的时间戳,每隔一段时间,不断检查时间戳。
  • 在你的循环中添加一个条件来检查音量?
  • if (vol &gt;= 100.0) break; 添加到循环中?虽然我不明白如果油箱容量为 500 加仑,“100”...
  • 或在声明时初始化vol = 0.0,然后初始化for (int hour = 0; hour &lt;= 24 &amp;&amp; vol &gt;= 100; hour++)(假设您想继续煎炸直到油量低于100 gal - 根据需要调整测试)AND &amp;vol, &amp;hour); 应该是 vol, hour);。 (没有'&amp;'签名打印)
  • 这意味着您没有充分启用编译器警告。对于 gcc/clang 添加 -Wall -Wextra -pedantic 到你的编译字符串,对于 VS 添加 /W3,并且在编译没有警告之前不要接受代码。

标签: c for-loop simulation


【解决方案1】:

你的程序有多个问题:

  • 你应该包括&lt;stdio.h&gt;
  • double 类型的 scanf() 转换规范是 %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 加仑的确切时间,但这更复杂。

【讨论】:

  • 在 C 中(我认为是从 C99 开始),您不需要在 main 中使用 return,如果缺少它,则预期返回值 0。
  • @hyde:这对于 C99 和更高版本是正确的,委员会破解了 C 规范,以确保如果 main 在没有返回语句的情况下离开,草率的遗留代码将隐式返回 0。将这种隐式 return 0; 显式化是很好的风格。
  • vol 怎么可能是&lt;= 100,因为上面的vol = gal * 0.90gal 在循环中是不变的?下面不应该是for (vol=gal, hour...vol *= 0.9吗?
  • @hyde: C19 5.1.2.2.1 程序启动 程序启动时调用的函数名为main。实现没有声明这个函数的原型。它应该用int 的返回类型定义并且没有参数:int main(void) { /* ... */ } 或有两个参数(这里称为argcargv,尽管可以使用任何名称,因为它们是本地的声明它们的函数):int main(int argc, char *argv[]) { /* ... */ } 或等效的或以其他一些实现定义的方式。
  • 其他实现定义方式通常指在 unix 系统中添加第三个参数如:int main(int argc, char **argv, char** envp) {...}。我想不出任何 void main() 会导致问题的 C 环境,但它仍然是不正确的。
【解决方案2】:

据我了解,这只是一个不需要实时的模拟。

只需添加一行:

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;
}

【讨论】:

    【解决方案3】:

    您可以使用 gettimeofday() 函数来获取初始时间(进程开始时),然后再次使用 gettimeofday() 重复获取当前时间。当前时间和初始时间的差值为 24 小时时,退出循环。

    参考检查http://man7.org/linux/man-pages/man2/gettimeofday.2.html

    【讨论】:

    • 嗯——是的,但是循环 hour = 0; hour &lt;= 24; ... 是通过循环计数 :) 来实现的
    • 我不认为问题在于等待实际的 24 小时,而是尽可能快地运行模拟,因此 gettimeofday 没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2023-03-27
    • 2010-12-05
    • 2021-04-17
    • 2020-01-19
    相关资源
    最近更新 更多