Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
bekhterman
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 5
#1

Многочлен n-ой степени. Списки

03.05.2017, 21:53. Просмотров 563. Ответов 6
Метки нет (Все метки)

Не могли бы Вы помочь мне с решение следующей задачи:
Многочлен n-ой степени можно представить в виде списка, где каждый элемент состоит из двух чисел - ненулевого коэффициента и показателя степени. Описать соответствующий тип данных и реализовать на нём следующие операции:
а) ввод многочлена с клавиатуры;
б) приведение многочлена к стандартному виду (приведены подобные слагаемые и одночлены упорядочены по неубыванию показателей степени)
в)вывод многочлена на экран в обычном виде (например, "р(х)=4x^3-2.51x+1.2");
д)произведение двух многочленов.

Желательно, чтобы программа была написана с использованием функций, а не созданием класса.
Особый момент - использование списков.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2017, 21:53
Ответы с готовыми решениями:

Даны действительное число а, многочлен степени n. Получить многочлен (x^2+2ax+3)*P(x)
Даны действительное число а, многочлен степени n. Получить многочлен ...

Многочлен P(x) степени N
помогите с задачкой: задача: Дан многочлен Р(х) степени N. Даны действительные...

Многочлен n+1ой степени
Дан многочлен P(x) степени n. Дано натур. число n, действительные числа a0 ,...

про списки и многочлен
добрый вечер.тут до завтра задачку решить надо.не очень понимаю само условие. ...

Даны действительные числа a0,.a5, d0,.d5 . Получить многочлен шестой степени d0+d1(x-a0)+d2(x-a0)(x-a1)+.+d5(x-a0)
Даны действительные числа a0,...a5, d0,...d5 . Получить многочлен шестой...

6
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
03.05.2017, 22:43 #2
bekhterman, я пока не слишком искушён в Си+1*, но мне кажутся перспективными возможности классов tuple и pair для этой задачи. Надо их исследовать, может ты или ещё кто доберутся до дела быстрее меня. По крайней мере, эти классы обещают решение без слишком узкой специализации.

Добавлено через 25 минут
Нет, пожалуй без класса list<pair> не обойтись.
0
bekhterman
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 5
03.05.2017, 23:03  [ТС] #3
Kudryashov_R_D, ох, это лишь ознакомительная задачка со связными списками, чем проще, тем лучше, конечно, но попробую ознакомиться с этим классом.
0
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
03.05.2017, 23:11 #4
bekhterman, если ты имеешь в виду не готовые списки std::list<type>, а самодельные, боюсь, это никому не будет интересно.
В STL полином можно впихнуть в std::list<pair<int,double>>, где int - степень элемента, double - коэффициент.
0
bekhterman
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 5
03.05.2017, 23:25  [ТС] #5
Kudryashov_R_D, хм, действительно, а почему бы и нет. Спасибо за наставление

Добавлено через 8 минут
Но и от самодельных я бы не отказался
0
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
04.05.2017, 22:18 #6
bekhterman, вот для разгона, неполный интерфейс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <algorithm> // sort
#include <iostream>
#include <list>
#include <sstream>
#include <string>
#include <utility> // pair
using namespace std;
 
using Item = pair<int,double>;
using Poly = list<Item>;
 
void PrintPolynom (Poly* pol) {
  bool firstTime = true;
  for (Item& p : *pol) {
    if (! firstTime)
      cout << "; ";
    cout << p.first << " " << p.second;
    firstTime = false;
  }
} // PrintPolynom()
 
void NormPolynom (Poly* pol) {
  // Привести подобные степени
  auto bgn = begin(*pol);
  while (bgn != end(*pol)) {
    auto p = *bgn;
    int pwr = p.first;
    double cft = p.second;
    auto nxt = bgn; ++nxt;
    while (nxt != end(*pol)) {
      auto q = *nxt;
      if (q.first != pwr)
        ++nxt;
      else {
        cft += q.second;
        nxt = pol->erase(nxt);
      }
    }
    if (cft == p.second)
      ++bgn;
    else {
      p.second = cft;
      auto del = bgn;
      bgn = pol->insert(bgn, p);
      pol->erase(del);;
    }
  }
  // Упорядочить по убыванию степеней
  pol->sort ([] (Item& p1, Item& p2)
    { return p1.first > p2.first; });
} // NormPolynom()
 
Poly* MultPolynom (Poly* pol1, Poly* pol2) {
  Poly* pol = new Poly;
  for (Item& p1 : *pol1) {
    for (Item& p2 : *pol2) {
      Item itm = make_pair (p1.first + p2.first
        ,p1.second * p2.second);
      pol->emplace_back(itm);
    }
  }
  NormPolynom (pol);
  return pol;
} // MultPolynom()
 
Poly* GetPolynom (istream& in) {
  Poly* pol = new Poly;
  string line, str1;
  int pwr; double cft;
  getline (in, line, '\n');
  istringstream elm1 (line);
  while (getline (elm1, str1, ';')) {
    istringstream elm2 (str1);
    elm2 >> pwr;
    elm2 >> cft;
    pol->emplace_back (make_pair (pwr, cft));
  }
  return pol;
} // GetPolynom()
 
void main () { // При вводе с клавиатуры (cin)
  // конец полинома по клавише Enter
  istringstream sin1 ("0 1; 1 2; 3 4; 1 -0.5");
  istringstream sin2 ("0 1; 1 2; 3 4; 1 -0.5");
  Poly* pol1 = GetPolynom (sin1); //cin);
  cout << "Origin 1\n";
  PrintPolynom (pol1);
  NormPolynom (pol1);
  cout << "\nNormalized 1\n";
  PrintPolynom (pol1);
  Poly* pol2 = GetPolynom (sin2); //cin);
  cout << "\nOrigin 2\n";
  PrintPolynom (pol2);
  NormPolynom (pol2);
  cout << "\nNormalized 2\n";
  PrintPolynom (pol2);
  Poly* pol3 = MultPolynom (pol1, pol2);
  cout << "\nProduct\n";
  PrintPolynom (pol3);
}
Добавлено через 13 часов 39 минут
bekhterman, Чем противо-естественна классо-боязнь? Она вынуждает писать отдельную функцию MultPolyDbl (Poly*, double) дополнительно к MultPolynom (Poly*, Poly*).
Этого можно избежать, если вместо псевдонима Poly объявить нормальный класс и в нём - конструктор из одного коэффициента при свободном члене
C++
1
2
3
4
5
6
7
8
9
10
11
12
using item = pair<int,double>;
using poly = list<item>;
 
class Poly {
private:
  poly* data = new poly;
public:
  ...
  Poly (double cft) {
    data->emplace_back (make_pair (0, cft));
  }
};
0
bekhterman
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 5
05.05.2017, 09:14  [ТС] #7
Kudryashov_R_D, да нет, я и не против классов, но мой препод это не оценит
0
05.05.2017, 09:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2017, 09:14

Дан многочлен P(x) степени n. Получить его производную P′(x)
Дан многочлен P(x) степени n. Получить его производную P′(x) ...

Дан многочлен P(x) степени n. Получить его производную P'(x), а также вычислить P'(1),P'(2),P'(3)
Дан многочлен P(x) степени n. Получить его производную P'(x), а также вычислить...

Сгенерировать случайным образом многочлен P(x) степени N и найти интеграл P(x) от a до b для заданных a и b
Сгенерировать случайным образом многочлен P(x) степени N и найти интеграл P(x)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru