Язык программирования C++. Вводный курс

         

и эта реализация содержит ошибку.












// альтернативная реализация

// с помощью пары

#include <uti1ity>

#include <vector>

typedef pair<int,int> min_va1_pair;

min_va1_pair

min( const vector<int> &ivec )

{

    int minVal = 0;

    int occurs = 0;

    // то же самое ...

    return make_pair( minVal, occurs );



}

К сожалению, и эта реализация содержит ошибку. Где же она? Правильно: мы инициализировали minVal

нулем, поэтому, если минимальный элемент вектора больше нуля, наша реализация вернет нулевое значение минимума и нулевое значение количества вхождений.

Программу можно изменить, инициализировав minVal первым элементом вектора:

int minVal = ivec[0];

Теперь функция работает правильно. Однако в ней выполняются некоторые лишние действия, снижающие ее эффективность.











// исправленная версия min()

// оставляющая возможность для оптимизации ...

int minVal = ivec[0];

occurs = 0;

int        size = ivec.size();

for        ( int ix = 0; ix < size; ++ix )

{

    if ( minVal == ivec[ ix ] )

        ++occurs;



    // ...

Поскольку ix

инициализируется нулем, на первой итерации цикла значение первого элемента сравнивается с самим собой. Можно инициализировать ix

единицей и избежать ненужного выполнения первой итерации. Однако при оптимизации кода мы допустили другую ошибку (наверное, стоило все оставить как было!). Сможете ли вы ее обнаружить?











// оптимизированная версия min(),

// к сожалению, содержащая ошибку...

int minVal = ivec[0];

occurs = 0;

int        size = ivec.size();

for        ( int ix = 1; ix < size; ++ix )

{

    if ( minVal == ivec[ ix ] )

        ++occurs;



    // ...

Если ivec[0]

окажется минимальным элементом, переменная occurs не получит значения 1. Конечно, исправить это очень просто, но сначала надо найти ошибку:











int minVal = ivec[0];



occurs = 1;

К сожалению, подобного рода недосмотры встречаются не так уж редко: программисты тоже люди и могут ошибаться. Важно понимать, что это неизбежно, и быть готовым тщательно тестировать и анализировать свои программы.


Содержание  Назад  Вперед







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий