Функция: подсчет количества сравнений чисел, выполняемых при операциях сортировки/поиска - C (СИ)
Формулировка задачи:
Подсчет количества сравнений чисел, выполняемых при операциях сортировки, многократного линейного и многократного бинарного поиска.Помогите написать функцию)
Решение задачи: «Функция: подсчет количества сравнений чисел, выполняемых при операциях сортировки/поиска»
textual
Листинг программы
#include <stdio.h>
/* с(expr) - сравнение*/
#define c(x) compare(x, 0)
/* cn() - возврат кол-ва сравнений */
#define cn() compare(0, 1)
/* cr() - сброс счетчика сравнений */
#define cr() compare(0, -1)
unsigned compare(int cmp, int op)
{
static unsigned countcmps = 0;
if (!op)
{
countcmps++;
return cmp;
}
if (op == -1) countcmps = 0;
return countcmps;
}
int main()
{
/* 2 сравнения */
printf("1 > 0?: %d\n5 < 3?: %d\n5 || 3?: %d\n1 && 0?: %d\n",
c(1 > 0), c(5 < 3), c(5 || 3), c(1 && 1));
/* кол-во сравнений */
printf("total compares: %d, then reset: cr()\n", cn());
cr(); /* сброс счетчика */
printf("total compares: %d\n", cn());
return 0;
}
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций вывода
- Определяем макросы c(x) и cn() для подсчета сравнений в функции main()
- Определяем макрос cr() для сброса счетчика сравнений
- Создаем функцию compare(int cmp, int op) для подсчета количества сравнений
- В функции compare(int cmp, int op) используем статическую переменную countcmps для хранения количества сравнений
- Если op равно 0, увеличиваем countcmps на 1 и возвращаем cmp
- Если op равно -1, сбрасываем countcmps в 0 и возвращаем countcmps
- Возвращаем countcmps в случае всех остальных значений op
- В функции main() выполняем 4 сравнения с использованием макроса c(x) и выводим результаты
- Выводим общее количество сравнений с использованием макроса cn() и сбрасываем счетчик с помощью макроса cr()
- Выводим общее количество сравнений после сброса счетчика
- Завершаем программу с возвратом 0