Как создать программу симуляции, которая прекращает выполнение до или через симуляцию 24 часа - PullRequest
1 голос
/ 26 марта 2019

Существует 500-литровый резервуар с водой, который использовался для Держите рыбу, чтобы быть Фрай Фрай в течение 24 часов. Резервуар, как утечка, теряет воду из расчета 10% от оставшейся воды каждый час. Как мне исправить мой код, чтобы он прекратил выполнение через 24 часа или после того, как объем бака достигнет 100 галлонов. По какой-то причине я не могу обернуть голову вокруг петли.

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

}

Ответы [ 3 ]

3 голосов
/ 26 марта 2019

В вашей программе есть несколько проблем:

  • Вы должны включить <stdio.h>
  • Спецификация преобразования scanf() для типа double - %lf, а не %f.
  • Необходимо проверить возвращаемое значение scanf(), чтобы избежать неопределенного поведения при неверном вводе.
  • Цикл повторяется 25 раз вместо 24.
  • выражениеvol = gal * 0.90 + add; для обновления тома неверно: вы должны обновить gal или использовать просто vol.Кроме того, если вода добавляется в начале каждого часа, она должна составлять vol = (gal + add) * 0.90;, но бак не может вместить более 500 галлонов.Если вода добавляется в конце каждого часа, вы должны проверить, достигает ли она 100 галлонов, прежде чем добавлять больше воды.
  • Вы не проверяете предел 100 галлонов
  • the *Неверный формат 1027 *, а также аргументы: оно должно быть 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 галлонов, но это более сложно.

0 голосов
/ 26 марта 2019

Как я понимаю, это всего лишь симуляция, которая не должна быть в реальном времени.

Простое добавление строки:

if (vol <= 100) break;

Итак, он выходит из цикла for.

Кстати, в вашем коде есть и другие ошибки. Например, vol всегда будет иметь одинаковое значение. Также ваша переменная hour, используемая для цикла for, отличается от той, которую вы используете снаружи (например, в printf). Вы должны сделать что-то подобное, чтобы заставить это работать:

vol = gal
for (hour = 0; hour <= 24; hour++)
{
    vol = vol * 0.90 + add;
    if (vol <= 100) break;
}
0 голосов
/ 26 марта 2019

Вы можете использовать функцию gettimeofday (), чтобы получить начальное время (при запуске процесса), а затем снова несколько раз использовать gettimeofday (), чтобы получить текущее время. Когда разница между текущим временем и начальным временем составляет 24 часа, прервите цикл.

Для справки http://man7.org/linux/man-pages/man2/gettimeofday.2.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...