sem_cabecalhos_introducao_funcoes.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <!--
  2. Introdução ao uso de funções em C e em Python
  3. http://saw.atp.usp.br/mod/page/view.php?id=
  4. -->
  5. <!DOCTYPE html>
  6. <html itemscope itemtype="http://schema.org/QAPage">
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  9. <title>Introdução ao uso de funções em C e em Python</title>
  10. <style type="text/css">
  11. .tableCd { border-collapse:collapse; }
  12. .thBg th { background-color:#8aaada; }
  13. .trCd td, .tbCd td, .tbCd th { vertical-align: top; padding:5px; border-right:1px solid #000; font-family: courier }
  14. </style>
  15. </head>
  16. <body>
  17. <span style="color: #0055AA"><b>O que é uma função em linguagens de programação</b></span>
  18. <p>
  19. A ideia básica de uma função, implementada em alguma linguagem de programação, é <i>encapsular</i> um código
  20. que poderá ser invocado/chamado por qualquer outro trecho do programa.
  21. Seu significado e uso é muito parecido com o de funções matemáticas, ou seja, existe um nome, uma definição
  22. e posterior invocação à função.
  23. </p>
  24. <p>
  25. Explicitando o paralelo com a matemática, tomemos como exemplo a função trigonétrica <i>cosseno(x)</i>,
  26. que é impossível de ser implementada de modo exato em um computador digital, entretanto é viável obter
  27. boas aproximações utilizando a
  28. <a href="introducao_eficiencia_algoritmos.html#taylor"
  29. title="ver explicaco sobre serie de Taylor e funcao cosseno"><i>série de Taylor</i></a>.
  30. Como examinado na referida página, a série que aproxima a função <i>cosseno</i> próximo à origem é:
  31. <i>(1) cos(x) = 1 - x<sup>2</sup> /2! + x<sup>4</sup> /4! - x<sup>6</sup> /6! + x<sup>8</sup> /8! + ...</i>
  32. </p>
  33. <p>
  34. Note que o <i>lado direito</i> da equação (1) é a definição da função e ela está escrita em termos
  35. do <b>parâmetro formal</b> <i>x</i>.
  36. Ao "chamarmos" a função com <b>parâmetros efetivos</b>, é sobre o valor desses parâmetros que computamos
  37. o lado direito da expressão, por exemplo, computar <i>cos(0.1)</i> ou de <i>cos(1.1)</i>.
  38. </p>
  39. <a name="porque">
  40. <span style="color: #0055AA"><b>Por que usar o conceito de função?</b></span>
  41. </a>
  42. <p>
  43. Assim, implementar códigos com objetivos específicos (como computar o <i>cosseno</i> de qualquer valor)
  44. apresentam três grandes vantagens:
  45. <ol>
  46. <li>
  47. Facilita o desenvolvimento (<i>desenvolvimento modular</i>): desenvolve-se um unidade particular, concentrando-se
  48. nela, até que ela esteja funcionando com alto grau de <i>confiabilidade</i>;
  49. </li>
  50. <li>
  51. Organização: o código fica melhor organizado e portanto mais fácil de manter;
  52. </li>
  53. <li>
  54. Reaproveitamento: sempre que precisar aplicar o código encapsulado em qualquer outro trecho de código
  55. (ou noutro código), pode-se utilizar aquele que já foi implementado e é <i>confiável</i>.
  56. </li>
  57. </ol>
  58. </p>
  59. <span style="color: #0055AA"><b>Introdução ao uso de funções em <i>C</i> e em <i>Python</i></b></span>
  60. <p>
  61. Assim, agrupar trechos com objetivos específicos e implementá-los na forma de uma <i>função</i>
  62. que ajuda bastante o desenvolvimento e a organização dos códigos em programação.
  63. </p>
  64. <p>
  65. Do ponto de vista prático, a estrutura básica de uma função em uma linguagem de programação está representada abaixo,
  66. com a <i>declaração da função</i> e sua <i>lista de parâmetros formais</i>, seguido de sua invocação
  67. (quando providenciamos os <i>parâmetro efetivos</i>).
  68. <table>
  69. <tr valign="top"><td>Declaração:</td>
  70. <td>
  71. <tt>[enventual tipo de retorno] nome_da_funcao (lista_parametros_formais)<br/>
  72. comando1<br/>
  73. ...<br/>
  74. comandoN<br/>
  75. return EXP</tt></td></tr>
  76. <tr valign="top"><td>Uso:</td><td>
  77. <tt>var = nome_da_funcao(lista_parametros_efetivos)</tt></td></tr>
  78. </table>
  79. </p>
  80. <p>
  81. A <i>lista de parâmetros</i> pode conter vários nomes de variáveis, geralmente, separadas por vírgula.
  82. Por exemplo, se houver necessidade de uma função que realiza vários cálculos com três variáveis pode-se usar como
  83. declaração da função algo como:
  84. <tt>nome_da_funcao (var1, var2, var3)</tt>.
  85. </p>
  86. <span style="color: #0055AA">Parâmetros formais e efetivos</span>
  87. <p>
  88. De modo geral, a diferença entre os <i> parâmetros formais</i> e <i>efetivos</i> é que o primeiro corresponde ao
  89. nome da variável utilizada dentro da função, enquanto o segundo é o nome da variável que será usado para iniciar o parâmetro
  90. formal ao iniciar a execução da função.
  91. </p>
  92. <p>
  93. Assim durante a execução, ao encontrar uma chamada à função <tt>nome_da_funcao</tt>, o fluxo de execução segue
  94. a partir do código da função.
  95. Mas antes de executar a primeira linha de código da função, os valores dos <i>parâmetros efetivos</i> servem para inicializar
  96. os parâmetros formais (que são também variáveis locais à função). Após esta inicialização, inicia-se a execução do código
  97. da função e geralmente ao final, encontra-se um comando do tipo "retorne devolvendo um valor" (<i>return</i>).
  98. </p>
  99. <span style="color: #0055AA">Ilustrando a execução de um trecho de programa com 3 chamadas à mesma função</span>
  100. <p>
  101. Suponhamos que precisemos computar o valor da combinação de <i>N</i> tomado <i>k</i> a <i>k</i>, ou seja,
  102. C(N,k) = N! / ( k! (N-k)!).
  103. Para isso percebe-se que é necessário implementar o cômputo de fatorial que será utilizado 3 vezes.
  104. Para facilitar a compreensão, podemos escrever um código com 3 variáveis auxiliares para armazenar, respectivamente,
  105. <i>N!</i>, <i>k!</i> e <i>(N-k)!</i>.
  106. <p>
  107. <center><img src="img/exemplo_exec_funcao.jpg" title="exemplo de execucao da funcao"/>
  108. </center>
  109. <p>
  110. Na figura acima ilustra a execução do código para computar <i>C(N,k)</i>, com o retângulo à esquerda contendo
  111. o código que invoca a função <i>fat</i> e à direita a função <i>fat</i>.
  112. Para entender o fluxo de execução destaremos a execução da linha 2, <tt>b = fat(k);</tt>.
  113. Como <tt>b = fat(k);</tt> é uma atribuição, primeiro computa-se o valor do <i>lado direito</i> da atribuição
  114. e só depois atribui-se à variável do <i>lado esquerdo</i> da atribuição o seu valor, ou seja,<br/>
  115. &nbsp; 1. primeiro executa-se o cômputo de <tt>fat(k)</tt>, para isso<br/>
  116. &nbsp; 2. pega-se o valor do <i>parâmetro efetivo</i> <tt>k</tt> e usa-o para iniciar o <i>parâmetro formal</i> <tt>n</tt> da função<br/>
  117. &nbsp; 3. então inicia-se a execução da função <tt>fat</tt><br/>
  118. &nbsp; 4. ao final da função <tt>fat</tt>, pega-se o valor da variável local <tt>ft</tt> e <br/>
  119. &nbsp; 5. atribui-se este valor para a variável <tt>b</tt><br/>
  120. &nbsp; 6. então segue-se execução da próxima linha (3).<br/>
  121. Vale notar que a execução da atribuição <tt>c = fat(N-k);</tt> seguirá um fluxo análogo aos 6 passos acima.
  122. </p>
  123. <p>
  124. Uma vez entendido como é executado uma chamada á função, podemos novamente comparar com o conceito usual
  125. de função matemática. Existe a declaração da função, com seu parâmetro formal
  126. <pre>
  127. fat : IN -> IN (nome 'fat', com domínio e imagem nos naturais)
  128. fat(n) = { 1, se n=0, n x fat(n-1), se n>0 }</pre>
  129. E existe o uso da função, como em
  130. <pre>
  131. C(N,k) = fat(N) / (fat(k) x fat(N-k)</pre>
  132. </p>
  133. <span style="color: #0055AA">Exemplo concreto em <i>C</i> e em <i>Python</i></span>
  134. <p>
  135. Para ilustrar o uso e sintaxe de funções em <i>C</i> e em <i>Python</i>, examinemos um exemplo em que implementamos uma
  136. função para cômputo do fatorial de um natural <i>n</i>, que será o nome de seu único parâmetro formal.
  137. </p>
  138. <center><table class="tableCd">
  139. <tr><td></td><td bgcolor="8aaada"><i>C</i> <td bgcolor="8aaada"><i>Python</i></td></tr>
  140. <tr><td><table class=""><tr class="trCd" valign="top"><td><pre> 1
  141. 2
  142. 3
  143. 4
  144. 5
  145. 6
  146. 7
  147. 8
  148. 9
  149. 10
  150. 11</pre></td></tr></table></td>
  151. <td><table class=""><tr class="trCd" valign="top"><td><pre>int fat (int n) { // define funcao com 1 parametro
  152. int ft = 1; int i=1;
  153. while (i &lt; n) {
  154. i = i + 1;
  155. ft = ft * i;
  156. }
  157. return ft;
  158. } // chave indica final da funcao 'fat(...)'
  159. ...
  160. // supondo existir neste contexto variaveis: N e k
  161. printf("Combinacao = %f\n", fat(N) / (fat(k) * fat(N-k));</pre></td></tr></table></td>
  162. <td><table class=""><tr class="trCd" valign="top"><td><pre>def fat (int n) : # define funcao com 1 parametro
  163. ft = 1; int i=1
  164. while (i &lt; n) {
  165. i = i + 1;
  166. ft = ft * i;
  167. return ft;
  168. # Final da funcao 'fat(...)' - em Python,
  169. # basta a indentacao da proxima linha ser recuada
  170. ...
  171. # supondo existir neste contexto variaveis: N e k
  172. print("Combinacao = ", fat(N) / (fat(k) * fat(N-k))
  173. </pre></td></tr></table></td></tr>
  174. </table></center>
  175. <span style="color: #0055AA">Variáveis locais</span>
  176. <p>
  177. Note na linha 2 do código acima que são declaradas duas novas variáveis, <i>ft</i> e <i>i</i>, dentro da fução <i>fat</i>.
  178. Isso significa que as variáveis <i>ft</i> e <i>i</i> são <b>variáveis locais</b> à função, ou seja,
  179. pode-se utilizar variáveis com os mesmos nomes em outras funções sendo que elas não terão qualquer relação.
  180. Em particular, na 11 do código em <i>C</i> ou na 9 do código em <i>Python</i>, poderia-se usar uma variável com nome <i>n</i>,
  181. <i>ft</i> ou <i>i</i> e ainda assim, está variável não teria qualquer relação com as correspondentes da função <i>fat</i>.
  182. </p>
  183. <span style="color: #0055AA">Para que serve função?</span>
  184. <p>
  185. A partir do exemplo acima, para cômputo de <i>C(n,k) = n! / (k! (n-k)!)</i>,
  186. imagine como seria o código para computar a combinção se a linguagem de programação NÂO dispusesse do conceito
  187. de funções: em resumo, precisariamos repetir as linhas 2 a 5 (ou 6), que computam fatorial, três vezes.
  188. Portanto, o uso de função simplifica o código.
  189. </p>
  190. <p>
  191. Mas existe uma outra razão para usar funções, que não tão óbvia, a maior facilidade para escrever um programa.
  192. E isso se deve à vários fatores, mas principalmente à quebra de um problema maior em vários menores.
  193. Isso facilita o desenvolvimento e reduz a incidência de erros de programação.
  194. </p>
  195. <p>
  196. Por exemplo, pode-se implementar a função separadamente, testando-a até que ela fique pronta e sem erros.
  197. Assim, o código fica mais fácil de ser entendido, pois ao usar a função pode-se abstrair, o trecho fica curto (apenas a chamada à função)
  198. e pode-se concentrar em saber se o restante do código está correto.
  199. </p>
  200. <p>
  201. Leônidas de Oliveira Brandão<br/>
  202. http://line.ime.usp.br
  203. </p>
  204. </body>