Baixe o app para aproveitar ainda mais
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
Compartilhar