Prévia do material em texto
FUNÇÕES COM VETORES
Estrutura de Dados I
Vetores
Um vetor pode armazenar múltiplos valores,
todos do mesmo tipo:
As notas de 30 alunos (valores tipo float)
A declaração de um vetor deve conter:
9.5 8.0 5.0 3.2 7.3 4.0 2.1 0.4 8.0...
int visitas[365];
O tipo de cada elemento A quantidade de elementos
O nome do vetor
Vetores
Os elementos de um vetor podem ser acessados
individualmente pelo seu índice
Em C/C++ o índice começa em 0 e não em 1
38 54 88 40
int visitas[365];
visitas[0] = 38;
visitas[1] = 54;
visitas[2] = 88;
cout << visitas[1]; // 54
visitas[3] = visitas[0] + 2; // 40
...
0 1 2 3 4 5 7 363 364
Vetores
#include <iostream>
using namespace std;
int main()
{
int batatas[3]; // cria vetor de 3 elementos
batatas[0] = 7; // atribui valor ao 1° elemento
batatas[1] = 8; // atribui valor ao 2° elemento
batatas[2] = 6; // atribui valor ao 3° elemento
int custo[3] = {20, 30, 15}; // cria e inicializa vetor
cout << "Quantidade de batatas = ";
cout << batatas[0] + batatas[1] + batatas[2] << endl;
cout << "O pacote com " << batatas[1] << " batatas custa";
cout << custo[1] << " centavos por batata.\n";
int total = 0;
for (int i=0; i < 3; i++)
total += batatas[i] * custo[i];
cout << "Todos os pacotes custam " << total << " centavos.\n";
system("pause");
return 0;
}
Vetores
A saída do programa é:
Um vetor não inicializado contém valores
indefinidos
Quantidade de batatas = 21
O pacote com 8 batatas custa 30 centavos por batata.
Todos os pacotes custam 470 centavos.
int batatas[3]; // os valores armazenados
// não são iguais a 0
// eles são indefinidos até que
// seja feita uma atribuição de valor
Funções e Vetores
Suponha o problema de verificar quantas
faltas um aluno possui no mês
Uma solução é armazenar a quantidade de faltas
diárias do aluno em um vetor de 30 elementos
Para saber o total basta usar um laço para
somar todos os elementos do vetor
Essa é uma tarefa tão comum que vale a pena
criar uma função para realizá-la
0 2 2 0 0 0 1 0 0...
Funções e Vetores
A funções deve receber como argumento o
vetor e a quantidade de elementos no vetor e
retornar a soma dos elementos
O parâmetro vet não é realmente um vetor,
ele é um ponteiro e poderia ser escrito assim:
// soma os elementos de um vetor de tamanho n
// vet = nome do vetor, n = tamanho do vetor
int somaVetor(int vet[], int n);
// soma os elementos de um vetor de tamanho n
// vet = nome do vetor, n = tamanho do vetor
int somaVetor(int * vet, int n);
Funções e Vetores
// Funções com vetores como argumento
#include <iostream>
using namespace std;
const int VetTam = 8;
int somaVetor(int vet[], int n);
int main()
{
int biscoitos[VetTam] = {1,2,4,8,16,32,64,128};
int total = somaVetor(biscoitos, VetTam);
cout << "Total de biscoitos consumidos: " << total << "\n";
system("pause");
return 0;
}
int somaVetor(int vet[], int n)
{
int soma = 0;
for (int i = 0; i < n; i++)
soma = soma + vet[i];
return soma;
}
Funções e Vetores
Saída do Programa:
Não importa se o programador usa a notação
de ponteiro ou de vetor no parâmetro da
função, os elementos podem sempre ser
acessados com a notação de vetor
Total de biscoitos consumidos: 255
int somaVetor(int vet[], int n);
int somaVetor(int * vet, int n);
soma = soma + vet[i];
Funções e Vetores
A chamada da função passa o endereço do
primeiro elemento do vetor biscoitos e o
tamanho desse vetor
A função não passa o conteúdo do vetor mas
a passagem do argumento ainda assim é feita
por valor
O endereço é copiado para a variável definida no
parâmetro da função
somaVetor(biscoitos, VetTam);
Funções e Vetores
// Funções com vetores como argumento
#include <iostream>
using namespace std;
const int VetTam = 8;
int somaVetor(int vet[], int n);
int main()
{
int biscoitos[VetTam] = {1,2,4,8,16,32,64,128};
cout << biscoitos << " = endereço de biscoitos, ";
cout << sizeof biscoitos << " = tamanho de biscoitos\n";
int total = somaVetor(biscoitos, VetTam);
cout << "Total de biscoitos consumidos: " << total << "\n";
total = somaVetor(biscoitos, 3);
cout << "Os três primeiros comeram " << total << " biscoitos\n";
total = somaVetor(biscoitos + 4, 4);
cout << "Os quatro últimos comeram " << total << " biscoitos\n";
system("pause");
return 0;
}
int somaVetor(int vet[], int n)
{
int soma = 0;
cout << vet << " = vet, ";
cout << sizeof vet
<< " = tamanho de vet\n";
for (int i = 0; i < n; i++)
soma = soma + vet[i];
return soma;
}
Funções e Vetores
Saída do Programa:
O tamanho de biscoitos é o tamanho do vetor
inteiro, enquanto que o tamanho de vet é o
tamanho do ponteiro
0x0065fd24 = endereço de biscoitos, 32 = tamanho de biscoitos
0x0065fd24 = vet, 4 = tamanho de vet
Total de biscoitos consumidos: 255
0x0065fd24 = vet, 4 = tamanho de vet
Os três primeiros comeram 7 biscoitos
0x0065fd34 = vet, 4 tamanho de vet
Os quatro últimos comeram 240 biscoitos
Aplicação com Vetores
Ao escolher um vetor para representar um
conjunto de dados, estamos tomando uma
decisão de projeto
Suponha que você deseja usar um vetor para
acompanhar o valor dos seus imóveis
Qual tipo usar para o valor dos imóveis?
float, double, int, unsigned?
Quantos imóveis você quer gerenciar?
Usar um tamanho fixo para o vetor
Usar um vetor dinâmico
Aplicação com Vetores
Decisões de projeto devem envolver não só a
forma de armazenar os dados mas também a
forma de manipular os dados
Que operações serão feitas sobre os dados?
A resposta a esta questão define que funções serão
criadas no programa e os seus protótipos
Preencher o vetor com valores
Mostrar o conteúdo do vetor
Reavaliar o valor do imóvel
Preencher Vetor
Uma função que recebe um vetor como
argumento acessa diretamente o conteúdo
original do vetor ( e não uma cópia)
Podemos usar uma função para popular o vetor
com valores lidos do teclado
A função deve ser construída para tratar vetores
de qualquer tamanho
A função deve retornar o número de elementos
contidos no vetor
int leVetor(double vet[], int tam);
Preencher Vetor
// Lendo valores do teclado para um vetor
int leVetor(double vet[], int tam)
{
double temp;
int i;
for (i = 0; i < tam; i++)
{
cout << "Digite valor #" << (i+1) << ":";
cin >> temp;
if (!cin)
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Entrada inválida. Leitura encerrada!\n";
break;
}
vet[i] = temp;
}
return i;
}
Mostrar Vetor
Construir uma função para mostrar o
conteúdo de um vetor consiste em:
Receber o nome de um vetor e o número de
elementos como argumento
Usar um laço para percorrer cada elemento e
mostrar seu valor na tela
Como a função trabalha como os valores
originais do vetor, podemos protegê-lo
contra alterações de seus dados
void mostraVetor(const double vet[], int tam);
Mostrar Vetor
A declaração diz que o ponteiro vet aponta
para um valor constante e assim não pode ser
usado para alterar o conteúdo do vetor
// Mostrando o conteúdo de um vetor
void mostraVetor(const double vet[], int tam)
{
for (int i = 0; i < tam; i++)
{
cout << "Imóvel #" << (i+1) << ": R$";
cout << vet[i] << endl;
}
}
Modificar Vetor
Suponha que a reavaliação do imóvel
consista em multiplicar o seu valor atual por
um fator de reajuste
A função deve receber o fator e multiplicar cada
elemento por ele, armazenando os novos valores
Ela deve receber também o vetor e seu tamanho
// Reajusta valores dos imóveis pelo fator dado
void ajustaVetor(double fator, double vet[], int tam)
{
for (int i =0; i < tam; i++)
vet[i] *= fator; // vet[i] = vet[i] * fator;
}
Construindo a Aplicação
// Aplicação principal – Gerenciando o valor de imóveis
#include <iostream>
#include "vetor.h" // contém o protótipo das funções
using namespace std;
const int Max = 5;
int main()
{
double imoveis[Max];
int quant = leVetor(imoveis, Max);
mostraVetor(imoveis, quant);
cout << "Digite o fator de ajuste: ";
double ajuste;
cin >> ajuste;
ajustaVetor(ajuste, imoveis, quant);
mostraVetor(imoveis, quant);
system("pause");
return 0;
}
Faixa de Elementos
Funções que trabalham com vetores
precisam receber como argumento:
A localização do início do vetor
O número de elementos do vetor
Existe uma outra abordagem:
Passar uma faixa de elementos
Isso pode ser feito usando dois ponteiros:
Um identificando o início do vetor
Um identificando o fim do vetor
Faixa de Elementos
O padrão de C++ é fazer o ponteiro de fim
apontar para um elemento após o último
Considere a declaração abaixo:
Os dois ponteiros seriam
vet + 19 aponta para o ultimo elemento (vet[19]),
assim vet+20 aponta para o fim da faixa, isto é,
um elemento após o último
double vet[20];
vet // ponteiro de início da faixa
vet + 20 // ponteiro de fim da faixa
Faixa de Elementos
// Funções com vetores como argumento
#include <iostream>
using namespace std;
const int VetTam = 8;
int somaVetor(const int * inicio, const int * fim);
int main()
{
int biscoitos[VetTam] = {1,2,4,8,16,32,64,128};
int total = somaVetor(biscoitos, biscoitos + VetTam);
cout << "Total de biscoitos consumidos: " << total << "\n";
total = somaVetor(biscoitos, biscoitos + 3);
cout << "Os três primeiros comeram " << total << " biscoitos.\n";
total = somaVetor(biscoitos + 4, biscoitos + 8);
cout << "Os quatro últimos comeram " << total << " biscoitos.\n";
system("pause");
return 0;
}
Faixa de Elementos
Saída do Programa:
// retorna a soma dos valores do vetor
int somaVetor(const int * inicio, const int * fim)
{
const int * pt;
int soma = 0;
for (pt = inicio; pt != fim; pt++)
soma = soma + *pt;
return soma;
}
Total de biscoitos consumidos: 255
Os três primeiros comeram 7 biscoitos.
Os quatro últimos comeram 240 biscoitos.
Conclusão
Ao passar vetores para funções, manipula-se
o vetor original e não uma cópia
Para proteger o vetor contra alterações é
necessário introduzir const na declaração do
parâmetro
Um vetor pode ser passado para funções de
duas formas:
O nome do vetor e o número de elementos
Ponteiros indicando o inicio e fim do vetor