Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Функции сравнения - C++

04.09.2012, 15:55. Просмотров 1219. Ответов 8
Метки нет (Все метки)

В классе, необходимо определить функции сравнения (аналогичные операторам отношения).

Какой вариант более оптимальный:
1. Определить в лоб, только функции == и > , а остальные через них (см.пример ниже).
2. Или определить каждую функцию в лоб?

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
bool HugeInteger::isEqualTo(const HugeInteger &ob2){
    int i;
    
    if (sgn != ob2.sgn) return false;
    
    for(i = MAX_SIZE - 1; i>=0; i--)
        if(num[i] != ob2.num[i]) break;
    
    return (i >= 0 ? false: true);
}
bool HugeInteger::isNotEqualTo(const HugeInteger &ob2){
    return !isEqualTo(ob2);
}
bool HugeInteger::isGreaterThan(const HugeInteger &ob2){
    int i;
    
    if(sgn < ob2.sgn) return false;
    else if(sgn > ob2.sgn) return true;
    else if(sgn && ob2.sgn){
        for(i=0; i<MAX_SIZE; i++){
            if(num[i] > ob2.num[i]) return true;
            else if(num[i] < ob2.num[i]) return false;
        }
    }else if(!sgn && !ob2.sgn){
        for(i=0; i<MAX_SIZE; i++){
            if(num[i] < ob2.num[i]) return true;
            else if(num[i] > ob2.num[i]) return false;
        }
    }
 
    return false;
}
bool HugeInteger::isLessThan(const HugeInteger &ob2){
    return !isGreaterThan(ob2) && !isEqualTo(ob2);
}
bool HugeInteger::isGreaterThanOrEqualTo(const HugeInteger &ob2){
    return isGreaterThan(ob2) || isEqualTo(ob2);
}
bool HugeInteger::isLessThanOrEqualTo(const HugeInteger &ob2){
    return !isGreaterThan(ob2);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 15:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функции сравнения (C++):

Шаблон функции сравнения для qsort() - C++
Хочу отсортировать массив из int и из double с помощью qsort(). Для этого необходимо определить функцию сравнения элементов. Думал...

Символы сравнения - C++
Приветствую. Пдскажите, пожалуйста, что означают символы сравнения &quot;:&quot; и &quot;?&quot; в контексте: while (x &gt; 0) { x -= div, ...

Сравнения символа - C++
Как сравнить символ из массива с символом &quot;;&quot; Так не получается: if(buffer==&quot;;&quot;)

сравнения строк - C++
Всем привет !! столкнулся с проблемой сравнения строки, объясните пожалуйста как правильно сравнить строки на етом примере ...

Счетчик сравнения - C++
куда его ставить?он ставиться перед if или после if?else и else if тоже ставим счетчик сравнения?while и do while?

сделать сравнения - C++
как сделать сравнение? Не могу понять. Пожалуйста, помогите. Задание: Рациональная (несократимая) дробь представляется парой целых...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 15:59 #2
bgm313, этож лаба, а не сурёзное приложение. Как компилится так и делай)
А реально, первый вариант типа круче.

Не по теме:

Ждем-с когда набигут и будут корованы грабить



Ну можно еще поперегружать операторы.
1
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 16:00 #3
Лучше в каждой функции сделайте сначала несколько простых проверок, чтобы быстро отбросить тривиальные случаи (числа разных знаков, разной длины, сравнение с нулём и т. п.), потом уже полную серьёзную проверку (её можно сделать в какой-то одной функции и вызывать из других).
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 16:04  [ТС] #4
Сомнения вызывают следующие факты:
Если тело каждой функции определить в лоб, тогда программа быдут работать быстрее, не будут вызываться другие функции. С другой стороны 1 вариант, при необходимости легче видоизменять.
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:05 #5
bgm313, перегрузка операторов. Смотрится красиво, и работает эффективно.
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 16:06  [ТС] #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
сравнение с нулём
Сравнение с нулём так, де требует проверки всего массива чаров из 40 элементов в моей программе. Может быть, как -то можно сделать так, чтобы не требовалось проверять весь массив?

Добавлено через 43 секунды
Цитата Сообщение от Invader_Zim Посмотреть сообщение
bgm313, перегрузка операторов
Я понимаю, но пока нужны только функции.
0
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
04.09.2012, 16:34 #7
Цитата Сообщение от bgm313 Посмотреть сообщение
Может быть, как -то можно сделать так, чтобы не требовалось проверять весь массив?
Я когда делал класс больших целых чисел объявлял еще атрибут класса, который хранил количество значащих разрядов ( где один разряд = 1 элемент массива). Сравнение при этом выглядит проще. Обход всего массива будет произведен только в случаях, когда количество значащих разрядов будет равно максимальному числу разрядов, и когда сравниваемые операнды различаются меньше чем на максимальное значение разряда.

Например, сравнение <:
1. сравниваем знаки
2. при равенстве знаков сравниваем количество значащих разрядов
3. при равенстве количества значащих разрядов сравниваем разряды числа начиная с самого значащего (при первом же несоответствии делаем соответствующий вывод)

И при таком раскладе сравнение с нулем тоже будет очень простой операцией. Нуль это либо число с количеством значащих разрядов равным нулю, либо число с одним разрядом, значение которого равно нулю, в зависимости от представления нуля.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.09.2012, 22:01 #8
bgm313, вообще, есть такая хорошая концепция - повторное использование кода. Она означает, что если в программе уже реализован функционал A и функционал B можно реализовать через функционал A напрямую или путём комбинации с каким-либо другим функционалом, то это обязательно стоит применить. Дублирование кода ни к чему хорошему не ведёт, с другой стороны, ради эффективности оно может быть выполнено компилятором самостоятельно (inline-функции), что на самом коде никак не отразится.
2
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
08.09.2012, 22:39 #9
Цитата Сообщение от bgm313 Посмотреть сообщение
Определить в лоб, только функции == и > , а остальные через них
Достаточно перегрузить в своём классе операторы < и ==, остальное в принципе уже придумано. Но есть свои тонкости, читайте внимательнее...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 22:39
Привет! Вот еще темы с ответами:

сделать сравнения - C++
Вот программа: #include&amp;lt;iostream&amp;gt; #include&amp;lt;conio.h&amp;gt; #include &amp;lt;math.h&amp;gt; using namespace std;class rational { ...

Переменный оператор сравнения - C++
Добрый день. Интересует такой вопрос: возможно ли переменной присвоить значение оператора сравнения. Что-то типа такого: if (i==1) ...

Перегрузка операторов сравнения - C++
Вот этот класс. Помогите пожалуйста. #include &lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;cstring&gt; using namespace std; ...

Структура сравнения контейнера - C++
Имеется контейнер multiset&lt;AnsiString, Compare&gt; Compare структура сравнения. Вот, и мне нужно упорядочить строки по увеличению длины и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2012, 22:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru