ex2_potencia.html 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <h2>3.3 - Como computar uma potência de inteiros usando laço de repetição</h2>
  2. <p>
  3. <b>Problema 3:</b><i>Dado X real e N natural, faça um programa que calcule X<sup>N</sup></i><br />
  4. Novamente, se N fosse fixo, por exemplo n=3, bastaria fazer<br />
  5. <center>
  6. <table>
  7. <tr>
  8. <th> C </th>
  9. <th>Python</th></tr>
  10. <tr>
  11. <td>
  12. <pre>
  13. 1 int x;
  14. 2 scanf("%d", &x);
  15. 3 printf("%d", x*x*x);
  16. </pre>
  17. </td>
  18. <td>
  19. <pre>
  20. 1 x = input()
  21. 2 print(x*x*x)
  22. </pre>
  23. </td>
  24. </tr>
  25. </table>
  26. <div>
  27. <img src="./imgs/potencia_x_3.png" /><br />
  28. <span>Código no iVProg</span>
  29. </div>
  30. </center>
  31. 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 />
  32. Novamente, vamos iniciar o processo de resolução examinando um exemplo, x=2 e n=7.<br />
  33. 1. Multiplique X por X, guardando o resultado desta conta(4); <br />
  34. 2. Multiplique por x o resultado guardado, guardando o novo resultado (8);<br />
  35. 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 />
  36. <h3>Quais são as variáveis necessárias?</h3>
  37. 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,
  38. sem a qual não será possível guardar o resultado das multiplicações executadas(reflita sobre isto!).<br />
  39. 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
  40. <b>cont</b>: a cada multiplicação somaremos 1 nessa variável. Assim, deveremos declarar as seguintes variáveis:<br />
  41. <center>
  42. int x, n, result, cont;
  43. </center>
  44. <h3>Quais os comandos devem aparecer dentro do bloco de repetição?</h3>
  45. 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
  46. 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.
  47. <center>
  48. <table>
  49. <tr>
  50. <th> C </th>
  51. <th>Python</th></tr>
  52. <tr>
  53. <td>
  54. <pre>
  55. while (condição){
  56. result = result*x;
  57. cont = cont+1;
  58. }
  59. </pre>
  60. </td>
  61. <td>
  62. <pre>
  63. while condição:
  64. result = result*x
  65. cont = cont+1
  66. </pre>
  67. </td>
  68. </tr>
  69. </table>
  70. </center>
  71. <h3>Qual a condição para que continue a repetição?</h3>
  72. 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,
  73. devemos continuar enquanto <b>cont< n</b>.
  74. <center>
  75. <table>
  76. <tr>
  77. <th> C </th>
  78. <th>Python</th></tr>
  79. <tr>
  80. <td>
  81. <pre>
  82. while (<b>cont < n</b>){
  83. result = result*x;
  84. cont = cont+1;
  85. }
  86. </pre>
  87. </td>
  88. <td>
  89. <pre>
  90. while <b>cont < n</b>:
  91. result = result*x
  92. cont = cont+1
  93. </pre>
  94. </td>
  95. </tr>
  96. </table>
  97. </center>
  98. <h3>O que deve vir antes da repetição?</h3>
  99. 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
  100. 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
  101. de <b>x</b> em <b>result</b> e por isto devemos impor que <b>result</b> comece com o valor 1.<br />
  102. Interrompido o laço, a resposta estará armazenada em <b>result</b>:
  103. <center>
  104. <table>
  105. <tr>
  106. <th> C </th>
  107. <th>Python</th></tr>
  108. <tr>
  109. <td>
  110. <pre>
  111. 1 int x, n, result, cont;
  112. 2 scanf("%d %d", &x, &n);
  113. 3 cont = 0;
  114. 4 result = 1;
  115. 5 while (<b>cont < n</b>){
  116. 6 result = result*x;
  117. 7 cont = cont+1;
  118. 8 }
  119. 9 printf("%d", result);
  120. </pre>
  121. </td>
  122. <td>
  123. <pre>
  124. 1 x = input()
  125. 2 n = input()
  126. 3 cont = 0
  127. 4 result = 1
  128. 5 while <b>cont < n</b>:
  129. 6 result = result*x
  130. 7 cont = cont+1
  131. 8 print(result)
  132. </pre>
  133. </td>
  134. </tr>
  135. </table>
  136. <div>
  137. <img src="./imgs/potencia_x_n.png" /><br />
  138. <span>Código no iVProg</span>
  139. </div>
  140. </center>
  141. <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 teríamos um resultado, mesmo que na matemática 0<sup>0</sup>
  142. é indeterminado.</i><br />
  143. <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 />
  144. <b>Exercício 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>
  145. <center>
  146. <table>
  147. <tr>
  148. <th> C </th>
  149. <th>Python</th></tr>
  150. <tr>
  151. <td>
  152. <pre>
  153. 1 int x, n, cont;
  154. 2 scanf("%d %d", &x, &n);
  155. 3 cont = 0;
  156. 4 while (cont < n){
  157. 5 x = x*x;
  158. 6 cont = cont+1;
  159. 7 }
  160. 8 printf("%d", x);
  161. </pre>
  162. </td>
  163. <td>
  164. <pre>
  165. 1 x = input()
  166. 2 n = input()
  167. 3 cont = 0
  168. 4 while cont < n:
  169. 5 x = x*x
  170. 6 cont = cont+1
  171. 7 print(x)
  172. </pre>
  173. </td>
  174. </tr>
  175. </table>
  176. <div>
  177. <img src="./imgs/potencia_x_n_errada.png" /><br />
  178. <span>Código no iVProg</span>
  179. </div>
  180. </center>
  181. <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
  182. referido problema, utilizando apenas três variáveis <b>x</b>, <b>n</b> e <b>result</b></i>.
  183. </p>