Você está na página 1de 12

INF1004 e INF1005 Programao 1

CAP. 07 - Vetores

Captulo 07: Vetores


INF1004 e INF1005 Programao 1

Pontifcia Universidade Catlica


Departamento de Informtica

Introduo


A partir de agora vamos poder usar um mecanismo que nos permita


armazenar um conjunto de valores na memria do computador.
Posteriormente, estes valores podem ser livremente processados de forma
eficiente, pois j estariam na memria do computador.

Podemos armazenar um conjunto de valores na memria do computador


atravs do uso de vetores (arrays, em ingls):
O vetor a forma mais simples de organizarmos dados na memria do
computador.
Com vetores, os valores so armazenados na memria do computador em
seqncia, um aps o outro, e podemos livremente acessar qualquer valor
do conjunto.

Na linguagem C, quando declaramos um vetor (conceito anlogo ao de


declarao de uma varivel simples) devemos informar a dimenso do
vetor, isto , o nmero mximo de elementos que poder ser
armazenado no espao de memria que reservado para o vetor.
Devemos tambm informar o tipo dos valores que sero armazenados no
vetor (por exemplo, int, float ou double). Em um vetor, s podemos
armazenar valores de um mesmo tipo.

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Exemplo de
Declarao e Inicializao


int x[10];
Esta declarao reserva um espao de memria para armazenar 10
valores inteiros e este espao de memria referenciado pelo nome x.

Inicializao de algumas posies do vetor x:

x[0] = 5;
x[1] = 11;
x[4] = 0;
x[9] = 3;

Exemplo
de Declarao e Inicializao




int a, b[20];
/* declara uma varivel simples e um vetor */
float c[10];
/* declara um vetor */
double d[30], e, f[5]; /* declara dois vetores e uma varivel simples */
Declara e j inicializa:
int v[5] = {12, 5, 34, 32, 9};

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Exemplo: Imprimindo os valores


armazenados em um vetor
#include <stdio.h>
int main (void)
{
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
for (i=0; i<6; i++) {
printf("%f", v[i]);
}
return 0;
}

Exemplo: Somatrio
#include <stdio.h>
int main (void)
{
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
float s = 0.0;
for (i=0; i<6; i++) {
s = s + v[i];
}
printf("%f", s);
return 0;
}

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Exemplo: Clculo do Mximo


#include <stdio.h>
int main (void)
{
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
float maior_valor = v[0];
for (i=0; i<6; i++) {
if(v[i]>maior_valor)
maior_valor = v[i];
}
printf("%f", maior_valor);
return 0;
}

Exemplo: Clculo Mdia

Dada um turma com n alunos (onde n conhecido a priori), obter a


notas dos alunos e calcula a mdia da turma.

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Soluo com leitura dos dados


via teclado.

#include<stdio.h>
#define NUM_ALUNOS 6

int main (void) {


float notas[NUM_ALUNOS];
float media, soma = 0.0;
int i;
/* leitura dos dados via teclado para armazenar no
vetor */
for(i=0;i<NUM_ALUNOS;i++) {
printf("Entre com a nota do aluno %d: ", i+1);
scanf("%f", &notas[i]);
}
/* soma das medias dos alunos */
for(i=0;i<NUM_ALUNOS;i++)
soma = soma + notas[i];
media = soma/NUM_ALUNOS;
printf("Media da turma = %.2f\n.", media);
return 0;
}

Soluo com leitura dos dados


via arquivo de entrada.

#include<stdio.h>
#define NUM_ALUNOS 6

int main (void) {


float notas[NUM_ALUNOS];
float media, soma = 0.0;
FILE* arq_entrada;
int i;
arq_entrada = fopen(notas.txt, r);
if (arq_entrada == NULL) {
printf(Erro no arquivo de entrada. Programa vai terminar);
return 0;
}
/* leitura dos dados arquivo */
for(i=0;i<NUM_ALUNOS;i++) {
fscanf(arq_entrada, "%f", &notas[i]);
}
fclose(arq_entrada);
/* soma das medias dos alunos */
for(i=0;i<NUM_ALUNOS;i++)
soma = soma + notas[i];
media = soma/NUM_ALUNOS;
printf("Media da turma = %.2f\n.", media);
return 0;
}

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Vetores Passados para Funes

Alm de passarmos variveis simples como parmetros, podemos


passar vetores tambm:
Quando passamos um vetor como parmetro, a funo chamada
recebe uma referncia para o vetor.
Isso significa que a funo chamada, quando acessa os elementos,
acessa as mesmas posies de memria que a funo que declarou
vetor.
Por essa razo, se atribuirmos um valor a um elemento do vetor
passado como parmetro, este elemento tambm alterado no vetor
original.
Portanto, podemos declarar um vetor numa funo e chamar uma
outra funo auxiliar para acessar e/ou modificar seus elementos.

Vetores Passados para Funes:


Voltando ao Exemplo Anterior


Com o uso de funes auxiliares podemos reescrever


os cdigos anterior:
Uma funo para ler os valores e armazen-los em um vetor; e
Uma funo para calcular a mdia.

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

#include<stdio.h>
#define NUM_ALUNOS 6
void ler_dados (float vet[], int num) {
int i;
/* leitura dos dados para armazenar no vetor */
for(i=0;i<num;i++) {
printf("Entre com o valor %d: ", i+1);
scanf("%f", &vet[i]);
}
}
float calcula_media (float vet[], int num) {
float soma = 0.0;
int i;
for(i=0;i<num;i++)
soma = soma + vet[i];
return soma/num;
}
int main (void) {
float notas[NUM_ALUNOS];
ler_dados(notas, NUM_ALUNOS);
printf("Media da turma = %.2f\n.", calcula_media(notas, NUM_ALUNOS));
return 0;
}

