Диапазон целых чисел должен соответствовать 3 различным условиям - PullRequest
0 голосов
/ 18 мая 2018

Если бы я хотел ограничить диапазон значений, которые должны быть присвоены целому, тремя различными условиями. например; Должно быть от 9 до 95, а также делиться на 5, это будет правильным способом для достижения этой цели?

Мне сказали, что у меня может быть несколько условий, если они разделены символом &&, но у меня мало успеха с моим кодом.

if (input >= 5 && input <= 95 && input %5)

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Существует число проблем с вашим кодом в его нынешнем виде.Во-первых, откровенные ошибки:

  • Выражение input % 5 даст вам остаток при делении на пять.Это означает, что вы получите ноль, если будет кратным, в противном случае ненулевое значение.К сожалению, ноль обрабатывается как false , поэтому это будет верно только в том случае, если input равно , а не , кратному.Правильное выражение: (input % 5) == 0.

  • Если вы введете что-то, что не может быть интерпретировано как целое число, scanf не удастся и input останется с тем значением, которое былозаранее.Это должно быть обнаружено и выполнено, проверив возвращаемое значение - это даст вам количество успешно отсканированных элементов, поэтому должно быть одним.

  • Ваш код, похоже, возвращает значение, если все в порядке, новернуть ничего , если оно недействительно.

Далее, хотя это и не ошибки, это мои личные предпочтения, которые могут облегчить чтение и обслуживание кода:

  • Я предпочитаю явно отдельных подвыражений, поэтому мне никогда не придется беспокоиться о правилах приоритета (при условии, что это не делает выражение нечитаемым в процессе).Для этого я бы сделал полное заявление if if ((input >= 5) && (input <= 95) && ((input % 5 == 0)).

  • Я не большой поклонник конструкции if (condition) transferControl else ..., поскольку else равен полностью лишнее.

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

  • Функция (при условии, что это функция, которая кажется вероятной) обычно должна делать одну вещь,например, проверьте, является ли значение допустимым.Запись проблем в стандартный вывод, вероятно, лучше оставить вызывающей стороне, чтобы функция действительно использовалась повторно.Было бы лучше иметь функцию, выполняющую проверку и возвращающую некоторое значение, чтобы указать, был ли сбой, или с значением, если оно действительно.

  • Обычно лучше использовать puts("something"), а не printf("something\n").Вызов printf лучше всего оставить там, где вам действительно нужно для форматирования аргументов.


Учитывая все это, код, который я хотел быposit будет выглядеть следующим образом:

#include <stdbool.h>

bool InputValidRangeAndMultiple(
    unsigned *pValue,
    unsigned minVal,
    unsigned maxVal,
    unsigned multVal
) {
    unsigned input;

    // If no unsigned int available, error.

    if (scanf("%u", pValue) != 1) return false;

    // If value invalid in any way (range or multiple), error.

    if ((*pValue < minVal) || (*pValue > maxVal)) return false;

    if ((*pValue % multVal) != 0) return false;

    // Value is now deemed okay.

    return true;
}

Вызов этой функции может быть выполнен таким образом, с обработкой запросов и ошибок за пределами функции «ввода и проверки»:

#include <stdio.h>

unsigned value;

puts("Enter Value.\nValue must be divisible by 5 and within 5 and 95...");
if (! InputValidRangeAndMultiple(&value, 5u, 95u, 5u)) {
    puts("Invalid input...");
    returnOrDoSomethingIntelligent();
}
// The 'value' variable is now valid.
0 голосов
/ 18 мая 2018

Ваш код мне подходит, за исключением этой строки.

if (input >= 5 && input <= 95 && input %5)

Выражение input % 5 возвращает остаток от input/5.Вы хотите, чтобы input делилось на 5, что происходит, когда input % 5 возвращает остаток от 0. Поскольку C интерпретирует 0 как false и почти все другие целые как true, это выражение будет делать в точности противоположность того, что вы хотитеэто делать.Попробуйте использовать

if (input >= 5 && input <= 95 && (input % 5 == 0))

Это должно делать то, что вы хотите.

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