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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножение полиномов 
V
    Опции темы
Lavroff
Дата 25.6.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

 Polinom Polinom::operator *(Polinom& pol)
{
                Polinom temp;
                temp.degree=degree+pol.degree;
                temp.koef=new int[temp.degree+1];
                for(int i=0;i<=degree;i++)
                {
                        for(int j=0;j<=pol.degree;j++)
                                {
                                        temp.koef[i+j] +=koef[i]*pol.koef[j];
                                }
                }
                return temp;
} 

Что здесь может быть неверно? И кстати, мучает вопрос. += - це что? С += выводит дребедень. Без += не учитывает один из коэффицентов или что-то вроде того. Например:

(2x+1)*(2x+1) выводит 4x^2+2x+1

Вызов функции в мейн + вывод:   
Код

Polinom x(p.GetDegr()+s.GetDegr());
        x=p*s;
        std::cout<<"\n";
        std::cout<<x<<'\n'; 
В чем ошибка? 


Так же на всякий случай, полный код:

Код

#include <iostream>
#include <cstring>
#include <cstdlib>
class Polinom
{
        int degree;//степень
        int*koef;//массив коэффицентов
public:
        Polinom(){};//конструктор по умолчанию
        Polinom(const Polinom& pol);//Конструктор копирования
        Polinom(int count);//Конструктор преобразования типа
        ~Polinom(){delete[] koef;}//Деструктор
        int& operator[](int index);//Перегрузка оператора индексирования
        Polinom operator+(Polinom&);//Перегрузка оператора сложения
        Polinom& operator=(Polinom&);//Перегрузка оператора присваивания
        Polinom operator*(Polinom&);//Перегрузка оператора умножения
        int GetDegr(){return degree;}//Получение степени
        int input(int);//Ввод полинома
        Polinom operator+(int&);//Перегрузка оператора сложения целого числа и полинома
        Polinom operator*(int&);//Перегрузка оператора умножения целого числа и полинома
        bool operator==(Polinom&);
        bool operator>=(Polinom&);
        bool operator<=(Polinom&);
        friend std::ostream& operator<<(std::ostream&, Polinom&);//Перегрузка оператора вывода в поток
};
int Polinom::input(int n)
{
        degree=n;
        koef=new int[degree+1]; 
        for(int i=n;i>=0;i--)
                {
                        std::cout<<"Enter " << i << " koef "<<'\n';
                        std::cin>>koef[i];
                        if(koef[i]==-842150451)
                        {
                                std::cout<<"Ошибка ввода. Введите число\n";
                                exit(0);
                        }
                }
        system("cls");
        return 0;
}
std::ostream& operator<<(std::ostream& str, Polinom& pol)
{
  int b;
  b=pol.degree;
  while(pol.koef[b]==0&&b>=0)
  b=b-1;
  if(b<0) 
          str<<"Polinom = 0\n";
  else
        {
                if(b==0) 
                        str<<pol.koef[0];
   else
        {
                str<<pol.koef[b]<<"x^"<<b;
                b=b-1;
                for(int i=b;i>0;i--)
                        {
                                if (pol.koef[i]<0) {str<<pol.koef[i];};
                                if (pol.koef[i]>0) {str<<"+"<<pol.koef[i];};
                                if (pol.koef[i]!=0) {str<<"x^"<<i;};
                        };
                if (pol.koef[0]<0) str<<pol.koef[0];
                if (pol.koef[0]>0) str<<"+"<<pol.koef[0];
        }
        }
  return str;
}
Polinom::Polinom(int count)
{
        degree=count;
        koef=new int[degree+1];
}
Polinom::Polinom(const Polinom& pol)
{
        degree=pol.degree;
        koef=new int[degree+1];
        for(int i=degree;i>=0;i--)
                koef[i]=pol.koef[i];
}
int& Polinom::operator [](int index)
{
        static int iErr=-1;
        if(index>=0&&index<=degree)
                return koef[index];
        else
        {
                std::cout<<"Error with index!"<<'\n';
                return iErr;
        }
}
Polinom Polinom::operator+(Polinom& pol)
{
        if(degree==pol.degree)
        {
                Polinom temp(degree);
                for(int i=pol.degree;i>=0;i--)
                        temp.koef[i]=koef[i]+pol.koef[i];
                return temp;
        }
        if(degree<pol.degree)
        {
                Polinom temp(pol.degree);
                for(int i=degree;i>=0;i--)
                        temp.koef[i]=koef[i]+pol.koef[i];
                for(int i=pol.degree;i>=degree+1;i--)
                        temp.koef[i]=pol.koef[i];
                return temp;
        }
        if(degree>pol.degree)
        {
                Polinom temp(degree);
                for(int i=pol.degree;i>=0;i--)
                        temp.koef[i]=koef[i]+pol.koef[i];
                for(int i=degree;i>=pol.degree+1;i--)
                        temp.koef[i]=koef[i];
                return temp;
        }
        return *this;
}
Polinom Polinom::operator *(Polinom& pol)
{
                Polinom temp;
                temp.degree=degree+pol.degree;
                temp.koef=new int[temp.degree+1];
                for(int i=0;i<=degree;i++)
                {
                        for(int j=0;j<=pol.degree;j++)
                                {
                                        temp.koef[i+j] +=koef[i]*pol.koef[j];
                                }
                }
                return temp;
}
Polinom& Polinom::operator =(Polinom& t)
{
        if(this==&t)
                {
                        return *this;
                }
        degree=t.degree;
        for(int i=degree;i>=0;i--)
                koef[i]=t.koef[i];
        return *this;
}
Polinom Polinom::operator +(int &n)
{
        Polinom temp(degree);
        for(int i=degree;i>=0;i--)
        {
                temp.koef[i]=koef[i];
                if (i==0) temp.koef[i]=koef[i]+n;
        }
        return temp;
}
Polinom Polinom::operator *(int&n)
{
        Polinom temp(degree);
        for(int i=degree;i>=0;i--)
                temp.koef[i]=koef[i]*n;
        return temp;
}
bool Polinom::operator ==(Polinom&t)
{
        return(t.degree==degree);
}
bool Polinom::operator >=(Polinom&t)
{
        return(degree>=t.degree);
}
bool Polinom::operator <=(Polinom&t)
{
        return(degree<=t.degree);
}
int main()
{
        setlocale(LC_ALL, "Russian");
        int n=-10;
        int k=0;
        std::cout<<"Введите степень первого полинома\n";std::cin>>n;
        if(n==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        Polinom p(n);
        p.input(n);
        int m=-10;
        std::cout<<"Введите степень второго полинома\n";std::cin>>m;
        if(m==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        Polinom s(m);
        s.input(m);
        std::cout<<"Первый полином: " << p <<'\n';
        std::cout<<"Второй полином: " << s <<'\n';
        if(p.GetDegr()>=s.GetDegr())
                k=p.GetDegr();
        else
                k=s.GetDegr();
        Polinom t(k);
        t=p+s;
        std::cout<<"\n";
        std::cout<<"Сумма полиномов = " << t <<'\n';
        std::cout<<"Введите натуральное число для сложения с первым полиномом\n";std::cin>>n;
        if(n==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        t=p+n;
        std::cout<<t<<'\n';
        std::cout<<"\n";
        std::cout<<"Введите натуральное число для сложения со вторым полиномом\n";std::cin>>n;
        if(n==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        t=s+n;
        std::cout<<t<<'\n';
        std::cout<<"\n";
        std::cout<<"Введите натуральное число для умножения первого полинома\n";std::cin>>n;
        if(n==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        t=p*n;
        std::cout<<t<<'\n';
        std::cout<<"\n";
        std::cout<<"Введите натуральное число для умножения второго полинома\n";std::cin>>n;
        if(n==-10)
        {
                std::cout<<"Ошибка ввода. Введите число\n";
                exit(0);
        }
        t=s*n;
        std::cout<<t<<'\n';
        std::cout<<"\n";
        if(p==s)
                std::cout<<"Полиномы равны\n";
        else if(p>=s)
                std::cout<<"Первый полином больше второго\n";
        else if(p<=s)
                std::cout<<"Первый полином меньше второго\n";
        Polinom x(p.GetDegr()+s.GetDegr());
        x=p*s;
        std::cout<<"\n";
        std::cout<<x<<'\n';
        system("pause");
        return 0;
}

PM MAIL   Вверх
vnf
Дата 25.6.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

+= - це что? 

сокращенная запись, a+=b эквивалентно a = a + b

после temp.koef=new int[temp.degree+1];
сделаей memset(temp.koef, 0, (temp.degree+1)*sizeof(int)), а так у тебя мусор в памяти

Это сообщение отредактировал(а) vnf - 25.6.2010, 19:14
PM MAIL   Вверх
Lavroff
Дата 25.6.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(vnf @ 25.6.2010,  19:12)
Цитата

+= - це что? 

сокращенная запись, a+=b эквивалентно a = a + b

после temp.koef=new int[temp.degree+1];
сделаей memset(temp.koef, 0, (temp.degree+1)*sizeof(int)), а так у тебя мусор в памяти

Огромное спасибо! Работает!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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