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