Состояния воды (температурная программа) — программирование на C

#c #if-statement #while-loop #temperature

#c #оператор if #цикл while #температура

Вопрос:

Я работаю над программой, в которой я должен использовать логические операторы в if / else, чтобы получить от пользователя значение температуры и символ градуса и распечатать состояние (лед, жидкость, пар), в котором находится вода.

Пример ввода и вывода:

    Enter temperature, such as 31 F: 101c
   Water is steam at 101c.
  

Мой код размещен ниже. Кажется, что это должно сработать, но я думаю, что я неправильно выполняю ввод и, следовательно, цикл не вводится. Не уверен, как это исправить.

 #include <stdio.h>


int main(void)
{

    double temp;
    char CorF;

    printf("Please enter a temperature, such as 31 F:");

    while (scanf_s("%lf %c", amp;temp, amp;CorF, 2) == 1)
    {

        if (temp <= 32 amp;amp; CorF == 'F')
        {
            printf("Water is ice at %lf %c.n", temp, CorF);
        }
        else if (temp >= 212 amp;amp; CorF == 'F')
        {
            printf("Water is steam at %lf %c.n", temp, CorF);
        }
        else if (temp > 32 amp;amp; temp < 212 amp;amp; CorF == 'F')
        {
            printf("Water is liquid at %lf %c.n", temp, CorF);
        }
        else if (temp <= 0 amp;amp; CorF == 'C')
        {
            printf("Water is ice at %lf %c.n", temp, CorF);
        }
        else if (temp >= 100 amp;amp; CorF == 'C')
        {
            printf("Water is steam at %lf %c.n", temp, CorF);
        }
        else if (temp < 0 amp;amp; temp > 100 amp;amp; CorF == 'C')
        {
            printf("Water is liquid at %lf %c", temp, CorF);
        }
        else
        {
            // blank line!
        }
    }

    return 0;

}
  

Комментарии:

1. scanf возвращает количество успешных преобразований, поэтому хорошее возвращаемое значение в вашем случае равно 2. Кроме того, если пользователь вводит 101c , ни одно из условий не будет выполнено, потому 'c' что это не то же самое, что 'C'

2. scanf_s("%lf %c", amp;temp, amp;CorF, 2) == 1 —> scanf_s("%lf %c", amp;temp, amp;CorF, 1) == 2

3. temp < 0 amp;amp; temp > 100 —> temp > 0 amp;amp; temp < 100

4. Когда вы определяете, что «мой цикл не вводится», вместо того, чтобы тратить время на публикацию вопроса здесь, спросите себя «почему это так?»… Ответ, если вы не уверены, — поэкспериментировать. Спросите: «Интересно, какое значение sscanf_s возвращается». Используйте отладчик или измените код для сохранения и отображения результата. Этот базовый навык исследования и любознательности избавит вас от необходимости задавать 99% вопросов, которые вы могли бы задать на этом сайте.

Ответ №1:

В вашем коде много ошибок. Пока это цикл, он используется для зацикливания. Когда вы проверяете его с помощью scanf_s, он будет проверять значение при вводе каждый раз в цикле. Вместо использования while вы должны использовать оператор if .

 #include<stdio.h>
int main(void)

{


double temp;
char CorF;

printf("Please enter a temperature, such as 31 F:");
int i=scanf("%lf %c", amp;temp, amp;CorF);
if(i==2)
{

    if (temp <= 32 amp;amp; CorF == 'F')
    {
        printf("Water is ice at %lf %c.n", temp, CorF);
    }
    else if (temp >= 212 amp;amp; CorF == 'F')
    {
        printf("Water is steam at %lf %c.n", temp, CorF);
    }
    else if (temp > 32 amp;amp; temp < 212 amp;amp; CorF == 'F')
    {
        printf("Water is liquid at %lf %c.n", temp, CorF);
    }
    else if (temp <= 0 amp;amp; CorF == 'C')
    {
        printf("Water is ice at %lf %c.n", temp, CorF);
    }
    else if (temp >= 100 amp;amp; CorF == 'C')
    {
        printf("Water is steam at %lf %c.n", temp, CorF);
    }
    else if (temp < 0 amp;amp; temp > 100 amp;amp; CorF == 'C')
    {
        printf("Water is liquid at %lf %c", temp, CorF);
    }
    else
    {
       ; // blank line!
    }
}

return 0;
}
  

Вы можете использовать этот код.
Из scanf: при успешном выполнении функция возвращает количество успешно прочитанных элементов. Это количество может соответствовать ожидаемому количеству показаний или меньше, даже нулю, если произойдет сбой сопоставления. В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.