A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 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

2 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 Colocar em ordem crescente ou decrescente os valores dentro dos elementos de um vetor 164572586795747080 0123456789 V Vetor desordenado 581645677072748095 0123456789 V Vetor ordenado crescentemente

3 São inúmeros os métodos para a ordenação de vetores apresentados na literatura 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 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 Outros, para vetores longos, são mais eficientes, porém mais complexos Nesta seção será apresentado o conhecido método Bubble- Sort (método da bolha), que é dos mais simples Nesta seção será apresentado o conhecido método Bubble- Sort (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 Esse nome é dado porque tem-se a impressão de que os elementos borbulham até chegar à sua posição definitiva

4 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

5 Exemplo: seja o seguinte vetor e o método em seu início 164572586795747080 0123456789 p (cursor para percorrer o vetor várias vezes) (limitante de i a cada percurso) i trocou (semáforo que acende quando há troca) V

6 Não trocar 164572586795747080 0123456789 p i trocou V

7 Não trocar 164572586795747080 0123456789 p i trocou V

8 Trocar 164572586795747080 0123456789 p i trocou V

9 Trocar 164557286795747080 0123456789 p i trocou V

10 Trocar 164558726795747080 0123456789 p i trocou V

11 Não trocar 164558677295747080 0123456789 p i trocou V

12 Trocar 164558677295747080 0123456789 p i trocou V

13 Trocar 164558677274957080 0123456789 p i trocou V

14 Trocar 164558677274709580 0123456789 p i trocou V

15 95 em sua posição definitiva trocou acesa: começar novo percurso retroceder p 164558677274708095 0123456789 p trocou V A variável cursora ‘i’ não precisa chegar até V[8] Basta chegar até V[7]

16 Não trocar 164558677274708095 0123456789 p trocou V i

17 Trocar 164558677274708095 0123456789 p trocou V i

18 Trocar 165458677274708095 0123456789 p trocou V i

19 Não trocar 165845677274708095 0123456789 p trocou V i

20 Não trocar 165845677274708095 0123456789 p trocou V i

21 Não trocar 165845677274708095 0123456789 p trocou V i

22 Trocar 165845677274708095 0123456789 p trocou V i

23 Não trocar 165845677270748095 0123456789 p trocou V i

24 80 em sua posição definitiva trocou acesa: iniciar novo percurso retroceder p 165845677270748095 0123456789 p trocou V

25 Trocar 165845677270748095 0123456789 p trocou V i

26 Trocar 516845677270748095 0123456789 p trocou V i

27 Não trocar 581645677270748095 0123456789 p trocou V i

28 Não trocar 581645677270748095 0123456789 p trocou V i

29 Não trocar 581645677270748095 0123456789 p trocou V i

30 Trocar 581645677270748095 0123456789 p trocou V i

31 Não trocar 581645677072748095 0123456789 p trocou V i

32 74 em sua posição definitiva trocou acesa: novo percurso retroceder p 581645677072748095 0123456789 p trocou V

33 Não trocar 581645677072748095 0123456789 p trocou V i

34 Não trocar 581645677072748095 0123456789 p trocou V i

35 Não trocar 581645677072748095 0123456789 p trocou V i

36 Não trocar 581645677072748095 0123456789 p trocou V i

37 Não trocar 581645677072748095 0123456789 p trocou V i

38 Não trocar 581645677072748095 0123456789 p trocou V i

39 72 em sua posição definitiva trocou apagada: vetor ordenado 581645677072748095 0123456789 trocou V p

40 581645677072748095 0123456789 V Se, em todos os percursos, a lâmpada acender, o processo termina quando p chegar a -1 p

41 ■ 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; } Um percurso genérico da variável i pode ser expresso por: 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 Testar e Trocar (i, i+1); ‘aux’ é uma variável auxiliar para realização de troca de conteúdo entre variáveis Seja este trecho abreviado para Percorrer até (p);

42 ■ for (trocou = false, i = 0; i <= p; i++) Testar e Trocar (i, i+1); Sendo n, o número de elementos do vetor, os diversos percursos necessários para a ordenação podem ser realizados por 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 A seguir o programa do Bubble-Sort completo Percorrer até (p);

43 #include #include /*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;

44 /*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]);

45 /*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]);

46 /*Fechamento da tela*/ printf ("\n\n"); system ("pause"); 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 Vetor desordenado: 16 45 72 5 8 67 95 74 70 80 Vetor ordenado: 5 8 16 45 67 70 72 74 80 95 Digite algo para encerrar: Resultado de uma execução

