Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/75: Рейтинг темы: голосов - 75, средняя оценка - 4.87
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
1

Найти производную многочлена

09.01.2016, 10:36. Показов 13938. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача простая - найти производную многочлена. Многочлен может быть большой, но только с неотрицательными целыми степенями и целыми коэффициентами. Вывод должен быть без пробелов и в порядке убывания степеней, хотя ввод этому правилу может не удовлетворять. Также на ввод может быть подан многочлен с неприведенными слагаемыми.

Sample Input 1:
x^2+x
Sample Output 1:
2*x+1

Sample Input 2:
2*x^100+100*x^2
Sample Output 2:
200*x^99+200*x

Sample Input 3:
x^10000+x+1
Sample Output 3:
10000*x^9999+1

Sample Input 4:
-x^2-x^3
Sample Output 4:
-3*x^2-2*x

Sample Input 5:
x+x+x+x+x+x+x+x+x+x
Sample Output 5:
10
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.01.2016, 10:36
Ответы с готовыми решениями:

Получить производную многочлена
Задание: Не понимаю, как это реализовать.

Найти значение многочлена при заданном аргументе, производной от многочлена
Ребята всем привет,,,,прошу вас помогите мне,,,,у меня вопрос жизни или смерти!!!!если вы мне не...

Найти производную f'(x)
double f(double t) { double F; F = 7*pow(2.71, -2*t)*sin(7*t+0.3)-1; return F; } требуется...

Найти коэффициенты многочлена
Друзья, приветствую, помогите решить одну заковыристую задачу на С++: Даны натуральное число n и...

21
Модератор
Эксперт С++
 Аватар для zss
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,157
09.01.2016, 10:41 2
Сдвигаете массив коэффициентов на один элемент и умножаете на номер этого элемента.
На место самого старшего пишите ноль
C++
1
2
3
for(int i=0;i<n-1;i++)
   p[i]=c[i+1]*(i+1);
p[n-1]=0;
1
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
09.01.2016, 16:19  [ТС] 3
Хотелось бы реализацию.

Добавлено через 3 часа 16 минут
Ап, все еще актуально.
0
Модератор
Эксперт С++
 Аватар для zss
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,157
09.01.2016, 20:05 4
Цитата Сообщение от andreyananas Посмотреть сообщение
Хотелось бы реализацию
Возьмите образец
Образцы (шаблоны) программ для типовых задач
И предложенный мною код вставьте в функцию
C++
1
int Work(int* с,int* p,int n);
1
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
11.01.2016, 18:05  [ТС] 5
Нужна все таки помощь.

Добавлено через 3 часа 6 минут
АП, нид хелп
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
12.01.2016, 11:09 6
С такой же задачкой борюсь , давайте это делать вместе) код на рабочем компе оставил, завтра выложу. Выкладывайте ваши наработки.

Добавлено через 12 часов 51 минуту
andreyananas,
Выкладываю код. Пока умеет просто считать не полностью многочлен и без сортировки. Пока не в какой контейнер итоговые результаты не загружал. Короче вчера накидал побыстрому, только учусь. Уверен что криво написано и можно короче, жду комментариев.
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <iterator>
#include <cstdlib>
#include<sstream>
#include <cstring>
 
using namespace std;
string derivative(string polynomial) ;
int main()
{
    string name;
    cout << "Vvedite mnogoclen!" << endl;
    cin>>name;
    string m;
    string tmp;
    list<string> li;
    string::iterator j;
    for(auto i=name.begin(); i!=name.end();)
    {
        j=i;
        for(j; j!=name.end(); j++)
        {
            if(i!=j&&(*j=='+'||*j=='-'||j+1==name.end()))
            {
                string *tmp=new string;
                if(j+1==name.end())
                    copy(i,j+1,insert_iterator<string>(*tmp,tmp->begin()));
                if(*j=='+'||*j=='-')
                {
                    copy(i,j,insert_iterator<string>(*tmp,tmp->begin()));
                    li.push_front(*tmp);
                    i=j;
                    continue;
                }
                li.push_front(*tmp);
                i=j+1;
            }
        }
    }
    int a=0;
    int b=0;
    while(!li.empty())
    {
        a=b=0;
        m=li.back();
        li.pop_back();
        for(auto i=m.begin(),j=i; i!=m.end(); i++)
        {
            if(!isalpha(*i))
            {
 
                if(*i=='*')
                {
                    copy(j,i+m.size(),insert_iterator<string>(tmp,tmp.begin()));
                    istringstream ss(tmp);
                    ss>>a;
                }
                if(*i=='^')
                    j=i=i+1;
                if(i==m.end()-1)
                {
                    copy(j,i+m.size(),insert_iterator<string>(tmp,tmp.begin()));
                    istringstream ss(tmp);
                    ss>>b;
                }
            }
            if(isalpha(*i))
            {
                if((*(i-1)=='+'||*(i-1)=='-')&&((*(i+1)!='^'||*(i+1)!='^')))
                {
                    stringstream sc;
                    sc.setf(ios_base::showpos);
                    sc<<1;
                    sc>>m;
                }
            }
        }
        /*if(!isalpha(m)){
            continue;
        }*/
        if(a==0&&b>1)
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
        if(a>0&&b>0)
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a*b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
 
        if(b==0&&a>1)
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a;
            sc>>m;
        }
        cout<<m<<endl;
    }
    cout<<a<<" "<<b;
    return 0;
}
0
andreyananas
12.01.2016, 12:02  [ТС]
  #7

Не по теме:

Ближе к вечеру отпишусь. Сейчас немного занят.

0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
12.01.2016, 22:13 8
Выкладываю итог часовой работы, код работает не полностью опять еще , но уже лучше. Сначала разбивает строку на подстроки с отдельными выражениями, потом определяет что есть множитель а что степень, потом записывает значения в новую строку, которая помещается в список. Короче- выражения типо 5*х^2+8-x+8*x он считает , но не сортирует. И еще один недочет , не смог добиться переноса знака, при подсчете одиночных X , т.е. если в выражении 7*х -х , то он считает как 7+1,а не 7-1. Так что вот так. Пока остановился на этом. Код очень громоздкий , проу помощи в указании недочетов по оформлении и чего я лишнего понапихал.
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <iterator>
#include <cstdlib>
#include<sstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    string name;
    cout << "Vvedite mnogoclen!" << endl;
    cin>>name;//Вводим многочлен
    string m;//переменные для разделения строки
    string *tmp;//переменная для запихивания в список данных
    list<string> li;
     list<string> li2;//список
    string::iterator j;//2-1 список
    for(auto i=name.begin(); i!=name.end();)
    {
        j=i;
        for(j; j!=name.end(); j++)//проходимся по всей строке
        {
            if(i!=j&&(*j=='+'||*j=='-'||j+1==name.end()))//если останавливаемся на + или - запихиваем в список
            {
                tmp=new string;
                if(j+1==name.end())
                    copy(i,j+1,insert_iterator<string>(*tmp,tmp->begin()));
                if(*j=='+'||*j=='-')
                {
                    copy(i,j,insert_iterator<string>(*tmp,tmp->begin()));
                    li.push_front(*tmp);
                    i=j;
                    continue;
                }
                li.push_front(*tmp);
                i=j+1;
            }
        }
    }
    int a=0;//сюда записываем множитель
    int b=0;//сюда степень
    int c=0;//флаг для определения одиночного числа(ничего лучше не придумал)
    while(!li.empty())
    {
        a=b=0;
        m=li.back();
        li.pop_back();
        for(auto i=m.begin(),j=i; i!=m.end(); i++)//проходимся по подмножителям
        {
            if(!isalpha(*i))//если не буква
            {
                if(*i=='*')//когда натыкаемся на * заносим число в множитель
                {
                    copy(j,i+m.size(),insert_iterator<string>(name,name.begin()));
                    istringstream ss(name);
                    ss>>a;
                }
                if(*i=='^')//когда натыкаемся на ^ перемещаем итераторы на 1
                    j=i=i+1;
                if(i==m.end()-1)//если почти конец
                {
                    if((*j=='+'||*j=='-')||(isdigit(*j)&&j==m.begin()))//если одиночная буква то меняем флаг
                    {
                        c=-1;
                    }
                    else
                    {
                        copy(j,i+m.size(),insert_iterator<string>(name,name.begin()));//в остальных случаях заносив в степень b
                        istringstream ss(name);
                        ss>>b;
                    }
                }
            }
        }
        if(a==0&&b!=1)//если нет множителя , но есть степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
        if(a!=0&&b!=0)//если есть и множитель и степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a*b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
 
        if(b==0&&a!=1)//если есть только множитель
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a;
            sc>>m;
        }
        if(a==0&&b==0)//если одиночный знак
        {
            if(c<0)//если буква
            {
                stringstream sc;
                sc<<"0";
                sc>>m;
                c=0;
            }
            else{//если цифра
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<1;
            sc>>m;
            }
        }
        tmp=new string;
        *tmp=m;
        if(m!="0"){
               li2.push_back(*tmp);//запихиваем в новый список
        }
    }
    for(auto i=li2.begin();i!=li2.end();i++){//выводим
        cout<<*i;
    }
    return 0;
}
Добавлено через 11 минут
и еще он не пропускает пробелы, чего требует условие задачи(

Добавлено через 1 час 22 минуты
Вот новый код, где предварительно удаляются все пробелы если они есть. Прошу помочь решить проблему , когда если 6*x^2 -x ,программа не сохраняет значение -х и получается +1,т.е. 12*х+1, а должно быть 12*х-1;
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <iterator>
#include <cstdlib>
#include<sstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    string name;
    cout << "Vvedite mnogoclen!" << endl;
    std::getline (std::cin,name);//Вводим многочлен
    for (std::string::iterator it = name.begin() ; it<name.end(); ++it )//удаляем пробелы если они есть
    {
        if (*it == ' ') name.erase(it);
    }
    string m;//переменные для разделения строки
    string *tmp;//переменная для запихивания в список данных
    list<string> li;
    list<string> li2;//список
    string::iterator j;//2-1 список
    for(auto i=name.begin(); i!=name.end();)
    {
        j=i;
        for(j; j!=name.end(); j++)//проходимся по всей строке
        {
            if(i!=j&&(*j=='+'||*j=='-'||j+1==name.end()))//если останавливаемся на + или - запихиваем в список
            {
                tmp=new string;
                if(j+1==name.end())
                    copy(i,j+1,insert_iterator<string>(*tmp,tmp->begin()));
                if(*j=='+'||*j=='-')
                {
                    copy(i,j,insert_iterator<string>(*tmp,tmp->begin()));
                    li.push_front(*tmp);
                    i=j;
                    continue;
                }
                li.push_front(*tmp);
                i=j+1;
            }
        }
    }
    int a=0;//сюда записываем множитель
    int b=0;//сюда степень
    int c=0;//флаг для определения одиночного числа(ничего лучше не придумал)
    while(!li.empty())
    {
        a=b=0;
        m=li.back();
        li.pop_back();
        for(auto i=m.begin(),j=i; i!=m.end(); i++)//проходимся по подмножителям
        {
            if(!isalpha(*i))//если не буква
            {
                if(*i=='*')//когда натыкаемся на * заносим число в множитель
                {
                    copy(j,i+m.size(),insert_iterator<string>(name,name.begin()));
                    istringstream ss(name);
                    ss>>a;
                }
                if(*i=='^')//когда натыкаемся на ^ перемещаем итераторы на 1
                    j=i=i+1;
                if(i==m.end()-1)//если почти конец
                {
                    if((*j=='+'||*j=='-')||(isdigit(*j)&&j==m.begin()))//если одиночная буква то меняем флаг
                    {
                        c=-1;
                    }
                    else
                    {
                        copy(j,i+m.size(),insert_iterator<string>(name,name.begin()));//в остальных случаях заносив в степень b
                        istringstream ss(name);
                        ss>>b;
                    }
                }
            }
        }
        if(a==0&&b!=1)//если нет множителя , но есть степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
        if(a!=0&&b!=0)//если есть и множитель и степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a*b;
            sc<<"x";
            sc<<noshowpos;
            if((b-1)>1)
            {
                sc<<b-1;
            }
            sc>>m;
        }
 
        if(b==0&&a!=1)//если есть только множитель
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc<<a;
            sc>>m;
        }
        if(a==0&&b==0)//если одиночный знак
        {
            if(c<0)//если буква
            {
                stringstream sc;
                sc<<"0";
                sc>>m;
                c=0;
            }
            else //если цифра
            {
                stringstream sc;
                sc.setf(ios_base::showpos);
                sc<<1;
                sc>>m;
            }
        }
        tmp=new string;
        *tmp=m;
        if(m!="0")
        {
            li2.push_back(*tmp);//запихиваем в новый список
        }
    }
    for(auto i=li2.begin(); i!=li2.end(); i++) //выводим
    {
        cout<<*i;
    }
    return 0;
}
Добавлено через 5 часов 8 минут
С Минусами проблема решена. Осталось отсортировать ) Кстати такой тупой вопрос, а что значит неприведенные слагаемые ?
Ниже код)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <iterator>
#include <cstdlib>
#include<sstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    string polynome;
    cout << "Vvedite mnogoclen!" << endl;
    std::getline (std::cin,polynome);//Вводим многочлен
    for (std::string::iterator it = polynome.begin() ; it<polynome.end(); ++it )//удаляем пробелы если они есть
    {
        if (*it == ' ') polynome.erase(it);
    }
    string m;//переменные для разделения строки
    string *tmp;//переменная для запихивания в список данных
    list<string> li;
    list<string> li2;//список
    string::iterator j;//2-1 список
    for(auto i = polynome.begin() ; i != polynome.end();)
    {
        j=i;
        for(j; j!=polynome.end(); j++)//проходимся по всей строке
        {
            if(i!=j && (*j=='+' || *j=='-' || j+1==polynome.end()))//если останавливаемся на + или - запихиваем в список
            {
                tmp = new string;
                if(j+1 == polynome.end())
                    copy(i,j+1,insert_iterator<string>(*tmp,tmp->begin()));
                if(*j == '+' || *j == '-')
                {
                    copy(i,j,insert_iterator<string>(*tmp,tmp->begin()));
                    li.push_front(*tmp);
                    i = j;
                    continue;
                }
                li.push_front(*tmp);
                i = j+1;
            }
        }
    }
    int a = 0;//сюда записываем множитель
    int b = 0;//сюда степень
    int c = 0;//флаг для определения одиночного числа(ничего лучше не придумал)
    while(!li.empty())
    {
        a = b = 0;
        m = li.back();
        li.pop_back();
        for(auto i=m.begin(), j=i; i!=m.end(); i++)//проходимся по подмножителям
        {
            if(!isalpha(*i))//если не буква
            {
                if(*i == '*')//когда натыкаемся на * заносим число в множитель
                {
                    copy(j,i+m.size(), insert_iterator<string>(polynome,polynome.begin()));
                    istringstream ss(polynome);
                    ss >> a;
                }
 
                if(*i == '^')//когда натыкаемся на ^ перемещаем итераторы на 1
                    j = i = i+1;
 
                if(i == m.end()-1)//если почти конец
                {
 
                    if((*j=='+' || *j=='-') || (isdigit(*j)&&j==m.begin()))//если одиночная буква то меняем флаг
                    {
                        c=-1;
                    }
                    else
                    {
                        copy(j, i+m.size(), insert_iterator<string>(polynome, polynome.begin()));//в остальных случаях заносив в степень b
                        istringstream ss(polynome);
                        ss >> b;
                    }
                }
            }
 
            if(isalpha(*i))
            {
                if(*(i-1)=='-' && *(i+1)=='^')
                    c=-2;
            }
        }
 
        if(a==0 && b!=0)//если нет множителя , но есть степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
 
            if(c==-2)
            {
                sc<<-(b);
            }
            else
                sc << b;
            sc << "x";
            sc << noshowpos;
            if((b-1) > 1)
            {
                sc << b-1;
            }
            sc >> m;
        }
 
        if(a!=0 && b!=0)//если есть и множитель и степень
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc << a*b;
            sc << "x";
            sc << noshowpos;
            if((b-1)>1)
            {
                sc << b-1;
            }
            sc >> m;
        }
 
        if(b==0 && a!=0)//если есть только множитель
        {
            stringstream sc;
            sc.setf(ios_base::showpos);
            sc << a;
            sc >> m;
        }
 
        if(a==0 && b==0)//если одиночный знак
        {
            if(c < 0)//если цифра
            {
                stringstream sc;
                sc << "0";
                sc >> m;
                c = 0;
            }
 
            else //если буква
            {
                stringstream sc;
                sc.setf(ios_base::showpos);
                if(*(m.begin()) == '-')
                {
                    sc << -1;
                }
                else
                    sc << 1;
                sc >> m;
            }
        }
        tmp = new string;
        *tmp = m;
 
        if(m != "0")
        {
            li2.push_back(*tmp);//запихиваем в новый список
        }
        c == 0;
    }
 
    for(auto i=li2.begin(); i!=li2.end(); i++) //выводим
    {
        cout << *i;
    }
    return 0;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
