2010-03-29 72 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