<!--
 Introducao 'a Programacao - desde 2017 - Prof. Leo^nidas de Oliveira Branda~o
 Sobre a estrutura basica de um programa em C ou em Python
 LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
 IME - USP
 Material didatico
 Pode usar livrevemente este material para fins nao comerciais, devendo sempre fazer referencia `a autoria.
 Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
 Autor: Prof. Leo^nidas de Oliveira Branda~o
 http://www.ime.usp.br/~leo
 http://line.ime.usp.br
 http://www.matemtica.br
  -->

  <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
<div class="pagina">

<!--
<center><p>[
  <a href="#" title=""></a> &nbsp; | &nbsp;
  <a href="#memoria" title=""></a> &nbsp; &nbsp;
 ]</p>
</center>
-->

<p class="secao">Sobre a estrutura básica de um programa em <i>C</i> ou em <i>Python</i>
</p>

<p>
  Antes de apresentar a estrutura dos programas, segue a primeira dica para um "bom código": utilizar "indentação" e comentários adequados.
</p>


<p class="secao">1. Comentários em meio ao código e o uso adequado de "indentação".</p>

<p>
  Toda linguagem de programação apresenta o conceito de <b style="color:#0000aa">comentário</b>, que serve para indicar ao
  compilador (<i>C</i>) ou ao interpretador (<i>Python</i>) que o texto em <i>comentário</i>
  <b style="color:#aa0000">não</b> deve ser <i>compilado</i> ou <i>interpretado</i>, respectivamente.
</p>

<p>
  Geralmente a linguagem oferece dois modos para comentários, um para <i>comentar apenas o trecho final de uma linha</i> e outro para
  <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
  <tt><cyan>// ignore o restante desta linha</cyan></tt> e <tt><cyan># ignore o restante desta linha</cyan></tt>, respectivamente.
  <br/>
  Já os comentários maiores, que sugiro usar <b>apenas</b> nas primeiras linhas de seu código (assim, se houve necessidade de comentar
  um bloco código poderá fazê-lo, pois <b style="color:#aa0000">não</b> funcionar comentário dentro de comentário), em
  em <i>C</i> e em <i>Python</i> são respectivamente:
  <br/>
  <tt><cyan>/* Ignore todas as linhas entre estas marcas ... */</cyan></tt>
  <br/>
  <tt><cyan>""" Ignore todas as linhas entre estas marcas ... """</cyan></tt>
</p>

<p>
  Vale a pena ressaltar a impossibilidade "comentários dentro de comentário" comparando com o princípio matemática das chaves e parênteses.
  Quer dizer, uma expressão matemática permite "parênteses dentro de parênteses", como em "<tt>(2 * (3+4))</tt>", mas
  nem <i>C</i> e nem <i>Python</i> permite que se use comentário dentro de comentário. Exemplifico o erro que resultaria.
</p>


<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>

<p>
  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>'.
  Assim, se o programador colocar em seu código <i>Python</i> as próximas 4 linhas:
</p> <!-- " -->

<p><center><!-- codigos/introducao_estrutura_bas.py -->
<pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">
<pre><cyan>"""
 Esta e' uma tentativa de colocar comentario dentro de comentario, mas NAO funciona!
 """ Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, """</cyan>
 logo esta linha NAO mais sera' comentario resultando erro de compilacao!
 Assim, comentarios encaixados NAO sao permitidos!
"""</pre><i>Cód. 1. Código ilustrando o erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
</center></p>

<p>
  Ao tentar fazer o computador interpretar o código acima, o interpretador indicará o erro, como indicado na figura 1.
  Experimente em seu interpretador.
</p>

<p><center>
<div class="imgTermTopo">
<pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">

  $ python py_teste_comentario.py
  File "py_teste_comentario.py", line 4
  """ Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, """
       ^</pre>
</div>
<i>Fig. 1. Ilustração do erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
</center></p>

<p>
  A razão é que o <b style="color:#0000aa">aninhamento</b> de comentários <b style="color:#aa0000">não</b> existe na
  configuração padrão <i>Python</i>, assim as 3 aspas da linha 2 fecha o comentário aberto na linha 1, ou seja,
  <b style="color:#0000aa">não</b> abre um novo bloco de comentários.
</p>

<p>  
  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,
  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
  encontrar erros de sintaxe (mais simples) ou de semântica.
</p>



<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>

<p>
  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>'.
  Assim, se o programador colocar em seu código <i>C</i> as próximas 4 linhas
</p> <!--  -->

<p><center><!-- codigos/introducao_estrutura_bas.c -->
<pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 1">
<pre><cyan>/* Esta e' uma tentativa de colocar comentario dentro de comentario, mas NAO funciona!
 /* Ao encontrar o proximo fecha, ele correspondera' ao primeiro abre, */</cyan>
 logo esta linha NAO mais sera' comentario resultando erro de compilacao!
 Assim, comentarios encaixados NAO sao permitidos!
*/</pre><i>Cód. 2. Código ilustrando o erro ao supor que existe comentários aninhados em <i>C</i>.</i>
</center></p>

<p>
  Ao tentar fazer o computador interpretar o código acima, o interpretador indicará o erro, como indicado na figura 2.
  Experimente em seu compilador.
</p>

<p><center>
<div class="imgTermTopo">
<pre style="text-align:left" title="Ilustração de um terminal com as saídas para o código 2">

$ gcc -o introducao_estrutura_bas.o introducao_estrutura_bas.c
introducao_estrutura_bas.c:7:2: error: unknown type name ‘logo’
  logo esta linha NAO mais sera' comentario resultando erro de compilacao!
  ^</pre>
</div>
<i>Fig. 2. Ilustração do erro ao supor que existe comentários aninhados em <i>Python</i>.</i>
</center></p>

<p>
  A razão é que o <b style="color:#0000aa">aninhamento</b> de comentários <b style="color:#aa0000">não</b> existe na
  configuração padrão <i>Python</i>, assim as 3 aspas da linha 2 fecha o comentário aberto na linha 1, ou seja,
  <b style="color:#0000aa">não</b> abre um novo bloco de comentários.
</p>

<p>  
  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,
  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
  encontrar erros de sintaxe (mais simples) ou de semântica.
</p>


<p class="secao">2. Uso adequado de "indentação".</p>

<p>
  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
  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
  espaços em branco a mais nesses comandos subordinados. Veja este exemplo uma linguagem semelhante ao Português:
  <pre> se (x>0)<br/>   S = S+1;<br/>   imprima(S);</pre>
  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
  extrato de código acima).

</p>

<p>
  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
  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.
  Isso é ilustrado no exemplo abaixo, no qual os comandos das linhas 2 até 5 estão subordinados ao "<tt>repita enquanto</tt>", tendo
  portanto deslocamento
  <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>"
  que já tinha deslocamento <i>X+2</i>.
</p>

<p>
  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
  denominada <b style="color:#0000aa">Portugol</b>:
</p>

<pre>Linha  Código
1      repita enquanto (cont &lt; N)
2         imprima(cont)
3         se ("cont for par") <cyan>// precisa implementar esta condicao, como "cont % 2 == 0"</cyan>
4           imprima(cont)
5         incremente(cont)</pre>
<p>
  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
  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).
  Já o comando da linha 4 está subordinado ao comando da linha 3 ("<tt>se</tt>"), por isso o uso do deslocamento adicional de
  dois espaços em branco.
</p>


<p class="secao">3. Estrutura básica de um programa em <i>C</i>.</p>

<p>
  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
  para você detectar problemas em seu código e essencial para receber uma boa nota por parte do monitor que analisará seu programa.
</p>
<pre style="font-size:0.8em;"><cyan>/*
 O programa abaixo serve apenas para ilustrar a estrutura basica de um programa em <i>C</i>.
 Neste primeiro exemplo existe:
 - Carrega o cabecalho para os comandos (ou funcoes) para entrada e saida de dados: biblioteca "stdio.h"
 - Definicao do codigo principal (por onde devera ser iniciada a execucao de seu codigo): funcao "main"
 - Comandos para leitura e para saida de dados: respectivamente, "scanf" e "printf"
   * Para declarar 2 variaveis que armazenarao valores inteiros, utilizar o "int" como abaixo
   * Para ler valores (usuario digita) e armazenar na variavel usando a funcao predefinida "scanf"
   * O "scanf" deve sempre 2 grupos, o primeiro entre aspas e o segundo uma lista de variaveis precedias do '&amp;'
     dentro das aspas, '%d' indica que o valor lido sera' tratado como inteiro
     na lista de variaveis, o uso de '&amp;' e' obrigatorio para conseguir guardar o valor lido corretamente na variavel
     (experimente eliminar um dos '&amp;' no programa abaixo e veja o que ocorre)
   * O "printf" adota a mesma estrutura do "scanf" com os 2 blocos, mas nele NAO usar o '&amp;' antes da variavel,
     senao sera' impresso o endereco de memoria da variavel, nao o valor que ela guarda)
     O '\n' e' serve para que, apos imprimir "n1+n2", "pular" de linha (ou seja, proxima impressao inicia-se na seguinte)
   * Os formatadores (como '%d') serao explicados noutra aula, eles podem ser usados para imprimir tabelas
*/</cyan>

<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>
<verm>int</verm> main (<verm>void</verm>) {  <cyan>// obrigatorio em todo programa <i>C</i> (noutra aula explicamos por que usar "void" aqui)</cyan>
  <verm>int</verm> n1, n2;               <cyan>// declarando o uso de 2 variaves para armazenar apenas valores inteiros</cyan>
  <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>
  <verd>printf</verd>("%d\n", n1+n2);    <cyan>// imprima um unico valor (soma dos valores guardados em n1 e em n2)</cyan>
  }</stdio.h></pre>


<p class="secao">4. Estrutura básica de um programa em <i>Python</i>.</p>

<p>
  Abaixo ilustro a estrutura básica de um programa em <i>Python</i>, utilizando indentação que deixa o código mais claro e é
  <b style="color:#00aa00">obrigatório</b> em <i>Python</i>.
  <br/>
  Para tentar, desde cedo, indicar aos aprendizes de programação em <i>Python</i> que procurem organizar seus código,
  sugerimos usar sempre uma função principal, que nominaremos como <tt style="color:#00aa00">main</tt>.
  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
  antes (acima) do trecho que a invoque.
</p>
<pre style="font-size:0.8em;"><cyan>"""<!-- " -->
 O programa abaixo serve apenas para ilustrar a estrutura basica de um programa em Python.
 Neste primeiro exemplo existe:
 - Definicao de uma funcao de nome "main": nao e' obrigatorio em Python, mas usaremos desta forma
 - Comandos para leitura e para saida de dados: respectivamente, "input" e "print"
   * Para declarar 2 variaveis que armazenarao valores inteiros, utilizar o "int" como abaixo
   * Para ler valores (usuario digita) e armazenar na variavel usando a funcao predefinida "input"
   * O "input" pode ter um argumento que e' uma mensagem (como 'input("Digite: ")'), mas nao usaremos devido
     ao avaliador automatico (voce nao vera as mensagens e elas poderiam provocar erro na avaliacao)
   * A funcao "int(...)" deve ter como parametro uma expressao numerica, devolvendo a parte inteira dela
     por exemplo, 'int(3.5+2)' devolvera' o valor inteiro 5
   * O "print" serve para imprimir respostas e pode ter como parametros um sequencia de "frase" e expressoes,
     por exemplo, supondo que as variaveis num1 e num2 guardem 2 e 3, o comando
         print(num1,"+", num2, "=", num1+num2);
     No Python 3 resultaria na seguinte impressao na tela
         2 + 3 = 5
     Mas no Python 2, resultaria em uma impressao "menos" elegante
         (2, '+', 3, '=', 5)
   * Existe um modo de impressao mais poderoso, que funciona da mesma forma tanto no Python 2 quanto no 3,:
         print("%d + %d = %d" % (num1,num2,(num1+num2)));
     que sempre resulta na primeira forma acima: 2 + 3 = 5
     Em outra aula sera' explicado o uso de formatadores (como o '%d') para construcao de tabelas.
"""</cyan><!-- " -->
<verm>def</verm> main () : <cyan># Pode usar outro nome que nao "main", mas convencionaremos "main"</cyan>
  num1 = int(<verd>input</verd>())
  num2 = int(<verd>input</verd>())
  <verd>print</verd>(num1+num2)
<cyan># note a indentacao dessa linha =&gt; NAO pertence ao bloco de comandos da funcao "main"</cyan>
main()</pre>

<p class="autoria">
 <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/>
 <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
</p>

<p class="rodape">
  <b>Alterações</b>:<br/>
  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/>
  2020/08/14: novo formato, pequenas revisões<br/>
  2020/03/31: detalhes<br/>
  2017/08/08: pesquenos acertos<br/>
  2017/03/20: segunda, 20 Mar 2017, 17:02<br/>
</p>

</div>