Найти три наибольших элемента массива - 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 */
}

Объяснение кода листинга программы

  1. В функции max3 мы ищем три наибольших элемента в массиве arr длиной siz.
  2. Мы используем статический массив max размером 3 для хранения найденных максимальных значений.
  3. Если длина массива siz меньше 3, функция возвращает NULL, указывая, что не удалось найти три наибольших элемента.
  4. Изначально все элементы массива max устанавливаются равными первому элементу массива arr.
  5. Затем мы проходим по всем оставшимся элементам массива arr.
  6. Если текущий элемент меньше второго максимального значения в массиве max, мы пропускаем его и переходим к следующему элементу.
  7. Если текущий элемент больше первого максимального значения в массиве max, мы обновляем значения второго и третьего максимальных значений, а затем обновляем первое максимальное значение.
  8. Если текущий элемент больше второго максимального значения в массиве max, мы обновляем значения второго и третьего максимальных значений.
  9. Если текущий элемент больше третьего максимального значения в массиве max, мы обновляем только третье максимальное значение.
  10. По завершении цикла функция возвращает массив max.
  11. В функции main мы определяем тестовые случаи, используя функцию ASSERT_EQ для проверки правильности работы функции max3.
  12. Мы также определяем тестовый набор test_max3, который содержит все тестовые случаи, и запускаем его с помощью функции RUN_SUITE.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы