Manipulando Funções

Ver Todos os Exercícios

Teoria

Introdução

Fala ae, tudo beleza? Nessa aula nós vamos aprender um pouco mais sobre as funções, seus parâmetros, retornos e como manipulá-las no nosso código. Então bora nessa!

O parâmetro para uma função

Diversas vezes quando estamos programando, nos deparamos com funções que recebem parâmetros e executam alguma alteração nos valores deles. Vamos ver a seguinte função:

Percebe-se que nessa função s o m a r 5 , houve a soma de 5 na variável c o n t a d o r que foi passada como parâmetro. Mas a variável contador realmente foi alterada?

A resposta é não! Podemos verificar isso com a impressão do valor da variável:

Isso ocorre pois, ao se passar um valor como parâmetro para uma função, o que é realmente enviado para a função é uma cópia desse dado, fazendo com que o original não seja alterado.

Portanto, os parâmetros de uma função são cópias enviadas para essa função.

Variáveis locais e globais

Dentro de um código, é possível definirmos as variáveis como locais ou globais:

  • Variável local
  • Essas variáveis existem apenas dentro de alguma função e os seus valores são perdidos após o término da execução da função.

    Nesse caso, as variáveis l o c a l 1 e l o c a l 2 , existem apenas dentro das funções m a i n e f u n c a o , respectivamente. Dessa forma, não é possível alterar o valor da variável l o c a l 2 dentro da função m a i n , pois essa existe somente dentro da função f u n c a o , e vice-versa.

  • Variável global
  • Esse tipo de variável é declarada fora das funções (inclusive da m a i n ) . Nesse caso, o valor dela pode ser modificado dentro ou fora de qualquer uma das funções do programa.

    Nesse caso, percebe-se o valor inicial da variável g l o b a l foi alterada durante a execução da função s o m a   e também dentro da função m a i n .

    Variável static

    Vamos supor que você precise desenvolver uma função na qual exista um contador (uma variável local dessa função) que indique quantas vezes ela já foi executada. Para isso, seria necessário que o valor dessa variável fosse guardado após o término da execução desse programa. Mas como fazer isso com uma variável local?

    É aí que estraria uma variável s t a t i c ! Para declararmos esse tipo de variável basta utilizarmos s t a t i c logo antes de definirmos o tipo de variável.

    s t a t i c           T i p o D e V a r i a v e l             N o m e D a V a r i a v e l ;

    Quando definimos uma variável como s t a t i c , o seu valor é perdido somente após o término do programa, se mantendo mesmo após o término da função a qual ela pertence.

    Para resolvermos o caso anterior poderíamos fazer o seguinte programa:

    Dessa forma, temos como saída:

    Protótipo de função

    Quando vamos declarar uma função, existem duas maneiras mais usuais de fazermos isso:

  • Declararmos a função junto do seu corpo
  • É o caso no qual nós declaramos a função e, logo em seguida, especificamos o corpo da função (onde escrevemos o que ela faz). Quando fazemos assim, devemos declarar a função antes da m a i n , onde ela será chamada para que o programa a execute. Esse é o caso que viemos fazendo até o momento.

  • Declararmos a função separada do seu corpo

Isso é chamado de protótipo de função. É quando nós declaramos a função numa parte do código, mas colocamos o que ela faz em outra parte. Isso é utilizado quando queremos colocar o que as funções fazem depois do término da função main.

Essa forma de trabalharmos com funções é bastante utilizada pois pode ser considerada uma maneira mais organizada es estruturarmos o nosso código, pois podemos evidenciar mais facilmente o que será executado no programa (dentro da função m a i n ) e não deixá-lo apenas para o final do código.

Perceba que num protótipo de função, precisamos declarar as funções antes da função m a i n , pois isso serve para indicarmos que elas existem e direcionarmos o computador a ler a parte do corpo da função indicada abaixo da m a i n . Não declarar previamente uma função é um erro grave que pode prejudicar o funcionamento do seu código, embora não seja indicado como erro pelo compilador.

Sobrecarga de funções

Suponha que, ao longo de um programa que você está trabalhando, tornou-se necessário usar duas funções nas quais seria conveniente possuírem o mesmo nome. Definir duas funções com o mesmo nome daria algum erro no programa?

A resposta é depende.

