Em C++ os arrays são estáticos e depois de criados não podem ser ampliados.
Porém, é possível “ampliar” um array dinâmico seguindo os seguintes passos:
- Crie um novo array dinâmico com um espaço a mais.
- Copie os valores do antigo array para o novo.
- Na última posição do novo array, guarde o novo elemento.
- Apague o array antigo.
Crie um programa que tenha a função que adiciona um novo elemento na última posição de uma array de inteiros.
Dica: Crie uma função auxiliares que realizem: a cópia dos elementos entre dois arrays dinâmicos, que receba os valores de uma array do usuário, e que imprima a array.
Passo 1
Vamos lá pessoal. Essa questão é um pouquinho mais cabeluda, mas com calma a gente vai fazê-la com tranquilidade.
O objetivo é criar uma função que amplie uma array. A vantagem é que a questão já explicou os passos que temos que seguir, basicamente vamos fazer uma cópia da array antiga em uma array nova com mais espaço.
Vamos iniciar com o cabeçalho do código:
Passo 2
Vamos começar criando algumas funções auxiliares.
A primeira função auxiliar que vamos precisar é uma que imprima os valores contidos no vetor dinâmico. Então vamos criar a função .
Lembre-se que a gente não tem acesso a array, mas sim a um ponteiro que aponta para essa array. Assim, a função vai receber como parâmetro o ponteiro que aponta para a memória alocada dinamicamente. Vamos precisar também de um parâmetro que contenha o tamanho da array que vamos chamar de , para que possamos imprimi-la corretamente:
Dentro da função, vamos usar um loop para iterar sobre os elementos da array e com o vamos imprimir cada um dos elementos.
Passo 3
A segunda função auxiliar que vamos precisar é uma função que preencha o vetor com valores inseridos pelo usuário. Essa função vai ser chamada .
A função vai precisar acessar e modificar os valores contidos no vetor dinâmico, o que vai ser fácil de resolver pois uma array dinâmica sempre é passada por ponteiro. Então o primeiro parâmetro da função é um ponteiro que aponta pra memória alocada dinamicamente chamado . Vamos precisar também de um parâmetro inteiro que represente o tamanho da array que vamos chamar de , para que possamos imprimi-la corretamente:
Para efetuar o preenchimento da array vamos utilizar um loop para acessar cada um dos elementos da array e usando e podemos guardar o valor inserido pelo usuário na posição adequada.
Passo 4
Vamos desenvolver agora a terceira função auxiliar. Vamos criar uma função que copia todos os dados de uma array para outra.
Pra essa função funcionar vamos precisar de três parâmetros. Primeiro é necessário receber a array atual, e segundo vamos precisar receber a nova array para onde os valores serão copiados, e terceiro é preciso conhecer o tamanho da array atual, para podermos executar um loop sobre a array atual.
O algoritmo da função de cópia consiste em usar um loop para acessar cada um dos elementos da e copiar esse elemento para a mesma posição na :
Passo 5
Com todas as funções auxiliares prontas, podemos nos dedicar a função mais importante do programa: executar a ampliação de uma array.
Vamos construir a declaração da função.
A função vai se chamar , que vai efetuar a cópia de uma array e retornar o endereço de memória de uma nova array dinâmica. Ou seja, essa função vai retornar um ponteiro, e por isso deve ser do tipo . O primeiro parâmetro é o valor do elemento a ser adicionado. O segundo parâmetro é o endereço de memória da array dinâmica que vai ser ampliada. E o terceiro parâmetro é o tamanho da array e vai ser passado por referência para que a gente possa atualizar o valor do tamanho da array.
Vamos passo a passo construir o algoritmo da função. O primeiro passo é alocar dinamicamente uma nova array dinâmica, com o detalhe de que o tamanho deve ser um espaço maior.
Em seguida, vamos copiar os valores da array atual para a nova array utilizando a função que nós criamos anteriormente.
Agora vamos acessar o último elemento da nova array e guardar o conteúdo de na nova array.
Pronto. Agora não precisamos mais da array antiga, e podemos deletá-la:
E para que a gente possa continuar sabendo o tamanho da array, vamos atualizar a variável
E para finalizar a função, vamos retornar o endereço de memória da array expandida.
Passo 6
Show de bola. Agora vamos criar uma que faça uso das funções que criamos.
Pra começar, vamos precisar de um ponteiro do tipo inteiro que vai conter o endereço da array dinâmica. Também vamos precisar declarar uma variável que receba contenha o tamanho da array, e uma variável em que o usuário possa inserir o novo elemento da array.
Vamos pedir pro usuário inserir o tamanho que ele deseja para a array
E com isso poderemos utilizar o operador para criar um novo vetor dinâmico do tipo inteiro.
Usando a função vamos pedir pro usuário colocar valores na array criada.
E agora vamos efetuar a ampliação da array. Primeiro vamos pedir pro usuário inserir o valor do novo elemento que vai ser adicionado na array. Em seguida, na linha 60, usamos a função para efetuar o processo de ampliação. Note que o resultado vai ser guardado dentro do mesmo ponteiro.
Agora que a array foi ampliada, podemos imprimir o seu conteúdo utilizando a função .
Passo 7
Antes de finalizar a questão, não podemos esquecer de deletar o array dinâmico. A array velha foi deletada dentro da função , porém temos que deletar a nova array que foi criada.
O endereço dessa nova array esta contido no ponteiro . Então vamos usar o operador para liberar a memória:
E prontinho! Acabou o exercício.