Kompiluje, jednak błąd. operator +, wielomian

0

witam, musze zrobic program w c++, ktory dodaje, odejmuje, mnozy dwa wielomiany i wyswietla wynik.
Robie to na vectorach z wykorzystaniem przeciazenia operatorow +.
Program sie kompiluje, wpisuje dwa wielomiany i wyskakuje blad przy dodawaniu.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

wiem, ze cos zwalilem z tym operatorem, ale nie wiem co. prosze o pomoc/naprowadzenie

 
#include <iostream>
#include <vector>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Wielomian
{
private:
    vector<int>wsp;
    int n;
 
public:
    Wielomian(int w);              // konstruktor
    Wielomian(){};
    void wyswietl(){				//wyswietlanie wielomianu
		int i;
		for(i = wsp.size()-1; i >= 0; i--){	
			if(wsp[i]>=0){
				cout << "+";	
			}	  
    		cout << wsp[i] << "x^" << i <<" ";
		}
    }
    void wyswietl1(){
		cout << wsp.size();
    }
 
    friend Wielomian operator +(const Wielomian& A, const Wielomian& B);
};


Wielomian::Wielomian(int w){//konstruktor, inicjacja obiektu, n=stopien wielomianu
	n = w;
	int temp;
	for(int i=0;i<=n;i++){
		cout <<"Podaj wartosc wspolczynnika nr: "<< i << endl;
		cin >> temp;
		wsp.push_back(temp);
	}
}
Wielomian operator +(const Wielomian& A, const Wielomian& B){
	int n;
	if(A.n > B.n){
		n = A.n;
	}else{
		n = B.n;
	}
	Wielomian C;
	C.n = n;
	int temp;
	for(int i=0;i<=n;i++){
		if(A.n>=i && B.n>=i){
			temp = A.wsp[i] + B.wsp[i];
		}
		if(A.n>=i && B.n<i){
			temp = A.wsp[i];
		}
		if(B.n>=i && A.n<i){
			temp = B.wsp[i];
		}
		C.wsp.push_back(temp);
	}
}
int main(int argc, char *argv[]) {
	int n;
	cout <<"Podaj stopien wielomianu A: "<< endl;
	cin >> n;
	Wielomian A(n);
	cout <<"Podaj stopien wielomianu B: "<< endl;
	cin >> n;
	Wielomian B(n);
	cout <<"Wielomian A: ";
	A.wyswietl();
	cout << endl << "Wielomian B: ";
	B.wyswietl();
	Wielomian C;
	C = A + B;
	cout << endl << "Wielomian C: ";
	C.wyswietl();
	
	return 0;
}
0

operator + musi zwrócić ten wielomian, brak return ...

0

dzieki za poprzednia odp. mam jeszcze jedno pytanie, bo nie wiem jak rozkmninic mnozenie. chodzi mi dokladnie o odwolywanie sie do poszczegolnych elementow wektora. czy da sie jakos w operatorze mnozenia ustalic od razu wielkosc wektora i potem odwolywac sie do niego jak do tablicy zwyklej.
Jak mam wielomian stopnia "n" i "m" to stopien po wymnozeniu bedzie "n+m", a w dodawaniu stopniem bedzie po prostu ten wiekszy wielomian.
W dodawaniu/odejmowaniu wszystkie wspolczynniki sa po kolei zapisywane C.wsp.push_back(temp); a w mnozeniu trzeba kilka razy nadpisac dane.

 
#include <iostream>
#include <vector>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Wielomian
{
private:
    vector<int>wsp;
    int n;
 
public:
    Wielomian(int w);              // konstruktor
    //Wielomian(int w, int ustalony);  //ustalona ilosc elementow w wektorze, do mnozenia 
    Wielomian(){};
    void wyswietl(){				//wyswietlanie wielomianu
		int i;
		for(i = wsp.size()-1; i >= 0; i--){	
			if(wsp[i]>=0){
				cout << "+";	
			}	  
    		cout << wsp[i] << "x^" << i <<" ";
		}
    }
 
    friend Wielomian operator +(const Wielomian& A, const Wielomian& B);
    friend Wielomian operator -(const Wielomian& A, const Wielomian& B);
    friend Wielomian operator *(const Wielomian& A, const Wielomian& B);
};


Wielomian::Wielomian(int w){//konstruktor, inicjacja obiektu, n=stopien wielomianu
	n = w;
	int temp;
	for(int i=0;i<=n;i++){
		cout <<"Podaj wartosc wspolczynnika nr: "<< i << endl;
		cin >> temp;
		wsp.push_back(temp);
	}
}
Wielomian operator +(const Wielomian& A, const Wielomian& B){
	int n;
	if(A.n > B.n){
		n = A.n;
	}else{
		n = B.n;
	}
	Wielomian C;
	C.n = n;
	int temp;
	for(int i=0;i<=n;i++){
		if(A.n>=i && B.n>=i){
			temp = A.wsp[i] + B.wsp[i];
		}
		if(A.n>=i && B.n<i){
			temp = A.wsp[i];
		}
		if(B.n>=i && A.n<i){
			temp = B.wsp[i];
		}
		C.wsp.push_back(temp);
	}
	return C;
}
Wielomian operator -(const Wielomian& A, const Wielomian& B){
	int n;
	if(A.n > B.n){
		n = A.n;
	}else{
		n = B.n;
	}
	Wielomian D;
	D.n = n;
	int temp;
	for(int i=0;i<=n;i++){
		if(A.n>=i && B.n>=i){
			temp = A.wsp[i] - B.wsp[i];
		}
		if(A.n>=i && B.n<i){
			temp = A.wsp[i];
		}
		if(B.n>=i && A.n<i){
			temp = -B.wsp[i];
		}
		D.wsp.push_back(temp);
	}
	return D;
}