No C++, quando declaramos duas funções distintas com o mesmo nome, isso se chama sobrecarga de funções e existem algumas condições para que isso seja feito.

Essas condições consistem nos parâmetros a serem usados nessas funções. As funções precisam ser declaradas com alguma diferença nos seus parâmetros, seja na quantidade de parâmetros ou nos tipos de parâmetros.

Vamos ver alguns exemplos:

Nesse caso, ao chamarmos uma função d i v i s a o e passarmos como parâmetros valores do tipo i n t , será executada a primeira função, caso passarmos valores do tipo f l o a t , será executada a segunda função.

Nesse segundo caso, a função que será executada dependerá da quantidade de argumentos que serão passados a ela, se forem passados dois será a primeira m e d i a , se forem passados três será a segunda.

Agora que já entendemos sobre como funcionam os parâmetros passados para uma função e as variáveis que serão usadas nelas, aprendemos a fazer um protótipo de função e uma sobrecarga de funções, podemos partir para os exercícios! 😉

Variáveis locais e globais

Variável static

Protótipo de função

Sobrecarga de funções

Exercícios Resolvidos

Exercício Resolvido #1

Faça um programa que recebe 3 valores inteiros do usuário e os passe como parâmetros para uma função o r d e n a r que irá imprimir na tela esses números em ordem crescente.

Faça o protótipo da função o r d e n a r .

Passo 1

Eai, tudo tranquilo?

Vamos iniciar esse código incluindo a função biblioteca i o s t r e a m , pois teremos que imprimir os valores na tela. Além disso, vamos inicializar a função m a i n .

Devemos fazer o protótipo da função o r d e n a r como explicitado no enunciado. Como o objetivo dessa função é imprimir os valores, não há necessidade dela retornar algo, portanto, vamos declará-la como v o i d . Já as 3 variáveis que irão receber os números do usuários são declaradas como inteiros. E como são argumentos da função o r d e n a r , elas são declaradas ali dentro dos parênteses mesmo.

Passo 2

Agora, vamos escrever o algoritmo da função para colarmos os números a , b e c em ordem crescente.

Vamos analisar o caso de a ser o menor, então abrimos um i f , com a condição de que a < b E a < c :

i f   ( a <   = b   & &   a <   = c )

O operador lógico & & significa E. Dentro dessa condição, teríamos duas possibilidades: ou b seria o maior ou c seria o maior. Então abrimos outro i f . Assim, poderíamos escrever o começo da função o r d e n a r dessa forma:

Mas também precisamos considerar o caso de b ser o menor número. Então escrevemos esses mesmos condicionais pro caso em que b < a E b < c . Se for o caso, o programa não vai entrar no primeiro i f , e vai entrar nesse. Daí vamos analisar quem é o segundo maior, a ou c .

Por fim, se a não é o menor e b não é o menor, o programa não vai entrar nesses i f s . Então ele vai entrar no e l s e , que vai considerar o caso em que c é o menor.

Juntando toda essa parte de ordenação pros 3 casos, fica bem assim:

Passo 3

Por fim, basta recebermos os dados do usuário e passarmos ele para a função:

Resposta

Exercício Resolvido #2

Implemente a questão anterior para que, ao final da impressão dos números ordenados, uma função c o n t i n u a r seja chamada. Essa função irá definir se o usuário irá digitar outro conjunto de 3 números para que sejam ordenados ou finalizará o programa.

Passo 1

Eai, tudo tranquilo?

Nessa questão, temos que entender como funciona para que um programa fique funcionando por um tempo indeterminado. Quando precisamos que uma rotina seja executada várias vezes, o uso de laços de repetição, como o f o r , o w h i l e e o d o   w h i l e , é o recomendado. Quando não temos uma quantidade determinada de vezes para o código ser executado, é recomendado o uso de w h i l e ou d o   w h i l e .

Nesse caso, vamos optar por utilizar o d o   w h i l e , mas o código poderia tranquilamente ser feito com o w h i l e .

Para o d o   w h i l e , temos a seguinte sintaxe:

d o   {             c ó d i g o }   w h i l e   c o n d i ç ã o ;

Passo 2

