introducao_parametros_funcoes.html 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução ao conceito de parâmetros para funções
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didático
  7. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Prof. Leônidas de Oliveira Brandão
  10. http://www.ime.usp.br/~leo
  11. http://line.ime.usp.br
  12. http://www.matemtica.br
  13. @versao: versão inicial: 2011/06/10
  14. -->
  15. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  16. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  18. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  19. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  20. <div class="pagina">
  21. <p class="secao">Introdução ao conceito de parâmetros para funções</p>
  22. <p>
  23. Neste texto, explicamos os princípios a respeito de passagem de parâmetros para
  24. <a href="#" onclick="trocaPagina('introducao_funcoes.html')" title="examinar o texto introdutório sobre funções em C e Python">funções</a>,
  25. particularmente diferenciando as passagens por <i>referência</i> (ou <i>endereço</i>) e por <i>valor</i>.
  26. </p>
  27. <!--
  28. Leia com atenção estas observações a respeito de funções e passagem de parâmetros.
  29. Elas referem-se ao exemplo
  30. <a href="exemplo_referencia_valor.c" title="clique aqui para pegar o exemplos exemplo_referencia_valor.c">exemplo_referencia_valor.c</a>.
  31. -->
  32. <p class="subsecao">Por que parâmetros são necessários para funções?</p>
  33. <p>
  34. A <b style="color:#0000aa;">passagem de parâmetros</b> é essencial para ampliar o potencial de uso de uma função.
  35. Uma função sem parâmetro, é apenas um procedimento que executará sempre
  36. <i title="exceto se o programador estiver usando variáveis globais - mas esperamos que você jamais tente fazer dessa forma, pois
  37. um tal código seria muito mais difícil de ser depurado)">exatamente os mesmos passos</i>.
  38. Por exemplo, uma função para computar o fatorial de um número natural, deve ter um único parâmetro, digamos <i>n</i>, sendo
  39. que <i>n</i> deve conter o valor para o qual deseja-se saber o fatorial.
  40. Por um lado, na declaração da função deve-se indicar de alguma forma este parâmetro, que neste caso é denominado
  41. <b style="color:#0000aa;">parâmetro formal</b> (por ser um <i style="color:#0000aa;">formalismo</i> necessário para funcionar o conceito).
  42. <br/>
  43. Por outro lado, o ponto do código que "está interessado" no fatorial de algum valor é quem deve invocar a função passando-lhe esse valor como
  44. parâmetro, que neste caso recebe o nome de <b style="color:#0000aa;">parâmetro efetivo</b> (pois é <i style="color:#0000aa;">efetivamente</i>
  45. o valor sobre o qual dever ser "aplicada" a função).
  46. </p>
  47. <p>
  48. <center>
  49. <img src="img/exemplo_exec_funcao.jpg" title="exemplo de execucao da funcao"/>
  50. <br/>
  51. <i>Fig. 1. Ilustração do fluxo de execução ao <b>invocar</b> uma função para computar o <b>fatorial</b> de um natural.</i>
  52. </center>
  53. </p>
  54. <p>
  55. A figura 1 ilustra o exemplo da função fatorial, o código à esquerda está interessado em computar o fatorial de <i>N</i>, de <i>k</i>
  56. e de <i>N-k</i>, que são os <i>parâmtros efetivos</i> para a função <i>fat</i> do exemplo.
  57. Do lado direito está a código da função, sua declaração (usamos o nome <i>fat</i>) e seu único <i>parâmtro formal</i>,
  58. que recebeu o nome <i>n</i>.
  59. </p>
  60. <p class="subsubsecao">Introdução aos parâmetros formal e efetivo</p>
  61. <p>
  62. O conceito de funções apresenta 4 palavras-chave principais, que são:
  63. <ul>
  64. <li> <b>parâmetros formais</b>: usados na declaração da função (por isso denominados formais);
  65. <li> <b>parâmetros efetivos</b>: usados na chamada da função (quem invoca é quem deve providenciar os parâmetros <i>efetivamente</i> utilizados);
  66. <li> a passagem de parâmetros pode ser
  67. <ul>
  68. <li>por valor: como "a" e "b" em <tt>void funcao (<verm>int</verm> a, float b)</tt></li>
  69. <li>por referência: como "a" e "b" em <tt>void funcao (<verm>int</verm> *a, float b[])</tt></li>
  70. </ul>
  71. <li> em <i>C</i>, uma função devolve apenas tipos simples (como "int", "float" e "char"), nunca um vetor!!!</li>
  72. </ul>
  73. </p>
  74. <p>
  75. Assim, no caso de passagem de <b>parâmetro por referência</b> (ou <b>por endereço</b>), como o nome indica,
  76. será passada uma <b>referência</b> à uma variável <i>externa</i> à função (o parâmetro efetivo).
  77. Desse modo, dentro da função, ao alterar o valor do parâmetro formal, quem estará sendo alterado é efetivamente à variável <i>externa</i>.
  78. Em <i>C</i> existe uma sintaxe especial para declarar e alterar o parâmetro por referência (usando asterisco '<tt>*</tt>' - vide exemplo abaixo).
  79. </p>
  80. <p>
  81. Já o uso de <b>parâmetro por valor</b> é mais simples, o parâmetro formal funciona como uma <i>variável local</i> que é <i>inicializada</i>
  82. com o valor do parâmetro efetivo, assim que a função em questão é invocada.
  83. Qualquer alteração do parâmetro formal, tem influência nula sobre o parâmetro formal associado (ou seja, uma atribuição dentro da função com
  84. determinado parâmetro, não provoca alteração alguma no valor da variável que foi passada para a função - parâmetro efetivo).
  85. </p>
  86. <p>
  87. Nos exemplos abaixo ilustramos os 4 conceitos em exemplos para <i>C</i> e para <i>Python</i>.
  88. <center><table style="border: 1px solid black;font-size:0.8em;">
  89. <tr>
  90. <th style="background-color:#8aaada;align:center;">C</th><th style="background-color:#8aaada;align:center;">Python</th></tr>
  91. <tr><td><pre style="font-size:0.8em;"><verm>int</verm> soma (<verm>int</verm> a, <verm>int</verm> b) {
  92. <verm>int</verm> c = a+b; <cyan>// variavel local: sem relacao com 'main.c'!</cyan>
  93. return a+b; <cyan>// devolve a+b</cyan>
  94. }
  95. <verm>int</verm> soma_max (<verm>int</verm> a, <verm>int</verm> b, <verm>int</verm> *max) {
  96. if (a &lt; b)
  97. *max = b; <cyan>// altera o valor da referencia (em quem invocou soma_max)</cyan>
  98. else
  99. *max = a; <cyan>// em caso de empate tanto faz...</cyan>
  100. return a+b; <cyan>// devolve a+b</cyan>
  101. }
  102. <verm>int</verm> main (void) {
  103. <verm>int</verm> a, b, c, maximo;
  104. <verd>scanf</verd>("%d %d", &a, &b); <cyan>// operador '&' pega o endereco da variavel na memoria</cyan>
  105. c = soma_max(a,b,&maximo);
  106. <verd>print</verd>("Soma de %d e %d = %d = %d.\n", a, b, soma(a,b), c);
  107. <verd>print</verd>("O maximo e': %d\n", maximo);
  108. return 1;
  109. }</pre> </td><td><pre style="font-size:0.8em;"><verm>def</verm> soma (a, b) :
  110. c = a+b; <cyan># variavel local: sem relacao com 'main.c'!</cyan>
  111. return a+b; <cyan># devolve a+b</cyan>
  112. <verm>def</verm> soma_max (a, b, max) :
  113. if (a &lt; b) :
  114. max[0] = b; <cyan># altera o valor da referencia (em quem invocou soma_max)</cyan>
  115. else :
  116. max[0] = a; <cyan># em caso de empate tanto faz...</cyan>
  117. return a+b; <cyan># devolve a+b</cyan>
  118. <verm>def</verm> main () :
  119. a = int(<verd>input</verd>());
  120. b = int(<verd>input</verd>());
  121. maximo = []; maximo.append(-1); <cyan># truque: usar vetor para param. por ref.</cyan>
  122. c = soma_max(a, b, maximo);
  123. <verd>print</verd>("Soma de %d e %d = %d = %d." % (a, b, soma(a,b), c));
  124. <verd>print</verd>("O maximo e': %d" % (maximo[0]));
  125. main();</pre> </td></tr>
  126. </table></center>
  127. </p>
  128. <p class="subsubsecao">Explicações sobre as diferenças entre parâmetros por referência e por valor</p>
  129. <p>
  130. A diferença entre passagem de parâmetro por referência ou valor, no primeiro caso é passado o endereço (ou referência) da
  131. variável efetivamente usada (parâmetro efetivo) e no segundo o valor da variável efetivamente usada apenas serve como valor
  132. inicial para o parâmetro formal (uma <i>inicialização</i>).
  133. </p>
  134. <p>
  135. <i><b>C</b></i>:
  136. No código <i>C</i> acima, o que definiu tratar-se de referência foi o uso de '*' no parâmetro formal.
  137. Além disso, para fazer referência ao parâmetro efetivo (a variável <tt>maximo</tt>) também foi preciso usar o '*'.
  138. <br/>
  139. Por outro, na chamada da função foi preciso passar o endereço da variável <tt>maximo</tt> e isso foi possível
  140. usando o operador '&'.
  141. <br/>
  142. No exemplo não aparece, mas em <i>C</i>, ao passar um vetor como parâmetro, automaticamente ele é passador por referência.
  143. <br/>
  144. <a href="#" onclick="trocaPagina('introducao_funcoes_c.html')"
  145. title="Para examinar detalhes de funções C em clique aqui">Para examinar mais sobre funções em <i>C</i> clique aqui</a>.
  146. </p>
  147. <p>
  148. <i><b>Python</b></i>:
  149. No código <i>Python</i> acima, o que definiu tratar-se de referência foi usar como parâmetro formal um vetor (ou lista).
  150. Por isso foi preciso o "truque" de definir um vetor (de nome <tt>maximo</tt>, com um único elemento) e passá-lo
  151. como parâmetro efetivo para a função.
  152. <br/>
  153. Assim, em <i>Python</i>, sempre que passar um vetor como parâmetro, automaticamente ele é passador por referência.
  154. <br/>
  155. <a href="#" onclick="trocaPagina('introducao_funcoes_python.html')"
  156. title="Para examinar detalhes de funções em Python clique aqui">Para examinar mais sobre funções em <i>Python</i> clique aqui</a>.
  157. </p>
  158. <p>
  159. <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
  160. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  161. </p>
  162. <p class="rodape">
  163. <b>Alterações</b>:<br/>
  164. 2020/08/20: acertos no formato<br/>
  165. 2020/08/10: revisão de formato e nova introdução<br/>
  166. 2020/08/09: Sábado, 09 de Agosto 2020, 14:00<br/>
  167. 2018/04/24: Terça, 24 de Abril 2018, 12:30<br/>
  168. 2011/06/10: inicial
  169. </p>
  170. </div>