12.01.2016, 22:31 9
Цитата Сообщение от MaximusL Посмотреть сообщение
if (*it == ' ') polynome.erase(it);
Получите undefined behaviour, так как вставка/удаление элементов в std::string и std::vector может превратить все связанные итераторы в тыкву (а может и не превратить). Для всего остального в тыкву превращаются ссылки и итераторы ведущие на удаленный элемент.
C++
1
2
3
4
    for (std::string::iterator it = polynome.begin() ; it<polynome.end(); )//удаляем пробелы если они есть
    {
        it=(*it == ' ')?polynome.erase(it):it+1;
    }
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
12.01.2016, 23:02 10
Renji, А можно поподробнее описать суть проблемы? И вообще может Ваш глаз увидит какие то недочеты. Ибо я только начал изучать С++ и возможно какие то вещи можно было сделать проще?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
12.01.2016, 23:28 11
Цитата Сообщение от MaximusL Посмотреть сообщение
Renji, А можно поподробнее описать суть проблемы?
Суть проблемы в том, что при вставке/удалении string может перенести свои данные в новое место. Причем, никого об этом не уведомляя (в том числе и итераторы). Поэтому, вы рискуете оказаться в ситуации когда итератор думает "данные лежат вон там", но в этом "вон там" уже ничего нет. Также переменятся итераторы указывающие на начало и конец контейнера. Поэтому, сравнения типа it<polynome.end() дадут непредсказуемый результат.

Контейнеры вроде std::list и std::map гарантируют что ничего, никуда переносить не будут. Зато, вместе с удаленным элементом, снесут и техническую информацию о "где лежали левый и правый соседи". Опять же, никого об этом не уведомляя. Так что итераторы указывающие на удаленный элемент заглючат после первого же ++.
Цитата Сообщение от MaximusL Посмотреть сообщение
И вообще может Ваш глаз увидит какие то недочеты.
Как минимум непонятно зачем вам tmp = new string; вместо просто std::string tmp;.
1
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
12.01.2016, 23:51 12
Renji, Хм, да , действительно , я почему то подумал что если не выделять память под каждую строку, то когда записывается в список, старые значения будут заменятся новыми данными и забыл о конструкторе копирования, и то что память выделяет для отдельной строки сам список.Поправлю) А вот как лучше реализовать сортировку? Написать функтор сравнивания и запихнуть его в sort?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.01.2016, 01:06 13
Лучше использовать контейнер который сортируется сам.
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
#include<sstream>
#include<iostream>
#include<cassert>
#include<map>
int main()
{
    std::stringstream stream("10*x^2-5*x^3+3");
    std::map<int,int>res;
    while(stream.peek()!=EOF)
    {
        bool is_signed=false;
        int mul=1,exp=0;
        if(stream.peek()=='-' || stream.peek()=='+')
            is_signed=stream.get()=='-';
        if(isdigit(stream.peek()))
            stream>>mul;
        if(is_signed)
            mul=-mul;
 
        if(stream.peek()=='*')
        {
            stream.get();
            assert(stream.peek()=='x');
            stream.get();
            if(stream.peek()=='^')
            {
                stream.get();
                stream>>exp;
            }else
                exp=1;
        }
 
        res[exp]=mul;
    }
 
    for(std::map<int,int>::const_iterator pos=res.begin();pos!=res.end();++pos)
        std::cout<<pos->second<<"*x^"<<pos->first<<std::endl;
}
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
13.01.2016, 21:52  [ТС] 14

