Обобщенное сравнение
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 52 из 61.
Универсальным функциям, таким как qsort и bsearch в стандартной библиотеке C, нужен способ сравнивать элементы, не зная их типов. Решение — функция сравнения: функция, которую вы пишете, а универсальный алгоритм вызывает всякий раз, когда ему нужно сравнить два элемента.
Стандартная сигнатура функций сравнения:
int compare(const void* a, const void* b);Оба параметра имеют тип const void*, поскольку универсальная функция не знает, элементы какого типа вы сортируете. Возвращаемое значение соответствует определённому соглашению:
| Возвращаемое значение | Значение |
|---|---|
| Отрицательное | a находится перед b |
| Ноль | a равно b |
| Положительное | a находится после b |
Внутри функции сравнения вы приводите указатели void* к фактическому типу и сравниваете значения. Вот как сравнивать целые числа:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}Трюк с вычитанием хорошо работает для целых чисел: если a меньше, результат отрицательный; если равны — ноль; если больше — положительный. Теперь эту функцию можно передать в qsort, чтобы отсортировать массив целых чисел в порядке возрастания.
Задание
ЛегкоНапиши функцию compare_ints, которая сравнивает два целых числа в соответствии со стандартным соглашением о функции сравнения, используемым универсальными алгоритмами, такими как qsort.
Твоя функция должна сравнить два значения и вернуть результат, указывающий на их взаимный порядок.
Соглашение о возвращаемом значении:
- Верни отрицательное значение, если первое целое число стоит перед вторым (first < second)
- Верни ноль, если оба целых числа равны
- Верни положительное значение, если первое целое число стоит после второго (first > second)
Параметры:
a(int): первое целое число для сравненияb(int): второе целое число для сравнения
Возвращаемое значение: целое число, указывающее порядок: отрицательное, если a < b, ноль, если a == b, положительное, если a > b.
Подсказка: Приём с вычитанием из урока позволяет получить элегантное однострочное решение.
Попробуйте сами
int compare_ints(int a, int b) {
// Напишите код здесь
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик7Указатели на функции
Объявление указателей на функцииВызов указателей на функцииTypedef для указателей на функцииПередача функций в качестве аргументовИтоги: Диспетчеризация калькулятора10Обобщенные контейнеры
Повторение: указатели voidОбобщенная оберткаОбобщенный обмен (Swap)Обобщенное сравнениеПовторение: обобщенный массив2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C