делать, пока условия выдают

Поэтому я пытаюсь убедиться, что пользователь вводит переменную в определенном наборе условий для использования в более поздних вычислениях. А именно, они не могут превышать vmax, быть не ниже нуля и не быть строкой.

Вот что у меня есть.

    do
    {
        scanf("%f", &vkmh);
        if (vkmh <= vmax)
        {
        }           
        else if (vkmh < 0)
        {
            printf("Error, speed must be positive.\n");
        }
        else if (vkmh > vmax)
        {
            printf("Error, the max speed of this vehicle is listed as %.fkm/h.\nIt cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax);
        }
        else if (vkm != getchar())
        {
            printf("Error in input. Please only use numbers\n");
        }
    }
    while(vkmh > vmax || vkmh < 0 || vkm != getchar());

Теоретически допустимые значения возвращают действительный ответ, а значение выше vmax возвращает недопустимый ответ и запрашивает повторный вход пользователя. Но отрицание или строка ничего не возвращает.

Любые идеи о том, как я могу заставить это работать?


person Eureka KN    schedule 26.03.2016    source источник
comment
Просто уведомление. Конструкция if (vkmh <= vmax) { X } else if (vkmh < 0) { Y } никогда не выполнит ветвь Y, когда vmax >= 0.   -  person Marian    schedule 26.03.2016
comment
Итак, как мне указать отдельные операции для этих условий?   -  person Eureka KN    schedule 26.03.2016
comment
Слышали ли вы о концепции делать одно дело за раз?   -  person Ed Heal    schedule 26.03.2016
comment
при вызове любой из функций scanf() всегда проверяйте возвращаемое значение (а не значение параметра), чтобы убедиться, что операция прошла успешно. Примечание: если пользователь ввел в качестве первого символа не цифру, возвращаемое значение из отправленного вызова scanf() будет равно 0.   -  person user3629249    schedule 27.03.2016
comment
учитывая эти строки: `if (vkmh ‹= vmax) { } else if (vkmh ‹ 0)` если vkmh < 0 также меньше vmax, поэтому задаются неправильные вопросы (или, по крайней мере, в неправильном порядке).   -  person user3629249    schedule 27.03.2016


Ответы (2)


Вы можете использовать приведенный ниже код для достижения того, что вы ищете. Обратите внимание, что ответ очень похож на этот ответ:

Как scanf только целое число и повторять чтение, если пользователь вводит нечисловые символы?

#include<stdlib.h>
#include<stdio.h>

int clean_stdin()
{
    while (getchar()!='\n');
    return 1;
}

int main ()
{
    float vkmh, vmax = 100.0;

    setbuf(stdout, NULL);

    vkmh = vmax + 1.0; /* value to start the loop */
    while ( vkmh < 0 || vkmh > vmax) {
        printf("Please enter value for the velocity in km/h: ");
        if (scanf("%f",&vkmh) == 1) {
            if (vkmh < 0) {
                /* This was your 2nd if condition, but would never have executed assuming that vmax > 0. */
                printf("Error, speed must be positive.\n");
                exit(1);
            } else if (vkmh <= vmax) {
                /* Do something */
            } else {
                /* No need for the else if, this is the only other possibility */
                printf("Error, the max speed of this vehicle is listed as %.fkm/h.\n"
                       "It cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax);
            }
        } else {
            printf("Error in input.\n");
            clean_stdin();
        }
    }
    printf("\nValue read: %f km/h\n",vkmh);
    return 0;
}
person PZwan    schedule 26.03.2016

Во-первых, это C, а не C#. getchar читать из стандартного ввода, поэтому на каждой итерации вы вызываете (до) 3 раза getchar() и читаете 3 раза пользовательский ввод. Таким образом, вы можете удалить эти звонки.

scanf возвращает количество успешных конверсий, поэтому вы можете использовать это (==1), чтобы проверить, не ввел ли пользователь правильное значение с плавающей запятой.

Редактировать: я удалил код, так как не могу скомпилировать на своем телефоне, извините. Используйте fgets/atof, как в примере на этой странице http://www.cplusplus.com/reference/cstdlib/atof/

person Sylvain P.    schedule 26.03.2016
comment
Эта структура прекрасно работает с числами, но плохо работает со строками. Если вы введете что-то вроде K, ошибка во входном сообщении будет повторяться бесконечно. - person Eureka KN; 26.03.2016
comment
Извините, забыл переменную состояния. Замените на тип bool, если вы используете С++ - person Sylvain P.; 26.03.2016
comment
добавьте scanf("%c",&c); внутри if (scanf("%f", &vkmh) != 1), чтобы использовать введенный символ! - person Rajeev Singh; 26.03.2016
comment
По-прежнему получаю сообщение об ошибке при вводе строки - person Eureka KN; 26.03.2016