Не по теме:

К сожалению не мог уделить время этой теме



Цитата Сообщение от Renji Посмотреть сообщение
Лучше использовать контейнер который сортируется сам.
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
#include<sstream>
#include<iostream>
#include<cassert>
#include<map>
int main()
{
    std::stringstream stream("10*x^2-5*x^3+3");
    std::map<int,int>res;
    while(stream.peek()!=EOF)
    {
        bool is_signed=false;
        int mul=1,exp=0;
        if(stream.peek()=='-' || stream.peek()=='+')
            is_signed=stream.get()=='-';
        if(isdigit(stream.peek()))
            stream>>mul;
        if(is_signed)
            mul=-mul;
 
        if(stream.peek()=='*')
        {
            stream.get();
            assert(stream.peek()=='x');
            stream.get();
            if(stream.peek()=='^')
            {
                stream.get();
                stream>>exp;
            }else
                exp=1;
        }
 
        res[exp]=mul;
    }
 
    for(std::map<int,int>::const_iterator pos=res.begin();pos!=res.end();++pos)
        std::cout<<pos->second<<"*x^"<<pos->first<<std::endl;
}
Это уже рабочий код по вычислению производной с многочлена?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.01.2016, 21:54 15
Это код по разложению многочлена на одночлены. Как искать производную от одночлена и суммы одночленов смотрите в школьном учебнике алгебры.
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
13.01.2016, 23:45 16
Renji, А если одночлены повторяются? код проглатывать их будет же....