Busca em Vetores


Problema: Implemente uma funo que busca por um


inteiro em um vetor de inteiros.
int busca(int n, int[] vet, int elem) {
int i;
for(i = 0 ; i < n ; i++) {
if(vet[i] == elem) {
return i;
}
}
return -1;
Retorna o ndice da primeira ocorrncia
}
do elemento procurado!

E se quisssemos retornar a ltima ocorrncia?...

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Busca em Vetores


Problema: Implemente uma funo que busca por um


inteiro em um vetor de inteiros.
int busca(int n, int[] vet, int elem) {
int i;
int ind_elem = -1;
for(i = 0 ; i < n ; i++) {
if(vet[i] == elem) {
ind_elem = i;
}
}
return ind_elem;
}
Percorre o vetor at o final procurando
o elemento desejado. Se achar, guarda seu
ndice, se no a varivel ind_elem j est
com o valor -1 de retorno.

Busca em Vetores


Pegando o algoritmo anterior, podemos alter-lo para


que ele volte a retornar o ndice da primeira ocorrncia
do elemento desejado:
int busca(int n, int[] vet, int elem) {
int i;
int ind_elem = -1;
for(i = 0 ; i < n ; i++) {
if(vet[i] == elem) {
ind_elem = i;
break;
Este comando usado para imediatamente
interromper um lao (execuo do for, while ou do-while
}
que ele est sendo chamado) e o programa continua
}
a execuo no comando seguinte ao comando lao.
return ind_elem;
}

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Busca em Vetores (vetor ordenado)


int busca_ord(int n, int[] vet, int elem) {
int i;
for(i = 0 ; i < n ; i++) {
if(vet[i]) {
return i;
}
else if(vet[i] > elem) {
return -1;
}
}
return -1;
}

Valor Mximo / Mnimo


float maximo ( int n, float v[]){
int i ;
float vmax = v [0] ;
for (i = 1; i < n ; i++){
if (v[i] > vmax){
vmax = v [ i ] ;
}
}
return vmax;
}

float minimo ( int n, float v[]){


int i ;
float vmin = v [0] ;
for (i = 1; i < n ; i++){
if (v[i] < vmin){
vmin = v [ i ] ;
}
}
return vmin;
}

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Valor Mximo:

#include <stdio.h>
#define CAPACIDADE_VETOR 10

Se quisssemos retornar o valor e o ndice


do maior elemento do vetor?

void maximo (int n, float v[], float *vmax, int *imax){


int i ;
float maior_valor = v[0];
int ind_maiorvalor = 0;
for(i = 1; i < n ; i++){
if (v[i] > maior_valor){
maior_valor = v[i];
ind_maiorvalor = i;
}
}
*vmax = maior_valor;
*imax = ind_maiorvalor;
}
void leitura_dados (int n, float v[]) {
int i;
for(i=0;i<n;i++) {
printf("Entre com o valor que quer armazenar no vetor: ");
scanf("%f", &v[i]);
}
}
int main(void) {
int vetor[CAPACIDADE_VETOR];
float maior_valor;
int indice_maior_valor;
leitura_dados(CAPACIDADE_VETOR, vetor);
maximo(CAPACIDADE_VETOR, vetor, &maior_valor, &indice_maior_valor);
printf("O maior valor armazenado no vetor foi %f na posicao %d.\n",maior_valor,indice_maior_valor);
return 0;
}

Vetores e Ponteiros


Existe uma associao forte entre vetores e ponteiros,


pois se existe a declarao:
int v[10];

o smbolo v, o qual representa o vetor, uma constante


que representa seu endereo inicial, isto , v, sem
indexao aponta para o primeiro elemento do
vetor.

10

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Vetores e Ponteiros:
Aritmtica de Ponteiros


A linguagem C tambm suporta aritmtica de ponteiros. Podemos


somar e subtrair valores, desde que o valor do ponteiro resultante
aponte para dentro da rea reservada do vetor.

Exemplo: se p representa o ponteiro para um inteiro, p+1


representa um ponteiro para o prximo inteiro armazenado na
memria, isto , o valor de p incrementado de 4 bytes.

Por tanto, escrever &v[i] equivalente a escrever (v+i). E escrever


v[i] equivalente a escrever *(v+i).

Exemplo
int main (void){
int v[2];
int *p;
p = v;
p = p + 1;
*p = 5;
return 0;
}

Varivel

Endereo

v[0]

v[1]

8
12

11

Contedo

INF1004 e INF1005 Programao 1


CAP. 07 - Vetores

Exemplo
int main (void){
int v[2];
int *p;
p = v;
p = p + 1;
*p = 5;
return 0;
}

Varivel

Endereo

Contedo

v[0]

v[1]

12

Relao entre vetores e ponteiros

#include <stdio.h>
int main (void) {
int i;
float v[6] = {2.3, 5.4, 1.0,
7.6, 8.8, 3.9};
for (i=0; i<6; i++) {
printf("%f", v[i]);
}
return 0;
}

#include <stdio.h>
int main (void){
int i;
float v[6] = {2.3, 5.4, 1.0,
7.6, 8.8, 3.9};
for (i=0; i<6; i++) {
printf("%f", *(v + i));
}
return 0;
}

12

Você também pode gostar