Funções que recebem arrays

Ver Todos os Exercícios

Teoria

Introdução

Fala aí, tudo tranquilo?

Você já deve ter se perguntado porque nos exercícios e exemplos que fizemos até esse momento nós não usamos arrays juntamente com funções. Isso acontece porque os vetores e as matrizes conversam de uma forma um pouquinho diferente com as funções do que uma variável comum.

Ficou curioso sobre isso? Então vem comigo que a gente vai destrinchar isso juntos!

Enviando um vetor para uma função

Vamos supor que você está trabalhando num projeto e precisa constantemente verificar os valores armazenados num determinado vetor que você utiliza no seu código. Para otimizar esse processo, você resolve fazer uma função p r i n t a r v e t o r que tem como objetivo imprimir os valores armazenados nesse vetor sempre que você usa essa função. Para que isso funcione, essa função precisa receber esse vetor como parâmetro.

É possível declarar essa função usando a seguinte sintaxe:

t i p o _ d e _ r e t o r n o           n o m e _ d a _ f u n ç ã o (     t i p o _ d o _ v e t o r         n o m e _ d o _ v e t o r       ) ;

A função que descrevemos seria declarada da seguinte forma:

Perceba que a diferença de sintaxe entre passar um vetor e uma variável simples consiste apenas no uso de colchetes após o nome do vetor. Existem algumas regras para o uso desses colchetes:

  • No caso de um vetor, o tamanho do vetor ser indicado dentro do colchete é algo opcional;
  • Para um array multidimensional, como uma matriz, é necessário indicar o tamanho das dimensões, exceto a primeira.

Bom, de qualquer forma, isso não é uma diferença muito grande, então o que tem de tão diferente no uso de arrays em funções?

Calma que a gente vai chegar lá!

Antes disso, vamos ver o seguinte exemplo:

Nesse código, nós passamos o vetor p r e ç o s como um parâmetro para a função p r i n t a r v e t o r . Perceba que, ao fazermos isso, nós colocamos apenas o nome do vetor como o parâmetro da função.

Mas o que exatamente nós estamos passando para essa função? Se colocarmos para imprimir na tela o array utilizando unicamente o seu nome como referência (ou seja, sem o índice de qualquer elemento armazenado nesse vetor) nós podemos entender isso melhor!

Ao colocarmos esse código para rodar, nós temos algo nesse formato:

Um endereço de memória! O que nós estamos enviando é um endereço de memória!

Para ser mais específico, esse é o endereço de memória do primeiro elemento do vetor. mas pera aí, como estamos enviando um endereço de memória, se modificarmos o que está armazenado nesse endereço, podemos modificar o valor do vetor?

Exatamente! Vetores, diferente de variáveis comuns, possuem os seus valores modificados quando os enviamos para as funções, pois, dentro das funções, temos acesso direto ao endereço de memória onde os elementos do vetor estão armazenados.

Nós já sabemos que um array é uma maneira de armazenarmos informação de forma indexada, ou seja, essa informação está armazenada numa estrutura específica na memória do nosso computador. Por causa disso, se o computador sabe a posição do primeiro elemento de um vetor, ele sabe a posição de todos, e com isso nós podemos trabalhar com todos os elementos desse vetor!

Agora vem a melhor parte disso tudo: para acessarmos a informação armazenada no vetor usando esse endereço de memória que foi enviado, basta fazermos o que fazemos desde o início, usar os colchetes! Ou seja, o nosso trabalho com o vetor se mantém o mesmo.

Sabendo disso, nós podemos concluir a função p r i n t a r v e t o r naquele código:

Vimos o caso de um vetor, mas e uma matriz? A situação será a mesma! A única diferença consiste no uso da regra para o colchete no momento de declarar a função.

Ou seja, se fôssemos utilizar uma função que recebe uma matriz, podemos declará-la da seguinte forma:

Agora que já entendemos como passamos um vetor ou uma matriz para uma função, vamos partir para as questões de fixação! Corre lá que eu te garanto que vai ter muita coisa boa!

Enviando um vetor para uma função

Exercícios Resolvidos

Exercício Resolvido #1

Crie uma função F 1 que retorna o maior elemento de um vetor.

Note: o vetor deve ser passado como parâmetro de entrada para a F 1 .

Passo 1

Eai, tudo beleza?

