Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Reas0n
#1

Сравнение одночленов X со степенями - C++

21.06.2012, 18:38. Просмотров 981. Ответов 2
Метки нет (Все метки)

Здравствуйте. Есть задача:

Дана запись многочлена (от переменной X) произвольной степени с целыми коэффициентами, причем его одночлены могут быть и не упорядочены по степеням X, а одночлены одной и той же степени могут повторяться, например:
-8x^4-74x+8x^4+5-x^3
Требуется привести подобные члены в этом многочлене, после чего распечатать его по убыванию степеней X.
Как я понимаю сначала бы надо записать одночлены в линейный массив, а потом уже выполнять операции над ними. Но массив отказывается работать с числами типа pow(x,2.0). Где я делаю ошибку?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2012, 18:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение одночленов X со степенями (C++):

Заполнить массив степенями числа 2 - C++
#include <iostream> #include <cmath> using namespace std; int main () { int i,n,a; cin>>n; for (i=n; i<1; i--) ...

Сравнение текста из файла и сравнение с текстом в программе char - Dev C++ - C++
Доброго времени суток! Имеется код программы: ifstream test("primer.txt"); char awm = "kod"; char buff; test >> buff; if (buff...

Найти количество чисел A (i= 1, 2,., n), являющихся степенями m - C++
Даны натуральное число m, n и целые числа а1, а2, ..., аn. Найти количество чисел аi (i= 1, 2,..., n), являющихся степенями m. (Определить...

Найти количество чисел a1(i=1,2,....,n), являющихся степенями пятерки - C++
Даны натуральное число n и целые числа а1,а2..,аn.Найти количество чисел a1(i=1,2,....,n),я вляющихся степенями пятерки.(Определить...

Нужно написать формулу нахождения функции у экспонент со степенями - C++
Пишу программу нужно написать формулу для функций экспонента в степени корня третей и пятой степени: e^3√x и e^5√x Помогите с...

Заполнить массив из N элементов степенями двойки в обратном порядке - C++
как заполнить массив из N элементов степенями двойки в обратном порядке? Например входные данные 5 выходные данные 32 16 8 4 2

2
Catstail
Модератор
22841 / 11207 / 1813
Регистрация: 12.02.2012
Сообщений: 18,446
21.06.2012, 19:12 #2
Решение любых задач должно начинаться с правильного выбора структуры данных. Многочлен от одной переменной имеет смысл хранить либо в виде массива коэффициентов, либо в виде списка коэффициентов (второй подход более универсальный).

Для простоты рассмотрим первый подход. Многочлен 3*x^3+7*x^2-8*x+11 будет храниться в виде массива {11,-8,7,3}.

Теперь нужна программа чтения многочлена, выделения степеней и коэффициентов. Даже если степени неупорядочены (и повторяются) это не будет играть роли (т.к. при чтении многочлена он автоматически
преобразуется во внутреннюю однозначную форму. Дальше его останется только распечатать.
2
Catstail
Модератор
22841 / 11207 / 1813
Регистрация: 12.02.2012
Сообщений: 18,446
21.06.2012, 20:39 #3
Вот набросал... Как это примерно может выглядеть.

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
#include "iostream.h"
#include "string.h"
#include "stdlib.h"
 
// Обработать моном
 
int GetMonom(char *Monom, int *Coeff)
{
    int c,p,i,l;
 
    l=strlen(Monom);
 
    if (strcmp("-x",Monom)==0) 
    {
        Coeff[1]=Coeff[1]-1;
        return 0;
    }
 
    if (strcmp("x",Monom)==0) 
    {
        Coeff[1]=Coeff[1]+1;
        return 0;
    }
 
    if (Monom[l-1]=='x')
    {
        Coeff[1]=Coeff[1]+atoi(Monom);
        return 0;
    }
 
    if ((Monom[0]=='x') && (Monom[1]=='^'))
    {
        c=1;
        Monom[0]=' ';
        Monom[1]=' ';
        p=atoi(Monom);
        Coeff[p]=Coeff[p]+1;
        return 0;
    }
    else
    {
        c=atoi(Monom);
 
        for (i=0; i<10; i++)
        {
            if (Monom[i] == '^')
            {
                Monom[i] = ' ';
                break;
            }
            Monom[i]=' ';
        }
 
        p=atoi(Monom);
 
        Coeff[p]=Coeff[p]+c;
        return 0;
    }
 
}
 
// Загрузить многочлен
 
void LoadPoly(char *Stri, int *Coeff, int nmax)
{
     int i,j,k,l;
     char sym;
     char monom[10];
 
     for (i=0; i<nmax; i++) Coeff[i]=0; // чистка
 
     // разбивка на одночлены (мономы)
 
     for (i=0; i < 10; i++) monom[i]=0;
     k=0;
 
     l=strlen(Stri);
 
     for (i=0; i < l; i++)
     {
         sym=Stri[i];
         switch (sym)
         {
         case '+':
            GetMonom(monom,Coeff);
            for (j=0; j < 10; j++) monom[j]=0;
                k=0;
            break;
         case '-':
            GetMonom(monom,Coeff);
            for (j=0; j < 10; j++) monom[j]=0;
            k=1;
            monom[0]='-';
            break;
         default:
            monom[k++]=sym; 
         }
     }
 
     GetMonom(monom,Coeff);
        for (j=0; j < 10; j++) monom[j]=0;
 
}
 
// Распечатать многочлен
 
void PrintPoly(int *Coeff, int nmax)
{
    int i,j,k,b=0;
 
    // Определяем макс. степень многочлена
 
    k=0;
 
    for (i=nmax-1; i >= 0; i--)
        if (Coeff[i] != 0) 
        {
            k=i;
            break;
        }
 
    // Печать
 
    for (i=k; i >= 0; i--)
        if (Coeff[i] != 0)
        {
            if (Coeff[i] != 1)
            {
                if ((Coeff[i] > 0) && (b != 0)) cout << '+';
                cout << Coeff[i];
            }
            
            if (i >= 1) cout << "x";
            if (i >= 2) cout << "^" << i;
            b=-1;
        }
 
    cout << endl;
 
}
 
int main(int argc, char* argv[])
{
 
    char Buf[200];
    int  C1[100];
 
    int i;
 
    for (i=0; i<200; i++) Buf[i]=0;
 
    cin >> Buf;
 
    LoadPoly(Buf,C1,100);
 
    cout << endl << endl;
 
    PrintPoly(C1,100);
 
    return 0;
}
Как работает - см. картинку. Конечно, есть недоработки. В частности, нужен хоть какой-то анализ ошибок...
1
Миниатюры
Сравнение одночленов X со степенями  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2012, 20:39
Привет! Вот еще темы с ответами:

Напечатать элементы массива, индексы которых являются степенями двойки (1,2,4,8,16.) - C++
Дан целочисленный массив с количеством элементов n. Напечатать те его элементы, индексы которых являются степенями двойки (1,2,4,8,16...)....

Найти количество чисел последовательности, которые являются степенями пятерки - C++
Даны натурального число n и целые числа A1,A2,A3...An. Найти количество чисел Ai(i=1,2,3,...,n), являющихся степенями пятерки.( Определить...

Найти элементы массива, индексы которых являются степенями двойки - C++
Дан целочисленный массив с количеством элементов n.напечатать те его элементы,индексы которых являются степенями двойки(1,2,4,8,16,...) ...

Одномерные массивы. Определить те его элементы, индексы которых являются степенями двойки - C++
Здравствуйте,помогите пожалуйста заранее благодарю. Составить программу по обработке одномерного массива согласно условию. Дан...


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

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

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