Распечатать последовательность Фибоначчи

У меня проблемы с печатью матрицы с рядом Фибоначчи. Когда я запускаю программу, она печатает последовательность с целым числом и остальными нулями. Я хотел бы север, чтобы иметь возможность заключить.

Функция последовательной печати:

void printArray(int _A[], int _sz)
{
    _A = new int(_sz);


    cout << ">>> [ ";
    for (int i = 0; i <= _sz; i++)
    {
        cout << _A[i] << " ";
    }
    cout << " ]\n";

}

Функция для вычисления последовательности:

int fib(int _limit, int *_A)
{
    int count = 0;
    int fib0 = 1;
    int fib1 = 1;
    int fib2 = 0;
    while (fib2 < _limit)
    {
        fib2 = fib0 + fib1;

        count++;  

        fib0 = fib1;
        fib1 = fib2;
    }

    _A = new int(count);
    for (int i = 0; i < count; i++)
    {
        cout << _A[i] << " ";
    }

    return count;
}

Главный:

int main()
{
    int L;            
    int *A = nullptr; 
    cout << ">>> Press number: "
    cin >> L; 

    if (L >= 0)
    {
        auto sz = fib(L, A); 
        cout << ">>> The Fibonacci series up to " << L << " is: \n";
        printArray(A, sz); .
    }
    else
        cout << ">>> Sorry, only positive integers accepted. Aborting...\n";
}

person Pedro Victor    schedule 03.03.2020    source источник
comment
Я не понимаю, что означает фраза, которую я хотел бы иметь на севере, чтобы быть в состоянии заключить.   -  person Robert Harvey    schedule 03.03.2020
comment
Когда вы запускаете программу, она должна ждать, пока вы введете число ;) какой ввод вы используете? Какой результат вы получаете?   -  person 463035818_is_not_a_number    schedule 03.03.2020
comment
void printArray(int _A[], int _sz) { _A = new int(_sz);...} Почему? Зачем перезаписывать параметр?   -  person churill    schedule 03.03.2020
comment
вы назначаете _A указатель, возвращенный из new, а затем ожидаете увидеть значения при печати _A[i] в цикле. Зачем?   -  person 463035818_is_not_a_number    schedule 03.03.2020
comment
Это хорошая возможность подружиться с std::vector, вашим отладчиком и вашей резиновой уткой (получите один, если у вас его еще нет), все они помогут вам здесь   -  person 463035818_is_not_a_number    schedule 03.03.2020
comment
Кстати. new int(_sz) создать одно единственное новое целое число в куче со значением _sz. может быть, вы хотели создать массив из _sz целых чисел -> new int[_sz]?   -  person churill    schedule 03.03.2020


Ответы (1)


У вас есть ряд проблем.

В printArray вы перезаписываете переданный массив одним целочисленным указателем _A = new int(_sz);, попытка напечатать все элементы массива приведет к неопределенному поведению.

В fib вы также используете new int(count);, опять же, это выделяет один указатель, а не массив. Вместо этого вы должны использовать new int[count];. Вы никогда не присваиваете значения элементам массива _A, поэтому они неинициализированы, и их использование является поведением undefined.

Вы не передаете массив _A обратно вызывающей функции. Вы можете исправить это, изменив объявление fib на:

int fib(int _limit, int *&_A)

Хороший способ исправить все эти проблемы — использовать std::vector вместо массива, тогда вам не нужно предварительно вычислять размер последовательности:

#include <iostream>
#include <vector>
using std::cout;
using std::cin;
using std::vector;

void printArray(const std::vector<int>& A)
{
    cout << ">>> [ ";
    for (int i : A)
    {
        cout << i << " ";
    }
    cout << " ]\n";

}

void fib(int _limit, std::vector<int>& A)
{
    int fib0 = 1;
    A.push_back(fib0);
    int fib1 = 1;
    int fib2 = 0;
    while (fib2 < _limit)
    {
        A.push_back(fib1);
        fib2 = fib0 + fib1;

        fib0 = fib1;
        fib1 = fib2;
    }
}

int main()
{
    int L;
    std::vector<int> A;
    cout << ">>> Press number: ";
    cin >> L; 

    if (L >= 0)
    {
        fib(L, A); 
        cout << ">>> The Fibonacci series up to " << L << " is: \n";
        printArray(A);
    }
    else
        cout << ">>> Sorry, only positive integers accepted. Aborting...\n";
}

Если вы изучаете какой-то извращенный курс информатики, который учит вас С++, но не позволяет вам использовать классы С++, тогда тот же код с использованием массивов может выглядеть так:

#include <iostream>
using std::cout;
using std::cin;

void printArray(int A[], int _sz)
{
    cout << ">>> [ ";
    for (int i = 0; i <= _sz; i++)
    {
        cout << A[i] << " ";
    }
    cout << " ]\n";

}

int fib(int _limit, int *A)
{
    int count = 0;
    int fib0 = 1;
    if (A) A[0] = fib0;
    int fib1 = 1;
    int fib2 = 0;
    while (fib2 < _limit)
    {
        count++;
        if (A) A[count] = fib1;
        fib2 = fib0 + fib1;
        fib0 = fib1;
        fib1 = fib2;
    }
    return count;
}

int main()
{
    int L;            
    int *A = nullptr; 
    cout << ">>> Press number: ";
    cin >> L;

    if (L >= 0)
    {
        auto sz = fib(L, A);
        A = new int[sz];
        fib(L, A);
        cout << ">>> The Fibonacci series up to " << L << " is: \n";
        printArray(A, sz);
    }
    else
        cout << ">>> Sorry, only positive integers accepted. Aborting...\n";
}
person Alan Birtles    schedule 03.03.2020