Trocando dados com funções em C++
No tutorial anterior, de nossa seção de Funções em C++, vimos como criar e invocar uma função.Bastou chamar pelo nome: hello(), que ela veio rapidinho e executou de imediato.
Poderíamos chamar 1 milhão de vezes, que ela executaria 1 milhão de vezes, sem precisar ficar repetindo código, basta invocar a função sempre que precisarmos fazer aquilo que ela se propõe a fazer.
Mas ali tem um problema...quando invocamos uma função, a execução sai do local onde houve a chamada e vai pra outro local da memória, onde estão as instruções da função, executa tudo, e volta. Nesse caso anterior, não há uma comunicação entre quem chamou e a função.
Vamos ver um código C++ onde invocamos uma função que pede o número e exibe seu dobro:
#include <iostream> using namespace std; void doub() { float num, dobro; cout<<"Digite um numero: "; cin >> num; dobro = 2*num; cout<<"Dobro: "<<dobro<<endl; } int main() { doub(); return 0; }Legal, né? Porém, a gente não tem acesso a essa informação 'dobro', não podemos pegar ela pra usar em outro cálculo, por exemplo, ele é simplesmente exibido dentro da função e ao término dela, esse valor se perde. As variáveis internas das funções são criadas localmente, e depois excluídas.
Se tentar usar 'dobro' fora da função vai ver que dá um erro de compilação.
Precisamos achar outra maneira de fazer a função se comunicar com o exterior, de enviar informações pra fora, concorda que isso é importante?
O comando RETURN em Funções
Sempre que quisermos enviar uma informação de dentro de uma função para o local onde ela foi chamada, usamos o comando return.Primeiro, no cabeçalho de declaração da função, precisamos informar o tipo de dado que a função vai retornar. No exemplo anterior é void porque ela não retorna nada.
Se o tipo de dado que ela vai retornar é um float, por exemplo, seu cabeçalho deve ser:
float doub() {...}
E dentro do escopo da função devemos fazer: return info;
Onde info deve ser um float.
Pronto, a informação 'info' será retornada, devolvida para o local onde a função foi invocada.
Vamos criar uma função que pede um número, dobra ele e retorna seu dobro:
#include <iostream> using namespace std; float doub() { float num, dobro; cout<<"Digite um numero: "; cin >> num; dobro = 2*num; return dobro; } int main() { float res; res = doub(); cout<<"Dobro: "<<res<<endl; return 0; }Agora, quando chamamos a função: doub()
Um valor é retornado para quem chamou ela, volta um float, no caso.
Então armazenamos o resultado desse retorno na variável res (obviamente, deve ser float):
res = doub();
E prontinho, essa variável vai ter dobro do valor que o usuário digitar lá dentro da função.
Podemos até deixar o código mais enxuto, veja:
#include <iostream> using namespace std; float doub() { float num; cout<<"Digite um numero: "; cin >> num; return (2*num); } int main() { cout<<doub()<<endl; return 0; }
Veja que podemos dar return numa expressão, diretamente: return 2*num;
Exemplo de uso de RETURN em Funções
Vamos agora criar uma função de par ou ímpar.Se for par, ela deve retornar 0, se for ímpar deve retornar 1.
Veja como fica nosso código C++:
#include <iostream> using namespace std; int par_impar() { int num; cout<<"Digite um numero: "; cin >> num; if(num%2==0) return 0; else return 1; } int main() { if(par_impar()==0) cout<<"É par!\n"; else cout<<"É ímpar!\n"; return 0; }Note agora que tem dois comandos return dentro da nossa função par_impar(), isso pode, mas veja que somente um ou outro pode acontecer, nunca um IF e um ELSE é executado, é sempre um deles.
Vamos dar uma enxugada nesse código?
#include <iostream> using namespace std; int par_impar() { int num; cout<<"Digite um numero: "; cin >> num; return (num%2); } int main() { if(!par_impar()) cout<<"É par!\n"; else cout<<"É ímpar!\n"; return 0; }Conseguiu entender de boa?
Boas práticas de funções
Primeiro, nomes de funções: não existe um jeito certo nem errado de usar, mas recomendamos ser consistentes com o nome delas.De preferência crie funções com o nome no seguinte estilo: c_progressivo(), projeto_progressivo(), van_der_graaf_generator() ... - tudo minúsculo, separado por _
Ou: cProgressivo(), projetoProgressivo(), vanDerGraafGenerator()...- primeira letra minúscula, e maiúscula para início das próximas palavras, ok?
Segundo, use muitas funções, e faças elas bem comunicativas, sempre que possível retornando e recebendo (vamos ver no próximo tutorial) dados, de maneira bem lógica e clara.
Assim como cada peça do seu carro ou cada órgão do seu corpo faz sua tarefa específica, eles também se comunicam e trocam informações entre si, isso é essencial para o bom funcionamento do sistema.
As funções de um sistema devem fazer o mesmo! Isso é uma boa prática de programação, não se esqueça! Faça suas funções serem facilmente 'acopladas' com outras funções, isso vai ser essencial para você ser capaz de criar sistemas grandes e robustos, como softwares empresariais, sistemas operacionais, jogos, etc.
Nenhum comentário:
Postar um comentário