Menu
Coddy logo textTech

Обобщенное сравнение

Часть раздела Объектно-ориентированное программирование путешествия по 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, чтобы отсортировать массив целых чисел в порядке возрастания.

challenge icon

Задание

Легко
Напиши функцию compare_ints, которая сравнивает два целых числа в соответствии со стандартным соглашением о функции сравнения, используемым универсальными алгоритмами, такими как qsort.

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

Соглашение о возвращаемом значении:

  • Верни отрицательное значение, если первое целое число стоит перед вторым (first < second)
  • Верни ноль, если оба целых числа равны
  • Верни положительное значение, если первое целое число стоит после второго (first > second)

Параметры:

  • a (int): первое целое число для сравнения
  • b (int): второе целое число для сравнения

Возвращаемое значение: целое число, указывающее порядок: отрицательное, если a < b, ноль, если a == b, положительное, если a > b.

Подсказка: Приём с вычитанием из урока позволяет получить элегантное однострочное решение.

Попробуйте сами

int compare_ints(int a, int b) {
    // Напишите код здесь
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C