-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
256 lines (198 loc) · 7.93 KB
/
main.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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include <stdio.h>
#include <math.h>
#define MAXN 11 // Polinômios de grau 0 até 10
void mostra_polinomio(float polinomio[], int grau);
void limpa_polinomio(float polinomio[]); //Função para limpar vetor de polinômio evitando valores residuais de operações passadas
void produto_polinomios(float polinomio1[], float polinomio2[], float polinomio3[], int grau1, int grau2, int grauProduto);
int soma_polinomios(float polinomio1[], float polinomio2[], float polinomio3[], int grau1, int grau2);
float calcula_valor(float polinomio[], int grau, float x);
int main(){
float polinomio1[MAXN], polinomio2[MAXN], polinomio3[MAXN]; // Polinômios referentes a duas entradas e uma saída
int option;
do{
printf("\n---CALCULADORA DE POLINOMIOS---\n\n");
printf("1. Calcular valor de polinomio\n");
printf("2. Calcular soma de polinomios\n");
printf("3. Calcular produto de polinomios\n");
printf("4. Sair\n");
printf("\nOpção ---> ");
scanf("%d", &option);
if (option == 1)
{
int grau;
float x;
// leitura do grau do polinômio
printf("Insira o grau do polinomio (Min = 0; Max = 10)\n");
do{
printf("---> ");
scanf("%d", &grau);
if (grau < 0 || grau > MAXN - 1)
{
printf("Valor nao suportado. (Min = 0; Max = 10)\n\n ");
}
} while (grau < 0 || grau > MAXN - 1);
// leitura do polinômio
printf("Insira os coeficientes do polinomio de forma crescente\n---> ");
for (int i = 0; i < grau + 1; i++)
{
scanf("%f", &polinomio1[i]);
}
mostra_polinomio(polinomio1, grau);
printf("\nInsira o valor da incognita X\n---> ");
scanf("%f", &x);
float resultado = calcula_valor(polinomio1, grau, x);
printf("P(%g) = %g\n", x, resultado);
limpa_polinomio(polinomio1);
}
else if (option == 2)
{
int grau1, grau2, grauSoma;
printf("Insira o grau do primeiro polinomio (Min = 0; Max = 10)\n");
do{
printf("---> ");
scanf("%d", &grau1);
if (grau1 < 0 || grau1 > MAXN - 1)
{
printf("Valor nao suportado. (Min = 0; Max = 10)\n\n ");
}
} while (grau1 < 0 || grau1 > MAXN - 1);
// leitura do primeiro polinômio
printf("Insira os coeficientes do polinomio de forma crescente\n---> ");
for (int i = 0; i < grau1 + 1; i++)
{
scanf("%f", &polinomio1[i]);
}
printf("Insira o grau do polinomio 2 (Min = 0; Max = 10)\n");
do{
printf("---> ");
scanf("%d", &grau2);
if (grau2 < 0 || grau2 > MAXN - 1)
{
printf("Valor nao suportado. (Min = 0; Max = 10)\n\n ");
}
} while (grau2 < 0 || grau2 > MAXN - 1);
// leitura do polinômio 2
printf("Insira os coeficientes do polinomio de forma crescente\n---> ");
for (int i = 0; i < grau2 + 1; i++)
{
scanf("%f", &polinomio2[i]);
}
grauSoma = soma_polinomios(polinomio1, polinomio2, polinomio3, grau1, grau2);
printf("\nSoma entre:\n");
mostra_polinomio(polinomio1, grau1);
mostra_polinomio(polinomio2, grau2);
printf("\nResultado: ");
mostra_polinomio(polinomio3, grauSoma);
limpa_polinomio(polinomio1);
limpa_polinomio(polinomio2);
limpa_polinomio(polinomio3);
}
else if (option == 3)
{
int grau1, grau2, grauProduto;
printf("Restrição: A soma dos graus dos polinomios produtos nao pode ser maior que 10\n");
printf("Insira o grau do primeiro polinomio (Min = 0; Max = 10)\n");
do{
printf("---> ");
scanf("%d", &grau1);
if (grau1 < 0 || grau1 > MAXN - 1)
{
printf("Valor nao suportado. (Min = 0; Max = 10)\n\n ");
}
} while (grau1 < 0 || grau1 > MAXN - 1);
// leitura do primeiro polinômio
printf("Insira os coeficientes do polinomio de forma crescente\n---> ");
for (int i = 0; i < grau1 + 1; i++)
{
scanf("%f", &polinomio1[i]);
}
printf("Insira o grau do polinomio 2 (Min = 0; Max = 10)\n");
do{
printf("---> ");
scanf("%d", &grau2);
if (grau2 < 0 || grau2 > MAXN - 1)
{
printf("Valor nao suportado. (Min = 0; Max = 10)\n\n ");
}
} while (grau2 < 0 || grau2 > MAXN - 1);
// leitura do polinômio 2
printf("Insira os coeficientes do polinomio de forma crescente\n---> ");
for (int i = 0; i < grau2 + 1; i++)
{
scanf("%f", &polinomio2[i]);
}
grauProduto = grau1 + grau2;
if (grauProduto > MAXN - 1){
printf("\nNao sera possivel realizar operacao. O polinomio resultante tem grau maior que 10.\n");
continue;
//Como o tamanho máximo do polinômio foi definido como 10, não é possível realizar multiplicação
//onde o polinômio produto tenha grau maior que 10
}
produto_polinomios(polinomio1, polinomio2, polinomio3, grau1, grau2, grauProduto);
printf("\nProduto entre:\n");
mostra_polinomio(polinomio1, grau1);
mostra_polinomio(polinomio2, grau2);
printf("\nResultado: ");
mostra_polinomio(polinomio3, grauProduto);
limpa_polinomio(polinomio1);
limpa_polinomio(polinomio2);
limpa_polinomio(polinomio3);
}
else if (option != 4)
{
printf("\nOpção inválida\n");
}
} while (option != 4);
}
void mostra_polinomio(float polinomio[], int grau){
printf("P(x) = ");
for(int i = grau; i >= 0; i--)
{
if(i == 0)
{
printf("%g\n", polinomio[i]);
}
else if (polinomio[i] != 0)
{
printf("%gx^%d + ", polinomio[i], i);
}
}
}
float calcula_valor(float polinomio[], int grau, float x){
float resultado = 0;
for(int i = 0; i <= grau; i++)
{
resultado += polinomio[i] * pow(x, i);
}
return resultado;
}
int soma_polinomios(float polinomio1[], float polinomio2[], float polinomio3[], int grau1, int grau2){
int maiorGrau = grau1;
if (grau1 < grau2)
{
maiorGrau = grau2;
}
for(int i = 0; i <= maiorGrau; i++)
{
polinomio3[i] = polinomio1[i] + polinomio2[i];
}
return maiorGrau; //grau do poliômio resultante é o mesmo do maior grau entre os dois que estão sendo somadados
}
void produto_polinomios(float polinomio1[], float polinomio2[], float polinomio3[], int grau1, int grau2, int grauProduto){
limpa_polinomio(polinomio3); //Garantir que todos o polinômio de saída tenha todos os valores 0 para realizar as adições a seguir.
for (int i = 0; i <= grau1; i++)
{
for (int j = 0; j <= grau2; j++)
{
polinomio3[i + j] += polinomio1[i] * polinomio2[j];
//Na multiplicação, o coeficiente é multiplicado e o expoente somado. Logo, o coeficiente resultado recebe posicao i+j no vetor.
}
}
}
void limpa_polinomio(float polinomio[])
{
for (int i = 0; i < MAXN; i++)
{
polinomio[i] = 0;
}
}