Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Класс многочленов


Автор: fandelle 24.12.2009, 14:09
Подскажите, пожалуйста, как переделать метод menu(), чтобы всё работало правильно для следующей программы:

Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы для вычисления значения многочлена для заданного аргумента, операции сложения, вычитания и умножения многочленов с получением нового объекта - многочлена.

Код

#include <iostream>
using namespace std;               
class Mnogochlen
{               
int A[100], n;
public:               
void vvod();                
void vichisl();             
void slozh(Mnogochlen mA, Mnogochlen mB);                
void vichit(Mnogochlen mA, Mnogochlen mB);                
void umnozh(Mnogochlen mA, Mnogochlen mB);                
void vivod();
void menu();               
};           
  
int main()                
{               
Mnogochlen a,b,c;                
a.vvod();               
a.vivod();                                         
b.vvod();   
b.vivod();
c.menu();
system("Pause");
return 0;} 
            
void Mnogochlen::menu()
{
     unsigned int p=0; 
     {cout<<"\n 1:Vichislenie v tochke \n 2:Slozhenie \n 3:Vichitanie \n 4:Umnozhenie \n 5:EXIT \n";
     cin>>p;
     switch(p)
     {          case 1: vichisl(); break;
                   case 2: slozh(); break;
                      case 3: vichit(); break;
                         case 4: umnozh(); break;
                            default: cout<<"Exit";
                                  }}
                                  while (p<4);
                                  };    
                
void Mnogochlen::vvod()                
{
cout<<endl;
cout<<"vvedite stepen mnogochlena: "; 
cin>>n;
cout<<"vvedite koefficienti\n";
for (int k=0;k<=99;k++) 
{A[k]=0;}
for (int i=0;i<=n;i++) 
{cout<<" a"<<i<<" = "; cin>>A[i];}      
}         

void Mnogochlen::vivod()               
{                
int f;                
f=0;
for (int i=n;i>=0;i--)                
 if (A[i]!=0)
{if(f==0){if(i!=0)cout<<A[i]<<"*x^"<<i; else cout<<A[i];       
 f++;}                 
else {if(i!=0)
if(A[i]>0) cout<<"+"<<A[i]<<"*x^"<<i;
else cout<<A[i]<<"*x^"<<i;                
else
if(A[i]>0) cout<<"+"<<A[i];
else cout<<A[i];
f++;} 
}
if (f==0) {cout<<0;}
cout<<endl;                 
}          

void Mnogochlen::vichisl()                 
{
cout<<endl;                 
int q,w,e;                
w=0;
cout<<"vvedite X: "; cin>>q;                
e=1;
for (int i=0;i<=n;i++) { w=w+A[i]*e; e=e*q;}
cout<<"f("<<q<<") = "<<w;
cout<<endl;                 
}              
   
void Mnogochlen::slozh(Mnogochlen mA, Mnogochlen mB)                 
{
for (int k=0;k<=99;k++) {A[k]=0;}
if (mA.n>mB.n) n=mA.n; else n=mB.n;
for (int i=0;i<=n;i++) {A[i]=mA.A[i]+mB.A[i]; }                
}                

void Mnogochlen::vichit(Mnogochlen mA, Mnogochlen mB)                
{for (int k=0;k<=99;k++) {A[k]=0;}
if (mA.n>mB.n) n=mA.n; else n=mB.n;
for (int i=0;i<=n;i++) {A[i]=mA.A[i]-mB.A[i]; }                
}                

void Mnogochlen::umnozh(Mnogochlen mA, Mnogochlen mB)                 
{
for (int k=0;k<=99;k++) {A[k]=0;}                 
n=mA.n+mB.n;
for (int i=0;i<=mA.n;i++) for (int j=0;j<=mB.n;j++) {A[i+j]=A[i+j]+mA.A[i]*mB.A[j]; }                 
}

