2010-10-18 3 views
2

Мне нужно придумать код, который проверяет, попадает ли заданное целое число в пределы диапазона. (. Спектр представлен парой целых чисел)Проверка того, что целое число попадает в диапазон, используя только <operator

Таким образом, учитывая диапазон r, определенный как std::pair<int, int> и тест-целое число n, я хочу сказать:

if (n >= r.first && n <= r.second)

Загвоздка , Для этого мне нужно использовать функцию сравнения std::less<int>, что означает, что я могу работать только с оператором меньше.

Я пытаюсь найти эквивалентное выражение. Я уверен, что у меня все правильно, но я не совсем уверен.

Выражение я придумал это:

(!cmp(n, r.first) && !cmp(r.second, n))

где cmp является экземпляром std::less<int>

ли я сделать это правильно?

+1

«Я сделал, что правильно? " Да. – aschepler

+0

Это домашнее задание? Трудно понять, почему вы не можете использовать полный набор операторов по известным значениям «int». –

ответ

7

Избирательные другие не лучший способ проверить правильность. :)

Вместо этого рассмотрите вашу проблему. Все, с чем вы имеете дело, это int, поэтому все значения могут быть представлены как int. Никакого сложения или вычитания не требуется, поэтому вам не нужно беспокоиться о том, чтобы оставить представленный диапазон. Таким образом, мы можем вернуться к стандартной математике с использованием стандартных целых чисел и оставить беспорядок представлений машин позади.

Вам предоставляется диапазон, закрытый на обоих концах [n, m], и значение p для проверки членства в этом диапазоне. У вас есть один оператор для целых чисел, который вы можете использовать, <. Все стандартные булевы операторы - честная игра.

Теперь вы можете просто подумать о множествах. Вы хотите отклонить все p так, чтобы p < n или p > m. Все остальные значения p приемлемы.Иными словами, p является частью требуемого набора, если

not ((p < n) or (m < p)) 

Использование законов де Моргана, это эквивалентно

(not (p < n)) and (not (m < p)) 

Представив, что при использовании стандартного C++ операторы (а не альтернативные варианты написания, предоставляемые <iso646.h>), мы получаем то, что вы предложили, но используя разные имена:

!<(p, n) && !<(m, p) 

переименование <() в cmp(), n к r.first, m к r.second и p к n, мы получаем именно то, что вы предложили:

!cmp(n, r.first) && !cmp(r.second, n) 

Итак, да, выглядит правильно для меня.

2

Да, не менее чем эквивалентно больше или равно, на самом деле во многих старых языках программирования <= на самом деле называется ngt для не больше и> = это nlt

0

Короткий ответ:

if (num < max && !(num <= min)) { // stuff to do } 

Это возвращает истину, если это «номер» между «мин» и «макс», но не равно ни одному из них.

Если вам это нужно, чтобы включить «мин» и «макс» в проверочной диапазон, использование:

if (num <= max && !(num < min)) { // stuff to do } 

Это работает, потому что ...

!(A > B) == (A <= B) // If not greater than B, must be less than or equal to B 
!(A >= B) == (A < B) // If not greater or equal to B, must be less than B 

!(A < B) == (A >= B) // If not less than B, must be greater or equal to B 
!(A <= B) == (A > B) // If not less than or equal to B, must be greater than B 
+1

Что делать, если num == max, я уверен, что он хочет включить диапазон – tobyodavies

+0

Да, это включено в него, см. Второй фрагмент кода. –

 Смежные вопросы

  • Нет связанных вопросов^_^