Buscar

07. Vetores e Strings

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Ju
d
so
n
 S
an
to
s 
S
an
ti
ag
o
VETORES E STRINGS
Tipos Compostos de Dados
Introdução
 Variáveis e constantes são usadas para 
armazenar informações na memória do 
computador
 Com os tipos básicos de dados pode-se 
armazenar informações de tipo inteiro ou 
ponto-flutuante
char ch = 'W';
short sol = 25;
int num = 45820;
float taxa = 0.25f;
double peso = 1.729156E5;
Inteiro
Ponto-flutuante
Introdução
 Porém, com os tipos básicos não é possível 
armazenar um conjunto de informações
 Como armazenar as notas de 30 alunos?
 Como armazenar um cadastro completo (nome, 
identidade, CPF, endereço, etc.) de 30 alunos?
float n1 = 8.0;
float n2 = 7.0;
float n3 = 4.5;
...
float n29 = 5.0;
float n30 = 2.0;
Criar 30 variáveis 
diferentes não é a 
melhor solução.
Introdução
 É preciso utilizar tipos compostos de dados, 
tipos que armazenam múltiplos valores:
 Vetores
 Strings
 Registros
 Uniões
 Enumerações
 Os tipos compostos são coleções formadas a 
partir dos tipos básicos de dados
Vetores
 Um vetor pode armazenar múltiplos valores, 
todos do mesmo tipo:
 As notas de 30 alunos
30 valores tipo float
 As 100 primeiras teclas pressionadas no teclado
100 valores tipo char
 O número diário de visitas de um site web por um 
período de um ano (365 dias)
365 valores tipo int
9.5 8.0 5.0 3.2 7.3 4.0 2.1 0.4 8.0...
Vetores
 Para criar um vetor utiliza-se uma instrução 
de declaração de variável
 A declaração de um vetor deve conter :
int visitas[365];
O tipo de cada elemento A quantidade de elementos
O nome do vetor
Vetores
 A quantidade de elementos do vetor deve 
ser um valor inteiro constante:
 Uma constante inteira
float notas[30];
const int Max = 30;
float notas[Max];
 Uma expressão inteira com valor constante1
int num[5 * sizeof(int)]; 
const int Tam = 5 * sizeof(int);
int num[Tam];
1 Calculado durante o processo de compilação
Vetores
 A quantidade de elementos deve ser 
conhecida no momento da compilação do 
programa e portanto não pode ser uma 
variável
int x = 30; 
int notas[x]; // inválido, x não é constante
int y; 
cin >> y;
int notas[y]; // inválido, y não é constante 
Vetores
 Um vetor é um tipo de dado derivado
 Ele é formado por vários dados
 Ele depende de um tipo base
 Um vetor não é um tipo, ele é um conjunto de 
dados do mesmo tipo
 Não existe um tipo chamado "vetor" 
 Todo vetor tem um tipo: vetor de inteiros, vetor 
de caracteres, vetor de pontos-flutuantes, etc.
Vetores
 Os elementos de um vetor são armazenados em 
posições consecutivas da memória
 Cada elemento é representado por um índice
int visitas[5];
Endereços 
de 
memória
Dados na 
memória
Memória para 
5 valores inteiros
0
1
2
3
4
0xCB20
0xCB21
0xCB22
0xCB23
0xCB24
0xCB25
0xCB26
0xCB27
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
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, 5}; // 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 = batatas[1] * custo[1];
cout << "O segundo pacote custa " << 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.
O segundo pacote custa 240 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 
Vetores
#include <iostream>
using namespace std;
int main()
{
int v[3]; // cria vetor de 3 elementos
cout << "Conteúdo da posição 0: " << v[0] << endl;
cout << "Conteúdo da posição 1: " << v[1] << endl;
cout << "Conteúdo da posição 2: " << v[2] << endl << endl;
v[0] = 0; v[1] = 0; v[2] = 0;
cout << "Conteúdo da posição 0: " << v[0] << endl;
cout << "Conteúdo da posição 1: " << v[1] << endl;
cout << "Conteúdo da posição 2: " << v[2] << endl;
cout << "\nO vetor tem " << sizeof v << " bytes.\n";
cout << "Um elemento tem " << sizeof v[0] << " bytes.\n";
system("pause");
return 0;
}
Vetores
 A saída do programa:
