Você está na página 1de 5

05/11/2017 Vetores

Repetições Encaixadas
Vetores são estruturas indexadas utilizadas para armazenar dados de um mesmo tipo. Para declarar um vetor use a construção:

tipo_do_vetor nome_do_vetor[tamanho];

Para acessar um elemento do vetor, basta utilizar o nome_do_vetor seguido do número que corresponde à posição do elemento desejado (o índice
do elemento) entre colchetes. O nome com esse índice pode ser utilizado em seu programa como se fosse uma variável qualquer.

Descrição:
Um vetor (array) é uma estrutura indexada por um índice que armazena dados de um mesmo tipo básico (por enquanto, inteiros e reais). Quando
um vetor de tamanho é declarado, uma área da memória, suficiente para armazenar todos os elementos do vetor, é reservada. Essa área
recebe o nome do vetor, e seus elementos podem ser acessados através de um índice entre colchetes ([]). O primeiro elemento do vetor é
acessado pelo índice 0 (zero), e o último pelo índice . O C não verifica se esses índices são válidos e problemas muito sérios podem
acontecer caso você tente acessar uma posição inválida do vetor (ou seja, fora do intervalo de 0 a ).

Como declarar um vetor


Um vetor deve ser declarado da seguinte forma:

tipo_do_vetor nome_do_vetor[tamanho];

Exemplos:

int vetorInt[6]; /* vetor de 6 inteiros, chamado vetorInt */


float vetorFloat[9]; /* vetor de 9 reais, chamado vetorFloat */

Observe que os vetores são declarados como se fossem variáveis, exceto que ele recebe um número entre colchetes que define o tamanho do vetor.
Nesse caso, o vetor vetorInt possui 6 inteiros, e o vetor vetorFloat possui 9 reais.

Uma vez declarado, é reservada uma região na memória suficiente para armazenar todo o vetor. A figura abaixo mostra essa estrutura para o vetor
vetorInt:

Posição Conteúdo Comentário


0 ? valor inicial desconhecido
1 ? valor inicial desconhecido
2 ? valor inicial desconhecido
3 ? valor inicial desconhecido
4 ? valor inicial desconhecido
5 ? valor inicial desconhecido

Figura 1: área da memória reservada para o vetor nome1. Observe que são reservadas 6 posições, númeradas de 0 a 5.

Como usar vetores em seus programas


Cada posição do vetor é pode ser considerada uma variável, que pode ser acessada através do nome do vetor e mais um índice entre colchetes para
indicar a posição desejada. Por exemplo, o trecho de programa abaixo coloca o valor zero em cada uma das posições do vetor vetorInt:
for (i = 0; i < 6; i++)
vetorInt[i] = 0;

O índice na verdade pode ser uma expressão, como abaixo:


for (i = 10; i < 16; i++)
vetorInt[i-10] = 0;

mas tenha absoluta certeza, porém, de sempre fornecer um índice válido.

Exemplos comentados
Problema 1:

Dados números inteiros, imprimí-los em ordem inversa a da leitura.

Exemplo:
entrada: 5 11 12 3 41 321
saída: 321 41 3 12 11

https://www.ime.usp.br/~elo/IntroducaoComputacao/Vetores.htm 1/5
05/11/2017 Vetores
Para resolver esse problema, precisamos armazenar todos os elementos da seqüência em um vetor, e depois imprimir esses elementos em ordem
inversa. Sem essa estrutura, usando apenas variáveis, seria muito difícil resolver esse problema para um valor arbitrário de .

Um programa possível, usando vetores, seria:


define MAX 100

include <stdio.h>
include <stdlib.h>

int main () {
int i, n;
int vet[MAX];

printf("Digite o valor de n: ");


scanf("%d", &n);

/* leitura do vetor */
for (i=0; i<n; i!++)
scanf("%d", &vet[i]);

/* impressão do vetor */
printf("Vetor em ordem inversa: ");
for (i=n-1; i>=0; i--)
printf(" %d", vet[i]);

system("pause");
return 0;
}

Observe que o tamanho do vetor é fixo, e deve ser definido antes do programa ser executado. É um erro muito comum entre programadores
inexperientes ler um número e utilizá-lo para definir o tamanho do vetor. Nesse programa, o valor limite foi definido como MAX e possui valor 100.
Esse programa não pode ser executado para seqüências maiores que 100. Esse programa não testa se é válido, como você faria esse teste?

