Sei sulla pagina 1di 6

Mtodos de Programao I Ana Maria de Almeida

2. 35

2.10 O TIPO ESTRUTURADO TABELA (ARRAY) A estruturao de informao introduz uma nova dimenso no poder e complexidade dos nossos programas que, ao mesmo tempo que amplia a capacidade de manipulao, tambm a simplifica e aumenta a sua clareza. Nesse sentido, passamos a apresentar uma das estruturas de informao mais utilizadas em programao - a tabela (array). Como habitual, uma tabela um agregado de elementos do mesmo tipo . Cada um desses elementos, pode ser acedido atravs da indicao da posio que ocupa na tabela. As dimenses de uma tabela representam, por definio, o nmero de valores (elementos) que a tabela pode conter no total, e atravs das dimenses que possvel indicar a posio de um dado elemento. Para referenciar, por exemplo, um elemento da tabela da figura 2.20, que tem dimenso 1x11, isto , uma nica linha e onze colunas, temos apenas que especificar a coluna - o valor do ndice que representa as colunas - onde est colocado o elemento, ou seja, a posio deste elemento na linha. Exactamente porque esta tabela s tem uma linha, e portanto s precisamos do ndice das colunas para referenciar os elementos, toma o nome de tabela unidimensional (um s ndice). ndice
0 24 1 7 2 18 3 -6 4 -5 5 0 6 20 7 2 8 34 9 35 10 4

Figura 2.20: tabela unidimensional

Para referenciar um elemento duma tabela como a da figura 2.21, com dimenso 4x10 (quatro linhas e dez colunas), j precisamos, no de um, mas de dois ndices: um para a posio na linha e outro para a posio na coluna. Por isso mesmo se denomina uma tabela deste tipo por bidimensional. Tabelas com mais do que dois ndices dizem-se multidimensionais. ndices
1 2 3 4 1 x 2 x 3 4 x x x Figura 2.21: tabela bidimensional 5 6 7 8 x 9 10

O Pascal, como de resto quase todas as linguagens de alto nvel, obriga declarao das tabelas antes da sua utilizao no programa (como bvio, a ser feita na parte declarativa do programa). Para declarar tabelas de um tipo particular, temos que caracterizar as suas dimenses, os limites dos seus ndices e qual o tipo dos seus elementos. As tabelas so, portanto, tipos estruturados com duas caractersticas fundamentais:

todos os elementos armazenados na tabela so do mesmo tipo os elementos de uma tabela so acedidos atravs da posio que ocupam nessa tabela.

O diagrama de sintaxe para a declarao de uma tabela em Pascal toma a forma, , array [ tipo simples ] of ndice(s) Este diagrama indica que o(s) ndice(s) sero de um tipo simples, que define no s as dimenses mximas da tabela, mas tambm os limites inferior e superior, como podemos ver nos exemplos que se seguem. A so apresentados trs tabelas diferentes: o tipo vector - unidimensional, com dimenso 100 (1x100), de elementos reais; a varivel texto - unidimensional, dimenso 12 (1x12), de elementos do tipo caracter; e o tipo matriz - bidimensional, com dimenso 100 (10x10), de elementos reais: tipo

Mtodos de Programao I Ana Maria de Almeida

2. 36

type var

vector = array [ 1 .. 100 ] of real; matriz = array [ 1 .. 10, 1 .. 10 ] of real; v1, v2 : vector; A, B, C : matriz; texto : array [ 0 .. 11 ] of char;

Os tipos vector e texto acima declarados so tabelas unidimensionais. Por conveno, passaremos a denominar toda a tabela deste tipo por vector (tabela com uma nica variao de ndice) e a uma tabela bidimensional chamar-se- matriz. Como bvio, para trabalhar com estes tipos necessrio criar variveis (identificadores). Aps a declarao de uma varivel como tabela, podemos referenciar qualquer um dos seus elementos especificando o nome da varivel (do tipo tabela) e a posio que o elemento desejado nela ocupa, isto , o (s) valor(es) do(s) ndice(s), como por exemplo, sendo a tabela texto a seguinte,
0 e 1 s 2 t 3 e 4 5 t 6 e 7 x 8 t 9 o 10 11 !

texto[1]

texto[6]

