A maior rede de estudos do Brasil

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

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

no exemplo 7 da seção 4.5. É interessante também 
que a função, para utilizações posteriores, determine o número de elementos da relação. Este valor pode ser 
retornado através de um parâmetro com passagem por referência o qual receberá uma variável global, 
digamos Tam. Dentro da função, pode-se utilizar um comando while que deverá ser executado enquanto o 
dado de entrada for diferente do flag escolhido. 
{Procedimento para armazenar uma relação de dados num vetor quando a quantidade de elementos 
da relação não é conhecida}
procedure ArmazenaRelacao(var v : TVetor; var t : integer );
var i : integer;
begin
writeln('Digite os elementos da relacao (-1 para encerrar)');
t := 1;
readln(v[t]);
while (v[t] <> -1)
begin
 t = t + 1;
 readln(v[t]);
end;
t := t – 1;
end;
Observe a necessidade do comando t := t – 1. Ele é necessário para se "excluir" o flag, estando o excluir 
entre aspas pelo fato de que o flag é armazenado, porém, com o comando acima, a variável que armazenará a 
quantidade de componentes do vetor não o considerará. Desta forma, como os acessos às componentes serão 
limitados ao valor desta variável, é como se o flag não estivesse armazenado. 
Observe também a passagem de parâmetro para o parâmetro t: no primeiro caso, o valor da quantidade 
de elementos da relação era conhecido e podia ser então passado por valor; no segundo caso, o procedimento 
é que iria determinar esta quantidade de elementos e este valor deveria ser armazenado numa variável global.
Para se exibir uma relação de dados armazenados num vetor, basta um procedimento com dois 
parâmetros: um para receber o vetor onde a relação está armazenada e o outro para receber a quantidade de 
elementos da relação. Esta quantidade está armazenada em alguma variável, pois ela foi um dado de entrada 
(se ela era conhecida a priori) ou foi determinada na ocasião do armazenamento da relação, através de um 
procedimento do tipo ArmazenaRelação definido anteriormente. 
{Procedimento para exibir os elementos de uma relação de dados armazenados num vetor}
procedure ExibeRelacao(var v : TVetor; t : integer);
var i : integer;
begin
for i := 1 to t do
write(v[i], ' ');
end;
Vale observar que, na execução deste procedimento, a relação está armazenada num vetor e a passagem 
de parâmetro para o parâmetro v poderia ser por valor. Porém, este tipo de passagem de parâmetro requer 
que fosse feita uma cópia de toda a relação que estava armazenada numa variável global para o parâmetro v, 
o que vai demandar algum tempo de processamento. Assim, quando o parâmetro é de um tipo estruturado é 
preferível que as passagens de parâmetros sejam feitas por referência, mesmo que isto não seja necessário.
Evidentemente o leitor deve ter entendido que um programa, para utilizar os procedimentos 
ArmazenaRelacaoN, ArmazenaRelacao e ExibeRelacao devem possuir uma definição do tipo
type TVetor = array [vi .. vf] of tipo de dado;
onde vi, vf e tipo de dado dependem do programa específico.
6.5 Exemplos Parte IX
Os exemplos a seguir, além de reforçar vários aspectos da utilização de vetores, são muito úteis no 
desenvolvimento da lógica de programação.
1. Para introduzir o estudo dos vetores, nos referimos, na seção 6.1, ao problema de se determinar o 
número de alunos de uma turma que obtiveram notas maiores que a média. Com a utilização de vetores, 
podemos calcular a tal média e depois "percorrer" novamente o vetor, comparando cada nota com a referida 
média. Teríamos então o seguinte programa:
{Programa para determinar o numero de alunos que obtiveram notas maiores que a media}
program AvaliaNotas;
type TVetor = array [1 .. 60] of real;
var NumAlunos, NumBonsAlunos, j : integer;
 Med : real;
 RelacaoNotas : TVetor;
{Procedimento para armazenar as notas}
procedure ArmazenaNotas(var v : TVetor; var t : integer);
 begin
t := 1;
writeln('Digite as notas (-1 para encerrar)');
readln(v[t]);
 while (v[t] <> -1) do
 begin
t := t + 1;
readln(v[t]);
 end;
