sexta-feira, 16 de março de 2012

Aula 05 - O que é uma função? Como criá-la?

Aula 05 - O que é uma função? Como criá-la?
Função... Você já ouviu ou leu essa palavra em algum lugar? Se não na internet, na escola já, porque é muito estudado para encontrar valores das incógnitas estudadas. O que é uma função?
Função são blocos, fora do programa principal, que vão exercer funções para facilitar e diminuir os códigos. Na verdade, quase tudo em C/C++ mais e uma função. Conhece o "comando"
int main() {


Isso é uma função. Existem funções que retornam valores, e as que não retornam. Dentre elas existem as com argumentos, e as sem argumentos.


Funções que não retornam valores sem argumentos
Uma função que não retorna valores é aquela que tem como tipo: void; Esse void é o tipo de função, que será o tipo de saída.
"Funções são como variáveis que guardam inúmeras linhas de código. Se não prototipadas, elas devem ser escritas antes da função MAIN, afim de serem compiladas primeiro para poderem ser utilizadas pela função main."
É quase o mesmo que querer comer uma maçã do pomar e quando chegar lá não tem nenhuma, você continuará com fome. Porque não tem maçãs produzidas no pomar. Seria o mesmo que querer utilizar uma função no MAIN e não tem nenhuma função produzida anteriormente.


Fonte: tiexpert.net

Após o tipo de saída, teremos o nome da função e depois os argumentos entre parênteses. 
PS: Se a função tiver argumentos, deixe os parenteses vazios, mas não os retire.
PS: Após o nome da função, não se utiliza ponto-e-vírgula (";").

TIPO DE RETORNONOME DA FUNÇÃOARGUMENTOS
voidMensagem()

Agora criaremos uma função:
void Mensagem() // Sem ponto e vírgula
{ // Abre o bloco de códigos da função
cout << "Aprendendo sobre funções" << endl; // Mostra uma mensagem na tela
return; // Sem nenhum valor, pois void não retorna valores
} // Fecha o bloco de códigos da função

int main ()
{
Mensagem(); // Chama a função Mensagem
system("pause");  //Pausa a aplicação
return 0; // Retorna valor 0 pois é tipo INT
}

Para chamá-la, basta digitar o nome da função. Se ela tiver argumentos, ponha os valores referente ao argumento. 

Funções que retornam valores com argumentos
Um exemplo bem prático disso é um cálculo. Um cálculo que precise de mais de uma linha por exemplo.
#include
using namespace std;
int factorial(int n);

int main ()
{
    int n1,fact;
    cout << "Enter the number whose factorial has to be calculated" <<  endl;
    cin >> n1;
    fact=factorial(n1);
    cout << "The factorial of " << n1 << "  is : " << fact << endl;
    return(0);
}

int factorial(int n) // int = tipo de retorno
{
int i=0, fact =1;
if(n<=1)
return 1;
else
{
for(i=1;i<=n;i++)
{
cout << fact << "*";
            fact=fact*i;
            cout << i << "=" << fact << endl;
}
return fact;
}
}
Fonte:  cpp-tutorial.cpp4u.com - editado por Shepher
Resultado:
Imagine, por exemplo, você ter um programa que executa essa função diversas vezes. Imagina ter que botar esse código SEMPRE que for fazer a mesma coisa... Seria ruim, não é? E funções diminui o código, pois com uma linha, você pode fazer uma coisa de várias.

TIPO DE RETORNONOME DA FUNÇÃOARGUMENTOS
intfactorial(int n)
O parâmetro de entrada é n. A função usará o valor de n como um número normalmente, como se ele substituísse na função (matemática básica, funções, incógnitas).
Depois de ele realizar todos os loops do laço for (estruturas de controle, requerimento básico para o tutorial) ele retorna o valor com o comando return;. 
Lembrando que quando se usa o comando return, ele sai da função. 

Funções no WYD
Funções no WYD são as mesmas coisas. Só que agora teremos que ver alguns valores básicos.
  • O inventário tem um total de 63 slots. Sendo eles de 0~62. 
  • Os equipamentos tem um total de 16 slots. Sendo eles de 0~15
  • O máximo de buffs são 4
  • Limite de clients conectados por padrão é 127 (pois trava a tmsrv)
  • Limite de level admin sem bugar = 1011
  • Limite de 4 chars por conta: 0~3
  • Limite de 6 adicionais (contando os EF e EFV)
  • Banco tem 120 slots
Basicamente é isso. Não me recordei de mais nada, mas se eu lembrar, eu adiciono, e se você souber, comente. 
Bom, uma boa função para começarmos a aprender, seria a pegar a quantidade de item X no inventário. 
Primeiro teremos que analisar. Perguntas básicas:

  • Essa função retornará um valor? Se retornar, é tipo char, ou int?
  • Essa função precisará de  argumentos (variáveis de entrada, para exercer sua função)?

Depois de responder essa perguntas, você escreve...

TIPO DE RETORNONOME DA FUNÇÃOARGUMENTOS
int ou char                        Nome_Da_Função                          (variáveis de entrada)


Iremos fazer a função: GetAmountItem. Fará exatamente o que fizemos acima.
Dica: Recomendo por o nome da sua função auto-explicativa. Como acima: GetAmountItem = Pegar Quantidade de Itens.

Como eu disse nas aulas anteriores, pensar é inevitável, então, teremos que fazer isso. Qual seria o algoritmo?
Um loop for para todos os slots do inventário
Verificar se o item que está no slot X é o item procurado, se for adiciona a contagem, se não, continua.
Após todo o for, retorna o valor da contagem


Simples, não é?
Respondendo as perguntas anteriores, e com o algoritmo, poderemos fazer o código facilmente.
Respostas das perguntas:
Respostas:

  • Essa função retornará um valor? Se retornar, é tipo char, ou int? Retornará. Valor tipo int (valor numérico inteiro)
  • Essa função precisará de  argumentos (variáveis de entrada, para exercer sua função)? Sim, serão o clientid e o item procurado
Agora transformaremos o algoritmo em código C++.

TIPO DE RETORNONOME DA FUNÇÃOARGUMENTOS
int                             GetAmountItem                 (int clientid, int item)                               


int GetAmountItem(int clientid, int item) 
{
st_Mob *player = (st_Mob*)GetMobFromIndex(clientid); // sempre adicione isso
int count; // variável que irá retornar

Esse é o "cabeçalho". A variável "count" será a variável que irá adicionar caso for o item procurado.
Bom, agora teremos que utilizar um comando for. Sua síntese para quem não lembra:
for(inicialização;condicional para executar;incremento)
De acordo com os limites que falei antes, o inventário tem 63 slots, sendo de 0~62. O que teremos que fazer então? Um for para 0~63.
for(int i = 0; i<=63;i++)
E depois, a verificação do inventário se é o item pedido. A variável do item pedido é "item". Ficaria como? Se você fez assim:
if(player->Inventory[i].Index == item)
Você acertou. E depois disso, apenas adicionar a variável count += 1;
count ++

Compare seu código com o código criado por mim:
int GetAmountItem(int clientid, int item) { st_Mob *player = (st_Mob*)GetMobFromIndex(clientid); int count; for(int i=0; i<=64;i++) { if(player->Inventory[i].Index == item) count++; } return count; }
Finalizando
Com o passar do tempo, teremos mais aulas sobre funções, porém mais complexas.


Atenciosamente, Shepher

Nenhum comentário:

Postar um comentário