Após a leitura (carregamento) do vetor, a estrutura correspondente na memória pode ser representada pela tabela abaixo:

Posição Conteúdo Comentário


0 11 valor lido pelo 1o scanf
1 12 valor lido pelo 2o scanf
2 3 valor lido pelo 3o scanf
3 41 valor lido pelo 4o scanf
4 321 valor lido pelo 5o scanf
5 ? valor inicial desconhecido

Figura 2: Observe que apenas as 5 primeiras posições (pois ) receberam valores

Observe com cuidado a linha do programa utilizada para carregar o vetor:


scanf("%d", &vet[i]);

A posição do vetor vet, ou seja, vet[i], é utilizada da mesma forma que utizamos qualquer variável até o momento. Essa "variável" é passada
para a função scanf precedida pelo caractere '&'.

Agora observe a parte do programa para imprimir o vetor invertido. Como o vetor foi carregado como mostra a figura acima, devemos começar na
última posição carregada e decrementar até a primeira. A última posição carregada nesse caso foi a posição 4, e a primeira foi 0.

Problema 2:

Dados lançamentos de uma roleta (números entre 0 e 36), calcular a freqüência de cada número.

Como a gente calcula a freqüência de um número? Basta contar quantas vezes ele aparece na seqüência, e dividir pelo total de números da
seqüência. Precisamos portanto criar um contador para cada resultado possível, ou seja, 37 contadores. Cada contador começa com zero, e toda
vez que lançamos a roleta, a gente incrementa apenas o contador correspondente. Ao final, basta calcular as freqüências. A solução completa é
dada abaixo:

include <stdio.h>
include <stdlib.h>

