2010-03-29 73 views
2

我对编程非常陌生,我正试图编写一个程序来增加和减少多项式。我的程序有时可以工作,但大多数时候,它随机崩溃,我不知道为什么。这是非常麻烦的,并且还有其他问题我正在尝试解决,但是自从它崩溃后,我无法真正地完成任何进一步的编码。我在这里是全新的,但任何帮助将不胜感激。如何解决我的程序崩溃在C++中?

下面的代码:

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int getChoice(); 
class Polynomial10 
{ 
private: 
    double* coef; 
    int degreePoly; 

public: 
    Polynomial10(int max); //Constructor for a new Polynomial10 
    int getDegree(){return degreePoly;}; 
    void print(); //Print the polynomial in standard form 
    void read(); //Read a polynomial from the user 
    void add(const Polynomial10& pol); //Add a polynomial 
    void multc(double factor); //Multiply the poly by scalar 
    void subtract(const Polynomial10& pol); //Subtract polynom 
}; 

void Polynomial10::read() 
{ 
    cout << "Enter degree of a polynom between 1 and 10 : "; 
    cin >> degreePoly; 

    cout << "Enter space separated coefficients starting from highest degree" << endl; 
    for (int i = 0; i <= degreePoly; i++) cin >> coef[i]; 
} 

void Polynomial10::print() 
{ 
    for (int i = 0;i <= degreePoly; i++) { 
     if (coef[i] == 0) cout << ""; 
     else if (i >= 0) { 
      if (coef[i] > 0 && i != 0) cout<<"+"; 
      if ((coef[i] != 1 && coef[i] != -1) || i == degreePoly) cout << coef[i]; 
      if ((coef[i] != 1 && coef[i] != -1) && i != degreePoly) cout << "*"; 
      if (i != degreePoly && coef[i] == -1) cout << "-"; 
      if (i != degreePoly) cout << "x"; 
      if ((degreePoly - i) != 1 && i != degreePoly) { 
       cout << "^"; 
       cout << degreePoly-i; 
      } 
     } 
    } 
} 

void Polynomial10::add(const Polynomial10& pol) 
{ 
    for(int i = 0; i<degreePoly; i++) { 
     int degree = degreePoly; 
     coef[degreePoly-i] += pol.coef[degreePoly-(i+1)]; 
    } 
} 

void Polynomial10::subtract(const Polynomial10& pol) 
{ 
    for(int i = 0; i<degreePoly; i++) { 
     coef[degreePoly-i] -= pol.coef[degreePoly-(i+1)]; 
    } 
} 

void Polynomial10::multc(double factor) 
{ 
    //int degreePoly=0; 
    //double coef[degreePoly]; 
    cout << "Enter the scalar multiplier : "; 
    cin >> factor; 
    for(int i = 0; i<degreePoly; i++) coef[i] *= factor; 
} 

Polynomial10::Polynomial10(int max) 
{ 
    degreePoly = max; 
    coef = new double[degreePoly]; 
    for(int i; i < degreePoly; i++) coef[i] = 0; 
} 

int main() 
{ 
    int choice; 
    Polynomial10 p1(1),p2(1); 
    cout << endl << "CGS 2421: The Polynomial10 Class" << endl << endl << endl; 
    cout 
     << "0. Quit\n" 
     << "1. Enter polynomial\n" 
     << "2. Print polynomial\n" 
     << "3. Add another polynomial\n" 
     << "4. Subtract another polynomial\n" 
     << "5. Multiply by scalar\n\n"; 

    int choiceFirst = getChoice(); 
    if (choiceFirst != 1) { 
     cout << "Enter a Polynomial first!"; 
    } 
    if (choiceFirst == 1) {choiceFirst = choice;} 

    while(choice != 0) { 
     switch(choice) { 
      case 0: 
       return 0; 
      case 1: 
       p1.read(); 
       break; 
      case 2: 
       p1.print(); 
       break; 
      case 3: 
       p2.read(); 
       p1.add(p2); 
       cout << "Updated Polynomial: "; 
       p1.print(); 
       break; 
      case 4: 
       p2.read(); 
       p1.subtract(p2); 
       cout << "Updated Polynomial: "; 
       p1.print(); 
       break; 
      case 5: 
       p1.multc(10); 
       cout << "Updated Polynomial: "; 
       p1.print(); 
       break; 
     } 
     choice = getChoice(); 
    } 
    return 0; 
} 

int getChoice() 
{ 
    int c; 
    cout << "\nEnter your choice : "; 
    cin >> c; 
    return c; 
} 
+0

我做了基本的格式化,我会让你做其余的。突出显示代码并单击1010按钮将其全部缩进四个空格。用4个空格前缀一行表示该行是代码。 – GManNickG 2010-03-29 04:40:41

+4

如果您可以向我们显示错误消息或打印到屏幕上的内容,这将有所帮助。 – Smashery 2010-03-29 04:42:55

+0

没有错误。只要我尝试输入第二个多项式系数,它就会崩溃。程序运行过程中,“Project6已停止工作......”。 会做,GMan。还在习惯这个网站。谢谢。 – Rachel 2010-03-29 04:51:50

回答

3

当您使用p1(1)p2(1)创建对象时,将分配每个对象中的coef数组以包含一个元素。然后在read()中,您只需将degreePoly设置为(可能更高)的值,但不会更改coef的分配。它仍然只包含一个元素,但所有的系数都写入它,可能写入数组的边界。而应该释放旧的coef,并分配一个合适大小的新数组。

add

还和subtract您要指派给系数出界(对于i = 0):

coef[degreePoly-i] -= pol.coef[degreePoly-(i+1)]; 

这也似乎是错误的数学在指数degreePoly-i减去从这些指标degreePoly-(i+1)系数。此外,两个多边形可能有不同程度的情况目前尚未处理。

+0

“coef [degreePoly-i] - = pol.coef [degreePoly-(i + 1)];” 我的想法是用这条线来解决不同程度的多项式。 我现在可以看到我的错误数组编码,我试图根据你所说的解决它。谢谢。 – Rachel 2010-03-29 06:40:09

2

的一个问题是coef分配。您正在分配一个degreePoly = max元素的数组(两个实际对象为1)。但我认为它应该是max + 1,因为一个n次多项式有n + 1个系数。这个错误的错误出现在别处(例如添加和多重)。同样在构造函数中,你不初始化i,所以它有一个未定义的值,这意味着你可以(可能会)写入你不控制的内存。

后来,在你读的代码,您覆盖degreePoly,但不重新分配coef,所以它可能是错误的大小,至少如果你超过最高。另外请注意,您正在接受degreePoly + 1系数(我认为这是正确的)。这意味着构造函数中的1的max只对应于0中的degreePoly!在read中输入1将导致读取两个值,这会使数组溢出。

写入无效指针位置并使用未初始化的值导致未定义的行为,这就是为什么它有时会崩溃有时

+0

啊!我会尽力解决这个问题。这是我第一个使用指针和对象的程序。 – Rachel 2010-03-29 04:57:45

0

if (choiceFirst == 1) {choiceFirst = choice;}

没有意义,因为choice没有在这个阶段初始化。你可能想要:

if (choiceFirst == 1) {choice = choiceFirst;}

+2

它在循环条件下使用时仍未初始化。开始时并不需要额外的变量。 – 2010-03-29 05:06:01

+0

解决了我遇到的问题。这是我做的一个很小的错误。谢谢你,Agnel。 – Rachel 2010-03-30 22:28:56