Capítulo VI – Variáveis Indexadas
6.1 – A necessidade de variáveis indexadas
6.2 – Vetores e matrizes
6.3 – Aplicações com vetores numéricos
6.4 – Aplicações com matrizes numéricas
6.5 – Cadeias de caracteres
6.6 – Aplicações com vetores de cadeias de
caracteres
6.3 – Aplicações com Vetores
Numéricos
6.3.1 – Ordenação dos valores de um vetor
Colocar em ordem crescente ou decrescente os valores
dentro dos elementos de um vetor
V
0
16
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
9
80
Vetor
desordenado
V
0
5
1
8
2
16
3
45
4
67
5
70
6
72
7
74
8
80
9
95
Vetor ordenado
crescentemente
São inúmeros os métodos para a ordenação de vetores
apresentados na literatura
Alguns deles são bem simples, porém ineficientes para
vetores muito longos
Outros, para vetores longos, são mais eficientes, porém mais
complexos
Nesta seção será apresentado o conhecido método BubbleSort (método da bolha), que é dos mais simples
Esse nome é dado porque tem-se a impressão de que os
elementos borbulham até chegar à sua posição definitiva
O método Bubble-Sort consiste em:
■ Percorrer o vetor várias vezes
■ Durante cada percurso, efetuar troca de posição de
elementos adjacentes, caso o elemento da esquerda seja
maior que o da direita
■ Em cada percurso, um elemento atinge sua posição
definitiva
■ Se, durante um dos percursos, não houver trocas, considera-
se que o vetor está ordenado
Exemplo: seja o seguinte vetor e o método em seu início
(cursor para percorrer
i o vetor várias vezes)
V
0
16
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
9
80
p (limitante de i a
cada percurso)
trocou
(semáforo que
acende quando
há troca)
Não trocar
i
V
0
16
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
p
trocou
9
80
Não trocar
i
V
0
16
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
5
3
72
4
8
5
67
6
95
7
74
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
5
3
8
4
72
5
67
6
95
7
74
8
70
p
trocou
9
80
Não trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
95
7
74
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
95
7
74
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
74
7
95
8
70
p
trocou
9
80
Trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
74
7
70
8
95
p
trocou
9
80
95 em sua posição definitiva
trocou acesa: começar novo percurso
retroceder p
V
0
16
1
45
2
5
3
8
4
67
5
72
6
74
7
70
8
80
9
95
p
trocou
A variável cursora
‘i’ não precisa
chegar até V[8]
Basta chegar até
V[7]
Não trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Trocar
i
V
0
16
1
45
2
5
3
8
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Trocar
i
V
0
16
1
5
2
45
3
8
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Não trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Não trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Não trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
74
7
70
8
80
p
trocou
9
95
Não trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
70
7
74
8
80
p
trocou
9
95
80 em sua posição definitiva
trocou acesa: iniciar novo percurso
retroceder p
V
0
16
1
5
2
8
3
45
4
67
5
72
6
70
7
74
8
80
p
trocou
9
95
Trocar
i
V
0
16
1
5
2
8
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Trocar
i
V
0
5
1
16
2
8
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
72
6
70
p
trocou
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
6
72
p
trocou
7
74
8
80
9
95
74 em sua posição definitiva
trocou acesa: novo percurso
retroceder p
V
0
5
1
8
2
16
3
45
4
67
5
70
6
72
p
trocou
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
Não trocar
i
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
72 em sua posição definitiva
trocou apagada: vetor ordenado
V
0
5
1
8
2
16
3
45
4
67
5
70
p
trocou
6
72
7
74
8
80
9
95
p
V
0
5
1
8
2
16
3
45
4
67
5
70
6
72
7
74
8
80
9
95
Se, em todos os percursos,
a lâmpada acender, o
processo termina quando
p chegar a -1
■ O teste da necessidade de troca entre dois elementos
adjacentes pode ser feito pelo seguinte trecho:
if (V[i] > V[i+1]) {
aux = V[i]; V[i] = V[i+1];
V[i+1] = aux; trocou = true;
}
Seja este trecho abreviado
para
Testar e Trocar (i, i+1);
‘aux’ é uma variável auxiliar para realização
de troca de conteúdo entre variáveis
Um percurso genérico da variável i pode ser expresso por:
for (trocou = false, i = 0; i <= p; i++)
Testar e Trocar (i, i+1);
Seja este trecho
abreviado para
Percorrer até (p);
■ for (trocou = false, i = 0; i <= p; i++)
Testar e Trocar (i, i+1);
Percorrer até (p);
Sendo n, o número de elementos do vetor, os diversos
percursos necessários para a ordenação podem ser realizados
por
for (trocou = true, p = n-2; p >= 0 && trocou == true; p--)
Percorrer até (p);
A seguir o programa do Bubble-Sort completo
#include <stdio.h>
#include <stdlib.h>
/*Criacao do tipo logic e suas constantes */
typedef char logic; const logic false = 0, true = 1;
/*Criacao do tipo vetor
*/
typedef int vetor[50];
/*Cabecalho e declarações locais */
int main () {
int n, i, p, aux; logic trocou; vetor V;
/*Leitura do vetor a ser ordenado */
printf ("Ordenacao de numeros pelo Bubble-Sort\n\n");
printf ("\tNumero de elementos: "); scanf ("%d",&n);
printf ("\n\tElementos: ");
for (i = 0; i < n; i++)
scanf ("%d", &V[i]);
/*Escrita do vetor desordenado
*/
printf ("\n\nVetor desordenado:\n\n");
for (i = 0; i < n; i++)
printf ("%4d", V[i]);
/*Aplicação do metodo bubble-sort
*/
for (trocou = true, p = n-2; p >= 0 && trocou == true; p--)
for (trocou = false, i = 0; i <= p; i++)
if (V[i] > V[i+1]) {
aux = V[i]; V[i] = V[i+1];
V[i+1] = aux; trocou = true;
}
/*Escrita do vetor ordenado
*/
printf ("\n\nVetor ordenado:\n\n");
for (i = 0; i < n; i++)
printf ("%4d", V[i]);
/*Fechamento da tela
*/
printf ("\n\n"); system ("pause");
return 0;
}
Ordenacao de numeros pelo Bubble-Sort
Numero de elementos: 10
Elementos: 16 45 72 5 8 67 95 74 70 80
Resultado
de uma
execução
Vetor desordenado:
16
45
72
5
8
67
95
74
70
80
67
70
72
74
80
95
Vetor ordenado:
5
8
16
45
Digite algo para encerrar:
6.3.2 – Procura de valores em um vetor
Outro problema muito conhecido: procurar um dado valor
entre os elementos de um vetor
Quando o vetor não está ordenado, deve-se percorrê-lo
sequencialmente, comparando os valores de seus elementos
com o valor procurado
A procura termina quando o valor for encontrado, ou
quando se chegar ao final do vetor
Esse tipo de procura é denominado procura sequencial
Exemplo: seja o seguinte vetor desordenado:
0
16
V
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
9
80
n
10
i
Seja a procura do valor 67:
Número de
elementos
do vetor
Percorre-se o vetor com um cursor i, de V[0] em diante
Quando i = 5, V[i] = V[5] = 67
Então o valor procurado foi encontrado na posição 5 do
vetor V
0
16
V
1
45
2
72
3
5
4
8
5
67
6
95
7
74
8
70
9
80
n
10
i
Seja a procura do valor 50:
Percorre-se o vetor com um cursor i, de V[0] em diante
Para 0 ≤ i ≤ n-1 (n = 10), V[i] ≠ 50
Então o valor procurado não foi encontrado no vetor V
V
0
16
1
45
2
72
3
5
i
4
8
5
67
6
95
7
74
8
70
9
80
n
10
num 67
Trecho de programa que realiza a procura sequencial:
printf ("Numero procurado: "); scanf ("%d", &num);
i = 0;
Caso ‘n’ seja muito grande e
‘num’ não esteja em ‘V’, o
while (i < n && V[i] != num)
tempo de procura é longo
i++;
É proporcional a ‘n’
if (i < n)
printf ("\n\t%d estah na posicao %d do vetor\n\n", num, i);
else
printf ("\n\t%d nao estah no vetor\n\n",num);
Quando o vetor estiver ordenado:
0
5
1
8
2
16
3
45
4
67
5
70
6
72
7
74
8
80
9
95
n
10
i
Seja a procura do valor 67:
Percorre-se o vetor com um cursor i, de V[0] em diante,
enquanto V[i] < 67
Quando i = 4, V[i] = V[4] = 67
Então o valor procurado foi encontrado na posição 4 do
vetor V
0
5
1
8
2
16
3
45
4
67
5
70
6
72
7
74
8
80
9
95
n
10
i
Seja a procura do valor 50:
Percorre-se o vetor com um cursor i, de V[0] em diante,
enquanto V[i] < 50
Quando i = 4, V[i] = V[4] > 50
Então o valor procurado não foi encontrado no vetor V
V
0
5
1
8
2
16
3
45
i
4
67
5
70
6
72
7
74
8
80
9
95
n
10
num 67
Trecho de programa que realiza a procura sequencial:
printf ("Numero procurado: "); scanf ("%d", &num);
i = 0;
No pior caso,
Casoo ntempo
seja muito
é proporcional
grande e a
num o>vetor
V[n-1],
desordenado
o problema
while (i < n && V[i] < num) ‘n’, como para
é o mesmo do vetor
i++;
(T(n) é O(n)
desordenado
– é da ordem de n)
if (i < n && V[i] == num)
printf ("\n\t%d estah na posicao %d do vetor\n\n", num, i);
else
printf ("\n\t%d nao estah no vetor\n\n",num);
Procura binária: importante método de procura, para
vetores ordenados
O tempo de procura, no caso do valor não estar no vetor é
proporcional a log2n, o que, para vetores longos, é muito
significativo (T(n) é O(log2n))
O método consiste em comparar o valor procurado com o
do elemento da posição média do vetor
Se forem iguais, o valor terá sido encontrado
Caso contrário, ele estará ou à esquerda ou à direita do
elemento médio
O campo de procura fica reduzido pela
metade; repete-se o procedimento acima,
até encontrar ou até anular esse campo
Exemplo: seja o seguinte vetor ordenado:
V
-5
-1
4
7
10
14
15
17
21
23
24
30
32
38
45
50
53
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
med
med med
med
Seja a procura do valor 15
Posição média:
med = (6
(0 + 7)/2
(4
16)/2==6538
15 =
< V[6]
>
V[8]
V[3]
V[5]
Achou 15 na
posição 6
V
-5
-1
4
7
10
14
15
17
21
23
24
30
32
38
45
50
53
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
med
Seja a procura do valor 41
Posição média:
med = (13
(0 ++16)/2
(9
16)/2==12
13)/2
813
14
med med med
41 >
< V[13]
V[8]
V[12]
V[14]
Campo de
procura vazio;
Não achou 41
V
-5
-1
4
7
10
14
15
17
21
23
24
30
32
38
45
50
53
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
med
Para os valores 15 e 41, o número de comparações foi 4
Numa procura sequencial, para o 15 e o 41, seriam
necessárias 7 e 15 comparações, respectivamente
Para vetores muito longos, essa diferença, no pior caso, seria
muito grande (n e log2n)
V
-5
-1
4
7
10
14
15
17
21
23
24
30
32
38
45
50
53
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inf
(limite inferior do
campo de procura)
Trecho de
programa para
efetuar uma
procura binária
achou: variável
que guarda a
resposta da
procura
med
sup
(limite superior do
campo de procura)
achou = false; inf = 0; sup = n - 1;
do {
med = (inf + sup) / 2;
if (num == V[med]) achou = true;
else if (num < V[med]) sup = med - 1;
else inf = med + 1;
} while (!achou && inf <= sup);
Quando inf > sup, o campo de procura é vazio
A seguir, um programa completo
Passos seguidos pelo programa da Procura binária:
Leitura dos dados sobre o vetor;
Verificação da condição de ordenação para o vetor;
Se no mínimo um de seus elementos estiver fora de ordem {
Emitir mensagem notificando o fato;
Encerrar a execução;
}
Senão
iniciar uma seção de procuras, que deve ser encerrada
mediante sinalização do operador;
/*Diretivas de preprocessamanto e declaracoes */
#include <stdio.h>
#include <stdlib.h>
#include <conio2.h>
typedef char logic;
const logic false = 0, true = 1;
typedef int vetor[50];
int main () {
int n, i, inf, sup, med, num;
vetor V;
logic achou, erro;
char c;
/*
Leitura dos elementos do vetor
*/
printf ("PROCURA BINARIA EM VETORES\n\n");
printf ("Numero de elementos do vetor: "); scanf ("%d",&n);
printf ("\nElementos: ");
for (i = 0; i < n; i++) scanf ("%d", &V[i]);
/*
Verificacao da ordenacao do vetor
*/
for (i = 0, erro = false; i < n-1 && erro == false; i++)
if (V[i] > V[i+1]) erro = true;
if (erro == true)
printf ("\n\tRelacao desordenada: nao havera procuras\n");
/*
Secao de procuras
*/
else {
clrscr ();
printf ("Secao de Procuras:\n\n");
printf ("Procurar numero (s/n)?: ");
do scanf ("%c", &c);
while (c != 's' && c != 'n' && c != 'S' && c != 'N');
while (c == 's' || c == 'S') {
printf ("\n\n\tNumero: "); scanf ("%d", &num);
/*
Procura de um numero no vetor
achou = false; inf = 0; sup = n - 1;
do {
med = (inf + sup) / 2;
if (num == V[med]) achou = true;
else if (num < V[med]) sup = med - 1;
else inf = med + 1;
} while (!achou && inf <= sup);
*/
/*
Emissao do resultado da procura e final do programa
*/
if (achou)
printf ("\n\t%d estah na posicao %d da relacao\n\n", num, med);
else
printf ("\n\t%d nao estah na relacao\n\n",num);
printf ("Procurar outro numero (s/n)?: ");
do scanf ("%c", &c);
while (c != 's' && c != 'n' && c != 'S' && c != 'N');
}
}
/*Fechamento da tela
*/
printf ("\n\n"); system ("pause"); getch ();
}
7.3.3 – Manipulação de polinômios
Seja P(x) um polinômio em x dado pela fórmula
P(x) = A0 + A1x + A2x2 + A3x3 + … + An-1xn-1 + Anxn
Há várias formas de se armazenar na memória um
polinômio com este
Uma das formas mais simples é guardar seus coeficientes
num vetor e seu grau numa variável escalar inteira
P(x) = A0 + A1x + A2x2 + A3x3 + … + An-1xn-1 + Anxn
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
A seguir, o desenvolvimento de um programa para ler os
dados sobre 2 polinômios e fazer a soma e a multiplicação
entre eles
No próximo slide, um exemplo da tela por ele produzida
TRABALHO COM POLINOMIOS
Grau do Polinomio P1: 3
Coeficientes de P1 (0 a 3):
3 5 -2 4
Grau do Polinomio P2: 3
Coeficientes de P2 (0 a 3):
4 -3 0 -4
Polinômios de entrada:
P1(x) = 3 + 5x - 2x2 + 4x3
P2(x) = 4 - 3x - 4x3
Polinomio P1: Grau 3
+ (3) + (5)*X + (-2)*X^2 + (4)*X^3
Polinomio P2: Grau 3
+ (4) + (-3)*X + (-4)*X^3
Polinomio Soma PS: Grau 2
+ (7) + (2)*X + (-2)*X^2
Polinomio Produto PM: Grau 6
+ (12) + (11)*X + (-23)*X^2 + (10)*X^3 + (-32)*X^4 + (8)*X^5 + (-16)*X^6
Digite algo para encerrar:
P(x) = A0 + A1x + A2x2 + A3x3 + … + An-1xn-1 + Anxn
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
Esse desenvolvimento se orientará pelos seguintes passos:
Leitura e correção dos dados dos dois polinômios
Escrita dos dois polinômios
Soma dos dois polinômios, com correção do grau, e escrita
do resultado
Multiplicação dos dois polinômios e escrita do resultado
P(x) = A0 + A1x + A2x2 + A3x3 + … + An-1xn-1 + Anxn
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
Necessidade de correção do grau:
Possibilidade do operador digitar o valor zero para os
coeficientes dos termos de graus mais elevados
Numa soma de polinômios de mesmo grau, os coeficientes
dos termos de graus mais elevados dos dois polinômios
poderão ter o mesmo valor absoluto com sinais opostos
Exemplo: P1(x) = 3 + 5x - 2x2 + 4x3
P2(x) = 4 + 2x2 - 4x3
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
Declarações:
typedef float polin[100];
polin P1 = {0}, P2 = {0}, PS = {0}, PM = {0}, Paux;
int n1, n2, ns, nm, naux, i, j;
n1, n2, ns, nm: graus do 1º e 2º polinômios e dos polinômios
soma e multiplicação
P1, P2, PS e PM são inicializados com zero nas declarações,
para facilitar a programação da soma e da multiplicação
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
Leitura de um polinômio:
Consiste na leitura de um valor para n e de valores para n+1
elementos do vetor P
Leituras similares já foram vistas
Correção do grau de um polinômio lido:
Supondo que o valor lido para n seja 7 e que os 8 valores para
os elementos de P sejam 6, -3, 4, -5, 12, 0, 0 e 0, tem-se:
n
7
P
6
-3
4
-5
12
0
0
0
0
1
2
3
4
5
6
7
Na realidade, o grau de P não é 7
98
99
Correção do grau de um polinômio lido:
n
47
P
6
-3
4
-5
12
0
0
0
0
1
2
3
4
5
6
7
98
99
i
Percorre-se o vetor com um cursor i, de P[n] = P[7] para a
esquerda, enquanto P[i] = 0
Quando i = 4, P[i] = P[4] = 12 ≠ 0
Então grau do polinômio é 4
Se inclusive P[0] = 0.0,
zero é o grau de P
Programação:
for (i = n; P[i] == 0.0 && i != 0; i--);
n = i;
P
A0
0
n
A1
A2
A3
1
2
3
An-1 An
n-1
n
Escrita de um polinômio:
printf ("\nPolinomio P: Grau %d\n\n\t", n);
Só escreve um termo se o
for (i = 0; i <= n; i++)
coeficiente não for zero ou se
if (P[i] != 0.0 || n == 0) {
for único termo de um
polinômio de grau zero
printf (" + (%g)", P[i]);
Só escreve a incógnita X se o
if (i != 0) {
grau do termo não for zero
printf ("*X");
if (i > 1) printf ("^%d", i);
}
Exemplos:
}
+ (3) + (5)*X + (-2)*X^2
+ (4)*X^3
Só escreve
o grau do termo se
for maior que 1
+ (4) + (-3)*X + (-4)*X^3
Soma de 2 polinômios P1 e P2:
Exemplo 1:
ns = maior (n1, n2)
Inicialmente P1 = P2 = PS = {0}
P1(x) = 3 + 5x - 2x2
+
P2(x) = 4 - 3x + 6x2 + 4x3 - 5x4
PS(x) = 7 + 2x + 4x2 + 4x3 - 5x4
P1
3
5
-2
0
0
0
0
0
0
0
1
2
3
4
5
6
7
99
n1
P2
4
-3
6
4
-5
0
0
0
0
0
1
2
3
4
5
6
7
99
2
n2
PS
7
2
4
4
-5
0
0
0
0
0
1
2
3
4
5
6
7
99
4
ns
4
Soma de 2 polinômios P1 e P2:
Inicialmente, ns = maior (n1, n2)
Exemplo 2:
Depois faz-se a correção do grau
P1(x) = 3 + 5x - 2x2 - 4x3 + 5x4
P2(x) = 4 - 3x +
6x2
+
4x3
-
PS(x) = 7 + 2x + 4x2 + 0x3 + 0x4
= 7 + 2x + 4x2
+
5x4
P1
3
5
-2
-4
5
0
0
0
0
0
1
2
3
4
5
6
7
99
n1
P2
4
-3
6
4
-5
0
0
0
0
0
1
2
3
4
5
6
7
99
4
n2
PS
7
2
4
0
0
0
0
0
0
0
1
2
3
4
5
6
7
99
4
ns
2
Soma de 2 polinômios P1 e P2:
Programação
ns = (n1 > n2) ? n1 : n2;
for (i = 0; i <= ns; i++)
PS[i] = P1[i] + P2[i];
for (i = ns; PS[i] == 0.0 && i != 0; i--);
ns = i;
P1
3
5
-2
-4
5
0
0
0
0
0
1
2
3
4
5
6
7
99
n1
P2
4
-3
6
4
-5
0
0
0
0
0
1
2
3
4
5
6
7
99
4
n2
PS
7
2
4
0
0
0
0
0
0
0
1
2
3
4
5
6
7
99
4
ns
2
Multiplicação de 2 polinômios P1 e P2:
Exemplo:
PM(x) =
P1(x) = 3 + 5x - 2x2 + 4x3
P2(x) = 4 - 3x -
4x3
*
4 * (3 + 5x - 2x2 + 4x3) +
(-3x) * (3 + 5x - 2x2 + 4x3) +
(-4x3) * (3 + 5x - 2x2 + 4x3)
PM(x) =
Esquema de programação:
12 + 20x - 8x2 + 16x3 +
- 9x - 15x2 + 6x3 - 12x4 +
- 12x3 - 20x4 + 8x5 - 16x6
PM(x) = 12 + 11x - 23x2 + 10x3 - 32x4 + 8x5 - 16x6
‘Paux’ guarda a multiplicação
de P1 por um termo de P2
PM(x) = 0;
for (j = 0; j <= n2; j++)
if (P2[j] != 0) {
Paux(x) = P1(x) * P2[j];
PM(x) += Paux(x);
}
Multiplicação de 2 polinômios P1 e P2:
Esquema de programação:
‘j’ é o grau do termo de P2 que multiplica P1
PM(x) = 0;
for (j = 0; j <= n2; j++)
if (P2[j] != 0) {
Paux(x) = P1(x) * P2[j];
PM(x) += Paux(x);
}
O grau de Paux é a soma do grau de P1 com
o grau do termo de P2 que multiplica P1
nm = n1 + n2;
for (j = 0; j <= n2; j++)
if (P2[j] != 0.0) {
for (i = 0; i < 100; i++) Paux[i] = 0;
for (i = 0; i <= n1; i++)
Paux[i+j] = P1[i] * P2[j];
naux = n1 + j;
for (i = 0; i <= naux; i++)
PM[i] = Paux[i] + PM[i];
}
Programação
Multiplicação de 2 polinômios P1 e P2:
Esquema de programação:
PM(x) = 0;
for (j = 0; j <= n2; j++)
if (P2[j] != 0) {
Paux(x) = P1(x) * P2[j];
PM(x) += Paux(x);
}
Dentro do ‘if ’
for (i = 0; i < 100; i++) Paux[i] = 0;
pode ser substituído por
polin Paux = {0.0};
nm = n1 + n2;
for (j = 0; j <= n2; j++)
if (P2[j] != 0.0) {
for (i = 0; i < 100; i++) Paux[i] = 0;
for (i = 0; i <= n1; i++)
Paux[i+j] = P1[i] * P2[j];
naux = n1 + j;
for (i = 0; i <= naux; i++)
PM[i] = Paux[i] + PM[i];
}
Conceito de bloco, a
ser visto no capítulo
de Subprogramação
Programação
A seguir, o programa
completo dos
polinômios
/* Declaracoes, inicializacoes e escrita de titulo
#include <stdio.h>
#include <stdlib.h>
typedef float polin[100];
int main ( ) {
polin P1 = {0}, P2 = {0}, PS = {0}, PM = {0};
int n1, n2, ns, nm, naux, i, j;
printf ("TRABALHO COM POLINOMIOS\n\n");
*/
/* Leitura do primeiro polinomio e correcao de seu grau
*/
printf ("Grau do Polinomio P1: "); scanf ("%d", &n1);
printf ("Coeficientes de P1 (0 a %d):\n\t", n1);
for (i = 0; i <= n1; i++)
scanf ("%f", &P1[i]);
for (i = n1; P1[i] == 0.0 && i != 0; i--);
n1 = i;
/* Leitura do segundo polinomio e correcao de seu grau
printf ("\nGrau do Polinomio P2: "); scanf ("%d", &n2);
printf ("Coeficientes de P2 (0 a %d):\n\t", n2);
for (i = 0; i <= n2; i++)
scanf ("%f", &P2[i]);
for (i = n2; P2[i] == 0.0 && i != 0; i--);
n2 = i;
*/
/* Escrita dos polinomios lidos
*/
printf ("\nPolinomio P1: Grau %d\n\n\t", n1);
for (i = 0; i <= n1; i++)
if (P1[i] != 0.0 || n1 == 0) {
printf (" + (%g)", P1[i]);
if (i != 0) {
printf ("*X"); if (i > 1) printf ("^%d", i);
}
}
printf ("\n\nPolinomio P2: Grau %d\n\n\t", n2);
for (i = 0; i <= n2; i++)
if (P2[i] != 0.0 || n2 == 0) {
printf (" + (%g)", P2[i]);
if (i != 0) {
printf ("*X"); if (i > 1) printf ("^%d", i);
}
}
/* Soma dos polinomios e escrita do resultado
*/
ns = (n1 > n2) ? n1 : n2;
for (i = 0; i <= ns; i++)
PS[i] = P1[i] + P2[i];
for (i = ns; PS[i] == 0.0 && i != 0; i--);
ns = i;
printf ("\n\nPolinomio Soma PS: Grau %d\n\n", ns);
for (i = 0; i <= ns; i++)
if (PS[i] != 0.0 || ns == 0) {
printf (" + (%g)", PS[i]);
if (i != 0) {
printf ("*X"); if (i > 1) printf ("^%d", i);
}
}
/* Multiplicacao dos polinomios e escrita do resultado
*/
nm = n1 + n2;
for (j = 0; j <= n2; j++)
if (P2[j] != 0.0) {
polin Paux = {0.0};
for (i = 0; i <= n1; i++) Paux[i+j] = P1[i] * P2[j];
naux = n1 + j;
for (i = 0; i <= naux; i++) PM[i] = Paux[i] + PM[i];
}
printf ("\n\nPolinomio Produto PM: Grau %d\n\n", nm);
for (i = 0; i <= nm; i++)
if (PM[i] != 0.0 || nm == 0) {
printf (" + (%g)", PM[i]);
if (i != 0) { printf ("*X"); if (i > 1) printf ("^%d", i); }
}
printf ("\n\n"); system ("pause"); return 0;
}
Observações:
Neste programa, há 2 trechos muito semelhantes para ler os
dados de P1 e P2 e 4 para escrever P1, P2, PS e PM
Conforme o mesmo capítulo sobre Subprogramação, pode-se
fazer um só subprograma para ler e outro para escrever o
conteúdo de um polinômio genérico
Pode-se então chamá-los respectivamente duas e quatro
vezes na função main, uma para cada polinômio
Isso deixa a função main bem mais sintética
Além disso, pode-se fazer um subprograma para somar e
outro para multiplicar 2 polinômios
Exercícios 6.3:
1. Escrever um programa para:
a) Ler um número inteiro e armazená-lo na variável n
b) Ler dois vetores A e B de números reais com n elementos
cada
c) Formar e escrever dois outros vetores C e D de n números
reais tais que, para 0 i n-1:
C[i] = max (A[i], B[i]) e D[i] = média (A[i], B[i])
2. Escrever um programa para ler um vetor desordenado de
números inteiros, eliminar todas as suas duplicatas e escrevêlo sem elementos repetidos
3. Em Estatística, utiliza-se uma série de medidas para a análise
de um conjunto de dados. Dado um conjunto de valores Xi
(0 ≤ i ≤ n-1) são definidas, entre outras grandezas:
Média
aritmética
Média
quadrática
Desvio
padrão
Escrever um programa em C para ler e imprimir os
elementos do vetor X, calcular e imprimir X,
¯ RMQ e S
4. O MMC (mínimo múltiplo comum) entre vários números
pode ser calculado conforme o seguinte esquema usando
como exemplo os números 48, 36, 63, 75
Escrever um programa em C para ler um vetor de números
inteiros positivos e achar e escrever o MMC entre eles,
usando o esquema acima; o programa deve mostrar o
andamento do cálculo, ou seja, deve exibir o esquema acima