Conteúdo da posição 0 = -858993460
Conteúdo da posição 1 = -858993460
Conteúdo da posição 2 = -858993460
Conteúdo da posição 0 = 0
Conteúdo da posição 1 = 0
Conteúdo da posição 2 = 0
O vetor tem 12 bytes.
Um elemento tem 4 bytes.
Inicialização de Vetores
 A inicialização com o uso das chaves só 
funciona na declaração do vetor
 Após a declaração do vetor seus valores só 
podem ser alterados com atribuição 
individual a cada elemento
int cartas[4] = {3, 6, 8, 10}; // ok
int mao[4]; // ok
mao = {5, 6, 7, 8}; // inválido
int mao[4]; // ok
mao[0] = 5; // atribuição de valor
mao[1] = 6; // atribuição de valor
mao[2] = 7; // atribuição de valor
mao[3] = 8; // atribuição de valor
Inicialização de Vetores
 Um vetor não pode ser atribuído a outro
30
60
80
100
0
1
2
3
0xCB20
0xCB21
0xCB22
0xCB23
0xCB24
0xCB25
0xCB26
0xCB27
int cartas[4] = {30, 60, 80, 100}; // ok
int mao[4]; // ok
mao = cartas; // inválido
= cartas
0
1
2
3
= mao
O nome de um vetor 
representa o endereço 
inicial do conjunto 
de dados
Esse endereço é fixado na 
criação do vetor e não 
pode ser alterado
Inicialização de Vetores
 Ao inicializar um vetor é permitido fornecer 
menos valores que o tamanho do vetor
 Ao inicializar parcialmente um vetor, os 
demais elementos recebem o valor zero
// inicializa apenas os dois primeiros elementos
float juros[5] = {5.0, 2.0}; 
// primeiro elemento é 1 e os demais são 0
long totais[500] = {1}; 
// todos os 500 elementos são iguais a zero
long totais[500] = {0}; 
Inicialização de Vetores
 Deixando os colchetes vazios na inicialização
o compilador conta os elementos para você
 Omitir o número de elementos sem inicializar 
o vetor constitui um erro
// cria um vetor com 4 elementos
short coisas[] = {1, 5, 3, 8}; 
// compilador acusa um erro
short coisas[]; 
Strings
 Uma string é uma série de caracteres 
armazenados consecutivamente na memória
 Uma string é então um vetor de caracteres?
char nome[5] = {'j', 'o', 'g', 'o', 's'};
j
o
g
o
s
Endereços 
de 
memória
Dados na 
memória
Memória para 
5 caracteres
0
1
2
3
4
0xCB20
0xCB21
0xCB22
0xCB23
0xCB24
= nome
Strings
 As strings são vetores de caracteres com uma 
propriedade especial
 O último caractere de toda string é o 
caractere nulo (escrito \0, ele é o caractere 
de código ASCII 0)
 Ambos exemplos são vetores de caracteres 
mas apenas o segundo é uma string
char dog[5] = {'l','a','t','i','r'}; // não é string
char cat[5] = {'m','i','a','r','\0'}; // string
Strings
 O caractere nulo tem um papel fundamental 
numa string:
 Todasas funções que trabalham com strings 
percorrem o vetor até achar o caractere nulo
 Usando cout com um vetor de caracteres faz com 
que ele imprima lixo da memória até achar um \0
char cat[5] = {'m','i','a','r','\0'}; // string
char dog[5] = {'l','a','t','i','r'}; // não é string
cout << cat; // miar
cout << dog; // latir╞ĉ3»"&*+%...
Strings
 A inicialização de uma string pode ser 
simplificada usando uma constante string
 Constantes string entre aspas duplas sempre 
