Funções e Menus 

Funções são segmentos de programa que executam uma determinada tarefa específica. Já foram utilizadas funções providenciadas pelas bibliotecas do C++ como pow(), sin(), getch(), etc. em aulas anteriores. Alem destas, o programador pode criar suas próprias funções. Estas são chamadas de funções de usuário ou rotinas de usuário. Com isto se pode segmentar um programa grande em vários programas menores. Esta segmentação é chamada de modularização e permite que cada segmento seja escrito, testado e revisado individualmente sem alterar o funcionamento do programa como um todo. 
Estrutura das funções definidas pelo usuário

A estrutura de uma função de usuário é muito semelhante a estrutura dos programas elaborados até agora. Uma função de usuário constitui-se de um bloco de instruções que definem os procedimentos efetuados pela função, um nome pelo qual a chamamos e uma lista de argumentos passados a função. Chamamos este conjunto de elementos de definição da função. 

Definição de funções

De modo formal, a sintaxe de uma função é a seguinte:
tipo nomef(tipo1 var1, tipo2 var2, ...)
{
bloco de instruções da função;
}

Depois de definida uma função, pode-se usá-la dentro de um programa qualquer. 

Exemplo: o código mostrado abaixo é uma função definida pelo usuário para transformar uma ângulo de graus para radianos:

float radianos(float graus){
float rad;
rad = (graus/180)*3.1415;
return(rad);
}

No exemplo acima definimos uma função chamada radianos que recebe um argumento tipo float: graus. O valor em radianos é calculada e armazenada na variável rad declarada internamente. A função envia, para o programa ou bloco que a chamou, um valor também do tipo float: o valor da variável rad. Este retorno de valor é feito pela função return() que termina a execução da função e retorna o valor de rad para o programa ou bloco que a chamou. 


Exemplo: No exemplo abaixo chamamos a função radiano() dentro de um programa principal:
#include <iostream.h> 
#include <stdlib.h> 
#include <math.h> 
#include <stdio.h>
#include <conio.h> 
// definindo a função
float radianos(float graus){
float rad;
rad = (graus/180)*3.1415;
return(rad);
}
void main(){
float angulo_graus, angulo_radianos, x, y;
cout<<" Este programa calcula o valor do seno e do co-seno de um ângulo dado em graus \n "
cout<<"Digite o angulo em graus ";
cin>>angulo_graus;
angulo_radianos = radianos(angulo_graus); // chamada a função 
x=sin(angulo_radianos);
y=cos(angulo_radianos);
cout<<"\n O valor do seno de "<< angulo_graus << " : " << x ;
cout<<"\n O valor do co-seno de "<< angulo_graus << " : " << y ; 
getche(); 
}
Observando a definição da função, no modo formal, a primeira linha da função contém a declaração da função. Na declaração de uma função se define o nome da função, seu tipo de retorno e a lista de argumentos que recebe. Em seguida, dentro de chaves {}, foi definido o bloco de instruções da função.
O tipo de retorno da função especifica sempre deve ser igual ao tipo de dado retornado pela função. Se a função não retorna nenhum valor para o programa que a chamou devemos definir o retorno como void, ou seja um retorno ausente. Vale notar que existe apenas um valor de retorno para funções C++. Por ser um identificador, o nome da função segue as mesmas regras de definição de nomes de variáveis.
A lista de argumentos (tipo1 var1, tipo2 var2,...) da função especifica são iguais os valores que a função recebe. As variáveis da lista de argumentos são manipuladas normalmente no bloco de instruções da função. A chamada de uma função termina com a instrução return() que transfere o controle para o programa que chamou a função. Esta instrução tem duas finalidades: determina o fim lógico da rotina e o valor de retorno da função. O argumento de return() será retornado como valor da função.

Localização das funções

Existem basicamente duas posições possíveis para escrevermos o corpo de uma função: ou antes ou depois do bloco principal. Podemos ainda escrever uma função no mesmo arquivo do programa principal ou em arquivo separado. 
Corpo da função antes do programa principal (no mesmo arquivo)
Quando escrevemos a definição de uma função antes do programa principal e no mesmo arquivo deste, nenhuma outra instrução é necessária. A sintaxe geral para isto é a seguinte:

