ex2_potencia.html 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <body>
  2. <h2>3.3 - Como computar uma potência de inteiros usando laço de repetição</h2>
  3. <p>
  4. <b>Problema 3:</b><i>Dado X real e N natural, faça um programa que calcule X<sup>N</sup></i><br />
  5. Novamente, se N fosse fixo, por exemplo n=3, bastaria fazer<br />
  6. <center>
  7. <table>
  8. <tr>
  9. <th> C </th>
  10. <th>Python</th></tr>
  11. <tr>
  12. <td>
  13. <pre>
  14. 1 int x;
  15. 2 scanf("%d", &x);
  16. 3 printf("%d", x*x*x);
  17. </pre>
  18. </td>
  19. <td>
  20. <pre>
  21. 1 x = input()
  22. 2 print(x*x*x)
  23. </pre>
  24. </td>
  25. </tr>
  26. </table>
  27. <div>
  28. <img src="./imgs/potencia_x_3.png" /><br />
  29. <span>Código no iVProg</span>
  30. </div>
  31. </center>
  32. Portanto a dificuldade deste problema se encontra na repetição arbitrária: repetir a operação de multiplicação um número variável de vezes, dependente da vontade do usuário.<br />
  33. Novamente, vamos iniciar o processo de resolução examinando um exemplo, x=2 e n=7.<br />
  34. 1. Multiplique X por X, guardando o resultado desta conta(4); <br />
  35. 2. Multiplique por x o resultado guardado, guardando o novo resultado (8);<br />
  36. 3. Repita o passo(2) outras 4 vezes (pois n=7 e x já entrou 3 vezes como fator de multiplicação) obtendo o resultado final, 128.<br />
  37. <h3>Quais são as variáveis necessárias?</h3>
  38. Claramente precisamos de variáveis para armazenar X e N. Além destas, será necessária outra variável (<b>result</b>) para armazenar o resultado das operações de potenciação de X,
  39. sem a qual não será possível guardar o resultado das multiplações executadas(reflita sobre isto!).<br />
  40. Neste problema, notamos uma novidade em relação ao anterior, precisamos contar quantas vezes já usamos o fator X (original). assim, vamos denotar esta variável pelo sugestivo nome de
  41. <b>cont</b>: a cada multiplicação somaremos 1 nessa variável. Assim, deveremos declarar as seguintes variáveis:<br />
  42. <center>
  43. int x, n, result, cont;
  44. </center>
  45. <h3>Quais os comandos devem aparecer dentor do bloco de repetição?</h3>
  46. Podemos observar no esquema inicial, elaborado acima, que o passo (2) é a parte repetitiva do processo: multiplicar o resultado atual de <b>result</b> por X, guardando este produto
  47. novamente em <b>result</b>. Feito isto, devemos então somar 1 ao contador <b>cont</b>, para indicar que mais uma multiplicação foi efetuada.
  48. <center>
  49. <table>
  50. <tr>
  51. <th> C </th>
  52. <th>Python</th></tr>
  53. <tr>
  54. <td>
  55. <pre>
  56. while (condição){
  57. result = result*x;
  58. cont = cont+1;
  59. }
  60. </pre>
  61. </td>
  62. <td>
  63. <pre>
  64. while condição:
  65. result = result*x
  66. cont = cont+1
  67. </pre>
  68. </td>
  69. </tr>
  70. </table>
  71. </center>
  72. <h3>Qual a condição para que continue a repetição?</h3>
  73. Já foi observado que a variável <b>cont</b> serve para contar quantas vezes o fator X já entrou no produto, assim devemos interromper o laço quando <b>cont==n</b>, ou de outro modo,
  74. devemos continuar enquanto <b>cont< n</b>.
  75. <center>
  76. <table>
  77. <tr>
  78. <th> C </th>
  79. <th>Python</th></tr>
  80. <tr>
  81. <td>
  82. <pre>
  83. while (<b>cont < n</b>){
  84. result = result*x;
  85. cont = cont+1;
  86. }
  87. </pre>
  88. </td>
  89. <td>
  90. <pre>
  91. while <b>cont < n</b>:
  92. result = result*x
  93. cont = cont+1
  94. </pre>
  95. </td>
  96. </tr>
  97. </table>
  98. </center>
  99. <h3>O que deve vir antes da repetição?</h3>
  100. Em primeiro lugar, devemos ler os valores <b>x</b> e <b>n</b>. Precisamos também atribuir valores iniciais adequados às variáveis <B>cont</B> e <b>result</b>. Como <b>cont</b> totaliza
  101. quantos fatores <b>x</b> já entraram no produto, o valor inicial de <b>cont</b> é zero. Assim, após a primeira execução do comando <b>result = result*x</b>, gostariamos de obter o valor
  102. de <b>x</b> em <b>result</b> e por isto devemos impor que <b>result</b> comece com o valor 1.<br />
  103. Interrompido o laço, a resposta estará armazenada em <b>result</b>:
  104. <center>
  105. <table>
  106. <tr>
  107. <th> C </th>
  108. <th>Python</th></tr>
  109. <tr>
  110. <td>
  111. <pre>
  112. 1 int x, n, result, cont;
  113. 2 scanf("%d %d", &x, &n);
  114. 3 cont = 0;
  115. 4 result = 1;
  116. 5 while (<b>cont < n</b>){
  117. 6 result = result*x;
  118. 7 cont = cont+1;
  119. 8 }
  120. 9 printf("%d", result);
  121. </pre>
  122. </td>
  123. <td>
  124. <pre>
  125. 1 x = input()
  126. 2 n = input()
  127. 3 cont = 0
  128. 4 result = 1
  129. 5 while <b>cont < n</b>:
  130. 6 result = result*x
  131. 7 cont = cont+1
  132. 8 print(result)
  133. </pre>
  134. </td>
  135. </tr>
  136. </table>
  137. <div>
  138. <img src="./imgs/potencia_x_n.png" /><br />
  139. <span>Código no iVProg</span>
  140. </div>
  141. </center>
  142. <b>Exercício 4</b> <i>Repare que o programa dá a resposta correta quando n==0, porém quando x==0 e n==0 teriamos um resultado, mesmo que na matemática 0<sup>0</sup>
  143. é indeterminado.</i><br />
  144. <b>Exercício 5</b> <i>Sugerimos como exercício a simulação deste programa, para alguns dados de entrada à escolha do leitor.</i><br />
  145. <b>Exercicio 6</b> <i>O programa abaixo foi proposto para calcular x<sup>n</sup>. Analise o algoritmo, ele está correto? Se não estiver o que há de errado?</i>
  146. <center>
  147. <table>
  148. <tr>
  149. <th> C </th>
  150. <th>Python</th></tr>
  151. <tr>
  152. <td>
  153. <pre>
  154. 1 int x, n, cont;
  155. 2 scanf("%d %d", &x, &n);
  156. 3 cont = 0;
  157. 4 while (cont < n){
  158. 5 x = x*x;
  159. 6 cont = cont+1;
  160. 7 }
  161. 8 printf("%d", x);
  162. </pre>
  163. </td>
  164. <td>
  165. <pre>
  166. 1 x = input()
  167. 2 n = input()
  168. 3 cont = 0
  169. 4 while cont < n:
  170. 5 x = x*x
  171. 6 cont = cont+1
  172. 7 print(x)
  173. </pre>
  174. </td>
  175. </tr>
  176. </table>
  177. <div>
  178. <img src="./imgs/potencia_x_n_errada.png" /><br />
  179. <span>Código no iVProg</span>
  180. </div>
  181. </center>
  182. <b>Exercício 7</b> <i>É possível alterar o programa-solução do problema 3, dispensando a variável contadora <b>cont</b>? Isto é, tente deduzir uma outra versão para o
  183. referido problema, utilizando apenas três variáveis <b>x</b>, <b>n</b> e <b>result</b></i>.
  184. </p>
  185. </body>