Цикл при вычислении ряда Фибоначчи

Программа должна вычислить все числа Фибоначчи до числа введенного пользователем. (Ряд Фибоначчи — первые два числа единица, каждое последующее — это сумма двух предыдущих 1, 1, 2, 3, 5, 8...)
Создал массив под хранение чисел, инициализировал его единицей,
а в цикле начинаются чудеса. В проверочном выражении (число Фибоначчи < введенного числа) цикл продолжается пока не выйдет за пределы массива. Компилятор выдает ошибку времени компиляции связанную с переполнением стека (Stack around the variable num was corrupted).
В отладчике подсветил каждый шаг, выражение rowFibonachi[i] < num дает false и все равно цикл не прекращается пока в условие не добавишь rowFibonachi[i] < num && i < N . Но так цикл заполняет весь массив. Зато в цикле вывода результата это же проверочное условие срабатывает безошибочно.
Вот код, объясните пожалуйста в чем собственно проблема. СПАСИБО:)

#include <iostream>


const int N = 20;

int main()
{
    using namespace std;
    setlocale(0, "");
    int num;
    do{
        cout << "Введите число (от 2 до 20)\n"
            << "до которого следует вычислить числа Фибоначчи: ";
        cin >> num;
    }while (num <= 0 || 1 == num);

    long rowFibonachi[N];
    for (int j = 0; j < N; ++j) // инициализация массива единицей
        rowFibonachi[j] = 1;

    //////////////////////////////////////////////////////////////////////////////////////////////
    // здесь нужно делать вычисления пока число Фибоначчи меньше введенного
    int i;
    for (i = 2 ; (rowFibonachi[i] < num) && (i < N) ; i++)  // !!! проверочное выражение не проходит и...
        rowFibonachi[i] = rowFibonachi[i - 1] + rowFibonachi[i - 2];        // цикл продолжается пока не 
        // заполнит весь массив
    //////////////////////////////////////////////////////////////////////////////////////////////

    cout << "\nРяд Фибоначчи до " << num << "-го числа: ";
    for (i = 0; rowFibonachi[i] < num; ++i)
        cout << rowFibonachi[i] << " ";
    cout << endl;
    return 0;
}

К началу второго цикла (вычисление ряда Фибоначчи) массив содержит единицы. Перед любой итерацией второго цикла rowFibonachi[i] будет равно 1, что меньше num. Условие в цикле for проверяется перед выполнением тела цикла.

Условие (rowFibonachi[i] < num) надо проверять после вычисления i-ого члена ряда. Т.е. либо использовать break, либо использовать цикл с постусловием.

А вообще, для вычисления чисел Фибоначчи массив совершенно не обязателен. Достаточно помнить два предыдущих членов ряда.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.