terça-feira, 26 de julho de 2016

Hardcore Devel #60 - Programando em C++ #3

A série continua!

Falamos sobre variáveis da última vez. Agora vamos falar de funções.

- Ah, Pedro, você não está indo muito pro lado da matemática?
- E você acha que computação é o que?

Bom, parece mesmo que estamos falando de matemática. Falamos de variáveis e agora de funções. Onde é que as coisas se desencontram? Será que em algum momento se desencontram? Bom, o que interessa é que funções tem duas razões de existência. A primeira é economia de código. A segunda é garantia de abstração.

Uma função é um mapeamento de um elemento de um conjunto, para um elemento de outro conjunto. Em programação a gente diz que função é uma rotina que faz especificamente uma coisa bem definida. No conceito matemático depende totalmente do valor de entrada. No conceito de programação, o ideal é que dependa minimamente do valor de entrada. Até porque não faz sentido você fazer um mapeamento bruto valor a valor, até porque você não vai ser capaz de fazer. Os valores tendem a infinito.

Note que até agora, nós não utilizamos nenhuma função em C++. O máximo que fizemos foi utilizar operadores, que nada mais é que utilizar uma função de maneira implícita. Matemáticamente dá pra discordar disso, computacionalmente é mais difícil.

Mentira. Nós já usamos uma função sim. O nome dela é "Main"

int main()
{
  cout << "Sim, a main é uma função";
  return 0;
}

Ela é uma função especial. O compilador de C++ procura essa função pra conseguir montar o executável. Se ele não conseguir encontrar, você não tem executável.

Mas você pode definir outras funções. Por exemplo, você pode definir uma função linear de uma forma bem simples:

double f(double x)
{
  return x + 5;
}

Ok isso define uma função, mas como a gente usa isso?

Definir uma função segue mais ou menos o seguinte padrão:

"Tipo retornado" "nome da função"("tipo argumento 1" "argumento 1", "tipo argumento 2" "argumento 2")
{
  //Corpo da função
  return "Coisa do tipo: Tipo Retornado"
}

Então, é mais ou menos isso aí, agora vamos colocar duas formas de você utilizar isso no seu próprio código. O ponto importante é, a sua função deve estar definida antes que você a utilize de fato. Então você tem duas escolhas: Ou você define as funções na ordem lógicas delas.

double f(double x)
{
  return x + 5;
}

int main()
{
  cout << f(5);
  return 0;
}

Sim, estamos suprimindo o "#include<iostream>" e o "using namespace std;" Você vai esquecer isso pelo resto da sua vida, mas estamos assumindo que você vai lembrar dessas coisas.

Ah, sim e a segunda forma:

double f(double x);

int main()
{
  cout << f(5);
  return 0;
}

double f(double x)
{
  return x + 5;
}

Pode isso Arnaldo? Claro que pode. Tanto pode que você vai ver que o bagulho vai compilar e rodar normalmente. A brincadeira é que você pode definir o protótipo das funções no início do arquivo e definí-las na ordem que quiser em seguida, pois nesse caso não está óbvio qual função vai usar qual. Apenas que elas existem e vão necessitar de determinados parâmetros.

Por ora é isso! Veremos mais nos próximos capítulos.

Nenhum comentário:

Postar um comentário