Anda di halaman 1dari 6

ALGORITMOS COM PASCAL

Prof. Miguel Jonathan Dept. Cincia da Computao IM/UFRJ

CAPTULO 5
Variveis Compostas Homogneas - Vetores e Matrizes
Um vetor (array em ingls) um agregado de variveis do mesmo tipo (homogneas).
O exemplo abaixo mostra a representao grfica de um vetor de 6 inteiros chamado v:
1

24

67

94

6
12
24

10
3

24

Cada casa , ou elemento, do vetor uma varivel independente. No exemplo acima,


cada elemento pode conter um valor inteiro, e as posies foram ordenadas de 1 at 6.
Os elementos de um vetor so identificados pelo nome do vetor associado ao nmero de
ordem da sua posio relativa no vetor: v[1], v[2], v[3], v[4], v[5] e v[6].
Assim, no caso acima, a varivel v[2] tem o valor 67.
Podemos alterar esse valor exatamente como fazemos com qualquer varivel:
v[2] := 100;
readln(v[2]);
etc.
Para declarar esse vetor em um programa Pascal, usada a forma abaixo:
var
v: array[1..6] of integer;
A forma geral :
var <identificador do vetor>: array [<intervalo das posies>] of <tipo dos valores do vetor>

Cada varivel do conjunto representada por:


<identificador do vetor>[<expresso cujo valor a posio da varivel> ]

onde a expresso deve ser do tipo declarado.


Por exemplo, a varivel na posio 3 do vetor pode ser representada por:
v[3]
v[10-7]
v[5*5-2*11] v[x-4], supondo que x tenha o valor 7, etc.
Uso do comando for com vetores
A manipulao de vetores grandemente facilitada pelo uso dos comandos de repetio,
especialmente o for. Por exemplo, para zerar (colocar o valor 0) todas as posies do
vetor v definido acima, seria necessrio escrever 6 comandos:
v[1]:= 0;
v[2]:= 0;

v[3]:= 0;
v[4]:= 0;
v[5]:= 0;
v[6]:= 0;
A mesma operao pode ser feita com apenas um comando de repetio for, usando
uma varivel de controle para representar as posies do vetor:
for i:= 1 to 6 do v[i]:=0;
fcil imaginar o que isso representa de simplificao para a manipulao de vetores
grandes.
Da mesma forma, para ler do teclado todos os valores do vetor v, seriam tambm
necessrios 6 comandos:
read (v[1]);
read (v[2]);
read (v[3]);
read (v[4]);
read (v[5]);
read (v[6]);
Todos esses comandos podem ser substitudos por um nico comando for:
for i:= 1 to 6 do read(v[i]);
O que se pode e o que no se pode fazer com vetores, na linguagem Pascal:
Nota: essas regras no se aplicam ao tipo string que um caso especial de vetor de
caracteres com regras prpria, e que ser visto mais adiante.
No possvel:
a) No se pode ler todo um vetor diretamente com um comando read. No se pode
escrever: read(v);
necessrio ler casa a casa, diretamente, ou com um lao de repetio como for no
exemplo acima.
b) No se pode escrever todos os elementos de um vetor com um nico comando write.
No permitido escrever: write(v). Tambm nesse caso cada elemento deve ser
tratado como uma varivel independente, por exemplo:
for i:= 1 to 6 do write(v[i]:3);
c) No possvel copiar os valores dos elementos de um vetor para outro com um nico
comando de atribuio. Ou seja, dados dois vetores v e w, ambos do mesmo tamanho
e do mesmo tipo, no permitido fazer: w:= v; . Tambm aqui necessrio trabalhar
elemento a elemento, e o comando for mais uma vez indicado:
for i:= 1 to 6 do w[i]:= v[i];
c) No existe comandos ou funes que do o tamanho (nmero de elementos) de um
vetor.
d) No permitido tentar acessar uma posio fora do intervalo de posies definido
para o vetor. A tentativa causar um erro em tempo de execuo e o programa
abortar. No caso do vetor v acima, por exemplo, no permitido escrever: v[8]:=
20, read(v[8]) ou write (v[8]) porque a faixa de valores das posies vai de 1 a 6
apenas.
O que permitido:

a) A faixa de valores das posies no precisa comear em 1. Qualquer intervalo de


valores pode ser usado na definio de um vetor. Por exemplo, podemos definir um
vetor assim:
var v:array[15..20] of real;