Nessa questão, precisamos criar uma função que recebe um vetor e retorna o seu maior valor. Para isso, vamos precisar definir os parâmetros que serão passados para a função, assim como o tipo de dado que ela retornará. Após isso, dentro da função, vamos precisar definir o maior termo e o armazenar dentro de uma variável. Para que isso seja ocorra, vamos precisar de um laço de f o r para analisarmos cada termo do vetor.

Vamos começar declarando a função. Como o enunciado não foi explícito quanto ao tipo de dado que será armazenado nesse vetor, vamos considerar que será do tipo i n t . Consequentemente, a função também retornará um i n t , pois será retornado um termo desse vetor. Dessa forma, temos:

Perceba que passamos um segundo parâmetro, o t a m . Ele é o parâmetro referente ao tamanho do vetor. É necessário que ele também seja passado, pois ao passar um vetor como parâmetro, passamos apenas o endereço de memória do primeiro elemento, tornando necessário saber a quantidade de elementos para que possamos acessá-los.

Passo 2

Dentro da função, vamos declarar uma variável m a i o r , que deverá armazenar o maior termo do vetor. Inicialmente, vamos fazer iniciar essa variável com o valor do primeiro elemento do vetor.

A seguir, vamos fazer um laço de for para passar por todos os elementos do vetor. É nesse momento que usamos o parâmetro t a m .

Dentro desse laço de f o r , devemos usar um condicional i f para comparar o valor armazenado em m a i o r com cada um dos elementos do vetor e, sempre que um elemento for maior que o valor armazenado na variável, fazemos a variável receber esse valor.

Dessa forma, ao final do laço de f o r , o maior elemento do vetor estará armazenado na variável m a i o r .

Agora, basta retornarmos esse valor.

Resposta

Exercício Resolvido #2

Faça uma função que receba uma matriz 10 x 3 com as notas de 10 alunos em 3 provas. Em seguida, imprima na tela o número de alunos cuja pior nota foi na prova 1, o número de alunos cuja pior nota foi na prova 2, e o número de alunos cuja pior nota foi na prova 3.

Em caso de empate das piores notas de um aluno, o critério de desempate é arbitrário, mas o aluno deve ser contabilizado apenas uma vez.

Passo 1

Eai, tudo tranquilo?

Para essa questão, precisamos criar uma função que recebe uma matriz de tamanho bem definido. Nessa matriz, cada linha possui 3 elementos que representam as notas de um mesmo aluno em 3 provas. Dentro da função, nós vamos precisar comparar essas 3 notas para saber em qual o aluno tirou a menor nota e, por fim, contabilizar e imprimir na tela quantos alunos tiraram a menor nota na primeira prova, na segunda prova e na terceira prova.

Vamos iniciar essa questão declarando essa função. Como não é necessário retornar nenhum valor, vamos declará-la como v o i d . Como argumento, basta que ela receba uma matriz no formato [ 10 ] [ 3 ] .

Além disso, perceba que já incluímos a biblioteca i o s t r e a m , pois vamos precisar imprimir os valores na tela.

Passo 2

Agora, vamos trabalhar no corpo dessa nossa função.

Sabemos que que vamos precisar printar 3 valores. Para armazenar esses valores, vamos declarar 3 variáveis: p r o v a 1 ,   p r o v a 2 e p r o v a 3 que seriam, respectivamente, a quantidade de alunos que tiveram a menor nota na primeira prova, na segunda prova e na terceira prova .

Perceba que inicializamos elas com o valor 0, pois a usaremos como contadores, ou seja, é são variáveis que irão aumentando na medida que o código for lido, por isso, precisam de um valor inicial nulo.

Agora, para fazermos a análise das notas, vamos usar um laço de f o r que vai rodar por todas as 10 linhas da matriz. Ou seja, cada repetição desse laço será referente as 3 notas de um mesmo aluno. Dentro desse laço, devemos usar condicionais para analisarmos qual das 3 notas é a menor.

Vamos iniciar utilizando um i f para analisar se a primeira nota é a menor e, caso seja, o contador p r o v a 1 vai aumentar em uma unidade o seu valor. Em caso negativo, significa que será a segunda nota ou a terceira, com isso podemos usar um e l s e   i f para saber se é a segunda e, em caso positivo, a variável p r o v a 2 vai aumentar o seu valor em 1. Em caso negativo, sobra apenas uma opção: a terceira nota foi a mais baixa. Com isso, podemos usar um e l s e para incrementar em uma unidade a variável p r o v a 3 .

