С++: треугольник Паскаля - странные результаты

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

Triangle 4 0 1 2 3

должен возвращать элементы: 0, 1, 2 and 3 из строки номер 4, но возвращает странные вещи, например:

Element 0: 1
Element 1: 10179988
Element 2: 50792126
Element 3: 91425820

Понятия не имею, почему
Вот мой код:

#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Pascal {
    private:
        int *tab;

    public:
        Pascal(int n) throw(string) {
            if (n < 0)
                throw (string)"";

            tab = new int[n+1];

            for(int i = 1; i <= n; i++) {
                for(int k = i; k >=0; k--) {
                    if (k - 1 >= 0)
                        tab[k] += tab[k-1];
                    else
                        tab[k] = 1;
                }
            }
        };

    int element(int m) {
        return tab[m];
    }
};

int main(int argc, char* argv[]) {
        int n = 0, m = 0, elem = 0;

        try {
            n = strtol(argv[1], NULL, 0);
            Pascal *row;

            for(int i = 2; i < argc; i++) {
                try {
                    m = strtol(argv[i], NULL, 0);
                    row = new Pascal(n+1);

                    if (m <= n && m >= 0) {
                        elem = row->element(m);
                        cout << "Element " << m << ": "<< elem << endl;
                    } else
                        cout << m << " - bad element index" << endl;

                } catch (string ex) {
                    cout << argv[i] << " - bad element index!" << endl;
                    continue;
                }

                delete[] row;
            }
        } catch (string e) {
            cout << argv[1] << " - bad row index!" << endl;
            return 0;
        }
    }

буду благодарен за любой ответ


person jedrzejginter    schedule 11.03.2014    source источник
comment
Когда вы получаете невероятно странные числа, это признак неинициализированной памяти.   -  person Martin Drozdik    schedule 12.03.2014
comment
Что мне делать тогда? (Извините, но я не очень хорош в этом)   -  person jedrzejginter    schedule 12.03.2014
comment
Попробуйте отладить программу. Идите шаг за шагом и посмотрите, делает ли он то, что вы думаете.   -  person Martin Drozdik    schedule 12.03.2014


Ответы (2)


Пытаться

tab = new int[n+1];

for(int i = 0; i <= n; i++) {
    tab[i] = 1;
    for(int k = i; --k > 0; )
        tab[k] += tab[k-1];
}
person CiaPan    schedule 11.03.2014
comment
Спасибо приятель! Мне пришлось изменить i <= n на i < n, и он отлично работает :) - person jedrzejginter; 12.03.2014

           tab = new int[n+1];

            for(int i = 1; i <= n; i++) {
                for(int k = i; k >=0; k--) {
                    if (k - 1 >= 0)
                        tab[k] += tab[k-1];
                    else
                        tab[k] = 1;
                }
            }

first iteration:  i=1, k=1, tab[1]+=tab[0];
second iteration: i=1, k=2, tab[2]+=tab[1]; 

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

Я думаю, что замена if (k - 1 >= 0) на if (k - 1 > 0) должна решить вашу проблему.

person Pandrei    schedule 11.03.2014
comment
Спасибо за ответ, но он мало что изменил. Теперь first and second element равно 1 - person jedrzejginter; 12.03.2014