47 6.3.2 – Procura de valores em um vetor Outro problema muito conhecido: procurar um dado valor entre os elementos de 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 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 A procura termina quando o valor for encontrado, ou quando se chegar ao final do vetor Esse tipo de procura é denominado procura sequencial Esse tipo de procura é denominado procura sequencial

48 Exemplo: seja o seguinte vetor desordenado: Seja a procura do valor 67: Seja a procura do valor 67:  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 164572586795747080 0123456789 V 10 n i Número de elementos do vetor

49 Seja a procura do valor 50: 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 164572586795747080 0123456789 V 10 n i

50 Trecho de programa que realiza a procura sequencial: Trecho de programa que realiza a procura sequencial: printf ("Numero procurado: "); scanf ("%d", &num); i = 0; while (i < n && V[i] != num) i++; 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); 164572586795747080 0123456789 V 10 n i 67 num Caso ‘n’ seja muito grande e ‘num’ não esteja em ‘V’, o tempo de procura é longo É proporcional a ‘n’

51 Quando o vetor estiver ordenado: Seja a procura do valor 67: 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 10 n i 581645677072748095 0123456789

52 Seja a procura do valor 50: 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 10 n i 581645677072748095 0123456789

53 Trecho de programa que realiza a procura sequencial: Trecho de programa que realiza a procura sequencial: printf ("Numero procurado: "); scanf ("%d", &num); i = 0; while (i < n && V[i] < num) i++; 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); 581645677072748095 0123456789 V 10 n i 67 num Caso n seja muito grande e num > V[n-1], o problema é o mesmo do vetor desordenado No pior caso, o tempo é proporcional a ‘n’, como para o vetor desordenado (T(n) é O(n) – é da ordem de n)

54 Procura binária: importante método de procura, para vetores ordenados 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 log 2 n, o que, para vetores longos, é muito significativo (T(n) é O(log 2 n)) O tempo de procura, no caso do valor não estar no vetor é proporcional a log 2 n, o que, para vetores longos, é muito significativo (T(n) é O(log 2 n)) O método consiste em comparar o valor procurado com o do elemento da posição média do vetor 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 Se forem iguais, o valor terá sido encontrado Caso contrário, ele estará ou à esquerda ou à direita do elemento médio 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

55 Exemplo: seja o seguinte vetor ordenado: Seja a procura do valor 15 Seja a procura do valor 15 -5 0 1 4 2 7 3 10 4 14 5 15 6 17 7 21 8 23 9 24 10 30 11 32 12 38 13 45 14 50 15 53 16 V Posição média: med = (0 + 16)/2 = 8 med 15 < V[8] Posição média: med = (0 + 7)/2 = 3 med 15 > V[3] Posição média: med = (4 + 7)/2 = 5 med 15 > V[5] Posição média: med = (6 + 7)/2 = 6 med 15 = V[6] Achou 15 na posição 6

56 Seja a procura do valor 41 Seja a procura do valor 41 -5 0 1 4 2 7 3 10 4 14 5 15 6 17 7 21 8 23 9 24 10 30 11 32 12 38 13 45 14 50 15 53 16 V Posição média: med = (0 + 16)/2 = 8 med 41 > V[8] Posição média: med = (9 + 16)/2 = 12 med 41 > V[12] Posição média: med = (13 + 16)/2 = 14 med 41 < V[14] Posição média: med = (13 + 13)/2 = 13 med 41 > V[13] Campo de procura vazio; Não achou 41

57 Para os valores 15 e 41, o número de comparações foi 4 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 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 log 2 n) Para vetores muito longos, essa diferença, no pior caso, seria muito grande (n e log 2 n) -5 0 1 4 2 7 3 10 4 14 5 15 6 17 7 21 8 23 9 24 10 30 11 32 12 38 13 45 14 50 15 53 16 V med

58 -5 0 1 4 2 7 3 10 4 14 5 15 6 17 7 21 8 23 9 24 10 30 11 32 12 38 13 45 14 50 15 53 16 V med inf (limite inferior do campo de procura) 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); Trecho de programa para efetuar uma procura binária achou: variável que guarda a resposta da procura Quando inf > sup, o campo de procura é vazio A seguir, um programa completo

59 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;

60 /*Diretivas de preprocessamanto e declaracoes*/ #include #include 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;