Passo 3

Por fim, basta printarmos os valores armazenados nas variáveis contadoras, que representam a quantidade de alunos que tiveram a menor nota em cada prova. Vamos acrescentar uma mensagem antes explicitando o que seria cada valor:

Resposta

Exercício Resolvido #3

Faça uma função denominada i m p r i m i r c o l u n a . Nessa função serão passados como argumentos uma matriz 4 × 4 de inteiros e um número de 0 a 3 que indica uma coluna dessa matriz. A função deverá imprimir a coluna da matriz indicada por esse segundo parâmetro.

Passo 1

Eai, tudo beleza?

Para essa questão, temos que fazer uma função que imprime um conjunto de valores de uma matriz que ela recebe como parâmetro. Para isso, vamos começar incluindo a biblioteca i o s t r e a m para que possamos imprimir valores na tela. Em seguida, vamos declarar a função como um v o i d , pois ela não vai retornar nada. Como argumentos vamos colocar a matriz e uma variável do tipo i n t que será chamada de c o l u n a .

Passo 2

Antes de iniciar a impressão dos valores da matriz, podemos imprimir uma mensagem para o usuário indicando que aqueles valores são referentes a coluna cujo índice foi passado como parâmetro.

Agora, vamos imprimir os valores dessa coluna. Para isso, usamos um laço de f o r para variar o índice das linhas e mantemos o índice das colunas com o valor do parâmetro recebido. Dessa forma, usando a função c o u t , podemos imprimir cada valor da coluna.

Resposta

Exercício Resolvido #4

Em C++, quando estamos trabalhando com vetores em funções, há uma forma de usarmos eles por meio da álgebra de ponteiros. Para isso, vamos escrever uma função v e t o r i n v e r t i d o do tipo void que receba um ponteiro e uma variável inteira e, dentro da m a i n vamos passar para ela um vetor de inteiros e o tamanho desse vetor como parâmetros. Não é necessário preencher o que essa função faz.

Passo 1

Eai, tudo beleza?

Nessa questão, estamos tentando introduzir a álgebra de ponteiros no mundo dos vetores. Nesse caso, vamos trabalhar apenas em como declarar essa função e passar argumentos para ela. Vamos começar declarando essa função.

Como foi dito no enunciado, ela é do tipo void, ou seja, ela não vai nos retornar nada. Além disso, ela deve receber um ponteiro, mas para declará-la, precisamos saber para que tipo de elemento esse ponteiro está apontando. No enunciado, nos é dito que devemos passar um vetor de inteiros e sabemos que, para passarmos um vetor para uma função, enviamos o ponteiro que aponta para o primeiro termo. Portanto, esse ponteiro vai apontar para um inteiro.

Com isso, podemos declarar essa função:

Perceba que, ao usarmos um ponteiro como referência na hora de declarar a função, usamos um * para indicar que se trata de um ponteiro.

Passo 2

Agora, dentro da main, vamos criar um vetor e passá-lo para essa função. Como não temos especificações sobre esse vetor, vamos criar um vetor de inteiros qualquer e passar ele e o seu tamanho. Lembre-se que, ao passar o vetor para uma função, devemos usar apenas o seu nome, pois ele é utilizado para referenciar o ponteiro.

Resposta

Exercício Resolvido #5

Usando a resposta do exercício anterior, desenvolva o corpo da função invertevetor. Essa função deve atribuir 0 ao último termo do vetor, e deve imprimir na tela os termos do vetor após ele ser mudado, mas na ordem inversa, começando pelo último termo e terminando com o primeiro. Use álgebra de ponteiro para desenvolver a função.

Passo 1

Eai, tudo tranquilo?

Essa questão dá continuidade à álgebra de ponteiros aplicada a vetores. Dentro dessa função, devemos modificar um valor do vetor e o imprimir na tela na ordem inversa. Sabendo disso, vamos ao trabalho!

Para acessar um valor que está armazenado no ponteiro, usamos o *, no entanto, se usarmos o * no parâmetro passado, vamos ter acesso ao primeiro termo do vetor somente. Como fazemos para acessar o restante?

