Найти три наибольших элемента массива - C (СИ)
Формулировка задачи:
Ввести массив действительных чисел длиной n (n < 30). Найти три наибольших элемента массива.
Решение задачи: «Найти три наибольших элемента массива»
textual
Листинг программы
#include "greatest.h" double* max3(const double* arr, unsigned int siz) { static double max[3]; if( siz < 3 ) { return NULL; } max[0] = max[1] = max[2] = *arr; while( --siz ) { ++arr; if( *arr < max[2] ) { continue; } if( *arr > max[0] ) { max[2] = max[1]; max[1] = max[0]; max[0] = *arr; } else if( *arr > max[1] ) { max[2] = max[1]; max[1] = *arr; } else { max[2] = *arr; } } return max; } TEST max3_123() { double arr[] = { 1.0, 2.0, 3.0 }; double* max = max3(arr, sizeof(arr) / sizeof(arr[0])); if( !max ) { FAIL(); } ASSERT_EQ(3.0, max[0]); ASSERT_EQ(2.0, max[1]); ASSERT_EQ(1.0, max[2]); PASS(); } TEST max3_1243() { double arr[] = { 1.0, 2.0, 4.0, 3.0 }; double* max = max3(arr, sizeof(arr) / sizeof(arr[0])); if( !max ) { FAIL(); } ASSERT_EQ(4.0, max[0]); ASSERT_EQ(3.0, max[1]); ASSERT_EQ(2.0, max[2]); PASS(); } TEST max3_15243() { double arr[] = { 1.0, 5.0, 2.0, 4.0, 3.0 }; double* max = max3(arr, sizeof(arr) / sizeof(arr[0])); if( !max ) { FAIL(); } ASSERT_EQ(5.0, max[0]); ASSERT_EQ(4.0, max[1]); ASSERT_EQ(3.0, max[2]); PASS(); } SUITE(test_max3) { RUN_TEST(max3_123); RUN_TEST(max3_1243); RUN_TEST(max3_15243); } /* Add definitions that need to be in the test runner's main file. */ GREATEST_MAIN_DEFS(); int main(int argc, char **argv) { GREATEST_MAIN_BEGIN(); /* command-line arguments, initialization. */ RUN_SUITE(test_max3); GREATEST_MAIN_END(); /* display results */ }
Объяснение кода листинга программы
- В функции
max3
мы ищем три наибольших элемента в массивеarr
длинойsiz
. - Мы используем статический массив
max
размером 3 для хранения найденных максимальных значений. - Если длина массива
siz
меньше 3, функция возвращаетNULL
, указывая, что не удалось найти три наибольших элемента. - Изначально все элементы массива
max
устанавливаются равными первому элементу массиваarr
. - Затем мы проходим по всем оставшимся элементам массива
arr
. - Если текущий элемент меньше второго максимального значения в массиве
max
, мы пропускаем его и переходим к следующему элементу. - Если текущий элемент больше первого максимального значения в массиве
max
, мы обновляем значения второго и третьего максимальных значений, а затем обновляем первое максимальное значение. - Если текущий элемент больше второго максимального значения в массиве
max
, мы обновляем значения второго и третьего максимальных значений. - Если текущий элемент больше третьего максимального значения в массиве
max
, мы обновляем только третье максимальное значение. - По завершении цикла функция возвращает массив
max
. - В функции
main
мы определяем тестовые случаи, используя функциюASSERT_EQ
для проверки правильности работы функцииmax3
. - Мы также определяем тестовый набор
test_max3
, который содержит все тестовые случаи, и запускаем его с помощью функцииRUN_SUITE
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д