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
Download

CES-10 Teoria Cap 6-b