Para acessarmos o segundo termo do vetor, basta usarmos * ( v e t o r + 1 ) , para acessarmos o terceiro termo, usamos * ( v e t o r + 2 ) . Ou seja, basta somar um valor ao ponteiro que mudamos a localização dentro do vetor, de modo que, para acessarmos o i-ésimo termo do vetor, usamos * ( v e t o r + i - 1 ) .

Dessa forma, para mudarmos o último valor do vetor para 0, bastaria usarmos:

Passo 2

Agora, vamos printar os termos do vetor, mas na ordem inversa. Para fazermos isso, vamos usar um laço de f o r para passarmos por cada termo do vetor, mas vamos começar acessando os últimos termos e, por meio da função c o u t , vamos printar cada termo.

Passo 3

O

Resposta

Exercício Resolvido #6

Faça uma função p r e e n c h e _ m a t r i z . Essa função deverá receber uma matriz 3 × 3 de inteiros vazia como parâmetro e deverá pedir ao usuário que informe o valor dos de cada elemento dessa matriz.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos fazer uma função que pede ao usuário os termos para preencher uma matriz 3 × 3 . Para isso interagirmos com o usuário, vamos incluir a biblioteca i o s t r e a m .

Como não há necessidade dessa função retornar nada, vamos declará-la como v o i d . Como parâmetro, vamos colocar uma matriz 3 × 3 de inteiros:

Passo 2

Dentro dessa função, nós vamos precisar de 2 laços de f o r , um para variar as linhas e outro para variar as colunas, para que possamos passar por todos os elementos dessa matriz. Dentro desses laços, vamos imprimir uma mensagem pedindo para que o usuário informe o valor para que deseja passar a determinado elemento dessa matriz e, logo em seguida, vamos usar o comando c i n para passar esse valor ao elemento m a t r i z i [ j ] .

Resposta

Exercício Resolvido #7

Faça uma função chamada d o b r a r . Essa função deve receber como parâmetro um vetor de números reais de qualquer tamanho e deve dobrar o valor de cada elemento pertencente ao vetor.

Passo 1

Eai, tudo beleza?

Nessa questão, nós precisamos criar uma função que dobra os valores armazenados em um vetor. Como esse vetor pode possuir qualquer tamanho, é necessário que seja passado o tamanho desse vetor como parâmetro para a nossa função.

Dessa forma, podemos declarar a função com dois parâmetros: o vetor que será modificado e o tamanho do vetor.

Passo 2

Dentro da função, nós vamos fazer um laço de f o r para passarmos por cada termo desse vetor. Dentro desse laço, vamos fazer com que cada termo do vetor receba ele mesmo multiplicado por 2.

Com isso, finalizamos a nossa função.

Resposta

Exercício Resolvido #8

Utilizando sobrecarga de funções, desenvolva duas funções chamadas m e d i a . Uma deve receber um vetor de inteiros com tamanho 5 e a outra uma matriz 5 × 5 de inteiros, e ambas devem retornar a média dos valores armazenados nessas matrizes.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos utilizar a sobrecarga de funções para criarmos duas funções distintas com o mesmo nome. O programa, para saber qual das duas funções vai ele vai utilizar ao chamarmos uma delas, vai verificar o tipo de parâmetro passado. Nesse caso, a diferença vai estar no fato de uma delas receber um vetor, enquanto a outra recebe uma matriz.

Vamos declarar a primeira função. Como ela deve retornar uma média, e esse valor pode não ser um número inteiro, vamos declarar essa função de forma que ela retorne um float.

Passo 2

Dentro dessa função, vamos declarar uma variável para acumular a média dos valores do vetor passado para essa função.

Em seguida, vamos fazer uma laço de f o r para passarmos por cada termo desse vetor e vamos somar à variável m cada elemento do vetor dividido por 5 , de forma que, ao final do loop, a média dos elementos do vetor estará armazenada na variável m .

Perceba que, fizemos um c a s t para f l o a t no elemento do vetor, pois ele é do tipo i n t e queremos passar o seu valor para uma variável f l o a t .

Passo 3

Na segunda função, vamos fazer o mesmo processo de declará-la com um retorno do tipo f l o a t e, dentro da função, vamos declarar uma variável local m do tipo f l o a t .

Em seguida, vamos iniciar dois laços de f o r para passarmos por todos os termos dessa matriz. Dentro desses laços, vamos fazer a variável m acumular a média dos valores armazenados nessa matriz.

Por fim, basta retornarmos o valor armazenado em m .

Resposta