Nesse caso o vetor v ter apenas os elementos: v[15], v[16], v[17], v[18], v[19] e
v[20]
b) As posies no precisam ser necessariamente nmeros inteiros. Podem ser qualquer
tipo ordinal, ou seja, que possa ser definido por uma seqncia ordenada de valores.
Por exemplo, os caracteres em Pascal formam uma seqncia ordenada na tabela de
caracteres, e podem portanto serem marcadores de posio em um vetor.
Podemos definir um vetor assim:
var letras: array['a'..'z'] of integer;

Nesse caso os elementos do vetor so: letras['a'], letras['b'], ..,


letras['z']

Um uso possvel para esse vetor poderia ser que cada posio poderia guardar a
quantidade de vezes que a letra dessa posio aparece em uma determinada frase.
Exemplos de uso:
Ordenao de nmeros:
Fazer um programa para ler n valores inteiros quaisquer, n <50, onde o valor de n deve
ser previamente fornecido pelo usurio.
Em seguida, o programa deve escrever na tela os valores em ordem numrica crescente.
A soluo utiliza um algoritmo de ordenao .
O algoritmo abaixo conhecido como ordenao por seleo. Os nmeros so
colocados em um vetor definido com 50 posies. Inicialmente, procura-se a posio no
vetor (posMenor) onde est o menor nmero. Se essa posio for diferente da posio 1,
ento troca-se os valores das casas 1 e posMenor. Isso garante que o menor elemento
agora est na posio 1. A seguir, repete-se o processo a partir da posio 2. Ou seja,
procura-se a posio do menor elemento da posio 2 em diante, que ser posMenor. Se
o valor de posMenor for diferente de 2, troca-se os valores das casas 2 e posMenor. O
processo repetido a partir da posio 3, depois 4, etc, at n-1. Nesse ponto o vetor
estar com os valores ordenados. Basta ento escrever na tela os valores das posies 1
a n e teremos os nmeros em ordem crescente.
program ordenasel;
const nmax=50;
var
v: array[1..nmax] of integer;
i,j,n,posMenor,temp: integer;
begin
writeln('Digite um inteiro menor ou igual a ' ,nmax, ' :
readln(n);
writeln('Digite ',n,' inteiros separados por espacos');
for i:=1 to n do read(v[i]);
for i:=1 to n-1 do begin
posMenor:=i;
for j:=i+1 to n do
if v[j] < v[posMenor] then posMenor := j;
if i <> posMenor then begin
temp := v[i];
v[i] := v[posMenor];

');

v[posMenor] := temp;
end;
end;
writeln;
for i:=1 to n do write(v[i]:4);
end.

O tipo STRING
A linguagem Pascal original no possua o tipo string. Hoje em dia, todas as verses
modernas de Pascal estendido possuem esse tipo (Turbo Pascal, Free Pascal, etc).
O tipo string um caso especial de vetor de caracteres criado especialmente para tratar
com texto: palavras, frases, etc, onde a seqncia de caracteres deve ser tratada como
uma nica entidade. A palavra string significa uma cadeia de caracteres. Cada posio
de uma string contm apenas um caractere.
A definio de uma varivel : var frase: string;
No h necessidade de se definir um tamanho mximo, embora seja possvel:
var nome: string[15];
Se no for definido um tamanho mximo, a string poder expandir-se ou encolher-se
automaticamente para acomodar a quantidade de caracteres necessria.
As regras para vetores em geral no se aplicam s strings. Em particular, permitido
paara strings:
a) a) ler uma string inteira com um nico comando read ou readln: readln(frase);
b) b) escrever uma string inteira com um nico comando write ou writeln:
writeln(frase);
c) c) atribuir uma string diretamente: frase2:= frase;
d) d) escrever o valor literal de uma string entre aspas simples e usar em comandos de
atribuio ou de escrita: frase:= rio de janeiro; write(rio de janeiro);
e) e) Caracteres individuais e strings podem ser usados de forma idntica:
frase:= a; faz a string frase ser uma string com apenas o caractere a.
f) f) O uso da funo length() que d o tamanho (nmero de caracteres) de uma
string.
g) g) O uso do operador de concatenao +, que permite unir duas strings
produzindo uma string que a concatenao das duas: ab + cd produz a string
abcd. O mesmo pode ser obtido com a funo concat(). Tambm aqui pode-se
misturar strings com caracteres de qualquer maneira: a + b d a string ab, etc.
O operador e a funo podem ser usados para concatenar varias strings e/ou
caracteres:
Ex: frase := frase1 + frase2 + !;
frase := concat(frase1, frase2, !);
h) possvel comparar duas strings diretamente, usando os operadores relacionais =,
<>, >, <, >=, e <=, onde a comparao feita pela ordem dos elementos na
tabela de caracteres, o que garante a ordem alfabtica para strings contendo apenas
letras maisculas ou apenas minsculas:
cde < fgh dar true e AB = CD dar false

