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?
Nenhum comentário:
Postar um comentário