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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание многочлена и выполнение действий над ним. на С++ 
V
    Опции темы
Pakshin A. S.
Дата 7.5.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что-то под вечер стал уго соображать... smile

Задача: сделать многочлен и действия над ним.

Вот, что у меня получилось:
Код

// Project2.cpp : Defines the entry point for the console application.
//

#include "iostream"
#include "fstream"
#include "locale"

using namespace std;

// Класс для хранения многочлена и примитивной работы с ним
class CMainData
{
private:
    int n;
    int *koff;
public:
    CMainData();
    void SetN(int _n);
    void SetKoff(int *_koff);
    int GetN();
    friend class CUser;
    friend class CPolynomial;
};

CMainData::CMainData()
{
    n = 0;
}

int CMainData::GetN()
{
    return n;
}

void CMainData::SetN(int _n)
{
    n = _n;
    koff = new int (n);
}

void CMainData::SetKoff(int *_koff)
{
    int *buf = koff;

    for (int i = 0; i <= n; *koff = *_koff, *_koff++, *koff++, i++);
    koff=buf;
}


// Класс пользовательских примитивных возможностей
class CUser: public CMainData
{
public:
    void ShowData();
    void GetData();
};

void CUser::ShowData()
{
    wcout << endl << L"Введенный многочлен: " << endl;
    
    int m=n;
    int *buf = koff;
    bool b = false;

    for (int i = 0; i <= n; i++)
    {
        if (*koff != 0)
        {
            m = m-i;
            if (*koff < 0) 
                cout << "-";
            else 
                if (b == true)
                    cout << "+";
            if ((abs(*koff) != 1) || (m == 0))
                cout << abs(*koff);
            if (m >= 1)
                cout << "x";
            if (m > 1)
                cout << "^" << m;
            b = true;
        }
        koff++;
    }
    if (b == false)
        cout << "0";
    koff=buf;
    cout << endl << endl;
}

void CUser::GetData()
{
    int _n;

    wcout << L"Введите степень многочлена -> ";
    cin >> _n;
    SetN(_n);

    int *buf, *b;
    buf = new int (n);
    b = buf;

    for (int i = 0; i <= n; i++)
    {
        wcout << L"Введите коэффициент " << i << L" -> ";
        cin >> *buf;
        if (i < n)
            buf++;
    }
    buf=b;
    SetKoff(b);
}

// Окончательный многочлен со всеми свойствами 
class CPolynomial: public CUser
{
public:
    CPolynomial operator+ (const CPolynomial &Poly);
    CPolynomial operator- (const CPolynomial &Poly);
//    CPolynomial operator* (CPolynomial Poly);
    int *Change(int *koff, int size);
};

CPolynomial CPolynomial::operator+ (const CPolynomial &Poly)
{
    CPolynomial buf;
    
    int kf[100];
    int *bf1 = Poly.koff;
    int *bf2 = koff;

    if (Poly.n > n)
    {
        buf.SetN(Poly.n);
        for (int i = 1; i < Poly.n - n; i++)
            bf1++;
    }
    else
    {
        buf.SetN(n);
        for (int i = 1; i < n - Poly.n; i++)
            bf2++;
    }        

    for (int i = 0; i <= n - abs(Poly.n - n); i++)
    {
        cout << endl << i << endl;
        kf[i] = *bf2 + *bf1;
        bf2++;
        bf1++;
    }
    buf.SetKoff(kf);

    return buf;
}

int *CPolynomial::Change(int *koff, int size)
{
    int *buf = koff;

    for (int i = 1; i <= size; i++)
    {
        *buf=-*buf;
        buf++;
    }

    return koff;
}

CPolynomial CPolynomial::operator- (const CPolynomial &Poly)
{
    CPolynomial buf;
    buf=Poly;
    buf.koff=Change(buf.koff, buf.n);

    return *this+buf;
}

int main(int argc, char* argv[])
{
    _wsetlocale (LC_ALL, L".866"); 
    
    CPolynomial Poly1;

    Poly1.GetData();
    Poly1.ShowData();
    
    CPolynomial Poly2;

    Poly2.GetData();
    (Poly1 + Poly2).ShowData();

    return 0;
}


Данная штука не желает складывать многочлены разной длины... Проверьте логику перегрузки оператора "+", если не сложно...  smile  
PM   Вверх
MAKCim
Дата 7.5.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



может так
Код

CPolynomial CPolynomial::operator+ (const CPolynomial &Poly)
{
    CPolynomial buf;
    
    int *bf1 = Poly.koff;
    int *bf2 = koff, *temp=0;
    int t=max(Poly.n,n);
    buf.SetN(t);
    int m=min(Poly.n,n), i=0;
    while (i<m)
    {
        buf.koff[i++]=*bf1+*bf2;
        ++bf1, ++bf2;
    }
    temp=Poly.n==m ? bf2: bf1;
    while (i<t) buf.koff[i++]=*temp;
    return buf;
}

извините конечно, но код Ваш, имхо,  smile   

Это сообщение отредактировал(а) MAKCim - 7.5.2006, 20:47


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Pakshin A. S.
Дата 7.5.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @  7.5.2006,  21:46 Найти цитируемый пост)
но код Ваш

А я и не Сист, а Дельфист...

Кстати, код не работает... smile 
PM   Вверх
Pakshin A. S.
Дата 7.5.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

CPolynomial CPolynomial::operator+ (const CPolynomial &Poly)
{
    CPolynomial buf;
    
    int *bf1 = Poly.koff;
    int *bf2 = koff;
    int t = max(Poly.n, n);

    buf.SetN(t);

    int m = min(Poly.n, n);
    int i = t;

    while (i > m)
        if (Poly.n == t)
        {
            buf.koff[i--] = *bf1;
            bf1++;
        }
        else
        {
            buf.koff[i--] = *bf2;
            bf2++;
        }
    while (i >= 0)
    {
        buf.koff[i--] = *bf1 + *bf2;
        ++bf1;
        ++bf2;
    }

    int bf;

    for (i = 0; i < t; i++)
    {
        bf = buf.koff[i];
        buf.koff[i] = buf.koff[t - i];
        buf.koff[t-i] = bf;
    }

    return buf;
}
 
PM   Вверх
MAKCim
Дата 8.5.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Кстати, код не работает..

не спорю мог где-то ошибиться
хотя по логике должен работать правильно 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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