A maior rede de estudos do Brasil

Grátis
146 pág.
Programando com PASCAL - Jaime Evaristo

Pré-visualização | Página 32 de 50

0
0 1 0
0 0 1
=






{Procedimento que gera a matriz unidade de ordem n}
procedure GeraMatrizUnidade(var Mat : TMatriz; n : integer);
var i, j : integer;
begin
for i := 0 to n do
for j = 0 to m do
if i = j
then
 Mat[i, j] = 1
 else
 Mat[i, j] = 0;
end;
3. Quando o número de linhas de uma matriz é igual ao número de colunas a matriz é dita matriz 
quadrada. Neste caso, os elementos de índices iguais constituem a diagonal principal. A soma dos 
elementos da diagonal principal de uma matriz quadrada é o traço da matriz. Como mais um exemplo de 
programas que manipulem matrizes, a função abaixo determina o traço de uma matriz quadrada dada. 
Observe que, para percorrer a diagonal principal, não há necessidade de um duplo for.
 {Funcao que calcula o traco de uma matriz}
function Traco(var Mat : matriz; m, n : integer) : real;
var i : integer;
 Tr : real;
begin
 if m = n 
 then
 begin
 Tr := 0;
 for i := 1 to m do
Tr := Tr + Mat[i, i];
 Traco := Tr;
end;
else 
 writeln('A matriz não é quadrada');
end;
4. Uma tabela que enumere as distâncias entre várias cidades é uma matriz simétrica: os termos 
simétricos em relação à diagonal principal são iguais, ou seja, Mat[i][j] = Mat[j][i]. Obviamente a digitação 
de uma matriz com esta propriedade pode ser simplificada, devendo-se digitar apenas os termos que estão 
acima da diagonal principal. 
{Procedimento para armazenar uma matriz simetrica}
procedure ArmazenaMatrizSimetrica(var Mat : TMatriz; m : integer);
var i, j : integer;
begin
writeln('Digite, por linha, os elementos da matriz, a partir da diagonal');
for i := 0 to m do
for j := i to m do
begin
readln(Mat[i][j]);
Mat[j][i] := Mat[i][j];
end;
end;
Observe a inicialização de j no comando for. A razão disto é que só serão digitados os termos acima da 
diagonal principal, termos em que j ≥ i. Observe também que estamos utilizando a outra forma de se 
referenciar as componentes de uma matriz. 
5. Nos exemplos anteriores, sempre "percorremos a matriz pelos elementos de suas linhas", que é o 
usual. O próximo exemplo mostra um caso em que é necessário percorrer as colunas. Trata-se de um 
procedimento para uma questão muito comum: a totalização das colunas de uma tabela.
{Procedimento para totalizar as colunas de uma tabela armazenada numa matriz}
procedure TotalizaColunas(var Mat : TMatriz; m, n : integer);
var i, j : integer;
begin
for j := 0 to n do
begin
Mat[m + 1][j] := 0;
for i := 0 to m do
Mat[m + 1][j] := Mat[m + 1][j] + Mat[i][j];
end;
end;
Observe que a totalização das colunas foi armazenada na linha de ordem m + 1, onde m é o número de 
linhas da tabela. Observe também a necessidade de, para cada j, inicializar-se Mat[m + 1][j] com zero.
6. O exemplo a seguir, além de sua importância prática, tem o objetivo de mostrar que se pode utilizar 
definições específicas para vetores multidimensionais de acordo com o objetivo do programa. Trata-se de um 
programa que determine as médias das linhas de uma matriz. Por exemplo, se a matriz dada for 
3 7 4 6
5 4 5 4
2 6 5 1





 a função deve fornecer a matriz
3 7 4 6 5 0
5 4 5 4 4 5
2 6 5 1 3 5
,
,
,





 . Este programa que poderia ser 
utilizado para, dada uma tabela com os preços de vários produtos em vários supermercados, determinar o 
preço médio de cada um dos produtos. Como precisamos calcular a média de cada linha e sabemos calcular a 
média das componentes de um vetor, vamos definir a matriz como sendo, especificamente, um vetor cujas 
componentes são vetores:
{Programa para determinar as medias de cada uma das linhas de uma matriz}
program MediasdasLinhas;
type TVetor = array[1..20] of real;
 TTabela = array[1..50] of TVetor;
