Introdução à Programação em C++
Aula 3 - Vetores

Lucas S. Vieira


Universidade Federal dos Vales do Jequitinhonha e Mucuri
Novembro de 2019

Introdução

Às vezes, precisamos de "atalhos" para declarar mais de uma variável ao mesmo tempo.

Algumas informações requerem um espaço maior de memória.

Situação-problema

"Construa um programa que recebe as notas finais dos alunos de uma turma de trinta alunos, e exibe a média de nota da turma."

Problemas

  • É inviável criar trinta variáveis.
  • Trinta variáveis não são uma única estrutura.
  • Consultar a nota do aluno X envolveria escrever um switch enorme, ou um if...else if...else colossal.

Solução: sintaxe para declarar e manipular diversos valores!

Primitivas, combinação, abstração

Todas as linguagens possuem três fatores básicos:

  • Primitivas: Elementos primitivos que podem ser rearranjados.
  • Meios de combinação: Elementos formados pelo agrupamento de primitivas.
  • Meios de abstração: Elementos que manipulam primitivas e combinações, transcendendo o mero armazenamento de dados.

Precisamos de um meio de combinação para variáveis.

Chamamos este meio de vetor.

Usando vetores

Conceito de vetores

Vetores são estruturas com \(n\) elementos do mesmo tipo, que ocupam espaços contíguos na memória do computador.

%3 A: A: values 2 1 3 5 9 7

O vetor acima é um vetor de números inteiros, com tamanho seis.

Declaração

int A[6];

Nunca dimensione o vetor com uma variável!

/* Este codigo eh incorreto */
int tamanho;
std::cin >> tamanho;

int A[tamanho];

Alternativa viável

Utilize um macro.

#define TAMANHO 6

int main()
{
    int meu_vetor[TAMANHO];
    return 0;
}

Acessando elementos

nome_do_vetor[indice]

Índice dos elementos

O índice é um valor base-0, ou seja, para um vetor A[6], são válidos os elementos de 0 a 5.

int A[6];

/* Mais linhas viriam aqui... */

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;

Atenção

Índices negativos ou maiores ou iguais ao tamanho do vetor são incorretos.

int A[6];
std::cout << A[6] << std::endl;  // Errado
std::cout << A[-1] << std::endl; // Mais errado ainda

Atribuindo valores

É interessante inicializar um vetor antes de utilizá-lo.

Podemos fazer isto em C++ de diversas formas.

Atribuição direta

int A[6];

A[0] = 2;  A[1] = 1;
A[2] = 3;  A[3] = 5;
A[4] = 9;  A[5] = 7;

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;
Primeiro elemento: 2
Segundo elemento:  1
Terceiro elemento: 3
Quarto elemento:   5
Quinto elemento:   9
Sexto elemento:    7

Inicialização na declaração

int A[6] = {2, 1, 3, 5, 9, 7};

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;
Primeiro elemento: 2
Segundo elemento:  1
Terceiro elemento: 3
Quarto elemento:   5
Quinto elemento:   9
Sexto elemento:    7

Inicialização de parte do vetor

int A[6] = {2, 1, 3};

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;
Primeiro elemento: 2
Segundo elemento:  1
Terceiro elemento: 3
Quarto elemento:   0
Quinto elemento:   0
Sexto elemento:    0

Inicialização sem tamanho

int A[] = {2, 1, 3, 5, 9, 7};

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;
Primeiro elemento: 2
Segundo elemento:  1
Terceiro elemento: 3
Quarto elemento:   5
Quinto elemento:   9
Sexto elemento:    7

Inicialização vazia

int A[6] = {};

std::cout << "Primeiro elemento: " << A[0] << std::endl
          << "Segundo elemento:  " << A[1] << std::endl
          << "Terceiro elemento: " << A[2] << std::endl
          << "Quarto elemento:   " << A[3] << std::endl
          << "Quinto elemento:   " << A[4] << std::endl
          << "Sexto elemento:    " << A[5] << std::endl;
Primeiro elemento: 0
Segundo elemento:  0
Terceiro elemento: 0
Quarto elemento:   0
Quinto elemento:   0
Sexto elemento:    0

Strings

São um tipo especial de vetor de tipo char.

