py_introducao_leituras.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <!--
  2. Introdução à entrada de dados em Python
  3. m, n = map(int, raw_input().split());
  4. -->
  5. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  6. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  7. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  8. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  9. <script src="css_img_js_conf/defineLInE.js"></script> <!-- referencia documentos internos -->
  10. <div class="pagina">
  11. <!--
  12. declaracao
  13. io_simples
  14. ex_io_simples
  15. io_composto
  16. -->
  17. <a name="declaracao">
  18. <p class="secao">Qual a diferença entre <i>declarar</i> e usar uma variável?</p>
  19. </a>
  20. <p>
  21. Uma <a href="#" onclick="trocaPagina('introducao_var.html#declaracao')" title="ver explicacao">variável</a> nada mais é que um nome associado à uma posição de <i>memória</i>
  22. do computador:
  23. a posição de seu <i>bit</i> inicial e o número de <i>bits</i> usados para representar aquele tipo de variável.
  24. Como a linguagem <i>Python</i> é interpretada, pode-se em qualquer parte
  25. <b style="color:#0000aa" title="Reservar espaço na memória e associar esse espaço a um nome">declarar</b> uma variável e
  26. depois pode-se usá-la, recebendo valores ou em expressões.
  27. <pre style="font-size:0.9em"><verm>def</verm> main () :
  28. i = 3; <cyan># declara variavel inteira 'i' (i sendo iniciada com valor 3)</cyan>
  29. x = 0.5; <cyan># declara variavel inteira 'x' (iniciada com 0.5)</cyan>
  30. y = i/2; <cyan># declara variavel inteiro 'y' (pois i e' inteiro =&gt; recebera' 3/2 = 1)</cyan>
  31. <cyan># %d e' formatador para imprimir inteiro, %f para flutuante - y=%f e' para comprovar que 3/2 = 1</cyan>
  32. <verd>print</verd>("i=%d, x=%f, y=%f" % (i, x, y));
  33. ...
  34. main();</pre>
  35. <i>Cód. 1. Código ilustrando a declaração de variáveis inteiras e flutuantes.</i>
  36. </p>
  37. <p>
  38. Outro conceito essencial às variáveis é o de
  39. <b style="color:#0000aa" title="Alterar o valor guardado pela variável">atribuição</b> de valor.
  40. Sua sintaxe em <i>Python</i>, e em muitas outras linuguagens, é usar do
  41. <b style="color:#0000aa" title="lado esquerdo da atribuição">lado esquerdo</b> da atribuição um nome de variável e do
  42. <b style="color:#0000aa" title="lado direito da atribuição">lado direito</b> da atribuição uma expressão aritméitca válida.
  43. No código 1, <tt>i=0</tt> e <tt>x=0.5</tt> são atribuições, então funciona no <i>Python</i> como declaração de variável,
  44. desse modo <i>i</i> será variável inteira e x flutuante.
  45. tendo como <i>lado esquerdo</i> as variáveis <i>i</i> e <i>x</i>
  46. e como <i>lado direito</i> as expressões constantes <i>0</i> e <i>0.5</i>.
  47. </p>
  48. <p>
  49. Ainda usando como estrutura o código 1, outro exemplo de atribuição poderia ser <tt>i = n/2</tt>, que tem como
  50. <i>lado direito</i> a expressão <i>n/2</i>.
  51. Como no código 1 a variável <i>n</i> é do tipo inteiro, o mesmo para a constante <i>2</i> (se desejasse <i>flutuante</i> deveria usar <i>2.0</i>),
  52. então seu resultado é o <b style="color:#00aa00" title="a/b = q &#8658; q é o quociente">quociente da divisão inteira da divisão</b>.
  53. Mas vale adiantar outra possibilidade de "forçar" o resultado a ser <i>flutuante</i>, usar o coversor de tipo:
  54. <tt style="color:#00aa00" title="o valor de n é convertido para float, daí o restante da conta usa flutuante">x = (<verm>float</verm>)n/2</tt>.
  55. <!--
  56. &#11013; black left arrow
  57. &#11013; black right arrow
  58. &#8658; Rightwards Double Arrow
  59. -->
  60. </p>
  61. <p>
  62. A figura 1 ilustra a associação de espaço em memória (<i>RAM</i>) para duas variáveis,
  63. são associados 16 <i>bits</i> à variável de nome <i>n</i>, para guardar valores inteiros, seguido da associação de
  64. 32 <i>bits</i> para a variável de nome <i>x</i>, que deve guardar valores "reais".
  65. Nota-se que a variável "real" tem um esquema mais "complicado", ela implementa o conceito
  66. de <a href=<a href="#" onclick="trocaPagina('line_introducao_float.html')" title="clique aqui para estudar ponto flutuante" targe="_blank">ponto flutuante</a>,
  67. usando o padrão
  68. <a href="https://en.wikipedia.org/wiki/Integer_%28computer_science%29" title="ler a respeito IEEE 754 na WikiPedia" target="_blank">
  69. IEEE 754</a> (o primeiro <i>bit</i> é o sinal <i>s</i>; os 8 <i>bits</i>
  70. seguintes correspondente ao expoente <i>e</i> e os últimos 23 à mantissa <i>m</i> - valor de <i>x</i> é s x m x 10<sup>e</sup>, sendo
  71. <i>m</i> entre 0 e 1).
  72. </p>
  73. <center><img src="img/var_memoria1.jpg" title="Ilustracao de inteiro de 16 bits e do modelo float IEEE 754 com 32 bits em memoria"/>
  74. <br/>
  75. <i>Fig. 1. Representação da memória com agrupamentos em <i>bytes</i> (8 <i>bits</i>).</i>
  76. </center>
  77. <!--
  78. https://en.wikipedia.org/wiki/Integer_%28computer_science%29
  79. int = -32,768 to 32,767, from -(2^15) to 2^15-1
  80. https://en.wikipedia.org/wiki/Single-precision_floating-point_format
  81. float = 32 bits
  82. IEEE 754 single-precision binary floating-point format: binary32
  83. Sign bit: 1 bit ; Exponent width: 8 bits ; Significand precision: 24 bits (23 explicitly stored)
  84. float = 0/1 0.mantissa x 10^e
  85. 24 bits 8
  86. -->
  87. <sabermais title="para saber mais">
  88. Note que, em <i>Python</i>, sempre que existe uma <i>atribuição</i>, a <i>variável</i> que aparece do
  89. <b>lado esquerdo</b> da atribuição está sendo (re)definida! Isso corresponde à sua <b>declaração</b>!
  90. <br/>
  91. Isso implica que, na <i>declaração</i> é reservado um espaço de tamanho fixo na <i>memória</i> do computador, o "tamanho" desse espaço
  92. depende do <b>tipo da variável</b>.
  93. </sabermais>
  94. <a name="io_simples">
  95. <span style="font-size:1.2em;color: #0055AA"><b>O que são "entradas de dados" e "saídas de dados"?</b></span>
  96. </a>
  97. <p>
  98. Um <b>algoritmo</b> é uma sequência finita de passos, que ao ser aplicado à um conjunto de dados (<b>entradas</b>) deve produzir
  99. sempre as mesmas <b>saídas</b>.
  100. Por exemplo, o algoritmo da divisão ao ser aplicado sobre valores fixados <i>a</i> e <i>b</i>, deve
  101. produzir sempre o mesmo valor <i>q</i> (de tal forma que <i>q * b = a</i>).
  102. </p>
  103. <p>
  104. Por outro lado, um
  105. <b style="color:#0000aa" title="um algoritmo implementado em alguma linguagem">programa</b>, em <i>Python</i> ou em qualquer outra linguagem,
  106. nada mais é que a implementação de um <b>algoritmo</b> na referida linguagem.
  107. Desse modo, para este programa ser usado, o
  108. <b style="color:#0000aa" title="quem usa o programa">usuário</b> (aquele que está executando) deve fornecer um conjunto de
  109. <b>dados de entrada</b>, na ordem adequada (pois <i>a/b</i> geralmente não é o mesmo que <i>b/a</i>), para que o
  110. programa possa ser executado e produzir as <b>saídas</b> desejadas.
  111. </p>
  112. <center><img src="img/img_computador_io.png" title="ilustracao processamento entradas x saidas"/>
  113. <br/><i>Fig. 2. Ilustração da existência de um algoritmo que aplicado sobre as entradas produz as respectivas saídas.</i>
  114. </center>
  115. <p>
  116. Podemos usar o mesmo exemplo da divisão para ilustar a necessidade dos <i>dados de entrada</i> adequados.
  117. Para que um algoritmo para a divisão de dois números reais seja adequadamente executado,
  118. devem ser fornecidos os dois valores reais, o primeiro será o
  119. <b style="color:#0000aa" title="em a/b &#8658; parte de cima é o numerador &#8658; a é o numerador">numerador</b> e o segundo será o
  120. <b style="color:#0000aa" title="em a/b &#8658; parte de baixo é o denominador &#8658; b é o denominador">denominador</b>.
  121. Assim, se o <i>usuário</i> digitar apenas um valor, o programa ficará parado até
  122. <!-- &#8658; = Rightwards Double Arrow -->
  123. que ele digite o segundo valor.
  124. </p>
  125. <sabermais title="para saber um pouco mais">
  126. Vale observar que, usando uma linguagem como <i>Python</i>, não existe a necessidade de implementar algo tão básico (a <i>divisão</i>, pois
  127. isso é feito por um algoritmo implementado no processador do computador.
  128. Na verdade, desde a proposta inicial do matemática
  129. <a href="https://en.wikipedia.org/wiki/John_von_Neumann" target="_blank" title="Examinar a página sobre John von Neumann na WikiPedia em Inglês"
  130. >John von Neumann</a>, existe uma
  131. <a href="https://en.wikipedia.org/wiki/Arithmetic_logic_unit" target="_blank" title="Examinar a página ULA na WikiPedia em Inglês"
  132. ><b style="color:#0000aa">unidade lógico/aritmética</b></a> especialmente projetada para realizar as
  133. operações lógicas e aritméticas.
  134. Embora, o modelo inicialmente proposto por <i>von Neumann</i> preconizase o uso de
  135. <i>ponto fixo</i>, não o <i>flutuante</i>.
  136. </sabermais>
  137. <br/>
  138. <a name="ex_io_simples">
  139. <span style="font-size:1.2em;color: #0055AA"><b>Entrada de dados simples: inteiro, real e texto em <i>Python 2</i></b></span>
  140. </a>
  141. <!-- ./introducao/codigos/testes/teste_input.py -->
  142. <p>
  143. Na versão 2 do <i>Python</i> a <i>prioridade</i> das entradas são os <i>valores numéricos</i> e a função para disparar
  144. o processo de "coleta" de dados é <b><tt>input()</tt></b>.
  145. Assim, usando o código da tabela 1, pode-se digitar um (único) valor inteiro e o programa imprime o valor e o dobro dele,
  146. em seguida o <i>usuário</i> deve digitar um (único) valor "real" e novamente é impresso o valor e seu dobro.
  147. </p>
  148. <p>
  149. Em <i>Python</i> é possível fazer impressões mais sofisticadas utilizando um formatador (<tt>%</tt>) com o um caractere indicando o
  150. tipo da variável ser impressa: <tt>d</tt> =&gt; "inteiro"; <tt>f</tt> =&gt; "float"; <tt>c</tt> =&gt; "caractere"; <tt>s</tt> =&gt; "string".
  151. Por exemplo, pode-se usar os comandos <br/>
  152. <tt>
  153. &nbsp;&nbsp;&nbsp; m = 2; f = 2.3; c = 'A';<br/>
  154. &nbsp;&nbsp;&nbsp; <verd>print</verd>("m=%d, f=%f, c=%c" % (m, f, c)); <cyan># imprime m, f e c</tt></cyan> <br/>
  155. </tt>
  156. para imprimir inteiro, "float" e caractere (respectivamente).<br/>
  157. Ainda pode-se usar um natural para indicar ajuste à direita e assim construir tabelas.
  158. Experimente: <tt><verd>print</verd>("m=%3d, f=%8.3f, c=%2c" % (m, f, c));</tt>
  159. </p>
  160. <p>
  161. Na tabela abaixo ilustra-se o uso da função/comando <tt><b>input()</b></tt> para entrada de dados no <i>Python 2</i>.
  162. </p>
  163. <p>
  164. <center><i>Tab. 1. Exemplo de códigos para entrada e saída de inteiros e "reais" para o Python 2</i><br/>
  165. <table class="tableCode thBg">
  166. <tr>
  167. <td></td><th bgcolor="8aaada"><i>Python 2</i>: impressão com formatador</th>
  168. <th bgcolor="8aaada"><i>Python 2</i>: com impressão simples</th></tr>
  169. <tr><td><pre style="font-size: 0.8em;"> 1
  170. 2
  171. 3
  172. 4
  173. 5
  174. 6
  175. 7
  176. 8
  177. 9
  178. 10
  179. 11
  180. 12
  181. 13
  182. 14
  183. 15
  184. 16
  185. 17
  186. 18
  187. 18
  188. 20</pre></td><!-- codigo/ -->
  189. <td><pre style="font-size: 0.8em;"><cyan># Python 2 (Py2): funciona digitar 2 ou 2.4</cyan>
  190. <cyan># * O Py2 automaticamente transforma no tipo adequado</cyan>
  191. <cyan># * Mas o Python 3 (Py3) nao faz isso! Ele le^ tudo como</cyan>
  192. <cyan># texto, entao precisa converter explicitamente para</cyan>
  193. <cyan># para o que interssa, e.g. int(input())</cyan>
  194. <cyan># Se usar, 'leitura1_Py2()' com Py3, resultara' no erro:</cyan>
  195. <cyan># <verd>print</verd>("%d %s" % (n,n));</cyan>
  196. <cyan># TypeError: %d format: a number is required, not str</cyan>
  197. <verm>def</verm> leitura1_Py2 () :
  198. <verd>print</verd>("Digitar inteiro");
  199. <cyan># Suponha que digite 2</cyan>
  200. n = <b><verd>input</verd>()</b>; <cyan># ATENCAO: aqui define o tipo como "int"</cyan>
  201. m = 3*n; <cyan># como recebe inteiro => tambem sera' "int"</cyan>
  202. <cyan># Imprime 2 e 6: Py2 automaticamente interpreta como numero</cyan>
  203. <verd>print</verd>("n=%d 3*n=%d" % (n,m));
  204. n = 4.7; <cyan># Nova atribuicao => redeclara, agora float</cyan>
  205. m = 3*n; <cyan># idem, m passa a ser "float"</cyan>
  206. <cyan># Imprime 2 e 3*4: %f por agora ser "float"</cyan>
  207. <verd>print</verd>("n=%f 3*n=%f" % (n,m)); <cyan></cyan>
  208. leitura1_Py2()</pre></td>
  209. <td><pre style="font-size: 0.8em;"><cyan># Python 2 (Py2): funciona digitar 2 ou 2.4</cyan>
  210. <cyan># * O Py2 automaticamente transforma no tipo adequado</cyan>
  211. <cyan># * Mas o Python 3 (Py3) nao faz isso! Ele le^ tudo como</cyan>
  212. <cyan># texto, entao precisa converter explicitamente para</cyan>
  213. <cyan># para o que interssa, e.g. int(input())</cyan>
  214. <cyan># Se usar, 'leitura2_Py2()' com Py3, resultara' no erro:</cyan>
  215. <cyan># <verd>print</verd>("%d %s" % (n,n));</cyan>
  216. <cyan># TypeError: %d format: a number is required, not str</cyan>
  217. <verm>def</verm> leitura2_Py2 () :
  218. <verd>print</verd>("Digitar inteiro");
  219. <cyan># Suponha que digite 2</cyan>
  220. n = <b><verd>input</verd>()</b>; <cyan># ATENCAO: declara "n" como "int"</cyan>
  221. m = 3*n; <cyan># declara "m" como "int"</cyan>
  222. <cyan># Imprime 2 e 6</cyan>
  223. <verd>print</verd>(n,m);
  224. n = 4.7; <cyan># Nova atribuicao => redeclara, agora float</cyan>
  225. m = 3*n; <cyan># idem, m passa a ser "float"</cyan>
  226. <cyan># Imprime 2 e 3*4: %f por agora ser "float"</cyan>
  227. <verd>print</verd>(n,m); <cyan></cyan>
  228. leitura2_Py2()</pre></td>
  229. </table></center>
  230. </p>
  231. <p>
  232. Se o <i>usuário</i>
  233. desejar inserir outra coisa (em geral uma <i>cadeia de caracteres</i> - "<i>string</i>")
  234. deve-se usar uma função especial (vide <tt>raw_input</tt> a seguir).
  235. </p>
  236. <a name="io_composto">
  237. <span style="font-size:1.2em;color: #0055AA"><b>Entrada de dados: vários valores em uma só linha no <i>Python 2</i></b></span>
  238. </a>
  239. <!-- ./introducao/codigos/testes/teste_input.py -->
  240. <p>
  241. Como citado acima, a versão 2 do <i>Python</i> dá <i>prioridade</i> às entradas serem <i>valores numéricos</i>, assim
  242. usando apenas <tt>input()</tt> automaticamente tenta-se interpretar o que foi digitado como número.
  243. Se forem digitados vários valores ou alguma palavra ocorre erro (<tt>File "<string>", line 1</tt>).
  244. </p>
  245. <p>
  246. Assim, se for necessário entrar vários valores de uma só vez deve-se usar um comando especial: <tt><b>raw_input()</b></tt>
  247. (que não mais existe no <i>Python 3</i>!).
  248. Entretanto, depois é preciso rodar um algoritmo para converter os dados, mas o <i>Python</i> já tem algumas funções/métodos
  249. pré-definidos para fazer isso como o <tt>split()</tt> que aplicado sobre uma "string" a quebra pegando cada um de seus elementos
  250. e a função <tt>map(<i>tipo</i>, <i>lista</i>)</tt> que pega uma lista de "strings" e gera uma
  251. lista de <i>tipos</i>.
  252. </p>
  253. <p>
  254. Por exemplo, para digitar as dimensões de uma matriz e seu maior e menor valor em um único <tt>ENTER</tt>, pode-se usar o comando:<br/>
  255. &nbsp;&nbsp;&nbsp; <tt>m, n = map(int, <verd>raw_input</verd>().split()); <cyan># raw_input pega a "string" digitada "2 4"</cyan></tt>
  256. <br/>
  257. É uma sequência de passos:<br/>
  258. 1. <tt><verd>raw_input</verd>()</tt> pegar a "string" digitada (e.g. supor ter sido digitado <tt>2 4 ENTER</tt>;<br/>
  259. 2. <tt>split()</tt> quebra a "string", gerando uma lista (e.g. <tt>["2", "4"]</tt>)<br/>
  260. 3. <tt>map</tt> com parâmetro <tt>int</tt> aplica um algoritmo de conversão em cada item tornando-os inteiro (e.g. <tt>[2, 4]</tt>)<br/>
  261. 4. <tt><verd>print</verd>("m=%d, n=%d" % (m, n, min, max));</tt><br/>
  262. </p>
  263. <p>
  264. Mas com a conversão é uniforme na função <tt>map</tt>, se tiver misturas de valores seria necessário algum "truque".
  265. Por exemplo, suponha que precise ser digitado 2 inteiros seguindos de 2 "floats" (em um único <tt>ENTER</tt>), pode-se usar o
  266. conversor para o tipo de "maior tamanho" ("float" no caso) e depois fazer mais uma conversão:
  267. <pre>
  268. m, n, x, y = map(int, <verd>raw_input</verd>().split()); <cyan># raw_input pega a "string" digitada "2 4 3.1 6.1"</cyan>
  269. m, n = map(int, [m, n]); <cyan># gere uma lista [m,n] e a converta para inteiro</cyan></pre>
  270. É uma sequência de passos:<br/>
  271. 1. <tt><verd>raw_input</verd>()</tt> pegar a "string" digitada (e.g. supor ter sido digitado <tt>2 4 3.1 6.1 ENTER</tt>;<br/>
  272. 2. <tt>split()</tt> quebra a "string", gerando uma lista (e.g. <tt>("2", "4", "3.1", "6.1")</tt>)<br/>
  273. 3. <tt>map</tt> com parâmetro <tt>float</tt> aplica um algoritmo de conversão em cada item tornando-os "float" (e.g. <tt>(2.0, 4.0, 3.1, 6.1)</tt>)<br/>
  274. 4. <tt>map</tt> com parâmetro <tt>int</tt> aplica um algoritmo de conversão em cada item tornando-os "int" (e.g. <tt>(2, 4)</tt>)<br/>
  275. 5. <tt><verd>print</verd>("m=%d, n=%d, x=%f, y=%f" % (m, n, x, y));</tt><br/>
  276. </p>
  277. <p class="autoria">
  278. <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/>
  279. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  280. </p>
  281. <p class="rodape">
  282. <b>Alterações</b>:<br/>
  283. 2020/08/14: novo formato, pequenas revisões<br/>
  284. 2020/07/06: Segunda, 06 Julho 2020, 23:30
  285. </p>
  286. </div>