Você está na página 1de 65

Programacao de Computadores I

Aula 09

Programacao: Vetores
Jose Romildo Malaquias
Departamento de Computac
ao
Universidade Federal de Ouro Preto

2011-1

1/62

Motivacao

Problema
Faca um programa que leia as notas dos alunos de uma turma de 5
alunos, determine e mostre a media aritmetica das notas, e o
n
umero de alunos com notas inferiores `a media.

2/62

Motivacao (cont.)
# include < stdio .h >
int main ( void )
{
double nota ;
double soma = 0.0;
for ( int i = 0; i < 5; i ++)
{
printf ( " nota % d : " , i +1);
scanf ( " % lf " , & nota );
soma = soma + nota ;
}
double media = soma / 5;
printf ( " m
e dia : %2 f \ n " , media );
// e agora ... como acessar as notas j
a digitadas ?
return 0;
}
3/62

Motivacao (cont.)

Este programa utiliza uma u


nica variavel para armazenar a
nota digitada pelo usuario.

Toda vez que o usuario digita uma nova nota, o valor


anteriormente digitado e perdido.

Apos ler todas as notas e calcular a media, nao e mais


possvel comparar cada nota com a media.

Solucao?
Usar uma variavel diferente para armazenar cada nota.

4/62

Motivacao (cont.)
# include < stdio .h >
int main ( void )
{
double n1 , n2 , n3 , n4 , n5 ;
printf ( " nota 1: " ); scanf ( " % lf " , & n1 );
printf ( " nota 2: " ); scanf ( " % lf " , & n2 );
printf ( " nota 3: " ); scanf ( " % lf " , & n3 );
printf ( " nota 4: " ); scanf ( " % lf " , & n4 );
printf ( " nota 5: " ); scanf ( " % lf " , & n5 );
double media = ( n1 + n2 + n3 + n4 + n5 ) / 5;
printf ( " m
e dia : %2 f \ n " , media );
int cont = 0;
if ( n1 < media ) cont ++;
if ( n2 < media ) cont ++;
if ( n3 < media ) cont ++;
if ( n4 < media ) cont ++;
if ( n5 < media ) cont ++;
printf ( " abaixo da m
e dia : % d \ n " , cont );
return 0;
}

5/62

Motivacao (cont.)

O problema foi resolvido.

Porem o fato de usarmos uma variavel diferente para cada


nota impossibilita o uso de comando de repeticao.

Assim foi necessaro escrever scanf 5 vezes, e if 5 vezes.

6/62

Motivacao (cont.)
I

Estenda o problema para trabalhar com uma turma de 100


alunos.
possvel, porem esta sera uma tarefa enfadonha e sujeita a
E
erros, pois serao necessarios:
100 variaveis distintas, cada uma com um nome diferente.
100 comandos scanf
100 comandos if

Pergunta:
Existe outra maneira de trabalhar com as 100 variaveis sem
usar 100 nomes diferentes?

Resposta:
Sim, utilizando vetor.

7/62

Motivacao (cont.)

Estenda o problema para trabalhar com um n


umero de alunos
que somente sera conhecido em tempo de execucao.
Com este esquema nao e possvel.

Pergunta:
Existe uma maneira de trabalhar com um n
umero
desconhecido (pelo programador) de variaveis?

Resposta:
Sim, utilizando vetor.

8/62

Vetor

Vetor e uma variavel composta homog


enea
unidimensional.

Um vetor e formado por uma sequencia de variaveis, todas do


mesmo tipo de dados.

Dizemos que cada variavel componente e um elemento do


vetor.

As variaveis que comp


oem um vetor sao todas identificadas
por um mesmo nome.

Estas variaveis sao alocadas sequencialmente na memoria.

9/62

Vetor (cont.)

10/62

Declaracao de uma variavel vetor

tipo identificador [tamanho];


I

Primeiro o tipo de dado dos componentes do vetor:


int, float, double, char, . . .

Segundo o nome da variavel vetor: usando as mesmas


convencoes de um identificador comum:
array, vetor, variavelDeNumeros, vet, . . .

E por fim, o tamanho do vetor (isto e, a quantidade de


elementos que formam o vetor) escrito entre colchetes:
[5], [10], [3], . . .

11/62

Declaracao de uma variavel vetor (cont.)

Exemplos:
int vet [6];
double notas [100];
char texto [256];
double medias [2* n ];

//
//
//
//

um
um
um
um

vetor
vetor
vetor
vetor

de
de
de
de

6 inteiros
100 doubles
256 caracteres
2* n doubles

12/62

Declaracao de uma variavel vetor (cont.)


I

Todo vetor e um espaco linear na mem


oria dividido em varias
variaveis componentes de acordo com o tamanho declarado.

Ao declaramos
int vet [4]

e alocado na mem
oria um espaco linear para 4 variaveis
inteiras, representadas da seguinte forma:

Assim vet e uma variavel vetor formada por 4 espacos de


memoria.
13/62

Acessando elementos de um vetor


I

Os componentes de um vetor sao numerados


sequencialmente comecando com zero.

Para identificar cada componente usamos o nome do vetor


juntamente com o n
umero que indica a posicao do
componente na sequencia.

A posicao de um componente e chamada de ndice.

Exemplo:
double Notas [10];

14/62

Acessando elementos de um vetor (cont.)

Sintaxe:
vetor[
ndice]

Primeiramente escreve-se o vetor.

Depois escreve-se o ndice (uma expressao inteira) entre


colchetes.

15/62

Acessando elementos de um vetor (cont.)

Exemplo:
double Notas [10];
Notas [1] = 9.35;
printf ( " % f " , Notas [1]);
Notas[1] refere-se ao componente na posic
ao 1 do vetor
Notas, ou seja, o segundo elemento do vetor.

16/62

Acessando elementos de um vetor (cont.)

Uma vez que as variaveis que comp


oem o vetor tem o mesmo
nome, o que distingue cada uma delas e o seu ndice, que
referencia sua localizacao dentro da estrutura.

17/62

Acessando elementos de um vetor (cont.)

18/62

Acessando elementos de um vetor (cont.)

A primeira posic
ao de um vetor tem ndice 0.

Au
ltima posic
ao de um vetor tem ndice tamanho - 1 .

Importante:
O sistema de execucao n
ao verifica se o ndice usado para
acessar um componente do vetor e valido.
responsabilidade do programador garantir que o ndice
E
usado para acessar um elemento de um vetor
e v
alido.

19/62

Acessando elementos de um vetor (cont.)


Nao esqueca:
I

Para acessar uma posicao especfica de um vetor basta indicar


a posicao desejada entre colchetes

A posicao e chamada de ndice.

A faixa de ndices validos inicia em 0 e termina com o


tamanho - 1.

Exemplo: os ndices validos para um vetor de tamanho 4 sao


0, 1, 2 e 3.

20/62

Acessando elementos de um vetor (cont.)


Exemplo:
Declarar um vetor de tamanho 4 e atribuir o valor 540 na posicao
1 e o valor 8456 na posicao 3.
int vetor [4];
vetor [1] = 540;
vetor [3] = 8456;

21/62

Acessando elementos de um vetor (cont.)


I

O limite do vetor e sempre o seu tamanho menos 1.

No exemplo anterior o vetor e de tamanho 4, a posicao


maxima e 3, pois 4 1 = 3.

Se um valor for atribudo fora dos limites do vetor ocorrera


um erro muito grave, pois o valor estara sendo armazenado
em um espaco de mem
oria que nao pertence ao vetor.

Ainda no exemplo anterior, nao se deve fazer


vetor [4] = 200;

22/62

Exemplo: ler e mostrar um vetor

Inserir 5 notas em um vetor, depois disso visualizar as notas


inseridas.

23/62

Exemplo: ler e mostrar um vetor (cont.)


# include < stdio .h >
int main ( void )
{
double notas [5]; // um vetor de 5 elementos
int j ;
//
ndice no vetor
// entrada dos dados
for ( j = 0; j < 5; j ++)
{
printf ( " Inserir nota % d : " , j +1);
scanf ( " % d " , & notas [ j ]);
}
// visualiza
c~
a o dos dados
for ( j = 0; j < 5; j ++)
printf ( " % d " , notas [ j ]);
return 0;
}
24/62

Exemplo: ler e mostrar um vetor (cont.)

25/62

Exemplo: ler e mostrar um vetor (cont.)

26/62

Exemplo: ler e mostrar um vetor (cont.)

27/62

Exemplo: ler e mostrar um vetor (cont.)

28/62

Exemplo: ler e mostrar um vetor (cont.)

29/62

Exemplo: ler e mostrar um vetor (cont.)

30/62

Exemplo: ler e mostrar um vetor (cont.)

31/62

Exemplo: ler e mostrar um vetor (cont.)

32/62

Exemplo: ler e mostrar um vetor (cont.)

33/62

Exemplo: ler e mostrar um vetor (cont.)

34/62

Exemplo: ler e mostrar um vetor (cont.)

35/62

Exemplo: ler e mostrar um vetor (cont.)

36/62

Exemplo: ler e mostrar um vetor (cont.)

37/62

Exemplo: ler e mostrar um vetor (cont.)

38/62

Exemplo: ler e mostrar um vetor (cont.)

39/62

Exemplo: ler e mostrar um vetor (cont.)

40/62

Exemplo: ler e mostrar um vetor (cont.)

41/62

Exemplo: ler e mostrar um vetor (cont.)

42/62

Exemplo: media de 5 notas

Faca um programa que leia as notas dos alunos de uma turma de 5


alunos, determine e mostre a media aritmetica das notas, e o
n
umero de alunos com notas inferiores `a media.

