Slides Lição 7, CPAD, O Perigo Da Murmuração, 2Tr24.pptx
(ACH2001) Introdução à Programação - Aula 05
1. Aula 05 – Subrotinas
Norton Trevisan Roman
19 de mar¸co de 2020
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 1 / 34
2. Constantes
Suponha que queremos incrementar nossa cabana
com uma piscina:
Piscina
r
Sala
Quarto
Banheiro
lat
lat/2
lat
comp
Queremos ent˜ao fazer um programa que calcule a
´area da cabana e da piscina
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 2 / 34
4. Constantes
Como?
Temos o raio da piscina
Basta vermos como
adicionar o π
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 3 / 34
5. Constantes
Como?
Temos o raio da piscina
Basta vermos como
adicionar o π
Podemos fazer:
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
double pi = 3.14159;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 3 / 34
6. Constantes
Como?
Temos o raio da piscina
Basta vermos como
adicionar o π
Podemos fazer:
E a sa´ıda ser´a “´Area:
12.56636”
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
double pi = 3.14159;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 3 / 34
7. Constantes
E se fizermos:
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
double pi = 3.14159;
pi = 12;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 4 / 34
8. Constantes
E se fizermos:
Teremos “´Area: 48.0”
Inadvertidamente
mudamos algo que deveria
ser constante
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
double pi = 3.14159;
pi = 12;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 4 / 34
9. Constantes
Devemos tornar π
constante, fazendo:
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
final double pi = 3.14159;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 5 / 34
10. Constantes
Devemos tornar π
constante, fazendo:
E, se tentarmos mudar
o valor, teremos
$ javac AreaPiscina.java
AreaPiscina.java:11: cannot
assign a value to final
variable pi
pi = 12;
^
1 error
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
final double pi = 3.14159;
pi = 12;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 5 / 34
11. Constantes
“final” especifica que
o valor n˜ao mais
poder´a ser mudado no
programa
Define uma constante
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
// valor do pi
final double pi = 3.14159;
areap = pi * raio * raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 6 / 34
12. Constantes
Alternativamente,
podemos usar uma
constante j´a definida
no java:
Math.PI, valendo
3.141592653589793
Math.PI ´e double, por
isso areap tamb´em o ´e
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
areap = Math.PI * raio
* raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 7 / 34
13. Constantes
E como podemos
mudar raio * raio?
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
areap = Math.PI * raio
* raio;
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 8 / 34
14. Constantes
E como podemos
mudar raio * raio?
Math.pow(a,b) d´a o
resultado de ab
O resultado tamb´em ´e
double
class AreaPiscina {
public static void main(
String[] args) {
// raio da piscina
double raio = 2;
// ´area da piscina
double areap;
areap = Math.PI *
Math.pow(raio,2);
System.out.println("´Area: "+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 8 / 34
15. M´etodos
Math ´e como se fosse
uma biblioteca, que nos
fornece o m´etodo pow
(al´em da constante PI)
N˜ao ´e uma biblioteca, ´e
mais que isso, mas
veremos mais adiante
class AreaPiscina {
public static void main(
String[] args){
double raio = 2;
double areap;
areap = Math.PI *
Math.pow(raio,2);
System.out.println(
"´Area: "+ areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 9 / 34
16. M´etodos
Math ´e como se fosse
uma biblioteca, que nos
fornece o m´etodo pow
(al´em da constante PI)
N˜ao ´e uma biblioteca, ´e
mais que isso, mas
veremos mais adiante
M´etodo?
class AreaPiscina {
public static void main(
String[] args){
double raio = 2;
double areap;
areap = Math.PI *
Math.pow(raio,2);
System.out.println(
"´Area: "+ areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 9 / 34
17. M´etodos
Um m´etodo ´e uma
implementa¸c˜ao de uma
subrotina
Nesse caso, pow(a,b)
recebe dois valores, a e
b, devolvendo o
resultado de ab
Os valores a e b
fornecidos ao m´etodo s˜ao
chamados argumentos de
seus parˆametros
class AreaPiscina {
public static void main(
String[] args){
double raio = 2;
double areap;
areap = Math.PI *
Math.pow(raio,2);
System.out.println(
"´Area: "+ areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 10 / 34
18. M´etodos
Vamos ent˜ao juntar os dois programas que vimos at´e
agora em um s´o:
class AreaCasa {
public static void main(
String[] args) {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
double raio = 2;
double areap;
System.out.println(...);
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."
+ areat);
areap = Math.PI *
Math.pow(raio,2);
System.out.println("..."+areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 11 / 34
19. M´etodos
E qual a saida?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 12 / 34
20. M´etodos
E qual a saida?
C´alculo da ´area da casa
A ´area da sala ´e 121.0
A ´area do banheiro ´e 38.5
A ´area do quarto ´e 38.5
A ´area total ´e 198.0
A ´area da piscina ´e 12.566370614359172
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 12 / 34
21. M´etodos
Esse programa est´a ficando confuso:
Mistura a casa com a piscina
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 13 / 34
22. M´etodos
Esse programa est´a ficando confuso:
Mistura a casa com a piscina
Que fazer?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 13 / 34
23. M´etodos
Esse programa est´a ficando confuso:
Mistura a casa com a piscina
Que fazer?
Podemos dividi-lo em 2 partes: uma para o c´alculo da casa e
outra para o c´alculo da piscina
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 13 / 34
24. M´etodos
Esse programa est´a ficando confuso:
Mistura a casa com a piscina
Que fazer?
Podemos dividi-lo em 2 partes: uma para o c´alculo da casa e
outra para o c´alculo da piscina
Como?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 13 / 34
25. M´etodos
Esse programa est´a ficando confuso:
Mistura a casa com a piscina
Que fazer?
Podemos dividi-lo em 2 partes: uma para o c´alculo da casa e
outra para o c´alculo da piscina
Como?
Criando nossos pr´oprios m´etodos
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 13 / 34
27. M´etodos
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..." + areat);
}
static double areaPiscina()
{
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
Ambos dentro do
mesmo programa...
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 14 / 34
28. M´etodos
O que significa o
void?
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 15 / 34
29. M´etodos
O que significa o
void?
Que o m´etodo n˜ao ir´a
retornar nenhum valor
Ele apenas executa a
tarefa e termina
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 15 / 34
30. M´etodos
O que significa o
void?
Que o m´etodo n˜ao ir´a
retornar nenhum valor
Ele apenas executa a
tarefa e termina
E o static?
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 15 / 34
31. M´etodos
O que significa o
void?
Que o m´etodo n˜ao ir´a
retornar nenhum valor
Ele apenas executa a
tarefa e termina
E o static?
Por hora, apenas
aceitemos...
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 15 / 34
32. M´etodos
O que significa o
double?
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 16 / 34
33. M´etodos
O que significa o
double?
Que o m´etodo ir´a retornar
um valor do tipo double
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 16 / 34
34. M´etodos
O que significa o
double?
Que o m´etodo ir´a retornar
um valor do tipo double
Semelhante ao pow(a,b)
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 16 / 34
35. M´etodos
O que significa o
double?
Que o m´etodo ir´a retornar
um valor do tipo double
Semelhante ao pow(a,b)
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
E o return?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 16 / 34
36. M´etodos
O que significa o
double?
Que o m´etodo ir´a retornar
um valor do tipo double
Semelhante ao pow(a,b)
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
E o return?
´E quando o valor ´e efetivamente retornado
A subrotina para a´ı
Alternativas:
return(Math.PI * Math.pow(raio,2));
return Math.PI * Math.pow(raio,2);
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 16 / 34
37. M´etodos
E como usamos isso no
corpo do programa?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 17 / 34
38. M´etodos
E como usamos isso no
corpo do programa?
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 17 / 34
39. M´etodos
E como usamos isso no
corpo do programa?
Note que areaPiscina()
retorna valor, ent˜ao
guardamos esse valor em
areap
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 17 / 34
40. M´etodos
E como usamos isso no
corpo do programa?
Note que areaPiscina()
retorna valor, ent˜ao
guardamos esse valor em
areap
J´a areaCasa() n˜ao
retorna nada, ent˜ao
apenas a executamos
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 17 / 34
41. Vis˜ao Geral do C´odigo
class AreaCasa {
static void areaCasa() {
float lateral = 11;
float cquarto = 7;
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
static double areaPiscina() {
double raio = 2;
return(Math.PI *
Math.pow(raio,2));
}
public static void main(String[] args)
{
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("..."+areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 18 / 34
42. M´etodos
Qual a utilidade de criarmos nossos pr´oprios
m´etodos?
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 19 / 34
43. M´etodos
Qual a utilidade de criarmos nossos pr´oprios
m´etodos?
Clareza: ao olharmos o
corpo do programa,
vemos claramente o que
´e feito, sem nos
preocuparmos com
detalhes
O m´etodo top-down fica
claro
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 19 / 34
44. M´etodos
Qual a utilidade de criarmos nossos pr´oprios
m´etodos?
Clareza: ao olharmos o
corpo do programa,
vemos claramente o que
´e feito, sem nos
preocuparmos com
detalhes
O m´etodo top-down fica
claro
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Portabilidade: se precisarmos, em outro programa,
usar a mesma subrotina, ela j´a est´a separada
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 19 / 34
45. M´etodos
Nossos m´etodos, contudo, n˜ao s˜ao gerais:
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 20 / 34
46. M´etodos
Nossos m´etodos, contudo, n˜ao s˜ao gerais:
areaCasa() funciona
apenas para casas da
dimens˜ao de nosso projeto
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 20 / 34
47. M´etodos
Nossos m´etodos, contudo, n˜ao s˜ao gerais:
areaCasa() funciona
apenas para casas da
dimens˜ao de nosso projeto
areaPiscina() funciona
apenas para piscinas
redondas de raio 2
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 20 / 34
48. M´etodos
Nossos m´etodos, contudo, n˜ao s˜ao gerais:
areaCasa() funciona
apenas para casas da
dimens˜ao de nosso projeto
areaPiscina() funciona
apenas para piscinas
redondas de raio 2
public static void main(
String[] args) {
double areap;
areaCasa();
areap = areaPiscina();
System.out.println("A ´area
da piscina ´e "+areap);
}
Como poder´ıamos fazer para tornar esses m´etodos
mais gerais?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 20 / 34
49. Parˆametros
A ideia ´e manter o formato da casa e da piscina,
mas permitir que seu tamanho varie
Como fazˆe-lo?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 21 / 34
50. Parˆametros
A ideia ´e manter o formato da casa e da piscina,
mas permitir que seu tamanho varie
Como fazˆe-lo? Com parˆametros:
static double areaPiscina(double raio){
return(Math.PI * Math.pow(raio,2));
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 21 / 34
51. Parˆametros
A ideia ´e manter o formato da casa e da piscina,
mas permitir que seu tamanho varie
Como fazˆe-lo? Com parˆametros:
static double areaPiscina(double raio){
return(Math.PI * Math.pow(raio,2));
}
O m´etodo agora deve receber um valor (argumento)
em seu parˆametro
Como o Math.pow
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 21 / 34
53. Parˆametros
Como chamamos esse
m´etodo de outras
partes do programa?
public static void main
(String[] args) {
double areap;
areaCasa();
areap = areaPiscina(2);
System.out.println("A
´area da piscina ´e "+
areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 22 / 34
54. Parˆametros
E o que acontece ao chamarmos areaPiscina(2)
de dentro do main?
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 23 / 34
55. Parˆametros
E o que acontece ao chamarmos areaPiscina(2)
de dentro do main?
O sistema ir´a alocar
mem´oria para todas as
vari´aveis e parˆametros
declarados dentro do
m´etodo
raio
areaPiscina
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 23 / 34
56. Parˆametros
E o que acontece ao chamarmos areaPiscina(2)
de dentro do main?
O sistema ir´a alocar
mem´oria para todas as
vari´aveis e parˆametros
declarados dentro do
m´etodo
raio 2
areaPiscina
Colocando o valor passado como parˆametro l´a
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 23 / 34
57. Parˆametros
E o que acontece ao chamarmos areaPiscina(2)
de dentro do main?
O sistema ir´a alocar
mem´oria para todas as
vari´aveis e parˆametros
declarados dentro do
m´etodo
raio 2
areaPiscina
Colocando o valor passado como parˆametro l´a
Ao ato de passar um valor externo para dentro de
um procedimento, via parˆametro, chamamos de
passagem por valor
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 23 / 34
58. Parˆametros
E o que acontece ao chamarmos areaPiscina(2)
de dentro do main?
O sistema ir´a alocar
mem´oria para todas as
vari´aveis e parˆametros
declarados dentro do
m´etodo
raio 2
areaPiscina
Colocando o valor passado como parˆametro l´a
Ao ato de passar um valor externo para dentro de
um procedimento, via parˆametro, chamamos de
passagem por valor
Nesse caso, o valor externo ´e copiado para a regi˜ao de
mem´oria correspondente ao parˆametro
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 23 / 34
59. Parˆametros
O que acontece se
tivermos algo assim?
public static void main(String[]
args) {
double areap;
double raio = 2;
areaCasa();
areap = areaPiscina(raio);
System.out.println("A ´area da
piscina ´e "+areap);
}
raio
areaPiscina
args areap
raio 2
main
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 24 / 34
60. Parˆametros
O que acontece se
tivermos algo assim?
O valor de raio, em
main, ´e copiado para
dentro da vari´avel
raio em
areaPiscina
public static void main(String[]
args) {
double areap;
double raio = 2;
areaCasa();
areap = areaPiscina(raio);
System.out.println("A ´area da
piscina ´e "+areap);
}
raio 2
areaPiscina
args areap
raio 2
main
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 24 / 34
61. Parˆametros
O que acontece se
tivermos algo assim?
O valor de raio, em
main, ´e copiado para
dentro da vari´avel
raio em
areaPiscina
S˜ao duas regi˜oes de
mem´oria diferentes
public static void main(String[]
args) {
double areap;
double raio = 2;
areaCasa();
areap = areaPiscina(raio);
System.out.println("A ´area da
piscina ´e "+areap);
}
raio 2
areaPiscina
args areap
raio 2
main
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 24 / 34
62. Parˆametros
O que acontece se
tivermos algo assim?
O valor de raio, em
main, ´e copiado para
dentro da vari´avel
raio em
areaPiscina
S˜ao duas regi˜oes de
mem´oria diferentes
Sim... main ´e um
m´etodo tamb´em
public static void main(String[]
args) {
double areap;
double raio = 2;
areaCasa();
areap = areaPiscina(raio);
System.out.println("A ´area da
piscina ´e "+areap);
}
raio 2
areaPiscina
args areap
raio 2
main
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 24 / 34
63. Parˆametros
Incluindo parˆametros em areaCasa():
class AreaCasa {
static void areaCasa(float
lateral,float cquarto){
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
static double areaPiscina(double
raio){
return Math.PI*
Math.pow(raio,2);
}
public static void main(String[]
args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("..."+
areap);
}
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 25 / 34
64. M´etodos e Mem´oria
Como fica o m´etodo
areaCasa na mem´oria?
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 26 / 34
65. M´etodos e Mem´oria
Como fica o m´etodo
areaCasa na mem´oria?
Ao ser chamado (ou
invocado) em main,
ser´a separada uma
regi˜ao na mem´oria para
esse m´etodo
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
areaCasa
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 26 / 34
66. M´etodos e Mem´oria
Como fica o m´etodo
areaCasa na mem´oria?
Ao ser chamado (ou
invocado) em main,
ser´a separada uma
regi˜ao na mem´oria para
esse m´etodo
Essa regi˜ao conter´a
todas suas vari´aveis
internas (locais), e
todos seus parˆametros
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
areaCasa
lateral cquarto
areaq areas areat
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 26 / 34
67. M´etodos e Mem´oria
public static void main(
String[] args) {
...
areaCasa(11,7);
...
}
Os valores de entrada
s˜ao ent˜ao copiados para
dentro dos parˆametros
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
areaCasa
lateral 11 cquarto 7
areaq areas areat
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 27 / 34
68. M´etodos e Mem´oria
Considerando o programa como um todo, como
agir´a na mem´oria?
public static void main(String[] args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area da
piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 28 / 34
69. M´etodos e Mem´oria
Considerando o programa como um todo, como
agir´a na mem´oria?
Ao iniciar main, ser´a alocado espa¸co para suas vari´aveis e
parˆametros
args areap
main public static void main(String[] args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area da
piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 28 / 34
70. M´etodos e Mem´oria
Considerando o programa como um todo, como
agir´a na mem´oria?
Ao iniciar main, ser´a alocado espa¸co para suas vari´aveis e
parˆametros
Ent˜ao areaCasa(11,7) ´e executada, e o mesmo processo
ocorre
args areap
main public static void main(String[] args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area da
piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 28 / 34
71. M´etodos e Mem´oria
Aloca-se espa¸co,
copiando-se os valores
aos parˆametros:
args areap
main
areaCasa
lateral 11 cquarto 7
areaq areas areat
public static void main(String[] args){
...
areaCasa(11,7);
...
}
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 29 / 34
72. M´etodos e Mem´oria
A cada atribui¸c˜ao, a
mem´oria
correspondente ´e
atualizada
args areap
main
areaCasa
lateral 11 cquarto 7
areaq areas 121 areat
public static void main(String[] args){
...
areaCasa(11,7);
...
}
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 30 / 34
73. M´etodos e Mem´oria
A cada atribui¸c˜ao, a
mem´oria
correspondente ´e
atualizada
args areap
main
areaCasa
lateral 11 cquarto 7
areaq 38.5 areas 121 areat
public static void main(String[] args){
...
areaCasa(11,7);
...
}
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 30 / 34
74. M´etodos e Mem´oria
A cada atribui¸c˜ao, a
mem´oria
correspondente ´e
atualizada
args areap
main
areaCasa
lateral 11 cquarto 7
areaq 38.5 areas 121 areat 198
public static void main(String[] args){
...
areaCasa(11,7);
...
}
static void areaCasa(float lateral,
float cquarto) {
float areaq;
float areas;
float areat;
System.out.println("...");
areas = lateral*lateral;
System.out.println("..."+areas);
areaq = cquarto*(lateral/2);
System.out.println("..."+areaq);
System.out.println("..."+areaq);
areat = areas + 2*areaq;
System.out.println("..."+areat);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 30 / 34
75. M´etodos e Mem´oria
Ao terminar areaCasa,
sua mem´oria ´e limpa, e
areaPiscina ´e rodada:
args areap
main
static double areaPiscina(double raio)
{
return Math.PI * Math.pow(raio,2);
}
public static void main(String[] args)
{
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area da
piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 31 / 34
76. M´etodos e Mem´oria
Ao terminar areaCasa,
sua mem´oria ´e limpa, e
areaPiscina ´e rodada:
args areap
main areaPiscina
raio 2
static double areaPiscina(double raio)
{
return Math.PI * Math.pow(raio,2);
}
public static void main(String[] args)
{
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area da
piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 31 / 34
77. M´etodos e Mem´oria
Ao terminar
areaPiscina, sua
mem´oria ´e limpa, e o
resultado ´e armazenado
em areap:
args areap12.566370614359172
main
public static void main(
String[] args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area
da piscina ´e "+areap);
}
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 32 / 34
78. M´etodos e Mem´oria
Ao terminar
areaPiscina, sua
mem´oria ´e limpa, e o
resultado ´e armazenado
em areap:
public static void main(
String[] args){
double areap;
areaCasa(11,7);
areap = areaPiscina(2);
System.out.println("A ´area
da piscina ´e "+areap);
}
Finalmente, quando main
terminar, tamb´em ser´a
removida
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 32 / 34
79. M´etodos e Mem´oria
Repare que toda vez que um m´etodo termina ele
libera a mem´oria que ocupava
Ent˜ao, qual a utilidade de criarmos nossos pr´oprios
m´etodos al´em de clareza e portabilidade?
Melhor uso da mem´oria: as vari´aveis relevantes ao
sub-problema (sub-rotina) ocupam a mem´oria apenas
durante a solu¸c˜ao desse sub-problema
Norton Trevisan Roman Aula 05 – Subrotinas 19 de mar¸co de 2020 33 / 34