- Mitglied seit
- 12.04.2003
- Beiträge
- 1.806
- Reaktionen
- 0
Also ich will gerade ein Programm zur Berechnung von Gewichten von Quadraturformeln schreiben, läuft auch ganz gut, allerdings habe ich gerade ein sehr merkwürdiges Problem:
Die Funktion "weights" wird nur dann richtig aufgerufen, wenn die Funktion "Multiply" vorher aufgerufen wurde. Also wenn man in der Main die Funktion "Multiply" weglässt, dann wird die äußere Schleife in der Funktion "weights" nur einmal durchlaufen und dann bricht die Funktion ab und zwar nachdem das "RUNDE " << i << " DURCHLAUFEN"<< da steht.
Wenn der viele Code zu nervig ist kann ich den auch noch reduzieren, aber eigentlich ist das Programm sehr einfach und das Problem liegt nur bei den beiden Funktionen, die irgendwie voneinander abhängen...
Die Funktion "weights" wird nur dann richtig aufgerufen, wenn die Funktion "Multiply" vorher aufgerufen wurde. Also wenn man in der Main die Funktion "Multiply" weglässt, dann wird die äußere Schleife in der Funktion "weights" nur einmal durchlaufen und dann bricht die Funktion ab und zwar nachdem das "RUNDE " << i << " DURCHLAUFEN"<< da steht.
Wenn der viele Code zu nervig ist kann ich den auch noch reduzieren, aber eigentlich ist das Programm sehr einfach und das Problem liegt nur bei den beiden Funktionen, die irgendwie voneinander abhängen...
Code:
#include <iostream>
#include <list>
#include <cmath>
using namespace std;
class variable{
private:
int exponent;
pair<int, int> koeffizient;
public:
void kuerzen(){
int ctr=2;
while (ctr<=abs(koeffizient.first) && ctr<=abs(koeffizient.second)){
if (koeffizient.first%ctr==0 && koeffizient.second%ctr==0){
koeffizient.first/=ctr;
koeffizient.second/=ctr;
}
else ctr++;
}
if(koeffizient.first<0 && koeffizient.second<0){
koeffizient.first=abs(koeffizient.first);
koeffizient.second=abs(koeffizient.second);
}
else if(koeffizient.first>0 && koeffizient.second<0){
koeffizient.first=koeffizient.first*(-1);
koeffizient.second=abs(koeffizient.second);
}
}
variable(){exponent=0; koeffizient.first=0; koeffizient.second=1;};
variable(int koe1, int koe2, int exp){
exponent=exp;
koeffizient.first=koe1;
koeffizient.second=koe2;
kuerzen();
};
void set_koe1(int koe1){koeffizient.first=koe1; kuerzen();}
void set_koe2(int koe2){koeffizient.second=koe2; kuerzen();}
void set_exp(int exp){exponent=exp;}
int get_exp(){return exponent;}
int get_koe1(){return koeffizient.first;}
int get_koe2(){return koeffizient.second;}
void print(){
if (exponent!=0 && exponent !=1)
cout << koeffizient.first << "/" << koeffizient.second << "*" << "x"<< "^" << exponent;
else if (exponent==1)
cout << koeffizient.first << "/" << koeffizient.second << "*" << "x";
else if (exponent==0)
cout << koeffizient.first << "/" << koeffizient.second;
}
};
class term{
////ÄNDERN: PUBLIC-PRIVATE
public:
list<variable*> m_list;
void add(variable *monom){m_list.push_back(monom);}
void print(){
list<variable*>::iterator iter;
iter=m_list.begin();
for (int i=0; i<m_list.size(); i++){
(*iter)->print();
if(i==m_list.size()-1) break;
else{
if ((*++iter)->get_koe1()>0)
cout << "+";
}
}
cout << endl;
}
void integrate(){
list<variable*>::iterator iter;
for (iter=m_list.begin(); iter!=m_list.end(); iter++){
(*iter)->set_koe2((*iter)->get_koe2()*((*iter)->get_exp()+1));
(*iter)->set_exp((*iter)->get_exp()+1);
}
}
};
void multiply(term *fterm, term *sterm, term *&solution){
variable *temp_vari;
solution=new term;
list<variable*>::iterator iter1;
list<variable*>::iterator iter2;
for(iter1=(*fterm).m_list.begin(); iter1!=(*fterm).m_list.end(); iter1++){
for (iter2=(*sterm).m_list.begin(); iter2!=(*sterm).m_list.end(); iter2++){
temp_vari=new variable;
temp_vari->set_koe1((*iter1)->get_koe1()*(*iter2)->get_koe1());
temp_vari->set_koe2((*iter1)->get_koe2()*(*iter2)->get_koe2());
temp_vari->set_exp((*iter1)->get_exp()+(*iter2)->get_exp());
solution->add(temp_vari);
}
}
solution->print();
}
void weights(int n){
term *alpha;
term *tempterm1, *tempterm2;
variable *tempvar1, *tempvar2;
for (int i=0; i<=n; i++){
//alpha=new term;
for (int j=0; j<=n; j++){
if(i!=j){
tempvar1=new variable;
tempvar1->set_exp(1);
tempvar1->set_koe1(n);
tempvar1->set_koe2(i-j);
tempvar2=new variable;
tempvar2->set_exp(0);
tempvar2->set_koe1(-j);
tempvar2->set_koe2(i-j);
tempvar1->print();
cout << endl;
tempvar2->print();
cout << endl;
cout << "RUNDE " << i << " DURCHLAUFEN"<< endl;
tempterm1->add(tempvar1);
tempterm1->add(tempvar2);
}
}
}
}
int main(){
variable *neu, *neu2, *neu3;
neu=new variable(-1,2,1);
neu2=new variable(2,3,3);
neu3=new variable(3,-4,4);
term *eins;
term *zwei;
term *drei;
eins=new term;
zwei=new term;
eins->add(neu);
eins->add(neu2);
zwei->add(neu3);
eins->print();
zwei->print();
multiply(eins, zwei, drei);
int n=1;
weights(n);
return 0;
}

