introducao_algoritmos.html 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <!--
  2. 2018 - Prof. Leo^nidas de Oliveira Branda~o
  3. Introducao `a programacao/algoritmos
  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 à Programaćão / algoritmos</title>
  10. <link rel="stylesheet" type="text/css" href="css/estilo.css" />
  11. </head>
  12. <body>
  13. <div class="titulo1"><b>Introdução à Programaćão / algoritmos</b></div>
  14. <p>
  15. <b>Versão 0</b>: 19/12/2019
  16. <!--<b>Alterações</b>: 14/04/2017 - adicionados novos itens (como explicação adicional sobre expressões aritméticas).-->
  17. </p>
  18. <p>
  19. Nesta seção apresentaremos os conceito fundamentais de algoritmos e sua implementaćão na forma de um programa.
  20. </p>
  21. <div class="item1">O que é um algoritmo?</div>
  22. <p>
  23. Um <i>algoritmo</i> descreve um processo repetitivo e é tão antiga quanto a área da Matemática.
  24. Um primeiro exemplo de algoritmo matemático útil é a <i>soma</i> de números com vários dígitos,
  25. por maior que sejam dois números, aplicando corretamente os passos do algoritmo da soma, conseguiremos
  26. somá-los (mesmo desconhendo o nome desses números gigantes!).
  27. </p>
  28. <div class="desafio">
  29. Antes de continuar a leitura, tente descrever o algoritmo da soma de dois números inteiros de vários dígitos.
  30. </div>
  31. <p>
  32. <div class="tit_code">Código 1.</div>
  33. Uma possível descrićão seria, simplificando para caso em que ambos os números tenham o mesmo número de dígitos:
  34. <div class="code">
  35. 1. ajusta-se os números à direita (por que?);<br/>
  36. 2. define-se uma variável auxiliar <tt>vai_um</tt> com valor nulo;<br/>
  37. 3. soma-se os dois dígitos mais à direita (menos significativos),<br/>
  38. &nbsp;&nbsp; se resultar mais que <tt>9</tt>,<br/>
  39. &nbsp;&nbsp;&nbsp;&nbsp; escreva o resultado menos <tt>10</tt> (um único dígito)<br/>
  40. &nbsp;&nbsp;&nbsp;&nbsp; define-se <tt>vai_um</tt> com valor <tt>1</tt> (por que?),<br/>
  41. &nbsp;&nbsp; senão<br/>
  42. &nbsp;&nbsp;&nbsp;&nbsp; escreva o resultado (um único dígito)<br/>
  43. &nbsp;&nbsp;&nbsp;&nbsp; define-se <tt>vai_um</tt> com valor <tt>0</tt> (por que?),<br/>
  44. 4. se não existem mais dígitos, <b>pare</b><br/>
  45. 5. soma-se os próximos dois dígitos e o <tt>vai_um</tt>,<br/>
  46. &nbsp;&nbsp; se resultar mais que <tt>9</tt>,<br/>
  47. &nbsp;&nbsp;&nbsp;&nbsp; escreva o resultado menos <tt>10</tt> (um único dígito)<br/>
  48. &nbsp;&nbsp;&nbsp;&nbsp; define-se <tt>vai_um</tt> com valor <tt>1</tt> (por que?),<br/>
  49. &nbsp;&nbsp; senão<br/>
  50. &nbsp;&nbsp;&nbsp;&nbsp; escreva o resultado (um único dígito)<br/>
  51. &nbsp;&nbsp;&nbsp;&nbsp; define-se <tt>vai_um</tt> com valor <tt>0</tt> (por que?),<br/>
  52. 6. volta-se ao passo passo 4 avanćando à esquerda um dígito.
  53. </div>
  54. </p>
  55. </p>
  56. Note que os passos 4, 5 e 6 são repetidos várias vezes, constituindo o núcleo desse algoritmo.
  57. </p>
  58. <div class="item1">O que é um programa de computador?</div>
  59. AQUI!!!!
  60. <p>
  61. E qual a relação disso com variável? Bem, por exemplo, é necessário contar e, para fazer usando o computador
  62. Basicamente é uma sequência de instrućões
  63. precisamos pegar uma sequência de <i>bytes</i> interpretá-lo como inteiro, somar 1 e registrar o valor
  64. alterado. Isso é feito utilizando a mesma posição de memória, que está assim <i>variando</i>, dai o nome
  65. <i>variável</i>.
  66. </p>
  67. <p>
  68. De um ponto de vista mais elevado (<i>alto-nivel</i>), utilizando uma linguagem de programação com <i>C</i> ou <i>Python</i>,
  69. uma variável é representada por um nome, sem caracteres especiais (exceto "barra baixa" '_' que é permitido)
  70. e que não seja o nome de um comando da linguaguem (denominado de modo geral por <i>palavra reservada</i>).
  71. </p>
  72. <p>
  73. Além disso uma variável deve ter um tipo associado, os tipos básicos que examinaremos nesta seção são o
  74. inteiro (<i>int</i>) e o flutuante (<i>float</i>), este último para representar os valores reais.
  75. A partir da explicação acima sobre interpretar os <i>bytes</i> como número ou caractere explica a necessidade
  76. de cada variável ter o seu tipo conhecido.
  77. </p>
  78. <p>
  79. Para explicar melhor a necessidade de tipos, suporemos que o computador considerado utilize para uma variável
  80. <i>int</i> e para uma do tipo <i>float</i>, respectivamente, 2 e 4 <i title="cada byte tem 8 bits">bytes</i>.
  81. </p>
  82. <p>
  83. Desse modo, quando o citado computador precisa devolver o valor armazenado em uma variável do tipo inteiro, ele
  84. acessará a posição de memória associada à variável, pegará a partir dessa posição os próximos 16 <i>bits</i> e
  85. o interpretará como um valor inteiro.
  86. </p>
  87. <p>
  88. Do ponto de vista prático, vejamos como se usa variáveis do tipo <i>int</i> e do tipo <i>float</i> nas linguagens
  89. <i>C</i> e <i>Python</i>.
  90. </p>
  91. <center><table>
  92. <tr><td></td><td bgcolor="8aaada"><i>C</i> <td bgcolor="8aaada"><i>Python</i></td></tr>
  93. <tr><td>1</td><td>int n1,n2; <td># desnecessário declarar em <i>Python</i></td></tr>
  94. <tr><td>2</td><td>n1 = 1; <td>n1 = 1</td></tr>
  95. <tr><td>3</td><td>scanf("%d", &n2); <td>n2 = int(input())</td></tr>
  96. <tr><td>4</td><td>printf("n1=%d e n2=%d\n", n1, n2); <td>print "n1=", n1, " e n2=", n2 # Python 2</td></tr>
  97. <tr><td>5</td><td> <td>print("n1=", n1, " e n2=", n2) # Python 3</td></tr>
  98. </table></center>
  99. <p>
  100. Note as diferenças entre <i>C</i> e <i>Python</i>:
  101. <ul>
  102. <li> De modo geral, todo comando em <i>C</i> precisa de ';' como finalizador.
  103. </li>
  104. <li> Na linha 1 percebe-se que em <i>C</i> é obrigatório <b>declarar</b> as variáveis, enquanto que em <i>Python</i> não.
  105. <li> Na linha 3 nota-se que <i>C</i> utiliza a função pré-definida de nome <i>scanf</i> para pegar valores digitados
  106. pelo usuário enquanto <i>Python</i> usa o <i>input</i>. O <i>scanf</i> usa o formatador especial '%d' para forçar
  107. o computador a interpretar os <i>bytes</i> como um inteiro, enquanto o <i>input</i> pega os <i>bytes</i>
  108. digitados e o submete à outra função pré-definida <i>Python</i>, o <i>int(...)</i>, que converte os <i>bytes</i> lidos para um inteiro.
  109. </li>
  110. <li> Na linha 4 nota-se o mesmo tipo de diferença, <i>C</i> utiliza a função <i>printf</i> para imprimir também com
  111. o formatador para inteiro '%d', além de separar em 2 blocos, o primeiro para formatar a saída, que é cercado
  112. por aspas dupla e o segunda, uma lista de variáveis compatíveis com o formatador.
  113. Já em <i>Python</i>, usa-se os caracteres entre aspas e as variáveis misturados, separador por vírgula.
  114. </li>
  115. <li> Vale destacar que a linha 4 apresenta a sintaxe do <i>Python</i> antes da versão 3, enquanto que alinha 5 apresenta
  116. o mesmo resultado mas para o <i>Python</i> a partir da sua versão 3.
  117. </li>
  118. </ul>
  119. </p>
  120. <div class="item1">Expressões aritméticas</div>
  121. <p>
  122. Do mesmo modo que em matemática é essencial efetuarmos operações aritméticas com valores numéricos,
  123. o mesmo ocorre com o computador, na verdade efetuar contas de modo
  124. rápido e "sem erro" (na verdade existem erros numéricos, mas este é
  125. outro assunto) foi a grande motivação para se construir os computadores.
  126. </p>
  127. <p>
  128. Neste, os agrupamentos de valores, variáveis e operadores aritméticos recebem o nome de <i>expressão aritmética</i>.
  129. De modo geral, podemos conceituar uma <i>expressão aritmética</i> <b>EA</b> como:
  130. <ol>
  131. <li>EA := K: uma constante numérica é uma <i>expressão aritmética</i></li>
  132. <li>EA := EA + EA | EA - EA | EA * EA | EA / EA: uma <i>expressão aritmética</i> seguida de um <b>operador binário</b>
  133. (com 2 itens) e seguida por outra <i>expressão aritmética</i> é uma <i>expressão aritmética</i></li>
  134. </ol>
  135. Os <b>operadores artiméticos binários</b>, tanto em <i>C</i> quanto em <i>Python</i> são:
  136. </p>
  137. <center><table>
  138. <tr><td bgcolor="8aaada">Operação</td><td bgcolor="8aaada">Operador <td bgcolor="8aaada">Exemplo</td></tr>
  139. <tr><td>soma </td><td> + <td> 2 + 4 </td></tr>
  140. <tr><td>subtração </td><td> - <td> n1 + 1 </td></tr>
  141. <tr><td>multiplicação</td><td> * <td> 3 * n2 </td></tr>
  142. <tr><td>divisão </td><td> / <td> n1 / n2 </td></tr>
  143. </table></center>
  144. <p>
  145. Note que foi usado espaço em branco entre os operando e operadores, mas isso não é obrigatório.
  146. </p>
  147. <div class="item1">O resultado de uma expressão aritmética depende do contexto</div>
  148. <p>
  149. É importante observar que dependendo do contexto o resultado de uma expressão é um ou outro, quer dizer,
  150. se os valores envolvidos forem todos eles inteiros, o resultado será inteiro, entretanto havendo um valor
  151. real, a resposta final será real.
  152. </p>
  153. <p>
  154. A importância disso fica clara ao examinar dois exemplos simples: <i>3 / 2 * 2</i> e <i>3.0 / 2 * 2</i>.
  155. A primeira expressão resulta o valor <i>2</i>, enquanto a segunda <i>3.0</i>. Isso mesmo.
  156. </p>
  157. <p>
  158. A razão é que no primeiro caso todos valores são inteiros, então o cômputo é realizado com aritmética de precisão inteira,
  159. ou seja, ao realizar o primeiro cômputo <i>3/2</i>, o resultado é <i>1</i> (e não <i>1.5</i> como no segundo caso), daí
  160. o segundo operador é feito com os valores <i>1 * 2</i> resultando o valor <i>2</i>.
  161. </p>
  162. <p>
  163. Leônidas de Oliveira Brandão<br/>
  164. http://line.ime.usp.br
  165. </p>