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