2010-03-29 6 views
2

Je suis très novice en programmation et j'essaye d'écrire un programme qui ajoute et soustrait des polynômes. Mon programme fonctionne parfois, mais la plupart du temps, il se bloque aléatoirement et je ne sais pas pourquoi. C'est très bogué et j'ai d'autres problèmes que j'essaie de résoudre, mais je suis incapable d'obtenir vraiment de codage supplémentaire car il plante. Je suis complètement nouveau ici mais toute aide serait grandement appréciée.Comment réparer mon programme de plantage en C++?

Voici le code:

#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

Je l'ai mise en forme de base, je vous laisse faire le reste. Mettez en surbrillance le code et cliquez sur le bouton 1010 pour indenter le tout par quatre espaces. Le préfixage d'une ligne avec 4 espaces indique que la ligne est du code. – GManNickG

+4

Il serait utile si vous pouviez nous montrer le message d'erreur, ou ce qui est imprimé à l'écran. – Smashery

+0

Aucune erreur. Dès que j'essaie d'entrer les deuxièmes coefficients polynomiaux, il se bloque. "Project6 a cessé de fonctionner ..." au milieu du programme en cours d'exécution. Fera, GMan. Encore s'habituer au site. Merci. – Rachel

Répondre

3

Lorsque vous créez vos objets avec p1(1) et p2(1) le tableau coef dans chaque objet est alloué pour contenir un élément. Ensuite, dans read(), vous définissez simplement degreePoly sur une valeur (éventuellement supérieure), mais ne modifiez pas l'allocation de coef. Il contiendra toujours un seul élément, mais tous les coefficients y sont écrits, en écrivant probablement sur les limites du tableau. Au lieu de cela, l'ancien coef doit être libéré et un nouveau tableau de taille appropriée doit être alloué.

également dans add et subtract vous assignez à des coefficients hors limites (pour i = 0):

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

Il semble également erroné mathématiquement pour soustraire les coefficients à l'indice degreePoly-(i+1) de ceux à l'index degreePoly-i. De plus, le cas où les deux polygones pourraient avoir des degrés différents n'est actuellement pas géré.

+0

"coef [degréPoly-i] - = pol.coef [degréPoly- (i + 1)];" Mon idée utilisait cette ligne pour adresser différents polynômes de degré. Je peux voir maintenant mon codage de tableau erroné et j'essaie de le réparer en fonction de ce que vous avez dit. Je vous remercie. – Rachel

2

Une question est l'allocation coef. Vous allouez un tableau de degreePoly = max éléments (1 pour les deux objets réels). Mais je pense que cela devrait être max + 1, car un polynôme à n degrés a n + 1 coefficients. Cette erreur "off-by-one" apparaît ailleurs (par exemple, add et mult). Toujours dans le constructeur, vous n'initialisez pas i, donc il a une valeur indéfinie, ce qui signifie que vous pouvez (probablement) écrire en mémoire que vous ne contrôlez pas. Plus tard, dans votre code lu, vous écrasez degreePoly, mais vous ne réallouez pas coef, donc la taille peut être incorrecte, du moins si vous dépassez votre maximum. Notez également que vous acceptez les coefficients degreePoly + 1 (ce que je pense est correct) ici. Cela signifie qu'un max de 1 dans le constructeur correspond seulement à un degreePoly de 0 en lecture! Si vous entrez 1 dans read, deux valeurs seront lues, ce qui débordera le tableau.

L'écriture dans des emplacements de pointeur non valides et l'utilisation de valeurs non initialisées provoquent un comportement indéfini, ce qui explique pourquoi il se bloque parfois.

+0

Ahhh! Je vais essayer de régler ça. C'est mon premier programme avec des pointeurs et des objets. – Rachel

0

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

n'a pas de sens puisque choice n'est pas initialisé à ce stade. Vous voulez sans doute:

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

+2

Et il n'est toujours pas initialisé lorsqu'il est utilisé dans la condition de boucle. Il n'y a pas vraiment besoin de la variable supplémentaire pour commencer. –

+0

Cela a résolu un problème que j'avais. C'était une erreur très noob que j'ai faite. Merci, Agnel. – Rachel

Questions connexes