incluem o \0 implicitamente
char bird[10] = "Gaivota"; // caractere \0 está implícito
char fish[] = "Sardinha"; // deixe o compilador contar
B o z o \0 \0 \0 \0
0 1 2 3 4 5 6 7
char chefe[8] = "Bozo";
Caracteres '\0'
são adicionados 
automaticamente
Strings
 Um caractere entre aspas duplas não é a 
mesma coisa que um caractere entre aspas 
simples
 'S' corresponde a um único caractere que possui o 
código ASCII 83
 "S" representa o endereço de memória onde a 
string composta pelos caracteres 'S' e '\0' está 
armazenada 
char camisa = 'S'; // ok
char camisa = "S"; // ilegal, tipos diferentes
Concatenação de Strings
 Algumas vezes uma string pode ser muito 
longa para caber em uma linha de código
 C++ concatena constantes strings separadas 
por espaços, tabulações ou novas linhas
// as instruções abaixo são equivalentes
cout << "Eu daria tudo para ser uma frase.\n";
cout << "Eu daria tudo para ser " "uma frase.\n";
cout << "Eu daria tudo para ser"
" uma frase.\n";
Leitura de Strings
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
const int Tam = 15;
char nome1[Tam]; // vetor vazio
char nome2[Tam] = "C++owboy"; // vetor inicializado
cout << "Olá! Eu sou " << nome2;
cout << "! Qual é seu nome?\n";
cin >> nome1;
cout << "Bem, " << nome1 << ", seu nome tem ";
cout << strlen(nome1) << " letras e está armazenado\n";
cout << "em um vetor de " << sizeof(nome1) << " bytes.\n";
cout << "Sua inicial é " << nome1[0] << ".\n";
nome2[3] = '\0'; // caractere nulo
cout << "Meu apelido é " << nome2 << endl;
return 0;
}
Leitura de Strings
 A saída do programa:
 A atribuição do caractere \0 para a quarta 
posição do vetor, encurtou a string, pelo 
menos para a função cout
Olá! Eu sou C++owboy! Qual é seu nome?
Judson
Bem, Judson, seu nome tem 6 letras e está armazenado
em um vetor de 15 bytes.
Sua inicial é J.
Meu apelido é C++
Leitura de Strings
#include <iostream>
using namespace std;
int main()
{
const int TamVet = 20;
char nome[TamVet];
char sobremesa[TamVet];
cout << "Entre com seu nome:\n";
cin >> nome; // lê apenas uma palavra
cout << "Entre com sua sobremesa favorita:\n";
cin >> sobremesa;
cout << "Eu tenho um delicioso " << sobremesa;
cout << "para você, " << nome << ".\n";
system("pause");
return 0;
}
Leitura de Strings
 A saída do programa:
 O fim da entrada de dados para cin é um 
espaço em branco, uma tabulação ou uma 
nova linha
Entre com seu nome:
Judson Santiago
Entre com sua sobremesa favorita:
Eu tenho um delicioso Santiago para você, Judson.
Leitura de Strings
 Como ler uma entrada que contém espaços, 
como "Rio Grande do Norte"? 
 É necessário usar uma função que seja orientada a 
linhas e não orientada a palavras
 A função cin.getline() lê uma linha até o 
caractere de nova linha (\n)
char estado[80];
cin.getline(estado, 80);
Leitura de Strings
#include <iostream>
using namespace std;
int main()
{
const int TamVet = 20;
char nome[TamVet];
char sobremesa[TamVet];
cout << "Entre com seu nome:\n";
cin.getline(nome, TamVet);
cout << "Entre com sua sobremesa favorita:\n";
cin.getline(sobremesa, TamVet);
cout << "Eu tenho um " << sobremesa;
cout << " para você, " << nome << ".\n";
system("pause");
return 0;
}
Leitura de Strings
 A saída do programa:
 A função getline() recebe dois argumentos:
 O nome do vetor que receberá a string lida
 O limite de caracteres que serão lidos