Wielomian operator *(const Wielomian& A, const Wielomian& B){
	Wielomian E;
	E.n = A.n+B.n;
	int temp;
}
	
	
int main(int argc, char *argv[]) {
	int n;
	cout <<"Podaj stopien wielomianu A: "<< endl;
	cin >> n;
	Wielomian A(n);
	cout <<"Podaj stopien wielomianu B: "<< endl;
	cin >> n;
	Wielomian B(n);
	cout <<"Wielomian A: ";
	A.wyswietl();
	cout << endl << "Wielomian B: ";
	B.wyswietl();
	Wielomian C;
	C = A + B;
	cout << endl << "Wielomian C = A + B: ";
	C.wyswietl();
	Wielomian D;
	D = A - B;
	cout << endl << "Wielomian D = A - B: ";
	D.wyswietl();
	
	return 0;
}
0

Nie potrzebujesz int n; w wielomianie, przecież zawsze możesz użyć (wsp.size()-1) w konstruktorze zrób tylko Wielomian::Wielomian(int w):wsp(w+1) {} i już masz wszystkie elementy. Dla wprowadzenia użyj przeciążenia operatora istream &operator>>(istream &s,Wielomian &W) { /* tu wczytujesz */ } adresować możesz wsp[i]

0

no przerobilem wedle Twoich wskazowek i nie chce mi dzialac do konca dodawanie, gdzie popelnilem blad?

http://img39.imageshack.us/img39/7737/wiel.png

#include <iostream>
#include <vector>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Wielomian
{
private:
    vector<int>wsp;
 
public:
    Wielomian(int w);              // konstruktor
    Wielomian(){};
    
    void wyswietl(){				//wyswietlanie wielomianu
		int i;
		for(i = wsp.size(); i >= 0; i--){	
			if(wsp[i]>=0){
				cout << "+";	
			}	  
    		cout << wsp[i] << "x^" << i <<" ";
		}
    }
    void wyswietl1(){				//wyswietlanie wielomianu
		cout << wsp.size();
    }
 
    friend Wielomian operator +(const Wielomian& A, const Wielomian& B);
    friend Wielomian operator -(const Wielomian& A, const Wielomian& B);
    friend Wielomian operator *(const Wielomian& A, const Wielomian& B);
    friend istream &operator>>(istream&, Wielomian &);
};


Wielomian::Wielomian(int w):wsp(w){//konstruktor, inicjacja obiektu, n=stopien wielomianu

}
istream &operator>>(istream &wejscie,Wielomian &W){
		for(int i=0;i<=W.wsp.size();i++){
		cout <<"Podaj wartosc wspolczynnika nr: "<< i << endl;
		wejscie>>W.wsp[i];
	}
	return wejscie;
}
Wielomian operator +(const Wielomian& A, const Wielomian& B){
	int temp;
	if(A.wsp.size() > B.wsp.size()){
		temp = A.wsp.size();
	}else{
		temp = B.wsp.size();
	}
	Wielomian C(temp);
	
	for(int i=0;i<=temp;i++){
		
		if(A.wsp.size()>=i && B.wsp.size()>=i){
			C.wsp[i] = A.wsp[i] + B.wsp[i];
		}
		if(A.wsp.size()>=i && B.wsp.size()<i){
			C.wsp[i] = A.wsp[i];
		}
		if(B.wsp.size()>=i && A.wsp.size()<i){
			C.wsp[i] = B.wsp[i];
		}
	}
	return C;
}

	
int main(int argc, char *argv[]) {
	int n;
	cout <<"Podaj stopien wielomianu A: "<< endl;
	cin >> n;
	Wielomian A(n);
	cin >> A;
	cout <<"Podaj stopien wielomianu B: "<< endl;
	cin >> n;
	Wielomian B(n);
	cin >> B;
	cout <<"Wielomian A: ";
	A.wyswietl(); 
	cout << endl << "Wielomian B: ";
	B.wyswietl();
	Wielomian C;
	C = A + B;
	cout << endl << "Wielomian C = A + B: ";
	C.wyswietl();
	
	return 0;
}

 
0
Wielomian operator +(const Wielomian& A, const Wielomian& B){
        int AS=A.wsp.size(),BS=B.wsp.size(),CS=max(AS,BS),i=0;
        Wielomian C(CS);
        while((i<AS)&&(i<BS)) C.wsp[i++]=A.wsp[i]+B.wsp[i];
        while((i<AS) C.wsp[i++]=A.wsp[i];
        while((i<BS) C.wsp[i++]=B.wsp[i];
        return C;
}
0

hmmm, wiesz co, nadal ten sam blad, nie wiem moze to wina mojego kompilatora, wydaje sie ze powinno dzialac. mozesz sprawdzic czy u Ciebie jest ok?

0

Jestem jasnowidzem ale nie aż tak dobrym aby dokładnie cały twój kod mieć przed oczami.

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