Agora, para a função c o n t i n u a r , nós precisamos de duas possíveis saídas, uma para continuar rodando o programa e outra para parar. Logo, é possível declarar essa função com a saída sendo um b o o l e a n , no qual, caso retorne t r u e o programa continua e caso retorne f a l s e o programa para.

Dessa forma, temos:

Passo 3

Para fazermos um código se repetir de acordo com o retorno da função r e s p o s t a bastaria usar o d o   w h i l e como explicado no passo 1:

Com isso, basta aplicarmos essa estrutura ao nosso código.

Resposta

Exercício Resolvido #3

Escreva um programa em C++ que leia 3 notas de um aluno e a média das notas dos exercícios realizados por ele. Esses valores devem ser passados para uma função m e d i a que deve calcular a média de aproveitamento, usando a fórmula: M A   =   ( N 1   +   N 2 * 2   +   N 3 * 3   +   M E ) / 7 . A partir da média obtida, enviar esse valor como parâmetro para uma função c o n c e i t o que retorna o conceito de acordo com a tabela:

Ao final do programa, imprimir na tela o conceito calculado. Certifique-se de fazer o protótipo das funções utilizadas.

Passo 1

Eai, ta tudo beleza?

Nessa questão, vamos começar pensando no algoritmo de cada função.

A primeira função a ser trabalhada será a m e d i a . Ela é uma função que deve receber 4 valores referentes às notas dos alunos. Como notas tendem a possuir até duas casas decimais de precisão, vamos declarar essa função e os seus parâmetros como f l o a t .

Agora, vamos criar uma variável m do tipo float, que vai assumir o valor da média final calculada igual é explicado no enunciado e, por fim, vamos retornar esse valor.

Passo 2

Vamos desenvolver a função c o n c e i t o . Como ela deve retornar uma letra de acordo com a média calculada, vamos defini-la como c h a r e o seu parâmetro como f l o a t . Dessa forma, temos:

Com isso, basta colocarmos os condicionais para que ocorra o retorno de acordo com a tabela no enunciado.

Passo 3

Com as funções feitas, vamos implementar a função m a i n , na qual printaremos mensagens para que o usuário coloque as notas, e, ao final, vamos imprimir o conceito.

Por fim, basta estruturarmos o nosso código, não esquecendo do protótipo das funções!

Resposta

Exercício Resolvido #4

Usando sobrecarga de funções, escreva 3 funções chamadas de m e d i a para que seja calculada a média das notas de um aluno. Se forem passadas 2 notas como parâmetros, a função a ser chamada será uma que calcula a média aritmética, se forem passadas 3 notas, a média ponderada (pesos: 5, 3 e 2) e se for forem passadas 4 notas, a sua média harmônica.

Passo 1

Eai, tudo tranquilo?

Nessa questão, vamos cada função, começando pela média aritmética.

Como notas podem ser valores com duas casas decimais, vamos definir os parâmetros e o retorno da função como do tipo f l o a t . Dessa forma, temos a seguinte função:

Passo 2

A segunda função será a da média ponderada. A diferença na sua declaração vai consistir na quantidade de argumentos que está recebendo, pois dessa vez será 3.

Essa média ponderada será calculada da seguinte forma:

M = 5 * N 1 + 3 * N 2 + 2 * N 3 10

Com isso, basta implementarmos no nosso código:

Passo 3

Agora, falta apenas a ultima função m e d i a , que é para calcular a média harmônica para quando temos 4 parâmetros. Uma média harmônica para 4 valores será calculada da seguinte forma:

M = 4 1 N 1 + 1 N 2 + 1 N 3 + 1 N 4

Aplicando isso ao nosso código, temos:

Resposta

Exercício Resolvido #5

Faça uma função chamada c o m p a r a que usa um número aleatório (utilize a função r a n d ( )   ) e solicita ao usuário que digite um número. O objetivo é que o usuário acerte o número gerado. Se o número digitado for menor que o gerado, imprima “MAIOR”, se for maior imprima “MENOR”, se for igual, imprima “ACERTOU”.

Passo 1

Eai, tudo tranquilo?

Vamos começar entendendo como funciona a função r a n d ( ) . Essa é uma função que retorna um valor inteiro aleatório que pertence a um intervalo de 0 até um máximo. Esse máximo depende do computador usado. Para você saber qual é esse valor máximo, coloque para imprimir o valor do máximo da função r a n d ( ) por meio da linha de comando:

