• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Trójkąt Pascala C++ problem

VPS Starter Arubacloud
0 głosów
599 wizyt
pytanie zadane 25 marca 2021 w C i C++ przez p_wika Nowicjusz (190 p.)

Cześć! Mam problem ze zrozumieniem co zrobiłam nie tak jak trzeba. Program dla pierwszego wywołania argumentu funkcji main wybiera wiersz trójkąta Pascala a dla następnych argumentów podaje m-ty element tego wiersza. W Javie wszystko działało, natomiast w C++ wychodzą jakieś śmieci. Chodzi mi o zwrócenie szczególnej uwagi na algorytm w konstruktorze. Będę wdzięczna za każdą pomoc!

#include <iostream>
#include <string>
#include <exception>
using namespace std ;

class WierszTrojkataPascala {
    int* trojkat; //deklaracja tablicy dynamicznej, alokujemy pamiec
public:
    WierszTrojkataPascala(int n) {
        trojkat = new int[n + 1];//tworzymy tablice n+1 elementowa
        trojkat[0] = 1;

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j > 0; j--)
                trojkat[j] = trojkat[j] + trojkat[j - 1];
        }
    }

    int wspolczynnik(int m) throw(string) {
        if(m < 0) throw (string)"Nie moze byc numerem w wierszu";
        return trojkat[m];
    }
    ~WierszTrojkataPascala();//{ //nazwa destruktora jak nazwa klasy
};
 WierszTrojkataPascala:: ~WierszTrojkataPascala(){
     delete[] trojkat;
 }
int main(int argc, char* argv[]){
    int n, k; // n-pierwszy argument(wiersz), k-numer elementu danego wiersza
    try {
        n = stoi(argv[1]); //konwersja na int, wazna numeracja od 1!
        if(n < 0)
            cout << argv[1] << " nie moze byc numerem wiersza" << endl;
        else {
            WierszTrojkataPascala WierszTrojkataPascala(n); //tworzymy obiekt

            for (int i = 2; i < argc; i++) {
                try {
                    k = stoi(argv[i]);
                    cout << argv[i] << " -> " << WierszTrojkataPascala.wspolczynnik(k) << endl;
                } catch (const invalid_argument ex) { cout << argv[i] << " nie jest liczba" << endl; }
                catch (string ex) {
                    cout << ex << endl;
                }
            }
        }
    }
    catch (const invalid_argument ex) {
        cout << argv[1] <<  " -> nie moze byc numerem wiersza" << endl;
    }

 

1 odpowiedź

0 głosów
odpowiedź 25 marca 2021 przez TOM_CPP Pasjonat (22,640 p.)

W pętlach

for (int i = 0; i < n; i++) {
   for (int j = i + 1; j > 0; j--)
       trojkat[j] = trojkat[j] + trojkat[j - 1];
}

wychodzisz poza zakres tablicy trojkat. Dla i równego n-1 , w wewnętrznej pętli j jest równe n.

Podobne pytania

0 głosów
1 odpowiedź 1,871 wizyt
pytanie zadane 13 stycznia 2020 w C i C++ przez ullortnaci Nowicjusz (220 p.)
0 głosów
1 odpowiedź 685 wizyt
pytanie zadane 20 października 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
0 odpowiedzi 435 wizyt
pytanie zadane 30 listopada 2018 w PHP przez Pawelczak22 Nowicjusz (180 p.)

92,770 zapytań

141,695 odpowiedzi

320,518 komentarzy

62,107 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...