niedziałający kod

0

Cześć, mam problem z programem w C++ mam do napisania program o dzieleniu dowolnych wielomianów, kompiler nie zwraca mi żadnych błędów. Za każdym razem oblicza inne wartości dla tych samych wartości, proszę o pomoc pozdrawiam :D

#include <iostream>
#include <cmath>

using namespace std;

    //dzielenie wielomianu A/D=Q + R

    int stA,stB,stR,stQ; //stopnie wielomianow, dzielenie wielomianow odbywa sie poprzez A - dzielna | B - Dzielna | Q - wynik | R - reszta
    double*Q=new double[stQ+1];
    double*A=new double[stA+1];
    double*B=new double[stB+1];
    double*R=new double[stR+1];

    void dzielenie(double *Q, double *R, const double *A, const double *B, int &stpQ, int &stpR, const int stpA, const int stpB)
{
        for (int i=0; i <=stpA; i++) //pętla ktora przenosi wartosci z tablicy R do A
            R[i]=A[i]; //przyrównuje na poczatku reszte do pierwszego wielomianu
            stpQ = stpA-stpB;
            stpR = stpB-1;
        for (int j=0; j <=stpQ; j++) //pętla
        {
                Q[stpQ-j]  = R[stpA-j] / B[stpB]; //obliczam wartosc Q dzielac najwiekszy wspolczynnik przy potege przy R przez najwiekszy przy potedze przy B
            for (int i = stpA-j; i >= stpQ-j; i--)
                R[i] -= Q[stpQ-j]*B[i-stpQ + j]; // odejmuje wartosci mnozenia B i Q od R[i] i wyliczam reszte
            for (int i = stpR - 1; i>=0; i--){
                if(R[i]<0){R[i]=0;}
            }
        }
            cout << endl<< endl <<"Wynik: " << endl;

        for (int i=stQ; i>=0;i--){
            cout << Q[i] << "x^" << i << " + ";
            }
                                                        //przedstawianie wyniku na ekranie
            cout << endl<< endl <<"Reszta: " << endl;

        for (int i=stR; i>=0;i--){

        if (R[i]!=0){
            cout << R[i] << "x^" << i << " + ";
        }

        else {cout << "0";}
        }
            cout <<endl;
 }


int main()
{
        cout << "Witaj! Podaj mi tutaj prosze najwyzsza potege wielomianu:  " << endl;
        cin >> stA;

    if (stA<1 || stA<stB){
        cout << "Blad, popraw dane! Pamietaj ze stopien wielomianu A musi byc wiekszy od wielomianu B i ze stopien wielomianu A nie moze byc rowny 0!";
        return 0;
    }
        cout << "Teraz pora na wspolczynniki pierwszego wielomianu" <<endl;

    for (int i=0;i<=stA;i++){
        cout << "x^ " << i << "   ";
        cin >> A[i];
    }


        cout << "Znakomicie, nadszedl czas na podanie najwyzszej potegi wielomianu numer 2" <<endl;
        cin >>stB;

        cout << "Teraz pora na wspolczynniki drugiego wielomianu" <<endl;

    for (int i=0;i<=stB;i++){
        cout << "x^ " << i << "   ";
        cin >> B[i];
    }



        cout <<  endl << "Swietnie, to wszystko. Licze wynik dzielenia..." << endl << "-----------------";
        dzielenie(Q,R,A,B,stQ,stR,stA,stB);



    return 0;

}

https://pl.wikipedia.org/wiki/Dzielenie_wielomian%C3%B3w

4
    int stA,stB,stR,stQ; //stopnie wielomianow, dzielenie wielomianow odbywa sie poprzez A - dzielna | B - Dzielna | Q - wynik | R - reszta
    double*Q=new double[stQ+1];
    double*A=new double[stA+1];
    double*B=new double[stB+1];
    double*R=new double[stR+1];

Pomijając już bezsensowne użycie new ( https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/ ), alokujesz po jednym elemencie w każdej tablicy. Jakikolwiek dostęp poza przydzieloną pamięcią to UB - może zdarzyć się wszystko (i się zdarza).

2

Starsznie to brzydkie. A program brzydki jest najprawdopodobniej błędny.
Taki C ze strumieniami. Jakbyś zrobił nawet najprostsze klasy, kupę walorów obiektowych broniło by Cię przed błędami. A dzielenie wielomianów się genialnie i bardzo naturalnie wyraża obiektowo

3

Poniżej przykład prostych struktur odpowiadających wielomianom, co znacznie uprości całość zadania.

#include <iostream>
#include <vector>

using namespace std;

struct Polynomial
{
    Polynomial( const vector<double>& coeff_ = {} ): coeff {coeff_} {}
    vector<double> coeff;
};


Polynomial divide( const Polynomial& p1 , const Polynomial& p2 )
{
    Polynomial result;
    // your code

    return result;
}

int main()
{
    Polynomial p1 { {1,2,-3,5} };
    Polynomial p2 { {5,-2,4} };

    auto result = divide(p1,p2);

    for( const auto& coeff : result.coeff )
    {
        cout << coeff << " ";
    }

    return 0;
}
1

@TomaszLiMoon: Zagłosowałem na twoją odpowiedź, ale jest ona dość niedopracowana.
Najbardziej boli mnie divide, które ma dwa argumenty const Polynomial& co jest bezsensu. Najwyraźniej zapominałeś od *this. Może myślałeś o reszcie z dzielenia, ale kod tego nie odzwierciedla.

Inne niedoróbki, są drobne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1