Aula - Vetores

Aula por Rogério Júnior e João Pedro Castro

Na última aula exploramos os loops, que permitem repetir uma operação N vezes. Agora vamos aprender sobre os vetores, que tem a função de servir como N variáveis.

Problema Base

Imagine o seguinte problema: imprimir uma lista de inteiros de trás pra frente. A entrada consiste de duas linhas, na primeira temos um número inteiro N (1 \leq N \leq 10^6), e na segunda temos uma lista a de tamanho N com inteiros a_i (-10^9 \leq a_i \leq 10^9). A saída deve consistir da lista na ordem inversa, com os números separados por um espaço, ou seja: a_N~a_{N - 1}~...~a_2~a_1.

Com o que vocês aprenderam até agora no roteiro esse problema é impossível, pois além de receber N valores também é necessário guardar todos os N valores para os usar em um momento posterior. Assim, vamos introduzir uma nova maneira de guardar dados: vetores.

Um vetor é uma lista de variáveis do mesmo tipo em que podemos acessá-las pela posição, que vai de 0 até tamanho - 1. Segue um exemplo abaixo:vetor_image

Sintaxe

A sintaxe básica do vetor é:

O tipo pode ser qualquer um dos tipos já mencionados nas variáveis, e o nome segue o mesmo modelo do nome das variáveis, enquanto o tamanho é um inteiro positivo, podendo ser inclusive uma variável. Na hora de acessar os valores podemos colocar qualquer posição válida (inteiro entre 0 e tamanho - 1) dentro dos colchetes, inclusive variáveis, que acabam sendo as mais utilizadas.

Agora que já sabemos o básico de vetores, vamos ver uma possível solução para o problema base:

No código acima declarei um vetor com exatamente N posições, e o inicializei dentro da main. Porém, é uma prática comum (e até recomendada) declarar o vetor fora da main, já que isso inicializa os valores de cada posição com 0, e com pouco mais posições do que o valor máximo de N (para o problema, um tamanho por volta de 10^6 + 10 é recomendado), para que erros no código ou problemas/diferenças de compiladores não provoquem respostas erradas ou erros de acesso de memória. Então, caso queira, fica como exercício reformular o código tendo isso em mente.

Campo Minado - Problema para focar

Resolva esse problema antes de prosseguir. Não recomendo olhar a solução antes de tentar resolver por um bom tempo, sinta-se livre para voltar na aula e reler o conteúdo já passado.

Solução Campo Minado

Nesse problema recebi os valores na posição 1 até a N, já que se eu tivesse começado da 0 ao olhar para a posição i - 1 iria receber um erro de memória, já que estaria procurando pela posição -1. Porém, ao começar da 1, tendo a campo[0] = 0 e campo[N + 1] = 0, não teremos nenhum problema. Obviamente, esse problema poderia ter sido remediado de outras formas, como um if para ver se a posição anterior ou posterior é válida, mas desse jeito que fiz é mais rápido programar.

[collapse]

Strings

Existe um tipo especial de vetor, as strings. Elas são vetores exclusivamente de caracteres, e já foram mostradas para vocês nas aulas anteriores (as frases entre aspas), com funcionalidades especiais, pois são tratadas como um outro tipo de variável. Para usar as strings é necessário importar a biblioteca "string" (sem as aspas). Segue algumas das funcionalidades:

Vogais e Consoantes - Problema para focar

Resolva esse problema antes de prosseguir. Não recomendo olhar a solução antes de tentar resolver por um bom tempo, sinta-se livre para voltar na aula e reler o conteúdo já passado.

Solução Vogais e Consoantes

[collapse]

Ideia Extra - Vetor dinâmico

Imagine uma lista que suporta além de suportar as operações usuais de ler/escrever também possibilita adicionar um elemento ao final do vetor, ou apagar o último elemento. Podemos implementar isso de forma fácil, estabelecendo um tamanho máximo para o vetor e guardando o tamanho atual em uma variável. Na última aula da parte inicial é introduzida uma versão pré-implementada pelo C++ na STL. Segue uma possível implementação.

Experimente rodar esse programa no seu computador e mexer fazendo operações.

Fim

Agora o universo de problemas que você  pode resolver se expandiu novamente, parabéns! Vá para página anterior e resolva os problemas recomendados para continuar sua jornada de aprendizado ?