i) A posio zero de uma string contm sempre um nmero inteiro que o tamanho da
string. Esse valor pode ser obtido usando a funo ord(). Por exemplo, para
imprimir o tamanho da string frase, pode-se escrever: write ( ord(frase[0]); Na
realidade a funo length() obtm o seu valor consultando a posio 0 da string.
Com esses conhecimentos, podemos adaptar muito facilmente o algoritmo de ordenao
por seleo, descrito acima para vetores de nmeros, para ordenar um vetor de nomes
em ordem alfabtica, assumindo que esto todos escritos em letras da mesma caixa
(maisculas ou minsculas). Note que isso s foi possvel por causa das regras especiais
para strings, e que possvel tambm se criar um vetor de strings:
program ordenanomes;
(*********************************************************************
*
algoritmo de selacao para ordenar nomes em ordem alfabtica.
**********************************************************************
)
const nmax=50;
var
v: array[1..nmax] of string;
i,j,n,posMenor: integer;
temp:string;
begin
writeln('Digite um inteiro menor ou igual a ' ,nmax, ' : ');
readln(n);
writeln('Digite ',n,' strings, uma em cada linha);
for i:=1 to n do readln(v[i]);
for i:=1 to n-1 do begin
posMenor:=i;
for j:=i+1 to n do
if v[j] < v[posMenor] then posMenor := j;
if i <> posMenor then begin
temp := v[i];
v[i] := v[posMenor];
v[posMenor] := temp;
end;
end;
writeln;
for i:=1 to n do writeln(v[i]);
end.

MATRIZES vetores com mais de 1 dimenso:


Os elementos de um vetor guardam uma relao de posicionamento entre si apenas em
uma dimenso. Essas variveis esto dispostas como que em uma linha, e cada
elemento identificado pela sua posio relativa na linha:
20 30 17 35 7
1

5 (posies na linha)

Quando h mais de uma dimenso, damos o nome de matriz a esse arranjo de variveis.
O caso mais comum a matriz de 2 dimenses. Os elementos ficam dispostos em um
plano, composto por vrias linhas do mesmo tamanho, como abaixo:
colunas
linhas 1 40

2
3

34

50

27

25

18

80

65

11

Na matriz de inteiros acima, existem 3 linhas, cada linha com 4 colunas, ou 3x4 (trs
por quatro). Essa matriz pode ser declarada assim:
var mat: array[1..3, 1..4] of integer;

Aps o nome da matriz, so colocados entre colchetes os intervalos em que ficam os


nmeros das linhas, e os nmeros das colunas, nessa ordem. Note que tambm aqui os
elementos da matriz devem ser todos do mesmo tipo.
Cada elemento da matriz identificado pela notao: mat[i,j], onde i o nmero da
linha, e j o nmero da coluna, onde se encontra o elemento. Na figura acima, temos
ento que mat[1,1] tem o valor 40.
O comando for... do muito usado para processar os valores de matrizes.
Exemplos:
a) Para zerar todos os elementos de uma matriz m, com 3 linhas e 4 colunas, declarada
como:
var
m: array[1..3, 1..4] of integer;

basta fazer:
for i:= 1 to 3 do
for j:= 1 to 4 do

m[i,j] := 0;

Nota: usual usar-se a varivel i para representar as linhas de uma matriz, a varivel j
para representar as colunas.
b) Para ler do teclado valores para preencher a matriz acima (12 valores):
for i:= 1 to 3 do
for j:= 1 to 4 do read(m[i,j] );

Nota: O usurio poder digitar todos os 12 nmeros em uma s linha (separados por
espaos), ou um nmero por linha, ou, melhor, 4 nmeros por linha, de forma a
visualizar melhor a matriz.

Anda mungkin juga menyukai