Entre com seu nome:
Judson Santiago
Entre com sua sobremesa favorita:
Sorvete
Eu tenho um Sorvete para você, Judson Santiago.
Misturando >> com getline
// misturando cin e cin.getline
#include <iostream>
using namespace std;
int main()
{
cout << "Em que ano sua casa foi construída?\n";
int ano;
cin >> ano;
cout << "Qual é seu endereço?\n";
char endereco[80];
cin.getline(endereco, 80);
cout << "Ano de construção: " << ano << endl;
cout << "Endereço: " << endereco << "\n";
cout << "Pronto!\n";
system("pause");
return 0;
}
Leitura de Strings
 A saída do programa:
 O operador de extração << deixa o caractere 
de nova linha (\n) no buffer de entrada
 cin.getline() armazena uma linha vazia na variável
Em que ano sua casa foi construída?
1932
Qual é seu endereço?
Ano de construção: 1932
Endereço:
Pronto!
Leitura de Strings
 Todo caractere digitado no teclado vai para 
um espaço temporário de memória chamado 
de buffer do teclado
int ano;
cin >> ano;
00110001 00111001 00110101 00110010 00001101
'1' '9' '5' '2' '\n'
ano='1' '9' '5' '2' 
1952
00000000000000000000011110100000
cin extrai caracteres do buffer e os converte
Buffer do teclado
Leitura de Strings
 A solução para o problema é descartar o 
caractere \n do buffer de entrada:
 A função cin.get(), sem parâmetros, pode ser 
usada para ler e descartar um caractere
cout << "Em que ano sua casa foi construída?\n";
int ano;
cin >> ano;
cin.get(); // caractere \n lido e descartado
cout << "Qual é seu endereço?\n";
char endereco[80];
cin.getline(endereco, 80); 
Leitura de Strings
 A função cin.get() possui outra versão que 
recebe uma variável tipo char como 
argumento 
 Permite armazenar o caractere lido
cout << "Em que ano sua casa foi construída?\n";
int ano;
cin >> ano;
char ch;
cin.get(ch); // guarda caractere lido em ch
cout << "Qual é seu endereço?\n";
char endereco[80];
cin.getline(endereco, 80); 
Funções e Vetores
 Vetores e strings também podem ser 
passados como argumentos de funções
 Deve-se usar colchetes no protótipo
 A definição deve dar um nome para o vetor 
// função recebe um vetor de inteiros
int somaVetor(int []);
// função recebe um vetor de caracteres
int ultimoChar(char []);
int somaVetor(int v[]) 
{ 
...
Funções e Vetores
#include <iostream>
using namespace std;
int somaVetor(int []);
int main()
{
int batatas[3] = {7, 8, 6};
cout << "Total de batatas = ";
cout << somaVetor(batatas) << endl;
system("pause");
return 0;
}
int somaVetor(int v[])
{
return v[0] + v[1] + v[2];
}
Funções e Vetores
 A saída do programa:
 O programa considera um número fixo de 
elementos para o vetor
 Para usar um número variável de elementos seria 
preciso passar também o tamanho do vetor
Total de batatas = 21
int somaVetor(int v[], int tam) 
{ 
...
Conclusão
 Vetores podem armazenar múltiplos valores, 
todos do mesmo tipo, sob um único 
identificador
 Os elementos de um vetor podem ser 
acessados através de índices
 Um vetor pode ser inicializado parcialmente
// todos os 500 elementos são iguais a zero
long totais[500] = {0}; 
long totais[500]; // 500 valores tipo long
cout << totais[0]; // mostra primeiro elemento
Conclusão
 Uma string é uma série de caracteres 
finalizada pelo caractere nulo '\0'
 Pode-se armazenar uma string em um vetor de 
caracteres
 A função strlen() retorna o comprimento de uma 
string
char dica[80] = "Estude C++";
cin >> dica;
char dica[80] = "Estudar em casa é fundamental";
cout << strlen(dica); // comprimento = 29

Outros materiais