t := t – 1;
 end;
{Funcao para calcular a media de uma relacao de números armazenada num vetor}
function Media(var v : TVetor; t : integer) : real;
var i : integer;
Soma : real;
begin
 Soma := 0;
 for i := 1 to t do
 Soma := Soma + v[i];
 Media := Soma/t;
end;
{Programa principal}
begin
ArmazenaNotas(RelacaoNotas, NumAlunos);
Med := Media(RelacaoNotas, NumAlunos);
NumBonsAlunos := 0;
for j := 1 to NumAlunos do
if (RelacaoNotas[i] > Med)
 NumBonsAlunos := NumBonsAlunos + 1;
writeln('Media das notas: ', Med);
writeln('Numero de alunos com notas maiores que a media: ', NumBonsAlunos);
end;
2. Imaginemos agora que queiramos um função que retorne o maior valor de uma relação armazenada em 
um vetor. Uma possível solução é supor que o maior valor procurado é o primeiro elemento do vetor e, em 
seguida, percorrer o vetor comparando cada componente com o valor que até o momento é o maior, 
substituindo o valor deste maior elemento quando se encontra uma componente maior que ele. Por exemplo, 
se a relação é (8, 2, 5, 12, 1), teríamos as seguintes ações:
1. Maior := 8.
2. Como 2 < Maior, nada é feito.
3. Como 5 < Maior, nada é feito.
4. Como 12 > Maior, Maior := 12.
5. Como 1 < Maior, nada é feito.
Temos então a seguinte função:
{Funcao que retorna o maior elemento de uma relacao armazenada num vetor}
function MaiorElemento(var v : TVetor; t : integer) : real;
var i : integer;
 Maior : real;
 begin
Maior := v[1];
for i := 2 to t do
if (v[i] > Maior)
 then
Maior := v[i];
MaiorElemento := Maior;
end;
Observe que a função acima retorna o maior elemento armazenado no vetor (o que em alguns casos é 
suficiente), mas não retorna a posição deste maior elemento (o que em alguns casos é necessário). Para isto, 
podemos utilizar um procedimento com quatro parâmetros: o primeiro para receber a relação; o segundo para 
receber a quantidade de elementos da relação; o terceiro, por referência, para retornar o maior valor e o 
quarto, também por referências, para retornar a posição. Este quarto parâmetro recebe o valor um e, em 
seguida, o valor da posição onde foi encontrada uma componente maior do que Maior.
{Procedimento que retorna o maior valor de uma relação e a posição deste maior valor} 
procedure MaiorElemento(var v : TVetor; t : integer; var Maior : real; var p : integer);
var i : integer;
begin
Maior := v[1];
p := 1;
for i := 1 to t do
if v[i] > Maior
 then
begin
 Maior := v[i];
 p := i;
end;
end;
Uma chamada deste procedimento vai requerer, além do vetor Vetor onde está armazenada a relação e do 
conteúdo da variável que contém o número de elementos da relação, duas outras variáveis, digamos 
ElementoMaior e Pos. Nestas condições a ativação do procedimento será feita através do comando
MaiorElemento(Vetor, Quant, ElementoMaior, Pos);
3. O exemplo a seguir tem o objetivo de mostrar que o índice de acesso às componentes de um vetor 
pode ser dado através de expressões. Nele se apresenta um procedimento que recebe um vetor e o decompõe 
em dois outros vetores, um contendo as componentes de ordem ímpar e o outro contendo as componentes de 
ordem par. Por exemplo, se o vetor dado for v = {3, 5, 6, 8, 1, 4, 2, 3, 7}, o vetor deve gerar os vetores
u = {3, 6, 1, 2, 7} e w = {5, 8, 4, 3}. 
procedure DecompoeVetor(var v, v1, v2 : TVetor; t : integer);
var i : integer;
begin
for i := 1 to t do
if i mod 2 = 1
 then
v1[(i + 1) div 2] := v[i]
 else
v2[i div 2] : = v[i];
end;
4. Agora apresentaremos um exemplo que mostra um vetor cujas componentes são cadeias de caracteres. 
Além disto, o exemplo mostra como um vetor pode ser definido como uma constante. Trata-se de uma 
função que retorne o nome do mês correspondente