o nome da tabela seguido da posio K indicada entre parntisis rectos texto[K] - referencia o elemento da tabela texto que se encontra no ndice de valor K (e, portanto, texto[1] tem o velor 's', enquanto texto[6] tem o valor 'e'). A instruo, texto[11] := ?; tem o efeito esperado, 0 e 1 s 2 t 3 e 4 5 t 6 e 7 x 8 t 9 o 10 11 ? texto[11] Poderemos utilizar todas as instrues conhecidas sobre variveis sobre estas referncias pois, cada uma delas referencia uma varivel (s que declarada de um modo especial). Por exemplo, e utilizando ainda os tipos e as variveis acima declarados, poderemos fazer, v2[56] := 3 + A[1,10] * 8.7; i := 55; j := 5; v2[i+j] := v2[100] - 26;

Notas Finais: Os ndices s podem ser de tipo escalar no real e, dentro destes, s so aceites subdomnios (enumerao): type

quadro = array [ -10 .. -5, -5 .. 5 ] of integer; vencimentos = array [ A .. F ] of real;

Os limites dos ndices tm que ser constantes. O nmero mximo de ndices depende do computador. Um array uma sequncia de variveis do mesmo tipo. O tipo dos elementos pode ser qualquer, inclusive, outro array:

Mtodos de Programao I Ana Maria de Almeida

2. 37

type var

cores = (branco, azul, verde, vermelho, amarelo); cubo : array [ 1 .. 3, 1 .. 3, 1 .. 3 ] of cores; digitos : array [ 1 .. 10 ] of 0 .. 9; array [ 1 .. 8 ] of array [ 1 .. 8 ] of quadrados;

A ltima declarao acima equivalente a declarar uma matriz: tabuleiro : array [1 .. 8 , 1 .. 8] of quadrados;

Exemplos de operaes elementares com tabelas unidimensionais numricas Podemos estender a analogia com os vectores algbricos e implementar as operaes algbricas mais usuais. Nesse sentido, vamos assumir que, a ttulo de exemplo, temos as seguintes declaraes: const DIM = 100; type Vector = array [1..DIM] of real; var i : 1..DIM; k, norma, prod : real; v, u, z : Vector;

Consideremos que temos 2 vectores de inteiros, v e u (do tipo Vector), j com valores para os quais podemos querer efectuar operaes como sejam, entre outras: somar 2 vectores, calcular o seu produto interno, multiplicar um escalar por um vector ou calcular a norma de um vector. Para todas estas operaes necessrio percorrer todas as posies (de 1 a Dim) de cada vector , para o que poderemos usar ciclos for:

Soma de dois vectores: for i:=1 to DIM do z[i] := v[i] + u[i];

Produto de um escalar por um vector: for i:=1 to DIM do u[i] := k * v[i];

Produto Interno de dois vectores: prod := 0; for i:=1 to DIM do prod := prod + v[i] * u[i];

Norma de um vector: norma := 0; for i:=1 to DIM do prod := norma + sqr( u[i]); norma := sqrt(norma);

Mtodos de Programao I Ana Maria de Almeida

2. 38

No entanto, tabelas so especialmente teis quando necessrio processar de um modo semelhante cada um dos elementos de uma coleco de valores. Vamos ver em seguida alguns exemplos tpicos de utilizao de tabelas, comeando precisamente por apresentar uma nova verso do um programa da figura 2.9, que verifica se um dado nmero natural ou no uma capicua.

Exemplo 2.10.1: Nova verso para detectar capicuas Nesta verso, vamos usar um vector para armazenar todos os digitos do nmero dado, 2 4 5 1 5 4 2 (capicua)

e depois comparamos pares de extremos para verificar se so iguais ou diferentes. 2 4 5 5 5 6 2 (no capicua)

Exerccio: Compare com a verso anterior e explicite as diferenas. program capicua2 (input, output); type tipoindice = 1 .. 10; var indice, inicial, final : 0 .. 9; numero : 0 .. maxint; num : array [tipoindice] of 0 .. 9; begin read(numero); (* colocar o numero num vector por digitos *) indice := 0; while numero > 0 do begin indice := indice + 1 num[indice] := numero mod 10; numero := numero div 10; end; (* comparar pares de digitos*) inicial := 1; final := indice; while (inicial < final) and (num[inicial] = num[final]) do begin inicial := inicial + 1; final := final - 1 end; if inicial >= final then writeln( Capicua ) else writeln ( No e capicua ) end.
Figura 2.22: programa para verificar se um dado nmero uma capicua - verso 2

