Найти три наибольших элемента массива - C (СИ)

Формулировка задачи:

Ввести массив действительных чисел длиной n (n < 30). Найти три наибольших элемента массива.

Код к задаче: «Найти три наибольших элемента массива - C (СИ)»

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 */
}

6   голосов, оценка 4.167 из 5


СОХРАНИТЬ ССЫЛКУ