introducao_estrutura_basica_c_python.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <!--
  2. Introducao 'a Programacao - desde 2017 - Prof. Leo^nidas de Oliveira Branda~o
  3. Sobre a estrutura basica de um programa em C ou em Python
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didatico
  7. Pode usar livrevemente este material para fins nao comerciais, devendo sempre fazer referencia `a autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Autor: Prof. Leo^nidas de Oliveira Branda~o
  10. http://www.ime.usp.br/~leo
  11. http://line.ime.usp.br
  12. http://www.matemtica.br
  13. -->
  14. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  15. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  16. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  18. <div class="pagina">
  19. <!--
  20. <center><p>[
  21. <a href="#" title=""></a> &nbsp; | &nbsp;
  22. <a href="#memoria" title=""></a> &nbsp; &nbsp;
  23. ]</p>
  24. </center>
  25. -->
  26. <p class="secao">Sobre a estrutura básica de um programa em <i>C</i> ou em <i>Python</i>
  27. </p>
  28. <p>
  29. Antes de apresentar a estrutura dos programas, segue a primeira dica para um "bom código": utilizar "indentação" e comentários adequados.
  30. </p>
  31. <p class="secao">1. Comentários em meio ao código e o uso adequado de "indentação".</p>
  32. <p>
  33. Toda linguagem de programação apresenta o conceito de <b style="color:#0000aa">comentário</b>, que serve para indicar ao
  34. compilador (<i>C</i>) ou ao interpretador (<i>Python</i>) que o texto em <i>comentário</i>
  35. <b style="color:#aa0000">não</b> deve ser <i>compilado</i> ou <i>interpretado</i>, respectivamente.
  36. </p>
  37. <p>
  38. Geralmente a linguagem oferece dois modos para comentários, um para <i>comentar apenas o trecho final de uma linha</i> e outro para
  39. <i>comentar várias linhas</i>. Os comentário do primeiro tipo em <i>C</i> e em <i>Python</i> usem os símbolos
  40. <tt><cyan>// ignore o restante desta linha</cyan></tt> e <tt><cyan># ignore o restante desta linha</cyan></tt>, respectivamente.
  41. <br/>
  42. Já os comentários maiores, que sugiro usar <b>apenas</b> nas primeiras linhas de seu código (assim, se houve necessidade de comentar
  43. um bloco código poderá fazê-lo, pois <b style="color:#aa0000">não</b> funcionar comentário dentro de comentário), em
  44. em <i>C</i> e em <i>Python</i> são respectivamente:
  45. <br/>
  46. <tt><cyan>/* Ignore todas as linhas entre estas marcas ... */</cyan></tt>
  47. <br/>
  48. <tt><cyan>""" Ignore todas as linhas entre estas marcas ... """</cyan></tt>
  49. </p>
  50. <p>
  51. Vale a pena ressaltar a impossibilidade "comentários dentro de comentário" comparando com o princípio matemática das chaves e parênteses.
  52. Quer dizer, uma expressão matemática permite "parênteses dentro de parênteses", como em "<tt>(2 * (3+4))</tt>", mas
  53. nem <i>C</i> e nem <i>Python</i> permite que se use comentário dentro de comentário. Exemplifico o erro que resultaria.
  54. </p>
  55. <p class="subsecao">1.1 Comentários dentro de comentário <b style="color:#aa0000">não</b> é possível em <i>Python</i>.</p>
  56. <p>
  57. Em <i>Python</i> o "comentários em várias linhas" é iniciado com e fechado com a sequência de 3 aspas dupla '<tt>"""</tt>'.
  58. Assim, se o programador colocar em seu código <i>Python</i> as próximas 4 linhas:
  59. </p> <!-- " -->
  60. <p><center><!-- codigos/introducao_estrutura_bas.py -->
  61. <pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">
  62. <pre><cyan>"""
  63. Esta e' uma tentativa de colocar comentario dentro de comentario, mas NAO funciona!
  64. """ Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, """</cyan>
  65. logo esta linha NAO mais sera' comentario resultando erro de compilacao!
  66. Assim, comentarios encaixados NAO sao permitidos!
  67. """</pre><i>Cód. 1. Código ilustrando o erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
  68. </center></p>
  69. <p>
  70. Ao tentar fazer o computador interpretar o código acima, o interpretador indicará o erro, como indicado na figura 1.
  71. Experimente em seu interpretador.
  72. </p>
  73. <p><center>
  74. <div class="imgTermTopo">
  75. <pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">
  76. $ python py_teste_comentario.py
  77. File "py_teste_comentario.py", line 4
  78. """ Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, """
  79. ^</pre>
  80. </div>
  81. <i>Fig. 1. Ilustração do erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
  82. </center></p>
  83. <p>
  84. A razão é que o <b style="color:#0000aa">aninhamento</b> de comentários <b style="color:#aa0000">não</b> existe na
  85. configuração padrão <i>Python</i>, assim as 3 aspas da linha 2 fecha o comentário aberto na linha 1, ou seja,
  86. <b style="color:#0000aa">não</b> abre um novo bloco de comentários.
  87. </p>
  88. <p>
  89. Por esta razão recomendo que em seus programas utilize comentários em várias linhas apenas no início do programa (para por exemplo,
  90. identificar-se e explicá-lo). Deste modo, fica fácil isolar um bloco grande de seu código (como comentário), o que é útil para
  91. encontrar erros de sintaxe (mais simples) ou de semântica.
  92. </p>
  93. <p class="subsecao">1.2 Comentários dentro de comentário <b style="color:#aa0000">não</b> é possível em <i>C</i>.</p>
  94. <p>
  95. Em <i>C</i> o "comentários em várias linhas" é iniciado com a dupla de caracteres '<tt>/*</tt>' e fechado com a dupla '<tt>*/</tt>'.
  96. Assim, se o programador colocar em seu código <i>C</i> as próximas 4 linhas
  97. </p> <!-- -->
  98. <p><center><!-- codigos/introducao_estrutura_bas.c -->
  99. <pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">
  100. <pre><cyan>/* Esta e' uma tentativa de colocar comentario dentro de comentario, mas NAO funciona!
  101. /* Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, */</cyan>
  102. logo esta linha NAO mais sera' comentario resultando erro de compilacao!
  103. Assim, comentarios encaixados NAO sao permitidos!
  104. */</pre><i>Cód. 2. Código ilustrando o erro ao supor que existe comentários aninhados em <i>C</i>.</i>
  105. </center></p>
  106. <p>
  107. Ao tentar fazer o computador interpretar o código acima, o interpretador indicará o erro, como indicado na figura 2.
  108. Experimente em seu compilador.
  109. </p>
  110. <p><center>
  111. <div class="imgTermTopo">
  112. <pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 2">
  113. $ gcc -o introducao_estrutura_bas.o introducao_estrutura_bas.c
  114. introducao_estrutura_bas.c:7:2: error: unknown type name ‘logo’
  115. logo esta linha NAO mais sera' comentario resultando erro de compilacao!
  116. ^</pre>
  117. </div>
  118. <i>Fig. 2. Ilustração do erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
  119. </center></p>
  120. <p>
  121. A razão é que o <b style="color:#0000aa">aninhamento</b> de comentários <b style="color:#aa0000">não</b> existe na
  122. configuração padrão <i>Python</i>, assim as 3 aspas da linha 2 fecha o comentário aberto na linha 1, ou seja,
  123. <b style="color:#0000aa">não</b> abre um novo bloco de comentários.
  124. </p>
  125. <p>
  126. Por esta razão recomendo que em seus programas utilize comentários em várias linhas apenas no início do programa (para por exemplo,
  127. identificar-se e explicá-lo). Deste modo, fica fácil isolar um bloco grande de seu código (como comentário), o que é útil para
  128. encontrar erros de sintaxe (mais simples) ou de semântica.
  129. </p>
  130. <p class="secao">2. Uso adequado de "indentação".</p>
  131. <p>
  132. Entenda-se por <b style="color:#0000aa">"indentação"</b> o deslocamento horizontal de trechos de código, o que é usado para indicar claramente uma subordinação de
  133. comandos (ou <b style="color:#0000aa">aninhamento</b>). Por exemplo, se um comando de seleção "<tt>se</tt>" tiver dois comandos subordinados à ele, pode-se usar 2
  134. espaços em branco a mais nesses comandos subordinados. Veja este exemplo uma linguagem semelhante ao Português:
  135. <pre> se (x>0)<br/> S = S+1;<br/> imprima(S);</pre>
  136. Para evitar que meus códigos fiquem muito "longos" (não cabendo uma linha inteira na tela), eu utilizo apenas 2 espaços para indicar subordinação (como no
  137. extrato de código acima).
  138. </p>
  139. <p>
  140. Assim, se determinado comando começa na coluna <i>X</i> ("indentação" de <i>X</i> espaços), então todos os comandos subordinados a ele
  141. terão deslocamento de ao menos <i>X+2</i> espaços em branco. Digo "ao menos", pois dentre estes comandos pode existir outras subordinações.
  142. Isso é ilustrado no exemplo abaixo, no qual os comandos das linhas 2 até 5 estão subordinados ao "<tt>repita enquanto</tt>", tendo
  143. portanto deslocamento
  144. <i>X+2</i> ou mais espaços, mas o comando "<tt>imprima</tt>" da linha 4 tem deslocamento <i>X+4</i>, pois ele está subordinado ao "<tt>se</tt>"
  145. que já tinha deslocamento <i>X+2</i>.
  146. </p>
  147. <p>
  148. A seguir um exemplo com mais linhas e mais subordinações. Nele será usado uma linguagem parecida com o Português, que por isso pode ser
  149. denominada <b style="color:#0000aa">Portugol</b>:
  150. </p>
  151. <pre>Linha Código
  152. 1 repita enquanto (cont &lt; N)
  153. 2 imprima(cont)
  154. 3 se ("cont for par") <cyan>// precisa implementar esta condicao, como "cont % 2 == 0"</cyan>
  155. 4 imprima(cont)
  156. 5 incremente(cont)</pre>
  157. <p>
  158. Note que no código acima, os comandos "<tt>imprima(cont)</tt>" e "<tt>incremente(cont)</tt>" estão deslocados 2 espaços à direita para
  159. indicar que ambos estão sobordinados ao comando de repetição "<tt>repita enquanto (cont &lt; N)</tt>" (repetição será explicado em outra aula).
  160. Já o comando da linha 4 está subordinado ao comando da linha 3 ("<tt>se</tt>"), por isso o uso do deslocamento adicional de
  161. dois espaços em branco.
  162. </p>
  163. <p class="secao">3. Estrutura básica de um programa em <i>C</i>.</p>
  164. <p>
  165. Abaixo ilustro a estrutura básica de um programa em <i>C</i>, utilizando indentação para deixar o código mais claro, o que é importante
  166. para você detectar problemas em seu código e essencial para receber uma boa nota por parte do monitor que analisará seu programa.
  167. </p>
  168. <pre style="font-size:0.8em;"><cyan>/*
  169. O programa abaixo serve apenas para ilustrar a estrutura basica de um programa em <i>C</i>.
  170. Neste primeiro exemplo existe:
  171. - Carrega o cabecalho para os comandos (ou funcoes) para entrada e saida de dados: biblioteca "stdio.h"
  172. - Definicao do codigo principal (por onde devera ser iniciada a execucao de seu codigo): funcao "main"
  173. - Comandos para leitura e para saida de dados: respectivamente, "scanf" e "printf"
  174. * Para declarar 2 variaveis que armazenarao valores inteiros, utilizar o "int" como abaixo
  175. * Para ler valores (usuario digita) e armazenar na variavel usando a funcao predefinida "scanf"
  176. * O "scanf" deve sempre 2 grupos, o primeiro entre aspas e o segundo uma lista de variaveis precedias do '&amp;'
  177. dentro das aspas, '%d' indica que o valor lido sera' tratado como inteiro
  178. na lista de variaveis, o uso de '&amp;' e' obrigatorio para conseguir guardar o valor lido corretamente na variavel
  179. (experimente eliminar um dos '&amp;' no programa abaixo e veja o que ocorre)
  180. * O "printf" adota a mesma estrutura do "scanf" com os 2 blocos, mas nele NAO usar o '&amp;' antes da variavel,
  181. senao sera' impresso o endereco de memoria da variavel, nao o valor que ela guarda)
  182. O '\n' e' serve para que, apos imprimir "n1+n2", "pular" de linha (ou seja, proxima impressao inicia-se na seguinte)
  183. * Os formatadores (como '%d') serao explicados noutra aula, eles podem ser usados para imprimir tabelas
  184. */</cyan>
  185. <incl1>#include</incl1> &lt;stdio.h&gt; <cyan>// coloque esta linha em TODOS seus programas <i>C</i> (a mesno que ele NAO tenha nem entrada, nem saidas!)</cyan>
  186. <verm>int</verm> main (<verm>void</verm>) { <cyan>// obrigatorio em todo programa <i>C</i> (noutra aula explicamos por que usar "void" aqui)</cyan>
  187. <verm>int</verm> n1, n2; <cyan>// declarando o uso de 2 variaves para armazenar apenas valores inteiros</cyan>
  188. <verd>scanf</verd>("%d %d", &amp;n1, &amp;n2); <cyan>// leia 2 valores inteiros, guarde o primeiro em n1 e o outro em n2 (depois veremos '%d' e o '&amp;')</cyan>
  189. <verd>printf</verd>("%d\n", n1+n2); <cyan>// imprima um unico valor (soma dos valores guardados em n1 e em n2)</cyan>
  190. }</stdio.h></pre>
  191. <p class="secao">4. Estrutura básica de um programa em <i>Python</i>.</p>
  192. <p>
  193. Abaixo ilustro a estrutura básica de um programa em <i>Python</i>, utilizando indentação que deixa o código mais claro e é
  194. <b style="color:#00aa00">obrigatório</b> em <i>Python</i>.
  195. <br/>
  196. Para tentar, desde cedo, indicar aos aprendizes de programação em <i>Python</i> que procurem organizar seus código,
  197. sugerimos usar sempre uma função principal, que nominaremos como <tt style="color:#00aa00">main</tt>.
  198. Sugerimos que sempre que implementar uma função, faça isso no início de seu código, deixando qualquer declaração de função
  199. antes (acima) do trecho que a invoque.
  200. </p>
  201. <pre style="font-size:0.8em;"><cyan>"""<!-- " -->
  202. O programa abaixo serve apenas para ilustrar a estrutura basica de um programa em Python.
  203. Neste primeiro exemplo existe:
  204. - Definicao de uma funcao de nome "main": nao e' obrigatorio em Python, mas usaremos desta forma
  205. - Comandos para leitura e para saida de dados: respectivamente, "input" e "print"
  206. * Para declarar 2 variaveis que armazenarao valores inteiros, utilizar o "int" como abaixo
  207. * Para ler valores (usuario digita) e armazenar na variavel usando a funcao predefinida "input"
  208. * O "input" pode ter um argumento que e' uma mensagem (como 'input("Digite: ")'), mas nao usaremos devido
  209. ao avaliador automatico (voce nao vera as mensagens e elas poderiam provocar erro na avaliacao)
  210. * A funcao "int(...)" deve ter como parametro uma expressao numerica, devolvendo a parte inteira dela
  211. por exemplo, 'int(3.5+2)' devolvera' o valor inteiro 5
  212. * O "print" serve para imprimir respostas e pode ter como parametros um sequencia de "frase" e expressoes,
  213. por exemplo, supondo que as variaveis num1 e num2 guardem 2 e 3, o comando
  214. print(num1,"+", num2, "=", num1+num2);
  215. No Python 3 resultaria na seguinte impressao na tela
  216. 2 + 3 = 5
  217. Mas no Python 2, resultaria em uma impressao "menos" elegante
  218. (2, '+', 3, '=', 5)
  219. * Existe um modo de impressao mais poderoso, que funciona da mesma forma tanto no Python 2 quanto no 3,:
  220. print("%d + %d = %d" % (num1,num2,(num1+num2)));
  221. que sempre resulta na primeira forma acima: 2 + 3 = 5
  222. Em outra aula sera' explicado o uso de formatadores (como o '%d') para construcao de tabelas.
  223. """</cyan><!-- " -->
  224. <verm>def</verm> main () : <cyan># Pode usar outro nome que nao "main", mas convencionaremos "main"</cyan>
  225. num1 = int(<verd>input</verd>())
  226. num2 = int(<verd>input</verd>())
  227. <verd>print</verd>(num1+num2)
  228. <cyan># note a indentacao dessa linha =&gt; NAO pertence ao bloco de comandos da funcao "main"</cyan>
  229. main()</pre>
  230. <p class="autoria">
  231. <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
  232. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  233. </p>
  234. <p class="rodape">
  235. <b>Alterações</b>:<br/>
  236. 2020/08/19: várias pequenas correções, nova seção 1.2 para <i>C</i> (existia uma correspondente apenas para <i>Python</i>)<br/>
  237. 2020/08/14: novo formato, pequenas revisões<br/>
  238. 2020/03/31: detalhes<br/>
  239. 2017/08/08: pesquenos acertos<br/>
  240. 2017/03/20: segunda, 20 Mar 2017, 17:02<br/>
  241. </p>
  242. </div>