Logo Passei Direto
Buscar

04. Funções com Vetores

Material sobre vetores em C/C++: definição e declaração, acesso por índice (começa em 0), inicialização e valores indefinidos; exemplos de código (visitas, batatas, biscoitos), funções que recebem vetores/ponteiros, passagem de endereço e comportamento de sizeof.

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

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

Mais conteúdos dessa disciplina