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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Класс полиномов, с вещественными коэффицентами 
:(
    Опции темы
Mcicool
Дата 17.11.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Определить класс полиномов с вещественными коэффициентами:
f(x) = a[0]*x^n + a[1]*x^(n-1) +...+ a[n-1]*x + a[n]
Максимальную степень полиномов задать препроцессорной константой. 
Ввести операции-функции для ввода-вывода (<<, >>), для сложения 
полиномов, умножения полинома на число и числа на полином, для 
сложения числа с полиномом и полинома с числом. 
В основной программе создать несколько полиномов и продемонстрировать 
применение всех операций над ними. 
Кроме того, определить массив полиномов 
(объектов класса). Размер массива (количество элементов) ввести с 
клавиатуры. Значения коэффициентов полиномов задать случайным образом 
(функция random(), заголовок <cstdlib>). Вывести полученные полиномы 
(элементы массива). Затем, вводя с клавиатуры значения аргумента (х), 
выводить те полиномы из массива, для которых при данном аргументе 
полиномы имеют минимальное и максимальное значения. 
Окончание работы - ввод нулевого значения аргумента х.
PM MAIL   Вверх
Kuvaldis
Дата 17.11.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



Mcicool, 
вот я делал свой класс: правда, в нем еще и умножение-деление полиномов есть.
В общем, усовершенствуй под свои нужды...

Это сообщение отредактировал(а) Kuvaldis - 17.11.2006, 12:19

Присоединённый файл ( Кол-во скачиваний: 204 )
Присоединённый файл  Polynom.zip 2,63 Kb


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Mcicool
Дата 17.11.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, ты не мог бы сказать, вообще, что делает твоя программа?
А то там слишком сложные для меня средства были использованы...
И зачем эти члеы:
Код

    friend  ostream& operator << (ostream& output, const Polynom& thePol);
    friend  istream& operator >> (istream& input, Polynom& thePol);
    friend  Polynom operator * (int num, const Polynom& thePol);


Объявлены как закрытые поля данных?
PM MAIL   Вверх
Kuvaldis
Дата 17.11.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



Mcicool, 
Вообще-то функциям, объявленным как friend, АСБОЛЮТНО фиолетово, в каком месте находится их описание Хочешь, пиши их в public, хочешь - в private секцию. Это  НЕ ВАЖНО.
Цитата

Спасибо, ты не мог бы сказать, вообще, что делает твоя программа?
А то там слишком сложные для меня средства были использованы...

Не бывает, что НИЧЕГО не понятно. Где непонятно конкретно?

Это сообщение отредактировал(а) Kuvaldis - 17.11.2006, 19:17


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
stalker401
Дата 26.11.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выполняя ту же работу, столкнулся с ошибкой.
Код кажется мне правильным, но тем не менее вылетает при работе, вызывая ошибку сегментации (segmentation fault).
Что самое интересное, ошибка вылетает в разных местах главной функции.
Гарантированно работает до момента, когда введены все полиномы.
Дальше - как получится.

Код

#include <iostream>
#include <cmath>
#define MAXIMUM 5
using namespace std;

class Polynom
{
    private:
    double *Arr;
    public:
    Polynom();
    Polynom(double x);
    Polynom(const Polynom&);
    ~Polynom();
    double value(double);
    friend Polynom operator + (Polynom, Polynom);
    friend Polynom operator + (Polynom, double);
    friend Polynom operator + (double, Polynom);
    friend istream & operator >> (istream&, Polynom&);
    friend ostream & operator << (ostream&, Polynom);
};

Polynom::Polynom()
{
    Arr=new double[MAXIMUM];
}

Polynom::Polynom(const Polynom & P)
{
    Arr=new double[MAXIMUM];
    for(int i=0; i<MAXIMUM; i++)
    {
        Arr[i]=P.Arr[i];
    }
}

Polynom::Polynom(double x)
{
    Arr=new double[MAXIMUM];
    Arr[MAXIMUM-1]=x;
}

Polynom::~Polynom()
{
    delete Arr;
    Arr = 0;
}

double Polynom::value(double x)
{
    double val;
    for (int i=0; i<MAXIMUM; i++)
    {
        val += pow (x, MAXIMUM-i) * Arr[i];
    }
    return val;
}

istream& operator >> (istream& cin, Polynom& P)
{
    cout<<"Максимальная степень полинома: "<<MAXIMUM<<endl;
    cout<<"Вводите аргументы по одному."<<endl;
    for (int i=0; i<MAXIMUM; i++)
    {
        cout<<"a["<<i<<"] = ";
        cin>>P.Arr[i];
    }
    return cin;
}

ostream& operator << (ostream& cout, Polynom P)
{
    for (int i=0; i<MAXIMUM; i++)
    {
        if (P.Arr[i] != 0 && i != MAXIMUM-1)
        {
            cout<<P.Arr[i]<<"x^"<<(MAXIMUM-i)<<" ";
            if (P.Arr[i+1] >= 0)
            {
                cout<<"+ ";
            }
        }
        else if (P.Arr[i] == 0)
        {
            continue;
        }
        else if (i == MAXIMUM-1)
        {
            cout<<P.Arr[i];
        }
    }
}

Polynom operator + (Polynom A, Polynom B)
{
    Polynom Ans(A);
    for (int i=0; i<MAXIMUM; i++)
    {
        Ans.Arr[i] += B.Arr[i];
    }
    return Ans;
}

Polynom operator + (Polynom A, double b)
{
    Polynom B(b);
    return A+B;
}

Polynom operator + (double a, Polynom B)
{
    Polynom A(a);
    return A+B;
}

int main()
{
    Polynom *A;
    Polynom Max;
    Polynom Min;
    int polyAmount;
    cout<<"Введите количество полиномов: ";
    cin>>polyAmount;
    A = new Polynom[polyAmount];
    for (int i=0; i<polyAmount; i++)
    {
        cin>>A[i];
    }
// Вот тут уже начинаются вылеты. Иногда даже не выводит значения полиномов при аргументе 1.
    for (int i=0; i<polyAmount; i++)
    {
        cout<<A[i]<<endl<<A[i].value(1)<<endl;
    }
    double argument;
    while(1)
    {
        cout<<endl<<"Введите значение аргумента: ";
        cin>>argument;
        if (argument == 0)
        {
            break;
        }
        Max = A[0];
        Min = A[0];
        for (int l=0; l<MAXIMUM; l++)
        {
            if ((Max.value(argument)) < (A[l].value(argument)))
            {
                Max = A[l];
            }
        }
        for (int k=0; k<MAXIMUM; k++)
        {
            if ((Min.value(argument)) > (A[k].value(argument)))
            {
                Min = A[k];
            }
        }
        cout<<endl<<"Полином с максимальным значением при данном аргументе:\t";
        cout<<Max<<endl;
        cout<<"Полином с минимальным значением при данном аргументе:\t";
        cout<<Min<<endl;
    }
    return 0;
}



Это сообщение отредактировал(а) stalker401 - 26.11.2006, 13:23
PM MAIL   Вверх
Mcicool
Дата 28.11.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мой код:
 
Код

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

#define MAX 3                //Препроцессорная константа, максимальная степень

class polynom
{
private:
 double a[MAX];

public:

 polynom();
 polynom(const polynom&p);

 double operator()(double x);
 friend polynom operator+(polynom a, polynom b);    //Полином с полиномом
 friend polynom operator+(polynom a, double d);     //Полином с числом
 friend polynom operator+(double d, polynom a);     //Число с полиномом
 friend polynom operator*(polynom a, double d);     //Полином на число
 friend polynom operator*(double d, polynom a);     //Число на полином
 friend ostream& operator<<(ostream&o, polynom p);
 friend istream& operator>>(istream&s, polynom&p);
};

polynom :: polynom ()
{
 for(int i=0;i<=MAX;i++) a[i]=rand()%10;
 }
 polynom :: polynom(const polynom&p)
 {
 for(int i=0;i<=MAX;i++) a[i]=p.a[i];
 }
double polynom::operator()(double x)
{
 double mul=1;
 double sum=a[MAX];
 for (int i=MAX;i>=0;i--)
  {
   sum+=mul*a[i];
   mul*=x;
  }
 return sum;
}
polynom operator+(polynom a, polynom b)
{
 polynom p;
 for(int i=0;i<=MAX;i++)
  p.a[i]=a.a[i]+b.a[i];
 return p;
}

polynom operator+(polynom a, double d)
{
 polynom p;
 for(int i=0;i<=MAX;i++)
  p.a[i]=a.a[i]+d;
 return p;
}

polynom operator+(double d, polynom a)
{
 polynom p;
 for(int i=0;i<=MAX;i++)
  p.a[i]=a.a[i]+d;
 return p;
}

polynom operator*(polynom a, double d)
{
 polynom p;
 for(int i=0;i<=MAX;i++)
  p.a[i]=a.a[i]*d;
 return p;
}

polynom operator*(double d, polynom a)
{
 polynom p;
 for(int i=0;i<=MAX;i++)
  p.a[i]=a.a[i]*d;
 return p;
}

ostream& operator<<(ostream&o, polynom p)
{
  bool flag=true;
  for(int i=MAX;i>0;i--)
 if (p.a[i]!=0.0) 
 {
  if (!flag) o<<" + ";
  else flag=false;
    if (p.a[i]!=1.0) o<<p.a[i];
    if(i>1) o<<"x^"<<i;
  else o<<"x";
 }
  if (!flag) o<<" + ";
  o<<p.a[0];
  
  return o;
}

istream& operator>>(istream&s, polynom&p)
{
  for(int i=0;i<=MAX;i++)
 {
  cout<<endl<<"a["<<i<<"]=";
  s>>p.a[i];
 }
  return s;
}


int main()
{
 srand(time(NULL));
 cout<<"Mnogo4len vida: f(x)=a[3]*x^3 + a[2]*x^2 + a[1]*x + a[0]"<<endl<<endl;
 int n;
 double x=1.0;
 polynom* m;

 polynom a,b;
 double d;

 cout<<"\nVvedite polinom:";
 cin>>a;
 cout<<"Vvedite chislo (double):";
 cin>>d;

 cout<<"\n\nVichislenia:\n"<<"Ishodniy polynom: "<<a;
 cout<<"\nUmnojaem ego na "<<d<<": ";
 b=a*d;
 cout<<b;
 cout<<"\nSkladivaem rezultat s "<<d<<": ";
 b=b+d;
 cout<<b;
 cout<<"\n Vvedite kolichestvo elementov massiva:";
 cin>>n;
 m = new polynom[n];

 cout<<"\n Vvedite x:";
 cin>>x;
 
 while(x!=0.0){
  if (x==0.0) break;
  for(int i=0;i<n;i++)
   {
   cout<<"\np"<<i<<" = "<<m[i]<<" = "<<m[i](x);

   if(m[i](x) >= m[i](x+0.001) && m[i](x) >= m[i](x-0.001)) // max
    cout<<"\tmax: "<<m[i];

   if(m[i](x) <= m[i](x+0.001) && m[i](x) <= m[i](x-0.001)) // min
    cout<<"\tmin: "<<m[i];
   }
  cout<<"\n Vvedite x:";
  cin>>x;
 };
}


Короче, моя прога не делает то, что нужно в задании. А мне надо, чтобы делала )))
Помогите мне с этой проблемой пожалуйста.

Это сообщение отредактировал(а) Alexeis - 24.5.2007, 16:57
PM MAIL   Вверх
Mcicool
Дата 28.11.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В общем у меня проблема в том, что мне надо написать конструктор приведения типов (дабл к полиному).
Чтобы, когда я вводил число 2 к примеру, он его распозновал как 0*x^3 + 0*x^2 + 0*x + 2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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