Buscar

7_vetor

Prévia do material em texto

Vetores e Constantes 
Imagine uma situação na qual fosse necessário armazenar 100 valores para 
processamento. Por exemplo, pode ser necessário armazenar as notas de 100 
provas de uma turma de alunos. Uma solução é declarar 100 variáveis, uma para 
cada nota de prova a ser armazenada. Essa solução é bem trabalhosa, 
especialmente se posteriormente for necessário armazenar um número diferente 
de notas. 
Existe uma solução mais simples para armazenar um grande número de valores. 
Essa solução é conhecida como vetor. Os vetores são estruturas capazes de 
armazenar diversos valores do mesmo tipo. Na linguagem algorítmica, os vetores 
são declarados da seguinte forma: 
<identificador>[<tamanho>]: <tipo>; 
No qual: 
• identificador: identificador (ou nome) do vetor; 
• tamanho: tamanho (número de elementos) do vetor; 
• tipo: tipo de cada elemento do vetor. 
Por exemplo: 
v[10]: inteiro; 
declara uma variável vetor de nome v. Essa variável terá "dentro" dela outras 10 
variáveis inteiras, a cada uma dessas variáveis damos o nome de elemento do 
vetor. Essa variável possui uma estrutura interna que pode ser representada da 
seguinte forma: 
 
A variável v é composta por outras 10 variáveis inteiras representadas através dos 
10 quadrados da figura acima. Cada quadrado representa um elemento do vetor. 
Os 10 elementos são numerados de 0 a 9, e esses números são chamados de 
índices do vetor. É importante saber que na liguagem algorítmica todo vetor inicia 
com o índice 0 e termina com o índice que representa o seu tamanho menos 1. 
Dessa forma, o tamanho mínimo aceitável para um vetor é 1, entretanto, um vetor 
de tamanho 1 é similar a uma variável do seu tipo base, uma vez que esse vetor 
somente seria capaz de armazenar um único valor. 
Para ler ou escrever variáveis do tipo vetor através dos comandos leia e escreva 
NÃO podemos simplesmente fazer: 
leia(v); 
escreva(v); 
Para ler ou escrever em um vetor é necessário ler ou escrever em cada um de 
seus elementos individualmente. Para acessar um elemento de um vetor basta 
utilizar o identificador do vetor e a sua posição (índice), na seguinte sintaxe: 
<identificador>[<posição>]; 
Como por exemplo: 
v[5]; 
No nosso exemplo, v[5] é o sexto elemento do vetor v, lembre-se que o primeiro 
elemento está no índice 0. Esse elemento é uma variável do tipo inteiro, porque 
declaramos, em nosso exemplo, o vetor v de tipo inteiro. Assim como é possível 
atribuir valores, ler e escrever no conteúdo de variável inteira, também é possível 
atribuir, ler e escrever no conteúdo de v[5]. Por exemplo, se executarmos a 
seguinte atribuição: 
v[5] 10; 
então o valor 10 é atribuído ao elemento de índice 5 do vetor v. Dessa forma, o 
vetor v é modificado e pode ser representado da seguinte forma: 
 