Автор: Luyan 24.12.2009, 14:51
глянул в ваш код, там до меню ещё далеко. Ошибки кругом:
Цитата(fandelle @  24.12.2009,  14:09 Найти цитируемый пост)
void Mnogochlen::umnozh(Mnogochlen mA, Mnogochlen mB)                 
{Mnogochlen mA; Mnogochlen mB;


Цитата(fandelle @  24.12.2009,  14:09 Найти цитируемый пост)
void Mnogochlen::vichit(Mnogochlen mA, Mnogochlen mB)                
{Mnogochlen mA; Mnogochlen mB;


Цитата(fandelle @  24.12.2009,  14:09 Найти цитируемый пост)
void Mnogochlen::slozh(Mnogochlen mA, Mnogochlen mB)                 
{Mnogochlen mA; Mnogochlen mB;


зачем в теле функции вы снова пишете Mnogochlen mA; Mnogochlen mB;? удалите.
Цитата(fandelle @  24.12.2009,  14:09 Найти цитируемый пост)
{ w=w+a[i]*e; e=e*q;}

думаю здесь должно быть A.

Цитата(fandelle @  24.12.2009,  14:09 Найти цитируемый пост)
for (int i=0;i<=n;i++) {a[i]=mA.A[i]+mB.A[i]; }          

здесь тоже.
исправьте и отформатируйте код, и можно будет начинать делать меню.

Автор: Luyan 24.12.2009, 15:20
вот так:
Код

void Mnogochlen::menu(Mnogochlen mA, Mnogochlen mB)
{

    char ch;
    cout<<"\n 1:Vichislenie v tochke \n 2:Slozhenie \n 3:Vichitanie \n 4:Umnozhenie \n 5:EXIT \n";
    do
    {
        ch = getchar();
    }while((ch < '1') || (ch > '5'));

    if(ch=='1')
    {
        mA.vichisl();
        vivod();
    }
    if(ch=='2')
    {
        slozh(mA,mB);
        vivod();
    }
    if(ch=='3')
    {
        vichit(mA,mB);
        vivod();
    }
    if(ch=='4')
    {
        umnozh(mA,mB);
        vivod();
    }
} 

так:
Код

int main()                
{
    Mnogochlen a, b, c;
    a.vvod();
    a.vivod();
    b.vvod();
    b.vivod();
    c.menu(a, b);
    system("Pause");
    return 0;
} 

а класс будет таким:
Код

class Mnogochlen
{               
    int A[100], n;
public:               
    void vvod();                
    void vichisl();             
    void slozh(Mnogochlen mA, Mnogochlen mB);                
    void vichit(Mnogochlen mA, Mnogochlen mB);                
    void umnozh(Mnogochlen mA, Mnogochlen mB);                
    void vivod();
    void menu(Mnogochlen mA, Mnogochlen mB);               
};

Автор: fandelle 24.12.2009, 15:27
Спасибо!
Подскажите ещё пожалуйста как деструктор и конструктор добавить

Код

public:
Mnogochlen();
~Mnogochlen();

Mnogochlen::Mnogochlen();
{A=new char[100];}
Mnogochlen::~Mnogochlen();
{delete [] A;}


Как-то так?

Автор: Luyan 24.12.2009, 15:36
Цитата(fandelle @  24.12.2009,  15:27 Найти цитируемый пост)
Подскажите ещё пожалуйста как деструктор и конструктор добавить

Цитата(fandelle @  24.12.2009,  15:27 Найти цитируемый пост)
{A=new char[100];}

зачем char? у вас же int.
Код

public:
Mnogochlen();
~Mnogochlen();
Mnogochlen::Mnogochlen();
{A=new int[100];}
Mnogochlen::~Mnogochlen();
{delete [] A;}

и поле класса измените на
Код

int* A;

и, я не то сделал smile, menu вот так: 
Код

void Mnogochlen::menu(Mnogochlen mA, Mnogochlen mB)
{

    char ch;
    cout<<"\n 1:Vichislenie v tochke \n 2:Slozhenie \n 3:Vichitanie \n 4:Umnozhenie \n 5:EXIT \n";
    do
    {
        ch = getchar();
    }while((ch < '1') || (ch > '5'));

    if(ch=='1')
        mA.vichisl();
    if(ch=='2')
        slozh(mA,mB);
    if(ch=='3')
        vichit(mA,mB);
    if(ch=='4')
        umnozh(mA,mB);
    vivod();
} 

Автор: fandelle 24.12.2009, 17:13
да, точно, int ведь тип массива.

Послушайте, при выполнении самой первой операции - вычисления в точке - происходит ошибка, сразу после получения результата.
От этого можно избавиться?

Автор: Luyan 24.12.2009, 18:02
Цитата(fandelle @  24.12.2009,  17:13 Найти цитируемый пост)
происходит ошибка

а результат выводится?
нужно передавать аргументы по ссылке (вместо Mnogochlen x, надо Mnogochlen& x), то есть сделайте так:
Код

void Mnogochlen::menu(Mnogochlen& mA, Mnogochlen& mB)
{

    char ch;
    cout<<"\n 1:Vichislenie v tochke \n 2:Slozhenie \n 3:Vichitanie \n 4:Umnozhenie \n 5:EXIT \n";
    do
    {
        ch = getchar();
    }while((ch < '1') || (ch > '5'));

    if(ch=='1')
    {
        mA.vichisl();
        return;
    }
    if(ch=='2')
        slozh(mA,mB);
    if(ch=='3')
        vichit(mA,mB);
    if(ch=='4')
        umnozh(mA,mB);
    if(ch=='5')
        return;
    vivod();
} 

и так во всех методах:
Код

class Mnogochlen
{               
    int* A, n;
public:
    Mnogochlen(){A=new int[100];}
    ~Mnogochlen(){delete [] A;}             
    void vvod();                
    void vichisl();             
    void slozh(Mnogochlen& mA, Mnogochlen& mB);                
    void vichit(Mnogochlen& mA, Mnogochlen& mB);                
    void umnozh(Mnogochlen& mA, Mnogochlen& mB);                
    void vivod();
    void menu(Mnogochlen& mA, Mnogochlen& mB);               
};

и когда определяете метод вне класса.
Код

//..
void Mnogochlen::umnozh(Mnogochlen& mA, Mnogochlen& mB)
//..

Автор: fandelle 24.12.2009, 18:18
Да, теперь всё хорошо.
Спасибо большое!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)