Variável str, contendo a cadeia de caracteres "Teste":

%3 str: str: values T e s t e \ 0

Estrutura interna

Strings armazenam cadeias de caracteres, e possuem um caractere de terminador nulo ('\0') ao final, indicando o fim da informação textual.

char str[] = "Teste";
std::cout << str << std::endl;
Teste

Tamanho

Strings não precisam ter o mesmo tamanho do texto, mas ocuparão apenas o espaço necessário no vetor (incluindo o terminador nulo '\0').

char str[8] = "Teste";
std::cout << str << std::endl;
Teste

%3 str: str: values T e s t e \ 0 (lixo) (lixo)

Lendo pelo console

char nome[80];
std::cin >> nome;

Obs: Isto só lê uma string até o primeiro caractere em branco, e também não é seguro quanto a tamanho!

Lendo uma linha inteira pelo console

char nome[80];
std::cin.getline(nome, 80);

Exercícios I

'Hello World' Personalizado

Construa um programa que pergunta o nome do usuário, e imprime na tela a saudação "Ola, <nome>!", onde <nome> deverá ser substituído pelo nome informado pelo usuário.

Citação Formal

Leia:

  • O título de um livro;
  • O sobrenome do autor;
  • O primeiro nome do autor;
  • O ano de lançamento do livro;
  • A editora do livro;
  • O local de lançamento do livro.

Imprima:

Sobrenome, Nome. Título do livro. Local: Editora, ano.

Laços de repetição

Precisamos também de um vocabulário para percorrer as variáveis contíguas armazenadas em um vetor.

Para tanto, usaremos laços de repetição, que abstraem a execução de um bloco de código múltiplas vezes.

Laços de repetição também podem ser utilizados para outros fins.

Laços while

int A[] = {2, 1, 3, 5, 9, 7};

// Indice do elemento iniciado em zero
int i = 0;

// Enquanto o indice nao for maior que 5...
while(i <= 5) {
    // Imprima o elemento na posição i e pule um espaço
    std::cout << A[i] << ' ';

    // Incremente a variável i
    i++;
}
std::cout << std::endl;
2 1 3 5 9 7

break

Podemos usar a instrução break; em qualquer laço para interrompê-lo.

int A[] = {2, 1, 3, 5, 9, 7};
int i = 0;

// Repita infinitamente: true é sempre verdadeiro
while(true) {
    std::cout << A[i] << ' ';
    i++;
    
    // Se i for maior que 5, quebre o laço
    if(i > 5) {
        break;
    }
}
2 1 3 5 9 7

Laços do...while

Invertem o momento de comparação do predicado.

Exemplo usando while

int i = 1;

while(i < 1) {
    std::cout << "Executou!" << std::endl;
}

Exemplo usando do...while

int i = 1;

do {
    std::cout << "Executou!" << std::endl;
} while(i < 1);
Executou!

Laços for

Englobam declaração, inicialização e incremento de variáveis em sua própria definição.

Sintaxe

for(<declarações>; <predicado>; <incrementos e decrementos>)
{
    <corpo...>
}

Exemplo

int A[] = {2, 1, 3, 5, 9, 7};

for(int i = 0; i <= 5; i++) {
    std::cout << A[i] << ' ';
}
std::cout << std::endl;
2 1 3 5 9 7

Podemos usar mais de uma variável de uma vez em um laço for.

int A[] = {2, 1, 3, 5, 9, 7};

for(int i = 5, n = 6;  // Declarações
    i >= 0;            // Predicado
    i--, n--)          // Incrementos
{
    std::cout << n << "º elemento: "
              << A[i] << std::endl;
}
6º elemento: 7
5º elemento: 9
4º elemento: 5
3º elemento: 3
2º elemento: 1
1º elemento: 2

Exercícios II

Média Aritmética III

Crie um programa que lê dez números reais digitados pelo usuário, armazena-os em um vetor de dez elementos, e então calcula a média aritmética entre todos eles, imprimindo o resultado na tela.

Média Aritmética IV

Crie um programa que lê dez números reais digitados pelo usuário, e então calcula a média aritmética entre todos eles, imprimindo o resultado na tela.

Não utilize vetores ao resolver este exercício. Também não utilize variáveis individuais para armazenar as notas.