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