int main () {
int resultado; /* resultado de uma jogada */
int n; /* total de jogadas */
int vet[37];

/* inicializacao do vetor */
for (resultado = 0; resultado < 37; resultado++)
vet[resultado] = 0;

printf("Digite o valor de n: ");


scanf("%d", &n);

/* contagem dos resultados */


for (i=1; i<=n; i++) {

https://www.ime.usp.br/~elo/IntroducaoComputacao/Vetores.htm 2/5
05/11/2017 Vetores
printf("Digite o resultado da jogada %d :", i);
scanf("%d", &resultado);
vet[resultado] = vet[resultado] + 1;
}

/* impressão do resultado */
for (resultado = 0; resultado < 37; resultado++)
printf("Frequencia do resultado %d = %f \n",
resultado, (float)vet[resultado]/n);

system("pause");
return 0;

Problema 3

Dada uma seqüência de números reais terminando com zero, imprimi-los eliminando as repetições e indicando quantas vezes cada um aparece na
seqüência.

Exemplo:

entrada: 1.51 3.14 2.78 3.14 8.2 2.78 0


saída:
1.51 2
3.14 1
2.78 2
8.2 1

RESOLUÇÃO:

Para ler e imprimir os números sem repetição, podemos utilizar um vetor para armazenar os números lidos. Caso o número já esteja no vetor,
então ele pode ser ignorado, e quando o número não está no vetor, então ele deve ser introduzido no vetor. Como precisamos também contar
quantas vezes cada número aparece na seqüência, assim como no problema da roleta, precisamos criar também um vetor de contadores. Se o
número já pertence ao vetor, então basta incrementar o contador correpondente, caso contrário, o número é introduzido no vetor de dados e o
contador correspondente é inicializado (com 1).

Por exemplo, veja a seqüência de transformações abaixo. Tanto o vetor dados quanto o vetor contador começam sem inicialização.

posição vetor dados vetor contador


0 ? ?
1 ? ?
2 ? ?
3 ? ?
4 ? ?
5 ? ?
... ? 0

Quando o primeiro número é lido, a tabela deve ser atualizada para:

posição vetor dados vetor contador


0 1.51 1
1 ? 0
2 ? 0
3 ? 0
4 ? 0
5 ? 0
... ? 0

O segundo e terceiro números (3.14 e 2.78) também são novos, então os colocamos também no vetor de dados, com os respectivos contadores
iguais a 1:

posição vetor dados vetor contador


0 1.51 1
1 3.14 1
2 2.78 1
3 ? 0
4 ? 0
5 ? 0

https://www.ime.usp.br/~elo/IntroducaoComputacao/Vetores.htm 3/5
05/11/2017 Vetores
... ? 0

O quarto número da seqüência é 3.14. Ele já aparece na seqüência, e portanto devemos apenas incrementar o contador correspondente:

posição vetor dados vetor contador


0 1.51 1
1 3.14 2
2 2.78 1
3 ? 0
4 ? 0
5 ? 0
... ? 0

e o programa continua até encontrar um zero na entrada. O seguinte programa é uma solução possível para o procedimento descrito acima:

include <stdio.h>
include <stdlib.h>
define MAX 100
define TRUE 1
define FALSE 0

int main () {
float dados[MAX];
int contador[MAX];
float num; /* numero lido da sequencia */
int final = 0; /* numero de indices sendo utilizados */
int achei; /* TRUE se num esta no vetor */
int i;

printf("Digite um numero da sequencia: ");


scanf( "%f", &num );

while (num != 0)
{
/* sera que num esta no vetor dados?
A variavel achei é um indicador de passagem, comeca com FALSE,
e recebe TRUE se o valor de num estiver no vetor dados
*/
achei = FALSE;
for (i=0; i<final; i++) {
if (dados[i] num ) {
achei = TRUE;
contador[i] = contador[i] + 1;
}
}
if (achei FALSE) {
/* colocar num no vetor de dados e inicializar contador */
dados[final] = num;
contador[final] = 1;
final++;
}
printf("Digite um numero da sequencia: ");
scanf( "%f", &num );
}
/* imprima o resultado */
for (i=0; i<final; i++)
printf("Num: %.2f x %d\n", dados[i], contador[i]);

system("pause");
return 0;
}

Erros comuns
Ao desenvolver seus programas com vetores, preste atenção com relação aos seguintes detalhes:

índices inválidos: tome muito cuidado, especialmente dentro de um while ou for, de não utilizar índices negativos ou maiores que o tamanho
máximo do vetor.
Definição do tamanho do vetor: se faz na declaração do vetor. O tamanho dele é constante, só mudando a sua declaração é que podemos
alterar o seu tamanho. Isso significa que podemos estar "desperdiçando" algum espaço que fica no final do vetor. Não cometa o erro de ler
, onde seria o tamanho do vetor, e tentar "declarar" o vetor em seguida.

Vetores e ponteiros
O nome_do_vetor utilizado na declaração do vetor pode ser utilizado também como um ponteiro que aponta para o endereço da primeira posição do
vetor.

https://www.ime.usp.br/~elo/IntroducaoComputacao/Vetores.htm 4/5
05/11/2017 Vetores
O índice dos colchetes podem ser interpretados como uma expressão aritmética com ponteiros, da seguinte forma:
Se vet é o nome de um vetor e também um ponteiro, então *vet é o valor armazenado na posição zero do vetor (sua 1a posição), ou seja, vet[0].
Da mesma forma, o elemento vet[i] é equivalente a *(vet+i), ou seja, o valor apontado pelo apontador vet deslocado de posições.

Esse conceito será fundamental para entender como a linguagem C implementa funções que aceitam vetores como parâmetros.

Exercícios Recomendados
Escreva um programa que leia um inteiro positivo m, os coeficientes de um polinômio real p0 de grau n, três reais x0, x1 e x2 e calcule
p0(x0), p1(x1) e p2(x2), onde p1 e p2 são respectivamente a primeira e a segunda derivada do polinômio p0.
Dada uma seqüência de n números inteiros, determinar um segmento de soma máxima.
Exemplo: Na seqüência
5, 2, -2, -7, 3, 14, 10, -3, 9, -6, 4, 1
a soma do segmento é 33.
Dada uma seqüência de números inteiros, verifique se existem dois segmentos consecutivos iguais nesta seqüência, isto é, se
existem e tais que:

Imprima, caso existam, os valores de e .

Exemplo: Na seqüência
7, 9, 5, 4, 5, 4, 8, 6
existem e .

Eloiza Sonoda

https://www.ime.usp.br/~elo/IntroducaoComputacao/Vetores.htm 5/5

Você também pode gostar