var Tabela : TTabela;
 NumLinhas, NumColunas : integer;
{Procedimento para armazenar uma tabela}
procedure ArmazenaTabela(var Tab : TTabela; m, n : integer);
var i, j : integer;
begin
writeln('Digite (por linha) os elementos da tabela');
for i := 1 to m do
for j := 1 to n do
readln(Tab[i, j]);
end;
{Procedimento para exibir uma tabela}
procedure ExibeTabela(var Tab : TTabela; m, n : integer);
var i, j : integer;
begin
for i := 1 to m do
begin
for j := 1 to n do
write(Tab[i, j]:6:2);
writeln;
end;
end;
{Funcao para calcular a media das componentes de um vetor}
function Media(var v : TVetor; t : integer) : real;
var Soma : real;
 i : integer;
begin
Soma := 0;
for i := 1 to t do
Soma := Soma + v[i];
Media := Soma/t;
end;
{Procedimento para determinar a media de cada uma das linhas de uma matriz}
procedure MediaLinha(var Tab : TTabela; m, n : integer);
var i : integer;
begin
for i := 1 to m do
Tab[i, n + 1] := Media(Tab[i], n);
end;
{Programa principal}
begin
writeln('Digite o numero de linhas e o numero de colunas da tabela');
readln(NumLinhas, NumColunas);
ArmazenaTabela(Tabela, NumLinhas, NumColunas);
MediaLinha(Tabela, NumLinhas, NumColunas);
ExibeTabela(Tabela, NumLinhas, NumColunas + 1);
end.
Observe que cada linha de Tabela é um vetor do tipo TVetor e, portanto, pudemos passar cada linha para 
a função Media.
6.8 Um programa para medidas estatísticas
Estamos em condições de apresentar um "programa completo", com um objetivo específico. Trata-se de 
um programa que determina medidas estatísticas, utilizadas em problemas de economia, de administração, de 
educação e de vários outros ramos do conhecimento humano. Estas medidas objetivam avaliar uma relação 
de valores numéricos relativos a algum fenômeno, procurando medir valores para os quais os valores da 
relação tendem e como estes valores estão dispersos. As medidas que o programa determina são a média 
aritmética e a moda, que são medidas de tendência central, e a amplitude e o desvio padrão, que são 
medidas de dispersão. A média aritmética (já discutida nos exemplos 1 da seção 6.5, 6 e 7, da seção 4.5 e 2, 
da seção 1.7) é definida como o quociente entre a soma dos valores da relação e a quantidade de seus 
elementos; a moda é o valor de maior freqüência da relação; a amplitude é a diferença entre o maior e o 
menor valores da relação; o desvio padrão é a raiz quadrada da média aritmética dos quadrados dos desvios 
em relação à média, que são as diferenças entra cada valor e a média aritmética da relação.
Para discutir as funções que farão parte do programa, imaginemos que a relação esteja armazenada num 
vetor Relacao. Para o cálculo da moda, vamos construir um vetor Frequencia, com número de componentes 
igual ao número de componentes do vetor Relacao, para armazenar as freqüências de cada um dos valores 
da relação. Para isto, inicializamos cada componente Frequencia[i] com zero e percorremos o vetor Relacao, 
a partir da posição i, procurando valores iguais à Relacao[i]; quando um valor igual é encontrado, a 
componente Frequencia[i] é incrementada. Em seguida, determinamos a posição p do maior elemento do 
vetor Frequencia; a moda da relação é, então, Relacao[p].
O cálculo da amplitude é bem mais simples: bastam funções que calculem a maior e a menor 
componente do vetor Relacao e a amplitude é a diferença entre os valores retornados por estas funções. Para 
que a função que determina o maior elemento possa ser utilizada também no cálculo da moda, ela deve 
retornar também a posição deste maior elemento, como foi feito no exemplo 2 da seção 6.5.
Para a determinação do desvio padrão, construímos um vetor contendo os quadrados dos desvios em 
relação à média, calculamos a média aritmética das componentes deste vetor e, finalmente, a raiz quadrada 
desta média.
Observe que este programa exemplifica