Operator mnozenia wielomianow

0

Witam.. mam zdefiniowac operator mnozenia wielomianow C*=A

Mam tu przykladowy.. bylbym wdzieczny gdyby ktos mi go zmienil.. na ten operator C*=A , bo ja niestety nie znam sie na C.. z gory dziekuje
Pozdrawiam.

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>

#define EPSILON 0.00000001

using namespace std;

struct Wielomian
{
    long stopien;
    double *wspolczynniki;
    
    // konstruktor
    Wielomian(long n)
    {
        stopien = n;
        wspolczynniki = new double[stopien+1];
    }
    
    // podaje wspolczynnik przy x^n
    double wspolczynnik(long n)
    {
        if(n>stopien || n<0)
            return 0;
        return wspolczynniki[n];
    }
    
    // konstruktor kopiujacy
    Wielomian(const Wielomian &w)
    {
        stopien = w.stopien;
        wspolczynniki = new double[stopien+1];
        for(long i=0; i<=stopien; ++i)
            wspolczynniki[i] = w.wspolczynniki[i];
    }
    
    // destruktor
    ~Wielomian()
    {
        delete []wspolczynniki;
    }
};

// operator odejmowania
Wielomian operator-(Wielomian A, Wielomian B)
{
    long sw = max(A.stopien, B.stopien);
    Wielomian C(sw);
    
    for(long i=0; i<=sw; ++i)
    {
        C.wspolczynniki[i] = A.wspolczynniki[i] + B.wspolczynniki[i];
    }
    
    return Wielomian(C);
}

int main(int argc, char *argv[])
{
    printf("Odejmowanie wielomianow\nAutor: Unknown\n");
    
    char input[256];
    long s = -1;
    
    
    // Pierwszy wielomian
    while(1)
    {
        printf("Podaj stopien pierwszego wielomianu: ");
        scanf("%s", input);
        s = atol(input);
        // kontrola, czy podano liczbe calkowita
        double d = atof(input);
        if(fabs(((double)s)-d)>=EPSILON)
            s = -1;
        
        if(s>=0)
            break;
        printf("Niepoprawny stopien!\n");
    }
    printf("Pozadany stopien pierwszego wielomianu to %ld.\n", s);
    Wielomian A(s);
    for(long i=0; i<=A.stopien; ++i)
    {
        printf("Podaj wspolczynnik przy x^%ld: ", i);
        scanf("%s", input);
        A.wspolczynniki[i] = atof(input);
    }
    printf("Wczytano pierwszy wielomian: ");
    for(long i=A.stopien; i>=0; --i)
    {
        if(A.wspolczynniki[i]>0.0)
            printf("+");
        printf("%lf*x^%ld", A.wspolczynnik(i), i);
    }
    printf("\n");
    
    // Drugi wielomian
    while(1)
    {
        printf("Podaj stopien drugiego wielomianu: ");
        scanf("%s", input);
        s = atol(input);
        // kontrola, czy podano liczbe calkowita
        double d = atof(input);
        if(fabs(((double)s)-d)>=EPSILON)
            s = -1;
        
        if(s>=0)
            break;
        printf("Niepoprawny stopien!\n");
    }
    printf("Pozadany stopien drugiego wielomianu to %ld.\n", s);
    Wielomian B(s);
    for(long i=0; i<=B.stopien; ++i)
    {
        printf("Podaj wspolczynnik przy x^%ld: ", i);
        scanf("%s", input);
        B.wspolczynniki[i] = atof(input);
    }
    printf("Wczytano drugi wielomian: ");
    for(long i=B.stopien; i>=0; --i)
    {
        if(B.wspolczynniki[i]>0.0)
            printf("+");
        printf("%lf*x^%ld", B.wspolczynnik(i), i);
    }
    printf("\n");
    
    
    // Odejmowanie i wynik
    printf("\n\nWynik odejmowania to: ");
    Wielomian C = A-B;
    for(long i=C.stopien; i>=0; --i)
    {
        if(C.wspolczynniki[i]>0.0)
            printf("+");
        printf("%lf*x^%ld", C.wspolczynnik(i), i);
        getchar();
    }
    printf("\n");
    return 0;
 }

0

to chyba jakoś tak:

Wielomian operator * (Wielomian A, Wielomian B) {
    long sw = max(A.stopien, B.stopien);
    Wielomian C(A.stopien+B.stopien + 1);  

    for(long i=0; i<=A.stopien; ++i) 
        for(long j=0; j<=B.stopien; j++)
            C.wspolczynniki[i+j] += A.wspolczynniki[i] + B.wspolczynniki[j];

    return Wielomian(C);
}
0

albo lepiej:

Wielomian& operator * (Wielomian A, Wielomian B)
0

raczej chodziło mu o coś takiego:

Wielomian& Wielomian::operator *= (const Wielomian& B) {
      double *stareWsp = wspolczynniki;
      double staryStopien = stopien;
      
      stopien = (stopien+1)*(B.stopien+1)-1;
      if (stopien!=staryStopien) {
           wspolczynniki = new double[stopien+1];
      }

      for(int i=0; i<=stopien; ++i) {
                .... // sam wymyśl co
           }
           wspolczynniki[i] = sum;
      }

      if (stopien!=staryStopien) {
           delete [] stareWsp;
      }

      return *this;
}

Poza tym widzę powyżej grzech zapomnienia o referencjach i const.

0

własnie chodzi mi o to co napisał MarekR22 ale zeby skecic to w calosc.. raczej nie dam rady..

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