Para ler valores do teclado e armazenar esses valores em um vetor é necessário 
fazê-lo elemento a elemento do vetor. Por exemplo, para ler 10 valores do teclado 
e armazená-los no vetor v, pode-se fazer: 
para (i 0; i<10; i++) 
{ 
 leia(v[i]); 
} 
O trecho de algoritmo acima lê 10 valores do teclado e os armazena nas 10 
posições do vetor v. Ainda, é possível fazer o mesmo para escrever os 10 
elementos do vetor v na tela do computador. 
para (i 0; i<10; i++) 
{ 
 escreva(v[i]); 
} 
Exercício 1 
Faça um algoritmo que leia 100 notas de prova. Calcule a média da turma e 
escreva quais notas estão acima da média da turma. 
Para solucionar este exercício é necessário: 
• ler 100 valores (notas) do teclado; 
• calcular a média da turma; 
• escrever na tela do computador as notas que estão acima da média da 
turma. 
Para iniciar precisamos declarar um vetor para armazenar as notas, vamos 
chamar esse vetor de notas. 
notas[100]: real; 
Para ler 100 notas e armazená-las no vetor notas deve-se fazer: 
para (i 0; i<100; i++) 
{ 
 leia(notas[i]); 
} 
Para calcular a média das 100 notas é necessário somar os 100 valores e dividir a 
valor da soma por 100. Para isso: 
total 0; 
para (i 0; i<100; i++) 
{ 
 total total + notas[i]; 
} 
média total / 100; 
Por fim é necessário verificar quais notas armazenadas no vetor notas são 
maiores que a média da turma, armazenada na variável média. Para isso: 
para (i 0; i<100; i++) 
{ 
 se notas[i] > média então 
 { 
 escreva(notas[i]); 
 } 
} 
Juntando tudo, nós temos o seguinte algoritmo: 
01 | Algoritmo notas_acima_media; 
02 | { 
03 | notas[100]: real; 
04 | média, total: real; 
05 | i: inteiro; 
06 | 
07 | 
08 | /* Leitura das notas e armazenamento no vetor notas */ 
09 | para (i 0; i<100; i++) 
10 | { 
11 | leia(notas[i]); 
12 | } 
13 | 
14 | /* Cálculo da média das notas */ 
15 | total 0; 
16 | para (i 0; i<100; i++) 
17 | { 
18 | total total + notas[i]; 
19 | } 
20 | média total / 100; 
21 | 
22 | /* Escrita das notas acima da média da turma */ 
23 | para (i 0; i<100; i++) 
24 | { 
25 | se notas[i] > média então 
26 | { 
27 | escreva(notas[i]); 
28 | } 
29 | } 
30 | } 
Imagine que o programador queira modificar o algoritmo para trabalhar com 50 
notas de prova. O que seria necessário modificar no algoritmo acima para ele 
trabalhar com um número diferente de notas? 
Seria necessário trocar o valor 100 pelo valor 50 nas linhas 03, 09, 16, 20 e 23. 
Mas, existe um jeito mais simples de fazer isso, utilizando constantes. 
Constantes são componentes de um algoritmo que armazenam um valor, o qual 
não pode ser alterado durante a execução do algoritmo. 
Para declarar uma constante é necessário utilizar a palavra reservada 
constantes. Constantes indica o início de um bloco de declaração de constantes. 
Geralmente as constantes são declaradas antes das variáveis. A declaração de 
uma constante deve seguir a seguinte sintaxe: 
<identificador> = <valor>; 
Como por exemplo: 
PI = 3.14; 
É convencionado, mas não é obrigatório, que os identificadores das constantes 
sejam escritos em letras maiúsculas. Dessa forma, é simples distinguir as 
constantes das variáveis. 
Voltando ao nosso algoritmo das médias, é possível declarar uma constante, com 
um identificador como, por exemplo, MAX, que terá o número de notas a serem 
processadas. Dessa forma, o algoritmo ficaria da seguinte forma: 
01 | Algoritmo notas_acima_media; 
02 | constantes 
03 | MAX = 100; 
04 | 
05 | { 
06 | notas[MAX]: real; 
07 | média, total: real; 
08 | i: inteiro; 
09 | 
10 | 
11 | /* Leitura das notas e armazenamento no vetor notas */ 
12 | para (i 0; i<MAX; i++) 
13 | { 
14 | leia(notas[i]); 
15 | } 
16 | 
17 | /* Cálculo da média das notas */ 
18 | total 0; 
19 | para (i 0; i<MAX; i++) 
20 | { 
21 | total total + notas[i]; 
22 | } 
23 | média total / MAX; 
24 | 
25 | /* Escrita das notas acima da média da turma */ 
26 | para (i 0; i<MAX; i++) 
27 | { 
28 | se notas[i] > média então 
29 | { 
30 | escreva(notas[i]); 
31 | } 
32 | } 
33 | } 
Repare que, no algoritmo anterior, todas as referências ao valor 100 foram 
substituídas por referências à MAX. Dessa forma, basta modificar a declaração da 
constante para modificar o número de notas com que o algoritmo vai trabalhar. 
Vetores são estruturas estáticas 
Vamos modificar o exercício anterior para que o usuário entre com um número 
não previamente definido de notas. Por exemplo, o usuário pode fornecer as notas 
até que um valor especial, digamos -1, seja fornecido. O valor especial diz que o 
usuário deseja parar de fornecer as notas, e quer que o programa realize os 
cálculos. 
Nosso primeiro problema é definir qual deve ser o tamanho do vetor. Os vetores 
são chamados de estruturas estáticas, pois têm o seu tamanho definido durante a 
codificaçãodo programa. Durante a execução do programa, o tamanho do vetor 
não pode ser alterado, ou seja, não pode ser aumentado nem diminuído. Uma vez 
que nós não sabemos quantas notas serão fornecidas pelo usuário, é difícil 
estipular previamente um tamanho para o vetor. Tudo isso pode acarretar dois 
problemas para o programa: 
1. Durante a codificação, o programador especificou um tamanho para o vetor 
que é muito maior do que o necessário. Nesse caso, tem-se memória 
alocada para o vetor que está sendo desperdiçada. 
2. Também, o programador pode especificar um tamanaho para o vetor que é 
menor do que o necessário. Nesse caso, o vetor não será suficiente para 
armazenar todos os valores que o usuário deseja fornecer. 
O segundo caso é sempre pior do que o primeiro. Caso o programador não queira 
ter nenhum dos dois problemas, então ele terá que recorrer a uma estrutura que 
não seja um vetor. Por exemplo, listas encadeadas dinâmicas podem crescer 
conforme a necessidade do programa. Essas estruturas serão estudadas mais à 
frente e são muito mais complexas do que os vetores. 
Portanto, temos que utilizar um pouco de bom senso para escolher o tamanho do 
vetor. Vamos dizer que dificilmente uma classe tenha mais do que 250 alunos. 
Podemos utilizar o valor 250 como máximo do nosso vetor. 
Para começar precisamos ler um determinado número de notas até que seja 
fornecido o valor -1. É necessário utilizar um comando de repetição. Vamos 
escolher o comando faça-enquanto. 
O trecho de código para ler valores e armazená-los em um vetor notas até que 
um valor -1 seja fornecido é: 
num_notas 0; 
faça { 
 leia(notas[num_notas]); 
 num_notas num_notas + 1; 
} enquanto notas[num_notas] != -1; 
Repare que foi necessário utilizar uma variável contadora num_notas. Essa 
variável precisa ser incrementada pelo programador, uma vez que o comando 
faça-enquanto não faz essa tarefa. O laço faca-enquanto termina quando uma 
nota com valor -1 é fornecida. Note que ao sair do laço faça-enquanto a variável 
num_notas terá o número de notas fornecidas pelo usuário mais uma nota. Na 
realidade a última nota fornecida é a nota especial -1. Nós não queremos que 
essa nota entre nos cálculos da média. Por isso, é necessário decrementar a 
variável num_notas. 
Ainda sobre o laço, nós podemos fazer mais um melhoramento. O que ocorrerá se 
o usuário fornecer mais que 250 notas? Caso isso ocorra, então ao ler a nota 251, 
e tentar armazenar essa nota na posição 250 do vetor notas, ocorrerá um erro de 
execução, pois não existe a posição 250 no vetor notas. Para evitar que esse erro 
ocorra, o laço faça-enquanto pode ser interrompido sempre que num_notas 
atinja o valor 250. Portanto, o trecho de código referente a leitura dos dados ficaria 
assim: 
num_notas 0; 
faça { 
 leia(notas[num_notas]); 
 num_notas num_notas + 1; 
} enquanto (notas[num_notas] != -1) e (num_notas < 250); 
O laço acima será executado até que uma nota -1 seja fornecida, ou que o valor 
de num_notas atinja o valor 250, o qual é uma posição além do máximo permitido 
pelo vetor notas declarado. Note que a variável num_notas só será 
decrementada caso o usuário digite o valor -1. Se o usuário fornecer as 250 notas, 
então a variável num_notas não precisa ser decrementada, pois todas as notas 
fornecidas serão válidas. Para decrementar num_notas precisamos agora fazer 
um teste e verificar se foi digitado o valor -1. O trecho de código referente ao teste 
ficaria assim: 
se notas[num_notas] == -1 então 
{ 
 num_notas num_notas - 1; 
} 
Suponha que o usuário logo na primeira vez digite o valor -1. Se isto acontecer 
não teremos nenhuma nota para fazer a média e todo o resto do processamento. 
Precisamos portanto verificar se o usuário digitou alguma nota válida. Isto pode 
ser feito verificando se a variável num_notas é diferente de 0. Se a variável 
num_notas for diferente de 0 significa que existem notas e portanto podemos 
fazer a média e mostrar as notas acima da média. Caso contrário, ou seja, se 
num_notas for igual a 0, então não há notas e enviaremos uma mensagem ao 
usuário dizendo que nenhuma nota foi fornecida. 
O resto do programa ficará muito parecido. Somente é necessário lembrar que o 
número de notas fornecido pelo usuário está na variável num_notas. 
01 | algoritmo notas_acima_media; 
02 | constantes 
03 | MAX = 250; 
04 | 
05 | { 
06 | notas[MAX]: real; 
07 | media, total: real; 
08 | i, num_notas: inteiro; 
09 | 
10 | 
11 | /* Leitura das notas e armazenamento no vetor notas */ 
12 | num_notas 0; 
13 | faça { 
14 | leia(notas[num_notas]); 
15 | num_notas num_notas + 1; 
16 | } enquanto (notas[num_notas] != -1) e (num_notas < MAX); 
17 | 
18 | /* num_notas é decrementada, para descartar o valor -1 */ 
19 | se notas[num_notas] == -1 então 
20 | { 
21 | num_notas num_notas - 1; 
22 | } 
23 | 
24 | /* Cálculo da média das notas, se alguma nota foi fornecida */ 
25 | se num_notas > 0 então 
26 | { 
27 | total 0; 
28 | para (i 0; i < num_notas; i++) 
29 | { 
30 | total total + notas[i]; 
31 | } 
32 | media total / num_notas; 
33 | 
34 | /* Escrita das notas acima da média da turma */ 
35 | para (i 0; i < num_notas; i++) 
36 | { 
37 | se notas[i] > media então 
38 | { 
39 | escreva(notas[i]); 
40 | } 
41 | } 
42 | } senão 
43 | { 
44 | escreva("Nenhuma nota foi fornecida"); 
45 | } 
46 | } 
Exercícios 
1. Faça um algoritmo e um programa capaz de ler em um vetor A um número 
não previamente determinado de valores inteiros positivos. Esses valores 
devem ser fornecidos pelo usuário até que ele entre um valor especial. 
Depois de ler esses valores, copie-os para um outro vetor B. Essa cópia 
deve ser feita de forma que o valor armazenado no primeiro elemento do 
vetor A seja copiado para o último elemento do vetor B. O segundo 
elemento do vetor A seja copiado para o penúltimo elemento do vetor B. E 
assim por diante. 
2. Faça um algoritmo e um programa capaz de ler 100 valores e armazená-los 
em um vetor A. Depois ler mais outros 100 valores e armazená-los em um 
vetor B. Faça com que um vetor C armazene a soma dos vetores A e B. O 
primeiro elemento do vetor C deve armazenar a soma do primeiro elemento 
do vetor A com o primeiro elemento do vetor B. O segundo elemento do 
vetor C deve armazenar a soma do segundo elemento do vetor A com o 
segundo elemento do vetor B. E assim por diante. 
3. Faça um algoritmo e um programa que leia 500 números reais do teclado e 
armazene em um vetor. Encontre e imprima o menor e o maior valor do 
vetor.

Continue navegando