Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Класс многочленов 
V
    Опции темы
fandelle
Дата 24.12.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 24.9.2008

Репутация: нет
Всего: нет



Подскажите, пожалуйста, как переделать метод 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]; }                 
}


Это сообщение отредактировал(а) fandelle - 24.12.2009, 14:54
PM MAIL   Вверх
Luyan
Дата 24.12.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 3.12.2008

Репутация: 5
Всего: 7



глянул в ваш код, там до меню ещё далеко. Ошибки кругом:
Цитата(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, 14:52
PM   Вверх
Luyan
Дата 24.12.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 3.12.2008

Репутация: 5
Всего: 7



вот так:
Код

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);               
};

PM   Вверх
fandelle
Дата 24.12.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 24.9.2008

Репутация: нет
Всего: нет



Спасибо!
Подскажите ещё пожалуйста как деструктор и конструктор добавить

Код

public:
Mnogochlen();
~Mnogochlen();

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


Как-то так?
PM MAIL   Вверх
Luyan
Дата 24.12.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 3.12.2008

Репутация: 5
Всего: 7



Цитата(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();
} 

PM   Вверх
fandelle
Дата 24.12.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 24.9.2008

Репутация: нет
Всего: нет



да, точно, int ведь тип массива.

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

Это сообщение отредактировал(а) fandelle - 24.12.2009, 17:15
PM MAIL   Вверх
Luyan
Дата 24.12.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 3.12.2008

Репутация: 5
Всего: 7



Цитата(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)
//..


Это сообщение отредактировал(а) Luyan - 24.12.2009, 18:10
PM   Вверх
fandelle
Дата 24.12.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 24.9.2008

Репутация: нет
Всего: нет



Да, теперь всё хорошо.
Спасибо большое!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.