Добавлено через 13 минут
Renji, думаю лучше взять тогда вместо map - std::unordered_map
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.01.2016, 01:34 17
Цитата Сообщение от MaximusL Посмотреть сообщение
Renji, А если одночлены повторяются? код проглатывать их будет же....
res[exp]=mul; res[exp]+=mul;
0
 Аватар для m1Rr0r
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
14.01.2016, 08:13 18
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
#include <regex>
#include <iostream>
#include <sstream>
#include <map>
#include <string>
using namespace std;
 
string derivative(string polynomial) {
    string s = polynomial;
    // Ключ - степень икса, значение - коеффициент при икс
    map<int, int> poly;
    map<int, int> dxpoly;
    if(polynomial[0] != '-') s = '+' + s;
    const regex r("([+|-]\\d+)([\\*]x([\\^](\\d+))?)?") ;
    const regex rr("([+|-])x");
    const string fmt("$011*x");
    s = regex_replace(s, rr, fmt);
    
    for(sregex_iterator i(s.begin(), s.end(), r), end; i != end; ++i) {
        //cout << " " << (*i)[0] << "\t" << (*i)[1] << "\t" << (*i)[2] << "\t" << (*i)[3] << "\t" << (*i)[4] << endl;
        // Только число. Коеффициент при x^0
        if( (*i)[2] == "" ) {
            int an = atoi((*i)[1].str().c_str());
            poly[0] += an;
        // x^1
        } else if( (*i)[2] == "*x" ) {
            int an = atoi((*i)[1].str().c_str());
            poly[1] += an;
        } else {
            int an = atoi((*i)[1].str().c_str());
            int xn = atoi((*i)[4].str().c_str());
            poly[xn] += an;
        }
    }
    // Derivate
    for(auto it = poly.begin(); it != poly.end(); ++it) {
        dxpoly[it->first - 1] = it->second * it->first;
    }
    // Grap result
    stringstream ss;
    for(auto it = dxpoly.rbegin(); it != dxpoly.rend(); ++it) {
        if(it->first < 0) continue;
        if(it->first == 0) {
            ss << showpos << it->second;
        } else if(it->first == 1) {
            if(abs(it->second) == 1) ss << (it->second > 0 ? "+x" : "-x");
            else ss << showpos << it->second << "*x";
        } else {
            if(abs(it->second) == 1) ss << (it->second > 0 ? "+x" : "-x") << "^" << noshowpos << it->first;
            else ss << showpos << it->second << "*x^" << noshowpos << it->first;
        }
    }
 
    string result = ss.str();
    if(result.size() == 0) return "0";
    if(result[0] == '+') return result.substr(1);
 
    return result;
}
2
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
14.01.2016, 09:09  [ТС] 19
Вот еще один человек с этих курсов=)
п.с. мог бы и чутка раньше скинуть)))
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
14.01.2016, 09:41 20
m1Rr0r, Спасибо за готовый код, но не могли бы пару нюансов разъяснить Что за redex,regex_replace и что значит строка const string fmt("$011*x")? И вообще гуглю, натыкаюсь на статью regex для unix, для винды только boost ?

Добавлено через 15 минут
Знаю что курсы под линекс, но привык на винде и курсы интересны.
0
14.01.2016, 09:41
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2016, 09:41
Помогаю со студенческими работами здесь

Найти значение многочлена
Помогите решить Перепишите задачу внутрь сообщения Добавлено через 32 минуты Вычислите...

Найти степень многочлена
Ребята, помогите пожалуйста, нужно составить программу для вычисления степень многочлена!!

Найти коэффициенты многочлена
Вот условие задачи: Даны действительные числа а0 ,..., а6 . Получить для х=1,3,4 значения...

Найти производную функции
найти производную функции f(x)=sinx(cosx-x^3) по определению (delta=0.1)в точках из интервала...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Golang] 121. Best Time to Buy and Sell Stock
alhaos 28.01.2025
В этой задаче мы получаем слайс целых чисел, которые означают цену акции в разные моменты времени, и должны вернуть максимально возможную прибыль от купли продажи акции. / / . . .
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru