SUBprogramaS2011<br />
Tópicos que pretendemos abordar !<br />Introdução<br />Características gerais<br />Definições básicas<br />Entradas de sub...
INTRODUÇÃO<br /><ul><li> Problemas complexos trajem programas complexos como solução.
 Para facilitar a solução é possível dividir um grande problema em problemas menores.</li></li></ul><li>INTRODUÇÃO - CONCE...
Um subprograma, é um nome dado a um trecho de um programa mais complexo e que, em geral,    encerra em si próprio um pedaç...
Reutilização.
Defeitos podem ser evitados, pois a replicação de código pode levar a modificações incompletas.
Aumento da legibilidade de um programa.
Abstração
Facilita o design de algoritmos, pois um problema é dividido em subproblemas</li></li></ul><li>INTRODUÇÃO - VANTAGENS<br /...
Características  gerais<br /><ul><li>Todo subprograma tem um único ponto de entrada.
 Toda unidade de programa chamadora é suspensa durante a execução do subprograma chamado.
Existe um único subprograma em execução em qualquer momento dado (unidade de programa chamadora)
O controle sempre retorna ao chamador quando a execução do subprograma encerra-se.</li></li></ul><li>FLUXOGRAMA  BÁSICO<br />
Existe Excessão?<br />SIM<br />NÃO<br />
DEFINIÇÕES BÁSICAS<br />Definição de subprograma<br /><ul><li>     Descreve as interfaces e as ações da abstração de subpr...
 Oferece um nome para o subprograma.
Especifica a lista de parâmetros.</li></ul><palavra especial><nome>(parâmetros):(retorno)<br />
DEFINIÇÕES  BÁSICAS<br />Perfil dos parâmetros  <br />	É a lista de parâmetros formais, incluindo o número, ordem e seus t...
ENTRADAS DE SUBPROGRAMAS<br /><ul><li>Acesso direto à variáveis não-locais
Computação ocorre em diferentes dados atribuindo novos valores às variáveis não-locais.
Reduz confiabilidade
Passagem de parâmetros
Dados são acessados por nomes locais.
Mais flexível – computação parametrizada
Preocupação com o método de acesso</li></li></ul><li>PARÂMETROS FORMAIS<br /><ul><li> O parâmetro no cabeçalho do subprogr...
 Freqüentemente se veicula ao armazenamento somente quando o subprograma é chamado.
Vinculo gerado pela variável do programa.</li></li></ul><li>PARÂMETROS  REAIS ou ATUAIS<br /><ul><li>Usados na chamada ao ...
Representa o valor (ou endereço) das variáveis ou constantes, utilizadas no ponto de invocação do subprograma.</li></li></...
  1º parâmetro atual é vinculado ao 1º parâmetro formal e assim por diante.
Vantagem
Ordem dos parâmetros é irrelevante;
Desvantagem
Programador tem de conhecer os nomes dos identificadores dos parâmetros formais.</li></ul>Ex: Visual Basic:<br />ShowMesg(...
VALORES  POR  OMISSÃO<br /><ul><li> Valor default para o parâmetro formal caso não seja passado um parâmetro real.
Valores por omissão existem em:
Exemplo em C++: </li></ul>// calculo do valor máximo de 1, 2 ou 3 nº positivos<br />Protótipo: <br />intmaximo(int x,int y...
Definem novas instruções, como, por exemplo, Pascal não possui uma instrução de classificação
Podem produzir resultados no chamador por meio de
Variáveis não-locais.
Parâmetros formais que 	permitem a transferência 	de dados ao chamador</li></li></ul><li>FUNÇÕES<br />CREATE [OR REPLACE] ...
Procedimentos e funções existem no java?<br />V<br />V<br />
QUER DIZER QUE VOID NÃO RETORNA NADA?<br />V<br />F<br />Publicvoid  teste() {<br />	System.out.Println(“Só testando”);<br...
Ambientes de Referência local<br /><ul><li>Os subprogramas tem permissão para definir suas próprias variáveis.
Acesso fica restrito apenas ao subprograma que a declarou.
 Variáveis Locais
Elas podem ser estáticas ou dinâmicas.</li></li></ul><li>Lembrando Variáveis locais estáticas<br /><ul><li>Vantagens
Acesso direto
Não exige alocação e desalocação.
Mais eficiente.
Desvantagens
Não permite recursividade.
 Uma vez criada, o espaço de memória que ela ocupa não pode mais ser  alterado
A alocação de memória para esse tipo de variável é feita antes da execução  do programa.
Área de memória ocupada por ela se mantém constante durante toda a execução
Variáveis que existem o tempo todo.</li></li></ul><li>Lembrando Variáveis locais dinâmicas<br />São alocadas quando o subp...
Ambientes de Referência local<br />Algumas linguagens que permitem ambiente estático:<br />„ 	<br />„ „ <br />Algumas Ling...
Exemplo no caso do C ou C++ <br />int somador (intlist [ ], intlistlen) {<br />staticint soma = 0;<br />intcont;<br />	for...
Só para lembra no java isso NÃO pode!!!! </li></li></ul><li>Métodos de Passagem de Parâmetros<br />Formas de transmitir os...
Modelo Semântico de Passagem de Parâmetros<br /><ul><li>Os parâmetros formais (lembram-se?) são caracterizados por um de t...
Modo de entrada (in mode)
eles podem somente receber dados dos parâmetros reais correspondentes
Modo de saída (out mode)
eles podem somente transmitir dados dos parâmetros reais correspondentes
„Modo entrada/saída (inoutmode)
podem fazer ambos</li></li></ul><li>PERDIDOS ?<br />Vamos tentar melhorar a explicação nos próximos slides<br />
Modelos Implementação de Passagem de Parâmetros<br /><ul><li>Projetistas de Linguagens desenvolveram vários modelos para o...
 Passagem por resultado
 Passagem por valor-resultado
 Passagem por referência
 Passagem por nome</li></li></ul><li>Passagem por Valor<br /><ul><li>O valor do parâmetro REAL é usado para inicializar o ...
Cópia física - o parâmetro REAL é avaliado e o seu valor é copiado para o parâmetro formal.
 Operações de armazenamento e de transferência pode ser custosa se o parâmetro for grande (array longo)</li></li></ul><li>...
Nenhum valor é transmitido para o subprograma.
Logicamente é um modelo de implementação do modo saída.
O parâmetro FORMAL age como variável local, mas seu valor é passado para o parâmetro real ( variável) da chamada.
Problema
Tempo e espaço de memória.  (Passagem por Valor)
Colisão de parâmetros atuais. Ex.: sub(p1, p1).</li></ul>			No retorno: x é atribuído à p1, y é atribuído à p1<br />			A o...
Passagem por Valor-Resultado<br /><ul><li>Modo Entrada/Saida
Valor do parâmetro real é usado para inicializar o parâmetro formal, que age como variável local.
Parâmetros formais devem ter armazenamento local associado ao subprogama.
No fim o valor do parâmetro formal é transmitido de volta para o parâmetro real.
Upcoming SlideShare
Loading in …5
×

SubProgramas

8,661
-1

Published on

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,661
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
135
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

SubProgramas

  1. 1. SUBprogramaS2011<br />
  2. 2. Tópicos que pretendemos abordar !<br />Introdução<br />Características gerais<br />Definições básicas<br />Entradas de subprogramas <br />Procedimentos e funções<br />Passagem de Parâmetros<br />Subprogramas SobreCarregagos<br />Subprogramas Genéricos<br />
  3. 3. INTRODUÇÃO<br /><ul><li> Problemas complexos trajem programas complexos como solução.
  4. 4. Para facilitar a solução é possível dividir um grande problema em problemas menores.</li></li></ul><li>INTRODUÇÃO - CONCEITO<br /><ul><li>Coleção de instruções
  5. 5. Um subprograma, é um nome dado a um trecho de um programa mais complexo e que, em geral, encerra em si próprio um pedaço da solução de um problema maior (o programa a que ele está subordinado).</li></li></ul><li>INTRODUÇÃO - VANTAGENS<br /><ul><li>Economia, tempo...
  6. 6. Reutilização.
  7. 7. Defeitos podem ser evitados, pois a replicação de código pode levar a modificações incompletas.
  8. 8. Aumento da legibilidade de um programa.
  9. 9. Abstração
  10. 10. Facilita o design de algoritmos, pois um problema é dividido em subproblemas</li></li></ul><li>INTRODUÇÃO - VANTAGENS<br />double a, b, c;<br /> a = Convert.ToDouble(Console.ReadLine());<br /> b = Convert.ToDouble(Console.ReadLine());<br /> c = a * b / 2.0;<br /> Console.WriteLine("Valor de A = " + a);<br /> Console.WriteLine ("Valor de B = " + b);<br /> Console.WriteLine("Valor de A*B/2 = " + c);<br /> a = a / 2.0;<br /> b = b / 2.0;<br /> c = a * b / 2;<br /> Console.WriteLine("Valor de A = " + a);<br /> Console.WriteLine ("Valor de B = " + b);<br /> Console.WriteLine("Valor de A*B/2 = " + c);<br />double a, b,c;<br />a = Convert.ToDouble(Console.ReadLine());<br />b = Convert.ToDouble(Console.ReadLine());<br />c = a * b / 2.0;<br />imprimir(a, b);<br />a = a / 2.0;<br />b = b / 2.0;<br />c = a * b / 2;<br />imprimir(a, b);<br />
  11. 11. Características gerais<br /><ul><li>Todo subprograma tem um único ponto de entrada.
  12. 12. Toda unidade de programa chamadora é suspensa durante a execução do subprograma chamado.
  13. 13. Existe um único subprograma em execução em qualquer momento dado (unidade de programa chamadora)
  14. 14. O controle sempre retorna ao chamador quando a execução do subprograma encerra-se.</li></li></ul><li>FLUXOGRAMA BÁSICO<br />
  15. 15. Existe Excessão?<br />SIM<br />NÃO<br />
  16. 16. DEFINIÇÕES BÁSICAS<br />Definição de subprograma<br /><ul><li> Descreve as interfaces e as ações da abstração de subprograma.</li></ul>Chamada a subprograma: <br /><ul><li> Solicitação explicita para executar o programa</li></ul>Subprograma ativo: <br /><ul><li>Depois de ter sido chamado, o subprograma iniciou a execução mas ainda não a concluiu.</li></li></ul><li>DEFINIÇÕES BÁSICAS<br />Cabeçalho: <br /><ul><li> A primeira linha da definição
  17. 17. Oferece um nome para o subprograma.
  18. 18. Especifica a lista de parâmetros.</li></ul><palavra especial><nome>(parâmetros):(retorno)<br />
  19. 19. DEFINIÇÕES BÁSICAS<br />Perfil dos parâmetros <br /> É a lista de parâmetros formais, incluindo o número, ordem e seus tipos.<br /> Muito interessante em subprogramas sobrecarregados.<br />„Protocolo <br /> É o seu perfil de parâmetros, e no caso de função, conjuntamente com o tipo de retorno. <br />„<br />Declaração <br /> Protótipo fornece o protocolo mas não o corpo do subprograma.<br />
  20. 20. ENTRADAS DE SUBPROGRAMAS<br /><ul><li>Acesso direto à variáveis não-locais
  21. 21. Computação ocorre em diferentes dados atribuindo novos valores às variáveis não-locais.
  22. 22. Reduz confiabilidade
  23. 23. Passagem de parâmetros
  24. 24. Dados são acessados por nomes locais.
  25. 25. Mais flexível – computação parametrizada
  26. 26. Preocupação com o método de acesso</li></li></ul><li>PARÂMETROS FORMAIS<br /><ul><li> O parâmetro no cabeçalho do subprograma.
  27. 27. Freqüentemente se veicula ao armazenamento somente quando o subprograma é chamado.
  28. 28. Vinculo gerado pela variável do programa.</li></li></ul><li>PARÂMETROS REAIS ou ATUAIS<br /><ul><li>Usados na chamada ao subprograma
  29. 29. Representa o valor (ou endereço) das variáveis ou constantes, utilizadas no ponto de invocação do subprograma.</li></li></ul><li>Correspondência entre parâmetros reais e formais<br />Parâmetros Posicionais<br /><ul><li>Vinculação efetuada pela ordem dos parâmetros.
  30. 30. 1º parâmetro atual é vinculado ao 1º parâmetro formal e assim por diante.
  31. 31. Vantagem
  32. 32. Ordem dos parâmetros é irrelevante;
  33. 33. Desvantagem
  34. 34. Programador tem de conhecer os nomes dos identificadores dos parâmetros formais.</li></ul>Ex: Visual Basic:<br />ShowMesg(Mesg:="Hello World", MyArg1:=7) <br />
  35. 35. VALORES POR OMISSÃO<br /><ul><li> Valor default para o parâmetro formal caso não seja passado um parâmetro real.
  36. 36. Valores por omissão existem em:
  37. 37. Exemplo em C++: </li></ul>// calculo do valor máximo de 1, 2 ou 3 nº positivos<br />Protótipo: <br />intmaximo(int x,int y=0,int z=0);<br />Invocação: <br />cout << maximo(5) << maximo(5, 7);<br />cout << maximo(4, 8, 9);<br /><ul><li> Um valor por omissão é utilizado caso não seja especificado o corresponde parâmetro atual.</li></li></ul><li>PROCEDIMENTOS <br />Exemplo em Pascal<br />procedure nome(argumentos);<br />var <br />{aqui colocamos as variáveis que serão<br /> usadas só neste procedimento}<br />begin<br />{aqui vai a parte executável, a<br /> lógica do procedimento}<br />end;<br /><ul><li>Coleção de instruções que definem computações parametrizadas
  38. 38. Definem novas instruções, como, por exemplo, Pascal não possui uma instrução de classificação
  39. 39. Podem produzir resultados no chamador por meio de
  40. 40. Variáveis não-locais.
  41. 41. Parâmetros formais que permitem a transferência de dados ao chamador</li></li></ul><li>FUNÇÕES<br />CREATE [OR REPLACE] FUNCTION nome_da_função<br />    [ ( [(parâmetro, (parâmetro]) ]<br />    RETURN tipodavariável de retorno<br />IS | AS<br />    [sessão de declaração]<br />BEGIN<br />    sessão de execução<br />[EXCEPTION<br />   sessão de excessão]<br />END [nomedafunção];<br />Semanticamente modeladas em funções matemáticas<br />Classificadas como modelo confiável.<br />O valor produzido por uma função é retornado ao código chamador, substituindo efetivamente a própria chamada.<br />Pode definir novos operadores determinados pelos usuários, como, por exemplo, a exponenciação.<br />
  42. 42. Procedimentos e funções existem no java?<br />V<br />V<br />
  43. 43. QUER DIZER QUE VOID NÃO RETORNA NADA?<br />V<br />F<br />Publicvoid teste() {<br /> System.out.Println(“Só testando”);<br />return;<br />}<br />
  44. 44. Ambientes de Referência local<br /><ul><li>Os subprogramas tem permissão para definir suas próprias variáveis.
  45. 45. Acesso fica restrito apenas ao subprograma que a declarou.
  46. 46. Variáveis Locais
  47. 47. Elas podem ser estáticas ou dinâmicas.</li></li></ul><li>Lembrando Variáveis locais estáticas<br /><ul><li>Vantagens
  48. 48. Acesso direto
  49. 49. Não exige alocação e desalocação.
  50. 50. Mais eficiente.
  51. 51. Desvantagens
  52. 52. Não permite recursividade.
  53. 53. Uma vez criada, o espaço de memória que ela ocupa não pode mais ser alterado
  54. 54. A alocação de memória para esse tipo de variável é feita antes da execução do programa.
  55. 55. Área de memória ocupada por ela se mantém constante durante toda a execução
  56. 56. Variáveis que existem o tempo todo.</li></li></ul><li>Lembrando Variáveis locais dinâmicas<br />São alocadas quando o subprograma se inicia e desalocadas quando ele é finalizado.<br />O ambiente local é criado em cada ativação.<br />„ „ Vantagens:<br /> Permitem recursividade<br />A memória utilizada pela pilha pode ser compartilhada entre subprogramas.<br />Desvantagens:<br />Tempo de reservar e libertar memória.<br />Acesso pode ser indireto ao invés do acesso direto da estática<br />Não pode reter valores de variáveis locais entre chamadas<br />
  57. 57. Ambientes de Referência local<br />Algumas linguagens que permitem ambiente estático:<br />„ <br />„ „ <br />Algumas Linguagens que permitem ambiente de Pilha dinâmica:<br />„ <br />
  58. 58. Exemplo no caso do C ou C++ <br />int somador (intlist [ ], intlistlen) {<br />staticint soma = 0;<br />intcont;<br /> for (cont = 0; cont < listlen; cont ++)<br /> soma += list [cont];<br />return soma;<br />}<br /><ul><li>Só vai ser estática a menos que seja delcarada como static.
  59. 59. Só para lembra no java isso NÃO pode!!!! </li></li></ul><li>Métodos de Passagem de Parâmetros<br />Formas de transmitir os parâmetros para os subprogramas chamados.<br />Modelos<br />Modelos semânticos <br />métodos de passagem de parâmetros<br />Modelos conceituais <br />como as transferências de dados desenvolve-se na transmissão de parâmetros<br />Modelos de implementação<br /> passagem de parâmetros<br />
  60. 60. Modelo Semântico de Passagem de Parâmetros<br /><ul><li>Os parâmetros formais (lembram-se?) são caracterizados por um de três modelos significados diferentes.
  61. 61. Modo de entrada (in mode)
  62. 62. eles podem somente receber dados dos parâmetros reais correspondentes
  63. 63. Modo de saída (out mode)
  64. 64. eles podem somente transmitir dados dos parâmetros reais correspondentes
  65. 65. „Modo entrada/saída (inoutmode)
  66. 66. podem fazer ambos</li></li></ul><li>PERDIDOS ?<br />Vamos tentar melhorar a explicação nos próximos slides<br />
  67. 67. Modelos Implementação de Passagem de Parâmetros<br /><ul><li>Projetistas de Linguagens desenvolveram vários modelos para orientar a implementação</li></ul>dos três modelos básicos de transmissão de parâmetros.<br /><ul><li> Passagem por valor
  68. 68. Passagem por resultado
  69. 69. Passagem por valor-resultado
  70. 70. Passagem por referência
  71. 71. Passagem por nome</li></li></ul><li>Passagem por Valor<br /><ul><li>O valor do parâmetro REAL é usado para inicializar o parâmetro FORMAL, que se torna então uma variável local no subprograma.
  72. 72. Cópia física - o parâmetro REAL é avaliado e o seu valor é copiado para o parâmetro formal.
  73. 73. Operações de armazenamento e de transferência pode ser custosa se o parâmetro for grande (array longo)</li></li></ul><li>Passagem por Resultado<br /><ul><li>Um parâmetro é passado por resultado
  74. 74. Nenhum valor é transmitido para o subprograma.
  75. 75. Logicamente é um modelo de implementação do modo saída.
  76. 76. O parâmetro FORMAL age como variável local, mas seu valor é passado para o parâmetro real ( variável) da chamada.
  77. 77. Problema
  78. 78. Tempo e espaço de memória. (Passagem por Valor)
  79. 79. Colisão de parâmetros atuais. Ex.: sub(p1, p1).</li></ul> No retorno: x é atribuído à p1, y é atribuído à p1<br /> A ordem da atribuição determina o valor de p1<br />
  80. 80. Passagem por Valor-Resultado<br /><ul><li>Modo Entrada/Saida
  81. 81. Valor do parâmetro real é usado para inicializar o parâmetro formal, que age como variável local.
  82. 82. Parâmetros formais devem ter armazenamento local associado ao subprogama.
  83. 83. No fim o valor do parâmetro formal é transmitido de volta para o parâmetro real.
  84. 84. Partilha com a passagem por valor e a passagem por resultado as mesmas desvantagens. </li></li></ul><li>Passagem por Referência<br /><ul><li>Outro modelo no estilo entrada / saída
  85. 85. Transmite um caminho, uma referência ao invés dos valores.
  86. 86. O caminho de acesso é um endereço para a célula que armazena o parâmetro real.
  87. 87. Ele acessa o parâmetro REAL na unidade do programa, ou seja o parâmetro real é partilhado com o subprograma chamado.</li></li></ul><li>Passagem por Referência<br />Vantagens<br /><ul><li>Transmissão de parâmetros eficiente tanto em termos de tempo como de espaço.
  88. 88. Não é necessário espaço duplicado, nem qualquer atividade de cópia.</li></ul>Desvantagens<br /><ul><li>Provavelmente será mais lento porque mais um nível de endereçamento indireto será necessário.
  89. 89. Se for comunicação unidirecional com o subprograma, mudanças podem ser feitas no parâmetro real.
  90. 90. Apelidos podem ser criados. Pois se torna disponível caminhos de acesso aos subprogramas. Ampliando o acesso as variáveis não locais.</li></li></ul><li>Passagem Por Nome<br /><ul><li>Modo entrada/saída que não corresponde a um só modelo de implementação.
  91. 91. Parâmetro formal é substituindo textualmente pelo parâmetro real.
  92. 92. Parâmetros Formais são vinculados a um método de acesso no momento de chamada.
  93. 93. Vinculação real a um valor ou endereço é retardada até que uma referência ou atribuição ao parâmetro formal seja realizada. (Vinculação tardia)
  94. 94. Aqui a forma do parâmetro real determina o modelo de implementação de parâmetros</li></li></ul><li>Relembrando Vinculação tardia<br /><ul><li>Também conhecida como late binding.
  95. 95. O método a ser chamado só pode ser determinado em tempo de execução.
  96. 96. Chamadas aos métodos sobrescritos, resolvidas em tempo de execução com base no tipo de objeto referenciado.
  97. 97. Impede a  a verificação do tipo estático.
  98. 98. o compilador tem que assumir que o método existe.
  99. 99.  um erro de ortografia simples pode causar um erro de execução para ser acionada.</li></li></ul><li>Passagem Por Nome<br /> REPITO: Aqui a forma do parâmetro real determina o modelo de implementação de parâmetros<br />Por exemplo:<br /> Se parâmetro real é uma variável escalarentão<br /> passagem equivalente à passagem por referência<br />Se parâmetro real é uma expressão constanteentão<br /> passagem equivalente à passagem por valor<br />Se parâmetro real é um elemento de arrayou<br /> parâmetro real é uma expressão que contém uma variávelentão<br /> passagem diferente de quaisquer métodos apresentados<br />
  100. 100. Exemplo passagem por nome em<br />procedurefirst;<br />integer array LIST[1:2];<br />integer GLOBAL;<br />procedure sub(PARAM); <br />integer PARAM;<br />begin<br /> PARAM := 3; // LIST[GLOBAL] := 3;<br />end;<br />begin<br /> LIST[1] = 40;<br /> GLOBAL := 2;<br /> sub(LIST[GLOBAL]);<br />end;<br />
  101. 101. Exemplos de Métodos de Passagem de Parâmetros <br /><ul><li>Passagem por valor se utilizarmos ponteiros como parâmetros, obtemos a semântica da passagem por referência.
  102. 102. Modos semânticos: Saída e Entrada/Saída
  103. 103. Os anteriores ao 77, a maioria utiliza passagem por referência.
  104. 104. Os posteriores, passagem por valor-resultado.
  105. 105. Modo semântico: Entrada/Saída.
  106. 106. Introduziu passagem por nome (de difícil implementação).
  107. 107. Também permite passagem por valor.</li></li></ul><li>Exemplos de Métodos de Passagem de Parâmetros <br />ALGOL W<br /><ul><li>Introduziu passagem por valor-resultado
  108. 108. Modo semântico: Entrada/Saída
  109. 109. Modos semânticos</li></ul> Entrada, Saída, Entrada/Saída<br />procedure somador(A: in out INTEGER; <br /> B: in INTEGER;C: out FLOAT)<br /><ul><li>Passagem por valor
  110. 110. Passagem por referência (reservada var)
  111. 111. Modos semânticos: Entrada e Entrada/Saída</li></li></ul><li>Passagem de parâmetro no java é por valor ou por referência? <br />Valor<br />REF<br />
  112. 112. JAVA POSSUI DOIS TIPOS DE VARIÁVEIS<br />Tipo referência<br /><ul><li>Englobam o tipo classes, interfaces e
  113. 113. arrays.
  114. 114. Uma variável do tipo referência recebe como valor uma referência para o tipo objeto.
  115. 115. Na área de memória da variável é armazenado um ponteiro para a área de memória que está o objeto.</li></ul>Tipo primitivo<br /><ul><li>Englobam os tipos numéricos booleanos.
  116. 116. Variável de tipo primitivo recebe um valor que é armazenado diretamente no espaço de memória alocado.</li></li></ul><li>RESPOSTA<br /> Java é SEMPRE POR VALOR.<br /> Ao passar uma variável como parâmetro de um método sempre será efetuada a cópia dos bits desta variável<br />Por exemplo:<br />publicstaticvoidmain(String[] args) { Carro carro = newCarro(); carro.preco = 10; System.out.println("Preço antes : " + carro.preco); // Saída "Preço antes : 10"somaPreco(carro); System.out.println("Preço depois: " + carro.preco); // Saída "Preço depois: 10" }privatestaticvoidsomaPreco(Carro parametro) {parametro = null; }<br />
  117. 117. Implementando Métodos de Passagem de Parâmetros<br />Pilha em tempo de execução<br /><ul><li>Pilha inicializada e mantida ativa por um programa de sistema que gerencia a execução de programas.
  118. 118. Usada para a ligação do controle de subprogramas.
  119. 119. Quem usa?
  120. 120. Passagem por valor
  121. 121. Por resultado
  122. 122. Por valor-resultado
  123. 123. Por referência:</li></ul>Segmentos de código (thunks)<br /><ul><li>Passagem por Nome</li></li></ul><li>Implementando Métodos de Passagem de Parâmetros<br /><ul><li>Parâmetros de passagem por valor:
  124. 124. Os valores dos parâmetros são copiados para localizações da pilha.
  125. 125. Estas localizações servem como armazenamento para os parâmetros formais.
  126. 126. Parâmetros de passagem por resultado:
  127. 127. Os valores atribuídos aos parâmetros reais são colocados na pilha, de onde podem ser chamados após o encerramento do subprograma chamado.
  128. 128. Parâmetros de passagem por valor-resultado
  129. 129. Implementados a partir de sua semântica como combinação dos dois tipos de passagem.
  130. 130. Localização da pilha é inicializada pela chamada e depois usada como variável local no subprograma.</li></li></ul><li>Implementando Métodos de Passagem de Parâmetros<br /><ul><li>Parâmetros de passagem por referência
  131. 131. O endereço do parâmetro é colocado na pilha
  132. 132. O acesso aos parâmetros formais no subprograma chamado é feito pelo endereçamento indireto da localização do endereço na pilha.</li></li></ul><li>Implementando Métodos de Passagem de Parâmetros<br />w<br />x<br />y<br />z<br />Programa principal Pilha procedimento sub<br />i<br />no início<br />valor de a<br />ref. a a<br />no final<br />valor de b<br />atribua a b<br />no início<br />ref. a c<br />no final<br />valor de c<br />atribua a c<br />ender. (no inicio)<br />Endereço (d)<br />Ref. a d<br />Código<br />
  133. 133. Implementando Métodos de Passagem de Parâmetros<br />OBSERVAÇÃO<br /><ul><li>Um erro fatal pode ocorrer com o parâmetro passado por referência e por valor resultado</li></ul>Por exemplo:<br /><ul><li>Um programa com 2 referências a constante 10.
  134. 134. 1° Com parâmetro real em um subprograma.
  135. 135. Suponha que subprograma modifique o parâmetro formal para 5.
  136. 136. Como só tem uma localização para 10 durante a compilação todas as ocorrências a 10 serão referências ao valor 5.</li></ul>Isso de fato aconteceu com implementações no FORTRAN IV<br />
  137. 137. Implementando Métodos de Passagem de Parâmetros<br /><ul><li>Parâmetros passados por nome
  138. 138. Implementados com procedimentos sem parâmetros.
  139. 139. Com segmentos de códigos chamados de Thunks.
  140. 140. Thunks
  141. 141. É chamado para toda referência a um parâmetro passado por um nome no subprograma.
  142. 142. Alavia a referência no ambiente do subprograma que passou o parâmetro real.
  143. 143. Veincula-se ao seu ambiente de referência na chamada que passo o parâmetro por nome.
  144. 144. Retorna o endereço do parâmetro real.
  145. 145. Processo lento e custoso em comparação ao endereçamento indireto simples passado, por referência.</li></li></ul><li>Arrays Multidimensionais como Parâmetros<br /><ul><li>Quando um array multidimensional é passado como parâmetro, e o subprograma é compilado separadamente, o compilador necessita conhecer o tamanho do array para </li></ul>construir a função de mapeamento.<br /><ul><li>Exemplo do C/C++:
  146. 146. Programador necessita declarar os tamanhos das dimensões, exceto da primeira. Este fato geral menor flexibilidade na programação.
  147. 147. O compilador deve ser capaz de criar a função de associação para um array.</li></ul>Arrays são armazenados em ordem de linha maior<br /> 3 4 7<br /> 6 2 5 -> 3, 4, 7, 6,2,5, 1,3,8<br /> 1 3 8 colunas 0,1,2, 0,1,2, 0,1,2<br />A função de associação relativa à ordem de linha maior para duas dimensões precisa do número de colunas, e não do número de linhas<br />
  148. 148. Arrays Multidimensionais como Parâmetros<br /><ul><li>Quando uma matriz é passada como um parâmetro, o parâmetro formal deve incluir o número de colunas no segundo par de colchetes
  149. 149. Exemplo em C (Primeira dimensão não incluída):</li></ul>void soma(int matriz[][3]){<br />int i, j, sum = 0;<br /> for (i = 0 ; i < 3; i++)...<br /> }<br />voidmain() {<br />int m[3][3];<br /> ...<br /> Soma (a); // Função de mapeamento:<br /> } <br /> // Seja S = sizeof(int), L = linha, C = coluna <br /> m[L, C] <=> *(&m[0][0] + (3 * S * L) + S * C)<br />
  150. 150. Arrays Multidimensionais como Parâmetros<br /><ul><li>Problema:
  151. 151. Não aceita matrizes com números diferentes de colunas
  152. 152. Uma nova função deve ser escrita para cada matriz com um número diferente de colunas
  153. 153. Impede a escrita de funções flexíveis
  154. 154. Como contornar o problema?
  155. 155. Aritmética de ponteiros
  156. 156. A matriz pode ser passada como um ponteiro, e as dimensões reais da matriz podem ser incluídas como parâmetros
  157. 157. A função pode avaliar a função de associação de armazenamento usando a aritmética de ponteiros cada vez que um elemento da matriz precisar ser referenciado</li></li></ul><li>Arrays Multidimensionais como Parâmetros<br />Exemplo em C (Solução para o problema da dimensão fixa de colunas):<br />„ Passar um apontador para o array e o tamanho das dimensões como parâmetros.<br />voidfun(float *mat, int linhas, intcols);<br />„ <br />Incluir a função de mapeamento em termos do tamanho dos parâmetros. Função de mapeamento (mat[i][j]):<br /> s = sizeof(float)<br />mat[i][j] = *(mat+(s*i*cols)+s*j);<br />
  158. 158. Arrays Multidimensionais como Parâmetros<br /><ul><li>Exemplo:</li></ul>type TIPO_MATRIZ is array (INTEGER range <>, INTEGER range <>) offloat;<br /> MATRIZ_1 : TIPO_MATRIZ (1..100, 1..20) //subscritos da matriz que estará como parâmetro real<br /><ul><li>Função que retorna a soma dos elementos de arrays do tipo TIPO_MATRIZ</li></ul>function SOMADOR(MAT : in TIPO_MATRIZ)<br /> SOMA : FLOAT = 0.0;<br />begin<br /> for LINHA in MAT’range(1) loop<br /> for COL in MAT’range(2) loop<br /> SOMA := SOMA + MAT(LINHA,COL);<br />end loop; - for COL...<br />end loop; - for LINHA...<br />return SOMA;<br />end SOMADOR;<br /><ul><li>O atributo RANGER retorna a faixa de subscritos nomeado da matriz passada.
  159. 159. Outras linguagens podem lidar de forma diferente com o problema de passar matrizes multidimendionais.
  160. 160. ADA determina o tamanho definido das dimensões de todas as matrizes usadas como parâmetros na hora da compilação.
  161. 161. Uma matriz não-restringida pode ser parâmetro formal e o código obtem a informação sobre a faixe de indices do parâmetro real associado.</li></li></ul><li>Arrays Multidimensionais como Parâmetros<br />float somador (floatmat[][]){<br />float soma = 0.0f;<br />for (int linha = 0; linha < mat.length; linha++) {<br /> for (int coluna = 0; coluna < mat[linha].length; coluna++) {<br /> soma += mat[linha][coluna];<br /> } // for para linha<br /> } // for para coluna<br />return soma;<br /> }<br />Uma vez que cada vetor tem seu próprio valor de tamanho, matriz também tem.<br />Como funciona no Java?<br /><ul><li>Semelhante a ADA. Em JAVA arrays são objectos, onde cada array herda uma constante (lenght) com o tamanho do array quando o objecto é criado.
  162. 162. O parâmetro formal é a variável com colchetes vazios.
  163. 163. Cada dimensão pode ser obtida no subprograma usando-se o atributo length.</li></li></ul><li>CONSIDERAÇÕPES DE PROJETO<br />Escolha de métodos de passagem de parâmetro<br /><ul><li>Eficiência
  164. 164. Passagem por referência é o modo mais eficiente para se transmitir estruturas de grande dimensão
  165. 165. Necessidade de transferência unidirecional ou bidirecional de dados
  166. 166. Boa programação
  167. 167. acesso limitado à variáveis externas, o que significa unidirecional quando possível.
  168. 168. Há uma consideração prática em conflito com esse princípio.
  169. 169. Por exemplo passar array de grande porte para um subprograma que não modifique tem como preferência um método unidirecional.</li></li></ul><li>CONSIDERAÇÕPES DE PROJETO<br /><ul><li>Os tipos de parâmetros reais são verificados em relação aos tipos de parâmetros formais?
  170. 170. Confiabilidade exige que os tipos dos parâmetros reais sejam verificados quanto a coerência com os tipos dos parâmetros formais correspondentes
  171. 171. Sem essa verificação de tipos, pequenos erros tipográficos podem levar a erros de programa difíceis de diagnosticar porque não são detectados pelo compilar ou pelo sistema em tempo de execução
  172. 172. No C original e no Fortran 77 não existe verificação de tipos.</li></li></ul><li>Parâmetros que são Nomes de Subprograma<br /><ul><li>Existe verificação de tipo dos parâmetros do subprograma utilizado como parâmetro real?
  173. 173. „ Pascal inicial e FORTRAN 77: Não;
  174. 174. „ Novas versões de Pascal, Modula-2, e FORTRAN 90: Sim;
  175. 175. „ Ada não permite subprograma como parâmetros;
  176. 176. „ C/C++: funções não podem ser passadas como parâmetros, mas pode-se transmitir apontador para funções (este contém o protocolo da função);
  177. 177. Parâmetros são verificados quanto a tipos.</li></li></ul><li>60<br /><ul><li>Ambiente de referenciamento dos subprogramas que são enviados como parâmetros
  178. 178. Possibilidades
  179. 179. Vinculação rasa – o ambiente de instrução de chamada que ordena o subprograma passado.
  180. 180. Vinculação profunda – o ambiente da definição do subprograma passado.
  181. 181. Vinculação Ad hoc – o ambiente da instrução de chamada que passou o subprograma como um parâmetro real.</li></ul>Parâmetros que são Nomes de Subprograma (3)<br />
  182. 182. Subprogramas<br />61<br />procedure SUB1;<br /> var x : integer;<br />procedure SUB2;<br />begin<br />write (‘x=‘, x)<br />end; {de sub2}<br />procedure SUB3;<br /> var x : integer;<br />begin<br /> x := 3;<br />SUB4(SUB2)<br />end; {de sub3}<br />procedure SUB4(SUBX);<br /> var x : integer;<br />begin<br /> x := 4;<br /> SUBX<br />end; {de sub4}<br />begin {de sub1}<br /> x := 1;<br /> SUB3<br />end; {de sub1}<br />Parâmetros que são Nomes de Subprograma <br />Se vinculação profunda, x = 1<br />Se vinculação ad hoc, x = 3<br />Se vinculação rasa, x = 4<br />
  183. 183. 62<br />Ex. de linguagens:<br />Vinculação profunda – é utilizado em linguagens de escopo estático (C e C++), porque o ambiente de definição é o mais natural.<br />Vinculação rasa – é utilizado em linguagens de escopo dinâmico (Pascal e SNOBOL), onde o ambiente do subprograma invocado é mais natural.<br />Parâmetros que são Nomes de Subprograma (5)<br />
  184. 184. Subprogramas<br />63<br />Subprogramas Sobrecarregados <br />Subprogramas podem ser sobrecarregados?<br /><ul><li>É um subprograma que possui o mesmo nome de outro subprograma num mesmo ambiente de referência (escopo), contudo têm de ter protocolos diferentes.
  185. 185. C++ e Ada possuem sobrecarga de subprogramas predefinidos e programadores podem implementar novos subprogramas sobrecarregados.
  186. 186. Exemplo em C++:</li></ul>intmaximo(int x, int y) <br /> { return x>y ? x : y; }<br />doublemaximo(double x, double y)<br /> { return x>y ? x : y; }<br />intmaximo(int x, int y, int w, int z)<br /> { returnmaximo(maximo(x,y),maximo(y,z));}<br />
  187. 187. Subprogramas<br />64<br /><ul><li>Ex. em C++:</li></ul>intmaximo(int x, int y)<br /> { return x>y ? x : y; }<br />doublemaximo(double x, double y)<br /> { return x>y ? x : y; }<br />intmaximo(int x, int y, int w, int z)<br /> { returnmaximo(maximo(x,y),maximo(y,z));}<br />Subprogramas Sobrecarregados<br />
  188. 188. Subprogramas Genéricos <br /><ul><li>Pense no seguinte problema.
  189. 189. Escrever um algoritmo de ordenação para vetores independente de seu tamanho.
  190. 190. Como fica a passagem de parâmetros?</li></li></ul><li>Subprogramas Genéricos<br /><ul><li>Como solução se cria um subprograma genérico, ou seja, que leva parâmetros de diferentes tipos.
  191. 191. Um subprograma genérico ou polimórfico é aquele que recebe parâmetros de tipos diferentes em diferentes ativações
  192. 192. Vantagens
  193. 193. Ganha em reutilização.
  194. 194. Não precisa implementar o mesmo algoritmo em diferentes subprogramas. </li></li></ul><li>Subprogramas Genéricos<br /><ul><li>Polimorfismo AD-HOC
  195. 195. Subprogramas Carregados
  196. 196. Permite ter funções de mesmo </li></ul>nome em classes sem relação.<br /><ul><li>Duas funções/métodos com o mesmo </li></ul>nome mas assinaturas diferentes.<br /><ul><li>Termo pode ser traduzido como  "para fim específico“.
  197. 197. Exemplo:
  198. 198. Uma função soma pode ser sobrecarregada para operar com dois parâmetros inteiros e dois reais.</li></li></ul><li>Subprogramas Genéricos<br /><ul><li>Polimorfismo Paramétrico
  199. 199. Funções de mesmo nome e parâmetros diferentes.
  200. 200. Torna possível a escolha automática do método a adotar por razão do tipo do parâmetro passado.</li></li></ul><li>Subprogramas Genéricos<br />Polimorfismo Paramétrico<br /> Exemplo:<br />Int adição ( int A, int B ) - Soma de totalidades.<br />Float adição (float A, float B ) – Soma de pontos flutuantes.<br />Char adição (char A, char B ) - Concatenação de 2 caracteres.<br />Observação: A assinatura do método define quem será chamado.<br /><ul><li>Perceberam que por ter o mesmo nome parece que existe apenas um único subprograma.
  201. 201. Como essas unidades são genéricas recebem o título de unidades genéricas</li></li></ul><li>Subprogramas<br />70<br />generic<br />type ELEMENT is private;<br />typeVECTOR is array (INTEGER range <>) of ELEMENT;<br />procedureGENERIC_SORT(LIST: in out VECTOR);<br />procedureGENERIC_SORT(LIST: in out VECTOR) is<br /> TEMP : ELEMENT;<br />begin<br /> for IND_1 in LIST'FIRST .. IND_1'PRED(LIST'LAST) loop<br /> for IND_2 in INDEX'SUCC(IND_1) .. LIST'LASTloop<br />ifLIST(IND_1) > LIST(IND_2) then<br /> TEMP := LIST(IND_1);<br /> LIST(IND_1) := LIST(IND_2);<br /> LIST(IND_2) := TEMP;<br />endif;<br />end loop; - end for IND_1<br />end loop; - end for IND_2 <br />endGENERIC_SORT;<br />Subprogramas Genéricos <br />Exemplo de ordenação genérica em Ada<br />TIPO GENÉRICO<br />NÚMERO QUALQUER DE ELEMENTOS <br />
  202. 202. COMPILAR POR PARTES<br />Compilar um programa por partes é fundamental para grandes softwares.<br />Somente módulos precisam ser compilados (Unidades Chamadoras)<br />LinkEditor é o programa que parte do sistema operacional que coleta as unidades compiladas.<br />Em poucas palavras compilar só o que <br />foi modificado <br />
  203. 203. COMPILAÇÃO SEPARADA<br />Exemplo em <br />Podemos compilar cada arquivo .c separadamente, produzindo um arquivo .o  para arquivo .c<br /> Ex.:  prompt$  gcc ­c arquivo.c<br />Para gerar o executável, devemos então passar os arquivos .o<br /> Ex.:  prompt$  gcc principal.c arquivo.o<br /><ul><li>Unidades de compilação compiladas em tempos diferentes.
  204. 204. Sem independência se usarem entidades de outra.
  205. 205. Usada se for necessária fazer verificação de interface.
  206. 206. O compilador precisa de muitas informações sobre as entidades de programa ( Variáveis, tipos, protocolos, ordem, retorno).</li></li></ul><li>COMPILAÇÃO SEPARADA<br />É necessário inserir o protótipo da função soma em principal.c.<br />
  207. 207. COMPILAÇÃO INDEPENDENTE <br /><ul><li>Não há necessidade de uma ordem de compilação e a quantidade e os tipos dos parâmetros não são checados entre chamada e definição.
  208. 208. Quando um programa chama outro subprograma que é compilado pelo mesmo arquivo os 2 de fato compilados independentemente.
  209. 209. Por exemplo a interface de parâmetros entre unidades de programa FORTRAN 77 nunca é verificada quanto a compatibilidade dos tipos. </li></li></ul><li>Teste Básico.<br />Tudo bem que a explicação não foi das melhores mais vamos ver se vocês entenderam algo.<br />
  210. 210.
  211. 211.
  212. 212. COMPILAÇÃO SEPARADA E INDEP.<br /><ul><li>Separada
  213. 213. Indenpendente</li></li></ul><li>Co-Rotinas<br /><ul><li>Tipo especial de subprograma.
  214. 214. Sem relação mestre-escravo entre chamador e chamado.
  215. 215. Surgiu 1° na área de análise sintática . Usado no SIMULA-67 que tinha como propósito simular sistemas com processos independentes.
  216. 216. Múltiplos pontos de Entrada.
  217. 217. Frequentemente não começar pelo inicio que não é o inicio.
  218. 218. Criada na aplicacação por uma unidade-mestra e não por outra co-rotina.
  219. 219. Quando todo o conjunto de co-rotinas são criadas o programa mestre RETOMA uma co-rotina que rotorma outra entre si até o fim do trabalho.</li></li></ul><li>EXEMPLO<br />Jogo de Cartas<br />Com 4 jogadores que usam <br />a mesma estragégia.<br />Simularemos o jogo fazendo<br />com que uma unidade de <br />programa-mestre crie uma família de co-rotinas.<br />Cada uma com suas mão.(Coleção ou cartas) <br />O programa mestre retona –corotinas jogadores, que podem retoma outra co-rotina até o fim jogo.<br />
  220. 220. Co-Rotinas<br />
  221. 221. Co-Rotinas<br />Obs: Tipicamente, co-rotinas repetidamente retomam a execução entre si, possivelmente em laço infinito.<br />
  222. 222. Dúvidas<br />Perguntem antes que o professor pergunte!!!!<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×