ex1_somatorio.html 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <body>
  2. <h2>3.1 - Como somar um número arbitrário de valores</h2>
  3. <p>
  4. <b>Problema: </b> Faça um programa que leia uma sequência de números inteiros, diferentes de zero, e calcule a sua soma.<br />
  5. Se a sequência de entrada tivesse um tamanho fixo conhecido, digamos 4, a descrição do processo não seria complicada, bastando escrever:
  6. <center>
  7. <table>
  8. <tr>
  9. <th> C </th>
  10. <th>Python</th></tr>
  11. <tr>
  12. <td>
  13. <pre>
  14. int n1, n2, n3, n4, soma; //cria as 5 variáveis
  15. que serão utilizadas
  16. scanf("%d %d %d %d", &n1, &n2, &n3, &n4);
  17. //lê 4 inteiros
  18. soma = n1+n2+n3+n4; //soma os 4 inteiros lidos
  19. printf("%d", soma); //imprime o resultado da soma
  20. </pre>
  21. </td>
  22. <td>
  23. <pre>
  24. n1 = input() //lê o primeiro inteiro
  25. n2 = input() //lê o segundo inteiro
  26. n3 = input() //lê o terceiro inteiro
  27. n4 = input() //lê o quarto inteiro
  28. soma = n1+n2+n3+n4 //soma os 4 inteiros
  29. print(soma) //imprime o resultado da soma
  30. </pre>
  31. </td>
  32. </tr>
  33. </table>
  34. <div>
  35. <img src="./imgs/soma_4_numeros.png" /><br />
  36. <span>Código no iVProg</span>
  37. </div>
  38. </center>
  39. <br />
  40. No entanto a solução muda radicalmente se desejamos escrever um algoritmo que funcione para um número arbitrário de valores de entrada (este número é
  41. definido pelo usuário durante a execução do algoritmo). Neste caso, a dificuldade reside no fato de o programa ser capaz de somar uma sequência de qualquer
  42. tamanho.<br />
  43. Antes de continuar, reflita um pouco sobre esta questão e tente escrever um código que permita a soma de uma sequência de qualquer tamanho.<br />
  44. Duas possíveis soluções são:
  45. <ul>
  46. <li>Ao início da execução do algoritmo o usuário digitar qual o tamanho da sequência</li>
  47. <li>Utilizarmos um caracter de escape que indicará o final da sequência</li>
  48. </ul>
  49. <br />
  50. Abaixo iremos apresentar a segunda solução, utilizar um caracter de escape.<br />
  51. Uma boa técnica para iniciar o processo de rogramação é admitir algumas sequências de dados de entrada e pensar a partir destes dados. Então examinaremos,
  52. por exemplo, a soma da seguinte sequência de entrada: 8 11 3 -7 2 ... 0
  53. <ol>
  54. <li>Leia o primeiro número 8;</li>
  55. <li>Como o número lido !=(diferente) 0, leia o próximo número 3, guardando a soma destes dois 19+3 = 22;</li>
  56. <li>Como o último número lido != 0, leia o próximo número 3, guardando com a soma anterior 19+3=22;</li>
  57. <li>Como o último número lido != 0, leia o próximo número -7, guardando com a soma anterior 22+(-7)=15;</li>
  58. <center>
  59. <pre>
  60. .
  61. .
  62. .
  63. </pre>
  64. </center>
  65. <li>Lê o 0, e como o número lido foi 0 imprime a soma final</li>
  66. </ol>
  67. <h3>Quais variáveis são necessárias?</h3>
  68. Vemos a necessidades de 2 variáveis: uma para guardar o último número lido e outra para guardar a soma dos número já lidos. Então teremos:
  69. <center>
  70. <table>
  71. <tr>
  72. <th> C </th>
  73. <th>Python</th></tr>
  74. <tr>
  75. <td>
  76. <pre>int num, soma;</pre>
  77. </td>
  78. <td>
  79. <pre>
  80. num = 0
  81. soma = 0</pre>
  82. </td>
  83. </tr>
  84. </table>
  85. </center>
  86. <h3>Quais os comandos necessários antes e depois do bloco de repetição?</h3>
  87. <p>
  88. Inicialmente, no código em C o valor das variáveis(quaisquer) está indefinido, já no código em Python está definido em 0 e portanto devemos cuidar das
  89. "inicializações" antes do primeiro teste <b>while (num !=0)</b>. Quanto deve valer a variável num neste momento inicial?<br />
  90. Uma solução possível é o tratamento do primeiro número da sequência como caso à parte, antes de entrarmos no comando de repetição. Deste modo, devemos ler
  91. o primeiro número fora da repetição e já contabilizar na soma.
  92. <br />
  93. <b>Exercício 1:</b> <i>Tente elaborar outra solução, que não faça uma primeira leitura de num dentro do laço</i>
  94. <br />
  95. Após a repetição devemos imprimir o conteúdo da variável <b>soma</b>, que deverá conter a soma dos elementos da sequência de entrada.<br />
  96. Escrevendo o código temos:<br />
  97. <center>
  98. <table>
  99. <tr>
  100. <th> C </th>
  101. <th>Python</th></tr>
  102. <tr>
  103. <td>
  104. <pre>
  105. 1 int num, soma;
  106. 2 scanf("%d", &num);
  107. 3 soma = num;
  108. 4 while (num != 0){
  109. 5 scanf(%d, &num);
  110. 6 soma = soma + num;
  111. 7 }
  112. 8 printf("%d",soma);
  113. </pre>
  114. </td>
  115. <td>
  116. <pre>
  117. 1 num = input();
  118. 2 soma = num;
  119. 3 while num != 0
  120. 4 num = input()
  121. 5 soma = soma + num
  122. 6 print(soma)
  123. </pre>
  124. </td>
  125. </tr>
  126. </table>
  127. <div>
  128. <img src="./imgs/soma_n_numeros.png" /><br />
  129. <span>Código no iVProg</span>
  130. </div>
  131. </center>
  132. <h3>Conceito de simulação de um Algoritmo</h3>
  133. Um conceito muito importante à programação é o processo de <b>simulação</b> de um algoritmo. Útil na verificação da corretude do mesmo e também para entender
  134. o seu funcionamento. Na simulação de um algoritmo/programa devemos anotar todas as alterações, de todas suas variáveis, ao longo de seu fluxo de execução para algum
  135. conjunto de entrada<br />
  136. Melhor que muitas explicações complicadas é um bom exemplo. Vejamos a simulação do programa acima para o conjunto de entradas 10 3 4 0 no algoritmo em C:
  137. <center>
  138. <table>
  139. <tr>
  140. <th>num</th>
  141. <th>soma</th>
  142. <th>comando em execução</th>
  143. <th>observações</th>
  144. </tr>
  145. <tr>
  146. <td>?</td>
  147. <td>?</td>
  148. <td> </td>
  149. <td>no início do programa valores das variáveis são desconhecidos, elas apenas foram declaradas</td>
  150. </tr>
  151. <tr>
  152. <td>10</td>
  153. <td>?</td>
  154. <td>scanf("%d", &num)</td>
  155. <td>pega o 1º número de entrada e guarda em num</td>
  156. </tr>
  157. <tr>
  158. <td>10</td>
  159. <td>10</td>
  160. <td>soma = num</td>
  161. <td>Atribui o valor de num a soma</td>
  162. </tr>
  163. <tr>
  164. <td>10</td>
  165. <td>10</td>
  166. <td> while (num != 0) </td>
  167. <td>Como num é diferente de 0, executa os comandos dentro do bloco de repetição (linhas 5 e 6)</td>
  168. </tr>
  169. <tr>
  170. <td>3</td>
  171. <td>10</td>
  172. <td> scanf("%d", num) </td>
  173. <td>Recebe o 2º número de entrada e guarda em num</td>
  174. </tr>
  175. <tr>
  176. <td>3</td>
  177. <td>13</td>
  178. <td> soma = soma + num </td>
  179. <td>atribui a soma o valor da expressão soma + num</td>
  180. </tr>
  181. <tr>
  182. <td>3</td>
  183. <td>13</td>
  184. <td> while(num!=0) </td>
  185. <td>Como num é diferente de 0, o programa continuará a repetição</td>
  186. </tr>
  187. <tr>
  188. <td>4</td>
  189. <td>13</td>
  190. <td> scanf("%d", num) </td>
  191. <td></td>
  192. </tr>
  193. <tr>
  194. <td>4</td>
  195. <td>17</td>
  196. <td>soma = soma+ num</td>
  197. <td></td>
  198. </tr>
  199. <tr>
  200. <td>4</td>
  201. <td>17</td>
  202. <td>while(num!=0)</td>
  203. <td></td>
  204. </tr>
  205. <tr>
  206. <td>0</td>
  207. <td>17</td>
  208. <td> soma = soma + num </td>
  209. <td></td>
  210. </tr>
  211. <tr>
  212. <td>0</td>
  213. <td>17</td>
  214. <td> while(num!=0) </td>
  215. <td>Como soma é igual a 0, o programa pula para a linha 8</td>
  216. </tr>
  217. <tr>
  218. <td>0</td>
  219. <td>17</td>
  220. <td>printf("%d", soma)</td>
  221. <td>Imprime o valor de soma: 17</td>
  222. </tr>
  223. </table>
  224. </center>
  225. <b>Saída do programa: 17</b>
  226. <br />
  227. Deve-se notar que após o programa "ler" o número 0(C: linha 5; Python: linha 4), ainda é executado o comando soma = soma + num antes do fluxo de execução
  228. voltar ao inicio do comando <b>while</b>. Mas isto não provoca qualquer erro, uma vez que o valor "lido"(0) não altera o valor da soma. No entanto, o que
  229. fazer se o programa consistisse em somar uma sequência de inteiros não negativos (positivos ou nulos), finalizada por um número negativo?<br />
  230. Antes de seguir com a leitura pense na questão<br />
  231. Uma primeira tentativa em responder à questão anterior é tentar aproveitar a versão anterior, trocando apenas a condição de parada do while de num != 0
  232. para num >= 0.<br />
  233. Porém isto não funcionaria, pois ao digitar um finalizador (número negativo), este será adicionado ao conteúdo de soma(C: linha 6; Python: linha 5), "estragando"
  234. o resultado final.<br />
  235. Se a solução do novo problema não pode ser tão semelhante à versão anterior, também não será radicalmente diferente. Basta efetuarmos uma mera inversão entre as
  236. linhas dentro do comando while(C: 5 com 6; Python: linha 4 com 5), além da troca da condição de parada acima citada.<br />
  237. <center>
  238. <table>
  239. <tr>
  240. <th> C </th>
  241. <th>Python</th></tr>
  242. <tr>
  243. <td>
  244. <pre>
  245. 1 int num, soma;
  246. 2 scanf("%d", &num);
  247. 3 soma = 0;
  248. 4 while (num >= 0){
  249. 5 soma = soma + num;
  250. 6 scanf(%d, &num);
  251. 7 }
  252. 8 printf("%d",soma);
  253. </pre>
  254. </td>
  255. <td>
  256. <pre>
  257. 1 num = input();
  258. 2 soma = 0;
  259. 3 while num >= 0:
  260. 4 soma = soma + num
  261. 5 num = input()
  262. 6 print(soma)
  263. </pre>
  264. </td>
  265. </tr>
  266. </table>
  267. <div>
  268. <img src="./imgs/soma_n_positivos.png" /><br />
  269. <span>Código no iVProg</span>
  270. </div>
  271. </center>
  272. Note também a diferença da inicialização da variável <b>soma</b>. Começando com zero ela ficará com o valor desejado após a primeira execução do comando <i>soma = soma + num</i>,
  273. ou seja, ela assumirá o valor do primeiro elemento da sequência (se este não for negativo). Note também que para uma sequência vazia, ou seja, para a entrada que já começa com um
  274. número negativo, o resultado escrito na saida será 0, que é o desejado.<br />
  275. <b>Exercício 2:</b><i>Fala a simulação deste programa para as entradas 10 3 4 -5 e veja as diferenças em relação à versão anterior do código, prestando atenção às linhas
  276. 5 e 6 no C, 4 e 5 no Python. Note que após a leitura do número -5, não é executado o comando <b>soma = soma + num</b>, pois o teste do <b>while</b> fica falso e o programa para
  277. o comando de escrita (printf no C; print no Python) </i><br /><br />
  278. <b>Exercício 3: </b><i>Ainda considerando o enunciado do problema 2, verifique o que há de errado com o programa a seguir:</i><br />
  279. <center>
  280. <table>
  281. <tr>
  282. <th> C </th>
  283. <th>Python</th></tr>
  284. <tr>
  285. <td>
  286. <pre>
  287. 1 int num, soma;
  288. 2 scanf("%d", &num);
  289. 3 soma = 0;
  290. 4 while(num!=0){
  291. 5 scanf("%d", num);
  292. 6 soma = soma + num;
  293. 7 }
  294. 8 printf("%d", soma);
  295. </pre>
  296. </td>
  297. <td>
  298. <pre>
  299. 1 num = input();
  300. 2 soma = 0
  301. 3 while num != 0:
  302. 4 num = input()
  303. 5 soma = soma+num
  304. 6 print(soma)
  305. </pre>
  306. </td>
  307. </tr>
  308. </table>
  309. </center>
  310. </p>
  311. </body>