c o u t ≪ R A N D _ M A X ;

Sabendo disso, vamos iniciar a função c o m p a r a . Como ela não retorna nenhum valor e nem recebe nenhum valor, vamos declará-la como v o i d e começar a função declarando as variáveis que serão usadas:

Nesse caso, chamamos de s e g r e d o o número aleatório que o usuário deverá adivinhar e de c h u t e a variável que vai assumir o valor do palpite digitado pelo usuário. Ambas são declaradas como inteiras.

Passo 2

Agora, vamos imprimir uma mensagem para o usuário digitar o seu palpite e vamos atribuir esse valor à variável c h u t e .

Agora, basta fazer os condicionais, considerando os 3 casos em que: c h u t e > s e g r e d o ; c h u t e = s e g r e d o e c h u t e < s e g r e d o . Para condicionais, usamos i f   /   e l s e   i f   /   e l s e (linhas 7, 9 e 11).

Para cada caso, o programa imprime as mensagens de acordo com o enunciado (linhas 8, 10 e 12):

Resposta

Exercício Resolvido #6

Faça uma função que recebe, por parâmetro, a altura ( a l t ) e o sexo de uma pessoa e retorna o seu peso ideal. Para homens, calcular o peso ideal usando a fórmula peso ideal =   72.7 ×   a l t   -   58 e, para mulheres, peso ideal =   62.1 ×   a l t   -   44.7 .

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos fazer uma função que checa algumas possibilidades e retorna um valor de acordo com elas.

Como a nossa função precisa retornar um valor para real para representar um peso, vamos declará-la como d o u b l e . Além disso, ela precisa de dois parâmetros, a altura e o sexo. O último, nós vamos representar como um caractere c h a r .

No caso de desse parâmetro receber ‘h’ ou ‘H’, significa que é um homem, e se for ‘m’ ou ‘M’ é uma mulher.

Vamos inicialmente declarar a nossa função:

Passo 2

Vamos declarar uma variável local para armazenar o valor do peso que queremos calcular:

Em seguida, vamos analisar o caso de ser um homem. Para isso, vamos fazer P receber o valor 72.7 ×   a l t   –   58 e retornar esse valor.

Passo 3

Por fim, vamos considerar o caso de ser uma mulher. Nessa situação, vamos fazer P receber o valor 62.1 ×   a l t   -   44.7 e vamos retornar esse valor:

Resposta

Exercício Resolvido #7

Faça um procedimento que recebe, por parâmetro, um valor N e calcula e escreve a tabuada de 1 até N . Mostre a tabuada na forma:

1   x   N   =   N

2   x   N   =   2 N

. . .

N   x   N   =   N 2

Passo 1

Eai, tudo beleza?

Nessa questão, vamos fazer uma função que deve imprimir determinados valores na tela do computador. Para isso, vamos incluir a biblioteca i o s t r e a m . Como não há necessidade de retorno, podemos declarar a nossa função como do tipo v o i d .

Passo 2

Por fim, vamos fazer um laço de for que vai variar um valor i de 1 até n . Esse valor será aquele multiplicado por n para calcular cada termo da tabuada. Portando, basta imprimirmos a nossa tabuada no padrão do enunciado:

Resposta

Exercício Resolvido #8

Escreva uma função que recebe, por parâmetro, dois valores inteiros X e Z e calcula e retorna X z . (sem utilizar funções ou operadores de potência prontos)

Passo 1

Eai, tudo beleza?

Nessa questão, vamos desenvolver uma função para resolver uma potenciação x z . Para isso, vamos declarar essa função com o nome p o t e n c i a e vamos fazê-la receber dois parâmetros inteiros e retornar um inteiro.

Além disso, vamos declarar uma variável local chamada a c u m u l a d o r para acumular um produtório, por isso, vamos inicializa-la com valor 1 .

Passo 2

Agora, vamos implementar um laço de f o r com um total de z repetições. Para cada laço de repetição, vamos fazer a variável acumuladora receber o seu valor multiplicado por x . Dessa forma, ao final do laço de repetição, a variável acumuladora terá o valor de x z armazenado nela.

Por fim, vamos retornar o valor armazenado em a c u m u l a d o r :

Resposta