Sintaxe de um função

Uma função escrita antes do programa principal:
//Cabeçalho

tipo nomef(...){ // definição da função
corpo de função;
}

void main(){ // programa principal
...
x = nomef(...) // chamada da função
...
}

Exemplo de programa que envolve funções e menu com switch

#include <iostream.h> 
#include <stdlib.h 
#include <math.h> 
#include <stdio.h>
#include <conio.h> 
#include <cstring> 
#define UNI " Universidade Regional do Noroeste do Estado do Rio Grande do Sul"
#define disc " Matematica Computacional II "
#define grupo " Fulano de Tal e Beltrano "
#define prof " Tania Michel Pareira "

///////// funcao fatorial/////////////////
float fatorial( int n) 
{ float f=1;
if (n>1) 
for(int i=2;i<=n;i++) 
f=f*i;
return f; 

////////////funcao/procedimento/subprograma/////////////////
void combinacao( ) 
{ float c=1,op;

int n, m;
for(;;)
{
cout << " Calculo do numero de combinacoes de n elementos distintos,";
cout << " tomados de m a m ";
cout << endl<<" Entre com o numero total de elementos n para calcularo";
cout << " numero de combinacoes";
cin >> n;
cout << endl<<" Entre com o numero de elementos de cada combinacao,para";
cout << " calcular o numero de combinacoes";
cin >> m;
if (n>1) 
c=fatorial(n)/(fatorial(n-m)*fatorial(m));
cout << endl << " O numero de combinacoes com " << n;
cout << " elementos tomados de "<<m<<" em "<<m <<"e' "<<c; 
cout<< endl<< " Digite 1 para continuar ou 2 para sair ";
cin>>op; 

if(op!=1) break;


///////////////funcao/procedimento/subprograma////////////////
void arranjo() 
{ float a=1;

int n, m,op;
for(;;)
{
cout << " Calculo do numero de arrajos de n elementos distintos,";
cout <<" tomados de m a m ";
cout << endl<<" Entre com o numero total de elementos n para calcular";
cout << " o numero de arranjos";
cin >> n;
cout << endl<<" Entre com o numero de elementos de cada arranjo, para";
cout<<" calcular o numero de arranjos";
cin >> m;
if (n>1)
a=fatorial(n)/fatorial(n-m); 
cout << endl << " O numero de arranjos";
cout << " com " << n << " elementos tomados de "<<m<<" em "<<m <<"e' "<<a; 
cout << endl<< " Digite 1 para continuar ou 2 para sair ";
cin >> op; 
if(op!=1) break;


////////////// funcao/procedimento/subprograma ////////////////////

void permutacao( ) 

float p=1;
int n,op;
for(;;) 
{
cout << " Calculo do numero de Permutacao de n elementos distintos ";
cout << endl<<" Entre com o numero de elementos distintos para calcular";
cout <<" o numero de permutacoes";
cin >> n;
if (n>1) 
p=fatorial(n);
cout << endl << " O numero de permutacoes com " << n << " elementos ";
cout <<" distintos e' "<<p; 
cout<< endl<< " Digite 1 para continuar ou 2 para sair ";
cin>>op;
if( op!=1) break;


///////////// funcao principal com menu ////////////
void main ()
{int opcao=4;
while (opcao>=4)

cout << UNI <<endl<< disc <<endl<< prof <<endl<< grupo <<endl;
cout << "\n Programa para o calculo do numero de elementos em analise";
cout << "Analise Combinatoria" <<endl<<endl;
cout << " 1-Calculo do numero de permutacoes\n";
cout << " 2-Calculo do numero de arranjos \n";
cout << " 3-Calculo do numero de combinacoes \n";
cout << " 4-Sair \n";
cout << endl<<" Entre com o numero da opcao desejada \n";
cin >> opcao;
switch (opcao)
{
case 1 : permutacao(); break;
case 2 : arranjo(); break; 
case 3 : combinacao(); break;
case 4 : exit(1);
default : opcao=1; 
} //fim do switch
}//fim do while
getche(); 
}//fim do main