61 /*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");

62 /*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);

63 /*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);

64 /*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 (); printf ("\n\n"); system ("pause"); getch ();}

65 7.3.3 – Manipulação de polinômios Seja P(x) um polinômio em x dado pela fórmula Seja P(x) um polinômio em x dado pela fórmula P(x) = A 0 + A 1 x + A 2 x 2 + A 3 x 3 + … + A n-1 x n-1 + A n x n Há várias formas de se armazenar na memória um polinômio com este 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 Uma das formas mais simples é guardar seus coeficientes num vetor e seu grau numa variável escalar inteira

66 P(x) = A 0 + A 1 x + A 2 x 2 + A 3 x 3 + … + A n-1 x n-1 + A n x 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 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 No próximo slide, um exemplo da tela por ele produzida n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P

67 TRABALHO COM POLINOMIOS Grau do Polinomio P1: 3 Coeficientes de P1 (0 a 3): 3 5 -2 4 3 5 -2 4 Grau do Polinomio P2: 3 Coeficientes de P2 (0 a 3): 4 -3 0 -4 4 -3 0 -4 Polinomio P1: Grau 3 + (3) + (5)*X + (-2)*X^2 + (4)*X^3 + (3) + (5)*X + (-2)*X^2 + (4)*X^3 Polinomio P2: Grau 3 + (4) + (-3)*X + (-4)*X^3 + (4) + (-3)*X + (-4)*X^3 Polinomio Soma PS: Grau 2 + (7) + (2)*X + (-2)*X^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 + (12) + (11)*X + (-23)*X^2 + (10)*X^3 + (-32)*X^4 + (8)*X^5 + (-16)*X^6 Digite algo para encerrar: Digite algo para encerrar: Polinômios de entrada: P1(x) = 3 + 5x - 2x 2 + 4x 3 P2(x) = 4 - 3x - 4x 3

68 P(x) = A 0 + A 1 x + A 2 x 2 + A 3 x 3 + … + A n-1 x n-1 + A n x n Esse desenvolvimento se orientará pelos seguintes passos: Leitura e correção dos dados dos dois polinômios Leitura e correção dos dados dos dois polinômios Escrita dos dois polinômios Escrita dos dois polinômios Soma dos dois polinômios, com correção do grau, e escrita do resultado Soma dos dois polinômios, com correção do grau, e escrita do resultado Multiplicação dos dois polinômios e escrita do resultado Multiplicação dos dois polinômios e escrita do resultado n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P

69 P(x) = A 0 + A 1 x + A 2 x 2 + A 3 x 3 + … + A n-1 x n-1 + A n x n Necessidade de correção do grau: Possibilidade do operador digitar o valor zero para os coeficientes dos termos de graus mais elevados 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 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 - 2x 2 + 4x 3 P2(x) = 4 + 2x 2 - 4x 3 n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P

70 Declarações: 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 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 P1, P2, PS e PM são inicializados com zero nas declarações, para facilitar a programação da soma e da multiplicação n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P

71 Leitura de um polinômio: Consiste na leitura de um valor para n e de valores para n+1 elementos do vetor P Consiste na leitura de um valor para n e de valores para n+1 elementos do vetor P Leituras similares já foram vistas Leituras similares já foram vistas n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P

72 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: 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: Na realidade, o grau de P não é 7 Na realidade, o grau de P não é 7 7 n 6 0 -3 1 4 2 -5 3 12 4 0 5 P 0 6 98 0 7 99

73 Correção do grau de um polinômio lido: Percorre-se o vetor com um cursor i, de P[n] = P[7] para a esquerda, enquanto P[i] = 0 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 Quando i = 4, P[i] = P[4] = 12 ≠ 0 Então grau do polinômio é 4 Então grau do polinômio é 4 7 n 6 0 -3 1 4 2 -5 3 12 4 0 5 P 0 6 98 0 7 99 i 4 n Programação: for (i = n; P[i] == 0.0 && i != 0; i--); n = i; Se inclusive P[0] = 0.0, zero é o grau de P

74 Escrita de um polinômio: printf ("\nPolinomio P: Grau %d\n\n\t", n); for (i = 0; i <= n; i++) if (P[i] != 0.0 || n == 0) { printf (" + (%g)", P[i]); if (i != 0) { printf ("*X"); if (i > 1) printf ("^%d", i); }} n A0A0 0 A1A1 1 A2A2 2 A3A3 3 A n-1 n-1 AnAn n P Só escreve um termo se o coeficiente não for zero ou se for único termo de um polinômio de grau zero Só escreve a incógnita X se o grau do termo não for zero Só escreve o grau do termo se for maior que 1 Exemplos: + (3) + (5)*X + (-2)*X^2 + (4)*X^3 + (4) + (-3)*X + (-4)*X^3

75 Soma de 2 polinômios P1 e P2: Exemplo 1: 2 n1 3 0 5 1 -2 2 0 3 0 4 0 5 P1 0 6 0 7 0 99 P1(x) = 3 + 5x - 2x 2 P2(x) = 4 - 3x + 6x 2 + 4x 3 - 5x 4 PS(x) = 7 + 2x + 4x 2 + 4x 3 - 5x 4 + 4 n2 4 0 -3 1 6 2 4 3 -5 4 0 5 P2 0 6 0 7 0 99 4 ns 7 0 2 1 4 2 4 3 -5 4 0 5 PS 0 6 0 7 0 99 ns = maior (n1, n2) Inicialmente P1 = P2 = PS = {0}

76 Soma de 2 polinômios P1 e P2: Exemplo 2: 4 n1 3 0 5 1 -2 2 -4 3 5 4 0 5 P1 0 6 0 7 0 99 P1(x) = 3 + 5x - 2x 2 - 4x 3 + 5x 4 P2(x) = 4 - 3x + 6x 2 + 4x 3 - 5x 4 PS(x) = 7 + 2x + 4x 2 + 0x 3 + 0x 4 = 7 + 2x + 4x 2 + 4 n2 4 0 -3 1 6 2 4 3 -5 4 0 5 P2 0 6 0 7 0 99 2 ns 7 0 2 1 4 2 0 3 0 4 0 5 PS 0 6 0 7 0 99 Inicialmente, ns = maior (n1, n2) Depois faz-se a correção do grau

77 Soma de 2 polinômios P1 e P2: 4 n1 3 0 5 1 -2 2 -4 3 5 4 0 5 P1 0 6 0 7 0 99 4 n2 4 0 -3 1 6 2 4 3 -5 4 0 5 P2 0 6 0 7 0 99 2 ns 7 0 2 1 4 2 0 3 0 4 0 5 PS 0 6 0 7 0 99 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 ; Programação

78 Multiplicação de 2 polinômios P1 e P2: Exemplo: P1(x) = 3 + 5x - 2x 2 + 4x 3 P2(x) = 4 - 3x - 4x 3 PM(x) = 4 * (3 + 5x - 2x 2 + 4x 3 ) + (-3x) * (3 + 5x - 2x 2 + 4x 3 ) + (-4x 3 ) * (3 + 5x - 2x 2 + 4x 3 ) * PM(x) = 12 + 20x - 8x 2 + 16x 3 + - 9x - 15x 2 + 6x 3 - 12x 4 + - 12x 3 - 20x 4 + 8x 5 - 16x 6 PM(x) = 12 + 11x - 23x 2 + 10x 3 - 32x 4 + 8x 5 - 16x 6 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); } ‘Paux’ guarda a multiplicação de P1 por um termo de P2

79 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); } 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 ‘j’ é o grau do termo de P2 que multiplica P1 O grau de Paux é a soma do grau de P1 com o grau do termo de P2 que multiplica P1

80 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); } 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 Dentro do ‘if’ for (i = 0; i < 100; i++) Paux[i] = 0; pode ser substituído por polin Paux = {0.0}; Conceito de bloco, a ser visto no capítulo de Subprogramação A seguir, o programa completo dos polinômios

81 /* Declaracoes, inicializacoes e escrita de titulo*/ #include #include 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");

82 /* 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;

83 /* 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); }}

84 /* 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); }}

85 /* 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}; 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; printf ("\n\n"); system ("pause"); return 0;}

86 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 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 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 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 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 Além disso, pode-se fazer um subprograma para somar e outro para multiplicar 2 polinômios

87 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])

88 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 X i (0 ≤ i ≤ n-1) são definidas, entre outras grandezas: Escrever um programa em C para ler e imprimir os elementos do vetor X, calcular e imprimir Escrever um programa em C para ler e imprimir os elementos do vetor X, calcular e imprimir Média aritmética Média quadrática Desvio padrão X, RMQ e S ¯

89 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


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google