Funções x Vetores. Parte Final (código)
Autor: Edson JR | Publicado: 2010-01-03T16:00:00-02:00

Agora que já vimos os conceitos e como funciona a alocação dinâmica, estamos prontos para ver um código exemplo. Então vamos a ele.#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;&nbsp;int ler_int(){&nbsp;&nbsp;int digitado;&nbsp;&nbsp;printf(&quot;Digite um valor inteiro: &quot;);&nbsp;scanf(&quot;%d&quot;,&amp;digitado);&nbsp;return digitado;}&nbsp;void mostra_int(int num){&nbsp;printf(&quot;%d &quot;,num);}&nbsp;void exibe_vetor(int* vet, int tamanho){&nbsp;int i;&nbsp;&nbsp;printf(&quot;\n&quot;);&nbsp;for(i = 0; i &lt; tamanho; i++)&nbsp;&nbsp;&nbsp;&nbsp;mostra_int(vet[i]);&nbsp;printf(&quot;\n\n&quot;);}&nbsp;int* preenche_vet_int(int tamanho){&nbsp;int *vet=0, i;&nbsp;&nbsp;vet = (int *) malloc (tamanho * sizeof(int));&nbsp;if (vet){&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\nPREENCHENDO O VETOR:\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; tamanho; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vet[i] = ler_int();&nbsp;}&nbsp;return vet;}&nbsp;int aumenta_vet_int(int* vet, int* tamanho, int incremento){&nbsp;int novo_tam, i;&nbsp;&nbsp;novo_tam = *tamanho + incremento;&nbsp;vet = (int *) realloc (vet, novo_tam * sizeof(int));&nbsp;if (vet){&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\nPREENCHENDO OS NOVOS ITENS DO VETOR:\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;for(i = *tamanho; i &lt; novo_tam; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vet[i] = ler_int();&nbsp;&nbsp;&nbsp;&nbsp;*tamanho = novo_tam;&nbsp;&nbsp;&nbsp;&nbsp;return 1;&nbsp;}&nbsp;else{&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;NAO FOI POSSIVEL AUMENTAR O VETOR!\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;}}&nbsp;int diminui_vet_int(int* vet, int* tamanho, int decremento){&nbsp;int novo_tam, i;&nbsp;&nbsp;novo_tam = *tamanho - decremento;&nbsp;if (novo_tam &lt;= 0){&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;DECREMENTO INFORMADO INVALIDO!!! NAO FOI POSSIVEL DIMINUIR O VETOR!\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;}&nbsp;vet = (int *) realloc (vet, novo_tam * sizeof(int));&nbsp;if (vet){&nbsp;&nbsp;&nbsp;&nbsp;*tamanho = novo_tam;&nbsp;&nbsp;&nbsp;&nbsp;return 1;&nbsp;}&nbsp;else{&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;NAO FOI POSSIVEL DIMINUIR O VETOR!\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;}}&nbsp;int main(){&nbsp;int *vetor, tamanho, incremento, decremento;&nbsp;&nbsp;printf(&quot;Digite o tamanho do vetor:\n&quot;);&nbsp;tamanho = ler_int();&nbsp;vetor = preenche_vet_int(tamanho);&nbsp;if (vetor){&nbsp;&nbsp;&nbsp;&nbsp;exibe_vetor(vetor, tamanho);&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Digite o quanto deseja aumentar o vetor:\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;incremento = ler_int();&nbsp;&nbsp;&nbsp;&nbsp;if (aumenta_vet_int(vetor, &amp;tamanho, incremento))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exibe_vetor(vetor, tamanho);&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Digite o quanto deseja diminuir o vetor:\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;decremento = ler_int();&nbsp;&nbsp;&nbsp;&nbsp;if (diminui_vet_int(vetor, &amp;tamanho, decremento))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exibe_vetor(vetor, tamanho);&nbsp;&nbsp;&nbsp;&nbsp;free(vetor);   &nbsp;}&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;NAO FOI POSSIVEL ALOCAR O VETOR!\n&quot;);&nbsp;system(&quot;pause&quot;);}Depois do que já vimos nos post anteriores, este código ficou muito simples.Algumas funções já são conhecidas nossas. E dentre as novas funções existe pouca coisa que ainda não foi dita.A primeira função nova está na linha 25, e é a razão desta sequência de posts. É uma função que retorna um vetor. Um detalhe interessante dela é que damos ao usuário a liberdade de definir o tamanho deste vetor. Seu funcionamento é simples.Declaramos um ponteiro para inteiros vet e o inicializamos com o valor 0. Este ponteiro irá armazenar o endereço do vetor que será alocado dinamicamente.Fazemos uma chamada a função malloc com o tamanho definido pelo usuário, e atribuimos o seu retorno ao ponteiro vet.Se a chamada teve sucesso e o vetor foi alocado, imediatamente vamos preenchê-lo.Observe o uso do if sem nenhum operador relacional. Na verdade ele verifica o valor de vet. Por isso o inicializamos com 0. Se a função malloc falhou, o valor de vet ainda será 0 (se funcionar perfeitamente, malloc nunca retorna um endereço 0). Este if verifica se o valor de vet é diferente de 0 (cuidado com isto: por diferente entenda qualquer outro valor, inclusive negativo). Este uso do if é muito comum, e passaremos a usá-lo, sempre que possível, daqui pra frente, como pode ser visto nas linhas 84 e 88, onde ele avalia o valor retornado pelas funções que aumentam e diminuem o tamanho do vetor, respectivamente.A segunda nova função, na linha 37, aumenta o tamanho do vetor com um valor também definido pelo usuário, usando a função realloc. Observe que usando um ponteiro para a variável tamanho, podemos alterar o seu valor dentro da própria função.A última função nova, na linha 55, diminui o tamanho do vetor de forma semelhante à função que o aumenta, usando a função realloc com um valor definido pelo usuário. A diferença entre elas é a verificação da validade do valor informado pelo usuário, evitando um erro ao tentar alterar o tamanho do vetor para 0 ou um valor negativo.Observe que na linha 90, já na função main, desalocamos o bloco de memória usado pelo vetor. Isto é muito importante, se não este espaço ficará 'ocupado' mesmo após o término do programa.Com isto encerramos a nossa série sobre funções que retornam vetores e como isto é possível utilizando a alocação dinâmica.Alguma dúvida?