Funções
Tags: cpp, beginners
Published: 2024-05-15 01:29:00

Queria começar a escrever uns artigos tem um tempo e hoje na aula de estrutura de dados tive essa idéia de escrever sobre funções e espero que possa servir para o pessoal da monitoria de algoritmos e pra você que possívelmente ficou curioso e veio ler.

Funções primeiramente servem pra não repetirmos código. Existe um princípio de desenvolvimento de  software chamado DRY (Don't repeat yourself), uma versão diferente do que os menudos diriam "Não se repita".

Imagina um código dessa forma:

```cpp
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    // Cálculo da área do retângulo
    
    //base 5 - altura 10
    float baseRetangulo = 5;
    float alturaRetangulo = 10;
    float areaRetangulo = baseRetangulo * alturaRetangulo;
    cout << "Área do retângulo: " << areaRetangulo << endl;
    
    //base 7 - altura 11
    float baseRetangulo = 7;
    float alturaRetangulo = 11;
    float areaRetangulo = baseRetangulo * alturaRetangulo;
    cout << "Área do retângulo: " << areaRetangulo << endl;

    //base 8 - altura 12
    float baseRetangulo = 8;
    float alturaRetangulo = 12;
    float areaRetangulo = baseRetangulo * alturaRetangulo;
    cout << "Área do retângulo: " << areaRetangulo << endl;
    return 0;
}

```

Poderíamos facilmente ter escrito esse código dessa forma abaixo e perceba como ficou mais fácil de ler o que está acontecendo. Além disso, eu repito o código infinitamente menos.

```cpp
#include <iostream>
#include <cmath> 

using namespace std;

// Função para calcular a área do retângulo
float calcularAreaRetangulo(float base, float altura) {
    return base * altura;
}

int main() {
    // Exemplos de uso das funções
    cout << "Área do retângulo: " << calcularAreaRetangulo(5, 10) << endl;
    cout << "Área do retângulo: " << calcularAreaRetangulo(7, 11) << endl;
    cout << "Área do retângulo: " << calcularAreaRetangulo(8, 12) << endl;
    return 0;
}
```

Suponho que concorde que fica muito mais fácil de entender o código e usá-lo para calcular as áreas das formas geométrica. Eu escrevo muito menos linhas e consigo usar valores diferentes de uma forma muito mais fácil.

E esse exemplo é bem simples, em um sistema mais complexo, os benefícios são infinitamente maiores.

Para defini-las usamos essa estrutura:

```cpp
    tipoDeRetorno nomeDafuncao(tipoParametro1 nomeParametro1, tipoParametro2 nomeParametro2, ...) {
        //conteúdo da função
}
```
Primeiramente declaramos o tipo de retorno, ou seja, o que aquela função vai entregar pra gente. 

Pode ser void se não retornar nada, pode ser int se retornar um inteiro (igual a função da área do retângulo por exemplo), float se eu retornar números decimais...

Agora entra a parte mais complicadinha, vamos falar sobre os parâmetros. Usando aquela função dá área do retângulo, percebe que no início, avisamos o programa que ela vai retornar um número decimal? E além disso, percebe que depois da abertura dos parênteses, temos duas variáveis? 

```cpp
float calcularAreaRetangulo(float base, float altura) {
    return base * altura;
}
```

Essas variáveis são chamadas de parâmetros, elas dizem que pro funcionamento da função, eu vou precisar de 2 coisas, no caso o número da base e o número da altura. E se observamos a linha de baixo vemos que a única coisa que essa função faz é pegar esses valores e multiplica-los então claro, precisaremos de 2 valores para isso.

Mas perceba, quando eu declaro essa função como fiz no código de cima, eu NÃO ESTOU PASSANDO VALOR NENHUM. Aquilo ali só diz pro computador, vou precisar de 2 coisas aqui, mas não tem valor nenhum definido ali.

E como eu defino um valor? Simples, primeiro você precisa executar (chamar) essa função. E para isso é só fazer assim.

```cpp
float area = calcularAreaRetangulo();
```

Se você definir a função da forma que fiz e executar esse código, perceberá que terá um erro. O erro nos diz o seguinte: 

> candidate function not viable: requires 2 arguments, but 0 were provided

Ou seja, são necessários 2 argumentos mas eu não entreguei nenhum. E você pode se perguntar, mas o que são argumentos? Eles são justamente o valor que eu passo, o que preencherá o vazio que existe nos parâmetros (lembra que eles não existem? eles só avisam que eu vou precisar de alguma coisa ali?).

E agora quando eu chamo a função dessa forma aqui: 

```cpp
float area = calcularAreaRetangulo(3, 4);
```

Terei como resultado 12!

Então lembra:

PARÂMETRO É O QUE EU ESPERO RECEBER

ARGUMENTO É O QUE EU MANDO PARA A FUNÇÃO SER EXECUTADA