43/62

Exemplo: media de 5 notas (cont.)


# include < stdio .h >
int main ( void )
{
double notas [5];
int indice ;
// leitura dos dados
for ( indice = 0; indice < 5; indice ++)
{
printf ( " nota % d : " , indice + 1);
scanf ( " % lf " , & notas [ indice ]);
}
// c
a lculo e exibi
c~
a o da m
e dia
double soma = 0;
for ( indice = 0; indice < 5; indice ++)
soma = soma + notas [ indice ];
44/62

Exemplo: media de 5 notas (cont.)

double media = soma /5;


printf ( " m
e dia : %2 f \ n " , media );
// c
a lculo e exibi
c~
a o da quantidade
// de notas abaixo da m
e dia
int cont = 0;
for ( indice = 0; indice < 5; indice ++)
if ( notas [ indice ] < media )
cont = cont + 1;
printf ( " abaixo da m
e dia : % d \ n " , cont );
return 0;
}

45/62

Exemplo: preenchendo um vetor

Colocar os n
umeros de 1 a 5 em Vetor.

46/62

Exemplo: preenchendo um vetor

Colocar os n
umeros de 1 a 5 em Vetor.
for ( int i = 0; i < 5; i ++)
Vetor [ i ] = i + 1;

46/62

Exemplo: preenchendo um vetor

Colocar os n
umeros de 1 a 5 em Vetor.
for ( int i = 0; i < 5; i ++)
Vetor [ i ] = i + 1;

Colocar os n
umeros de 5 a 1 em Vetor.

46/62

Exemplo: preenchendo um vetor

Colocar os n
umeros de 1 a 5 em Vetor.
for ( int i = 0; i < 5; i ++)
Vetor [ i ] = i + 1;

Colocar os n
umeros de 5 a 1 em Vetor.
for ( int i = 0; i < 5; i ++)
Vetor [ i ] = 5 - i ;

46/62

Uso de constantes com vetores

Geralmente e melhor usar um nome representando um valor


constante do que usar a pr
opria constante em um programa.

Para tanto define-se a constante no incio do programa, e no


restante do programa usa-se o nome definido.

Se for necessario redefinir o valor da constante no texto do


programa, o local a ser alterado e somente na declaracao da
constante.

Alem disto, o uso de um nome pode ser uma dica do


significado da constante.

47/62

Uso de constantes com vetores (cont.)

Geralmente e melhor definir e usar uma constante para


representar o tamanho de um vetor do que escrever o valor do
tamanho explicitamente em todas os locais que precisamos do
tamanho.

48/62

Uso de constantes com vetores (cont.)


I

Uma constante pode ser definida como uma macro do


pr
e-processador usando a diretiva #define.

No incio da compilacao, o pre-processador substitui todas as


ocorrencias no nome da macro pela definicao dada.

Este procedimento e apenas manipulacao do texto do


programa.

Nao e feita nenhuma checagem de tipo com o nome da macro.

Exemplo:
# define TAMANHO 5
double VetReais [ TAMANHO ];
// coloca 5 ,4 ,3 ,2 ,1 no vetor
for ( i = 0; i < TAMANHO ; i ++)
VetReais [ i ] = TAMANHO + i ;
49/62

Uso de constantes com vetores (cont.)


I

Uma constante pode ser definida no nvel da linguagem


atraves do especificador const colocado em uma declaracao
de variavel, antes no nome do tipo.

A variavel assim definida e similar `as outras variaveis, exceto


pelo fato de que o seu valor nao pode ser alterado. Portanto
nao e possvel fazer uma atribuicao a ela.

Exemplo:
const int TAMANHO = 20
double VetReais [ TAMANHO ] , VetCopia [ TAMANHO ];
// copia os dados de um vetor para outro
for ( i = 0; i < TAMANHO ; i ++)
VetCopia [ i ] = VetReais [ i ];
50/62

Exemplo: ordem inversa

Construa um algoritmo que leia 300 n


umeros inteiros e imprima
esses n
umeros na ordem inversa de entrada.

51/62

Exemplo: ordem inversa (cont.)


# include < stdio .h >
# define QUANTIDADE 300

// defini
c~
a o de macro

int main ( void )


{
int vet [ QUANTIDADE ];
int i ;
// leitura dos dados
for ( i = 0; i < QUANTIDADE ; i ++)
{
printf ( " n
u mero % d : " , i + 1);
scanf ( " % d " , & vet [ i ]);
}
// impress~
a o na ordem inversa
printf ( " \ nordem inversa :\ n " );
for ( i = QUANTIDADE - 1; i >= 0; i - -)
printf ( " n
u mero % d : % d \ n " , i + 1 , vet [ i ]);
return 0;
}
52/62

Inicializacao de vetores

Quando declaramos um vetor, os seus elementos nao sao


inicializados.

Neste caso os seus elementos sao desconhecidos (lixo) e so


deverao ser utilizados ap
os atribuicao.

Porem e possvel fazer a inicializac


ao de um vetor com os
valores iniciais desejados.

Os valores inicias sao colocados entre chaves {}.

Exemplo:
int v [5] = { 16 , 36 , 3 , 8 , 26 };

53/62

Inicializacao de vetores (cont.)

A quantidade de valores entre chaves nao deve ser maior que


o tamanho do vetor.

A fim de facilitar a inicializacao, C permite omitir o n


umero
de elementos (tamanho): [].

Neste caso, o compilador assume que o tamanho do vetor e


igual ao n
umero de valores especificados na inicializacao
(entre chaves).

Exemplo:
int v [] = { 16 , 36 , 3 , 8 , 26 };

54/62

Busca

Dada uma colecao de n elementos, pretende-se saber se um


determinado valor x esta presente nessa colecao.

Para efeitos praticos, vamos supor que essa colecao e


implementada como sendo um vetor de n elementos inteiros:
v[0]..v[n-1].

55/62

Pesquisa sequencial

Utilizamos uma variavel encontrado para sinalizar se o valor


ja foi encontrado. Inicialmente o seu valor e falso
(representando como 0 no C).
Percorremos o vetor desde a primeira posicao ate a u
ltima, ou
ate o valor ser encontrado:
Para cada posicao i, comparamos v[i] com o valor x:
se forem iguais sinalizamos que o valor foi encontrado
atribuindo verdadeiro (representado como 1 no C) `
a vari
avel
encontrado

se chegarmos ao fim do vetor sem sucesso conclumos que o


valor nao existe no vetor

56/62

Pesquisa sequencial (cont.)

Passos:
1. Inicializacao
int i = 0;
int encontrado = 0;

/* falso */

57/62

Pesquisa sequencial (cont.)

2. Pesquisa
while ( i < TAMANHO && ! encontrado )
{
if ( vetor [ i ] == x )
encontrado = 1;
/* verdadeiro */
else
i ++;
}

58/62

Pesquisa sequencial (cont.)

3. Tratamento do resultado
if ( encontrado )
printf ( " Valor % d encontrado na posi
c~
ao %d\n" ,
vetor [ i ] , i );
else
printf ( " Valor % d n~
a o encontrado \ n " ,
vetor [ i ]);

59/62

Pesquisa sequencial (cont.)


Exemplo:
# include < stdio .h >
# define TAMANHO 4
int main ( void )
{
int vet [ TAMANHO ];
int i ;
// leitura dos dados
printf ( " Digite % d n
u meros :\ n " , TAMANHO );
for ( i = 0; i < TAMANHO ; i ++)
scanf ( " % d " , & vet [ i ]);
// leitura do valor a ser pesquisado
int valor ;
printf ( " Valor procurado :\ n " );
scanf ( " % d " , & valor );
60/62

Pesquisa sequencial (cont.)

// realiza a pesquisa
int encontrado = 0; /* falso */
for ( i = 0; i < TAMANHO && ! encontrado ; i ++)
encontrado = ( vet [ i ] == valor );
// exibe resultado
if ( encontrado )
printf ( " encontrado na posi
c~
a o % d \ n " , i - 1);
else
printf ( " n~
a o encontrado \ n " );
return 0;
}

61/62

FIM

Creditos:
Baseado no material preparado pelo
Prof. Guillermo Camara-Chavez.

62/62

Você também pode gostar