Mtodos de Programao I Ana Maria de Almeida

2. 39

Exemplo 2.10.2 : Clculo de um polinmio A forma geral de um polinmio a seguinte: Pn(x) = a0xn + a1xn-1 + + an-2x2 + an-1x + an onde n o grau do polinmio, ou seja, a maior potncia de x a ser calculada. Isto significa que, para cada n, para cada conjunto de coeficientes, ak, e para cada valor x, Pn(x) ter diferentes valores. Por exemplo, se P2(x) = 6x2 + 2x + 3, ento, P2(1) = 11 e P2(2) = 55. Se P2(x) = 2x2 + x + 1, ento, P2(1) = 4 e P2(2) = 11. Pretende-se implementar em Pascal, um programa que, dadas estas trs indicaes, calcule o valor final do polinmio usando o chamado Mtodo de Horner, que diminui o nmero de multiplicaes envolvidas. Tal mtodo modifica a forma de avaliao do polinmio, passando esta a ser feita na ordem seguinte (do interior para o exterior): Pn(x) = (((((a0x + a1)x + a2))x + an-2)x + an-1)x + an Para melhor perceber como trabalha este mtodo vamos ver alguns exemplos: n=2 P2(x) = a0x2 + a1x + a2 Mtodo de Horner = (a0x + a1) x + a2 n=3 P3(x) = a0x3 + a1x2 + a2x + a3 Mtodo de Horner = ((a0x + a1) x + a2) x + a3 6 multiplicaes 3 multiplicaes 3 multiplicaes 2 multiplicaes

Para construir o valor final do polinmio, basta usar uma frmula iterativa que v recolhendo, passo a passo, os valores sucessivos anteriores, de acordo com o raciocino que se segue: factor a0 factor a0 x + a1 factor anterior factor (a0x + a1) x + a2 factor anterior factor ((a0x + a1) x + a2) x + a3 factor anterior Ou seja, a frmula iterativa toma a forma, factor factor * x + ak e a implementao ser: program horner (input, output); type indice = 0 .. 10; var k, n : indice; x, factor : real; a : array [indice] of real; begin write('Qual o grau do polinmio?') readln( n );

Mtodos de Programao I Ana Maria de Almeida

2. 40

write('Qual o valor de x?') readln( x ); (* ler e colocar os coeficientes ak num vector *) writeln('Escreva os coeficientes:'); for k:=0 to n do read( a[k] ); (* calcular o valor do polinomio - metodo de Horner *) factor:= a[0]; for k:=0 to n do factor := factor * x + a[k]; writeln ( Valor do polinomio = , factor) end.
Figura2.23: programa para calcular o valor de um polinmio de grau n

Dado que cada valor ak s utilizado uma nica vez e no mais necessrio, podemos simplificar esta verso evitando o uso de tabelas. Exerccio: Reescreva o programa de modo a evitar o uso de tabelas e lendo o valor de ak s quando necessrio. De facto, a declarao de uma tabela pressupe a necessidade de manter em memria informao agregada, de modo a poder consultar, alterar e manipular essa informao, tipicamente mais do que uma vez. O prximo exemplo, ainda que simples, ilustra j este conceito, usando vrias vezes um vector para consulta. Exemplo 2.10.3: Pares de Nmeros Seja dado um conjunto de N valores inteiros que representam um consumo elctrico horrio (cada valor para uma hora diferente) de um dado gabinete. necessrio saber agora, dada uma certa quantidade K, todos os pares de valores cuja soma igual a K e em que horas ocorreram. program pares_soma (input, output); const Ntotal = 500; type indice = 1 .. Ntotal; var j1, j2 : indice; horas, K : integer; consumo : array [indice] of integer; begin read( total_horas ); (* ler e colocar os consumos num vector *) for j1:=1 to total_horas do read( consumo[j1] ); read( K ); (* verificar soma de pares igual a K *) for j1:=1 to total_horas do for j2:=1 to total_horas do if (consumo[j1] + consumo[j2]) = K then writeln(j1, :, consumo[j1]:5, e , j2, :, consumo[j2]:5); end.
Figura 2.24

Potrebbero piacerti anche