quinta-feira, 19 de fevereiro de 2015

0.0.0.10.1 - métodos 3

Procedimentos e sua relação com funções matemáticas 3.

Objetivo desta aula:

Apresentar procedimentos/funções/métodos/subrotinas.

links citados durante a aula

Métodos na especificação da linguagem Java

Tutorial sobre métodos em Java

Código completo do exemplo inicial

  class Taximetro {
   static double f (double x) {
    return 5+0.5*x;
   }
   public static void main (String[] args) {
    System.out.println ("ola");
    double w=5.0;
    System.out.println (f(w));
   }
  }
  

Código completo do exemplo ampliado

  class Taximetro {
   static double f (double x, int b) {
    double r;
    if (b==1) {
     r=5+0.5*x;
     } else {
     r=5+1.0*x;
    }
    return r;
   }
   public static void main (String[] args) {
    System.out.println ("ola");
    double w=5.0;
    int bandeira=2;
    System.out.println (f(w,bandeira));
   }
  }
  
  • Tente explicar o funcionamento do código acima, tenha especial atenção com o que ocorre com os parâmetros de f.
  • É possível reescrever a função, por exemplo usando switch e manter a funcionalidade. experimente.
  • Usar constantes (literais) pode ser desvantajoso, você seria capaz de mudar a função de maneira que o valor da bandeirada e do quilômetro sejam passados para a função como parâmetros? Neste caso, f teria quatro parâmetros.

Composição de funções

Voltando à matemática, existe o conceito de composição de funções, por exemplo g(f(x)). Que significa que aplicamos f sobre x e sobre o resultado, aplicamos g.

Como exemplo, temos uma empresa que envia seus funcionários para passar o dia em seus clientes e ao final do dia os traga de volta, de taxi. Para essa empresa, é interessante calcular o valor de duas corridas, mais o preço da espera do motorista, que é de R$80.00. Usemos a função mais simples de cálculo de valor de corrida.

f(x)=5+0.5*x, onde x é a distância percorrida em quilômetros.

e g(z)=80+2*z, onde z é o valor da corrida.

O código completo correspondente é:

   static double f (double x) {
    return 5+0.5*x;
   }
   static double g (double z) {
    return 80.0+2.0*z;
   }
   public static void main (String[] args) {
    System.out.println ("ola");
    double w=5.0;
    System.out.println (g(f(w)));
   }
  
  • Construa uma função, g(d,h) que receba o dia da semana e a hora, e retorne a bandeira que deve ser usada.
  • Componha esta função com a de cálculo de valor de corrida ampliada (f(x,b)) e apresente uma nova função h(x,d,h). Dica: como você escreveria (em notação matemática), a composição de f com g?

Escopo das variáveis

Quando trabalhamos com várias funções simultaneamente, precisamos ter claro como as variáveis funcionam nesta situação. Por exemplo, se definirmos em main uma variável x, ela é a mesmo que usamos na função f(x)?

Chamamos escopo da variável o intervalo do código em que essa variável é acessível. Em geral, uma variável é acessível no bloco onde é declarada e nos blocos contidos por ele. Por exemplo, se declararmos uma variável dentro da classe e fora de qualquer função, ela pode ser acessada por qualquer função:

  class Taximetro {
   static String mensagem="Táxis Ipê, calculando o valor da sua corrida...";
   static double f (double x, int b) {
    System.out.println (mensagem);
    double r;
    if (b==1) {
     r=5+0.5*x;
     } else {
     r=5+1.0*x;
    }
    return r;
   }
   public static void main (String[] args) {
    System.out.println ("ola");
    double w=5.0;
    int bandeira=2;
    System.out.println (f(w,bandeira));
   }
  }
  

A variável mensagem está definida dentro da classe, assim como os métodos f e main. Logo, ela pode ser usada dentro deles.

A variável mensagem foi declarada no escopo da classe. Em linguagens orientadas a objeto, ela é chamada atributo da classe (em C seria variável da classe;na documentação de java , é chamada member variable). Como até agora trabalhamos exclusivamnte em um contexto estático, a variável tem que ser estática também.

Quando trabalhamos com uma única classe em escopo estático, os atributos podem ser chamados "variáveis globais", em referência a tais variáveis no paradigma procedural.

A existência de vários escopos (e a escolha dos desenvolvedores da linguagem), permite declarar em diferentes escopos, variáveis de mesmo nome (no começo pode gerar um pouco de confusão, mas com a prática, veremos que é muito útil).

Uma ilustração deste caso é:

  class Taximetro {
   static double x=7.0;
   static double f (double x) {
    return x;
    
   }
   public static void main (String[] args) {
    double x=5.0;
    System.out.println (f(2.0));
   }
  }
  

Antes de ir para a próxima página, responda:

  • Que valor será impresso na tela quando executarmos o programa?
  • Quantas variáveis de nome x existem no programa?
  • Qual é o escopo de cada variável?

Próxima parte.

Nenhum comentário:

Postar um comentário