123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- <!--
- Introdução à entrada de dados em Python
- m, n = map(int, raw_input().split());
- -->
- <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'>
- <script src="css_img_js_conf/defineLInE.js"></script> <!-- referencia documentos internos -->
- <div class="pagina">
- <!--
- declaracao
- io_simples
- ex_io_simples
- io_composto
- -->
- <a name="declaracao">
- <p class="secao">Qual a diferença entre <i>declarar</i> e usar uma variável?</p>
- </a>
- <p>
- 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>
- do computador:
- 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.
- Como a linguagem <i>Python</i> é interpretada, pode-se em qualquer parte
- <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
- depois pode-se usá-la, recebendo valores ou em expressões.
- <pre style="font-size:0.9em"><verm>def</verm> main () :
- i = 3; <cyan># declara variavel inteira 'i' (i sendo iniciada com valor 3)</cyan>
- x = 0.5; <cyan># declara variavel inteira 'x' (iniciada com 0.5)</cyan>
- y = i/2; <cyan># declara variavel inteiro 'y' (pois i e' inteiro => recebera' 3/2 = 1)</cyan>
- <cyan># %d e' formatador para imprimir inteiro, %f para flutuante - y=%f e' para comprovar que 3/2 = 1</cyan>
- <verd>print</verd>("i=%d, x=%f, y=%f" % (i, x, y));
- ...
- main();</pre>
- <i>Cód. 1. Código ilustrando a declaração de variáveis inteiras e flutuantes.</i>
- </p>
- <p>
- Outro conceito essencial às variáveis é o de
- <b style="color:#0000aa" title="Alterar o valor guardado pela variável">atribuição</b> de valor.
- Sua sintaxe em <i>Python</i>, e em muitas outras linuguagens, é usar do
- <b style="color:#0000aa" title="lado esquerdo da atribuição">lado esquerdo</b> da atribuição um nome de variável e do
- <b style="color:#0000aa" title="lado direito da atribuição">lado direito</b> da atribuição uma expressão aritméitca válida.
- 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,
- desse modo <i>i</i> será variável inteira e x flutuante.
- tendo como <i>lado esquerdo</i> as variáveis <i>i</i> e <i>x</i>
- e como <i>lado direito</i> as expressões constantes <i>0</i> e <i>0.5</i>.
- </p>
- <p>
- Ainda usando como estrutura o código 1, outro exemplo de atribuição poderia ser <tt>i = n/2</tt>, que tem como
- <i>lado direito</i> a expressão <i>n/2</i>.
- 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>),
- então seu resultado é o <b style="color:#00aa00" title="a/b = q ⇒ q é o quociente">quociente da divisão inteira da divisão</b>.
- Mas vale adiantar outra possibilidade de "forçar" o resultado a ser <i>flutuante</i>, usar o coversor de tipo:
- <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>.
- <!--
- ⬅ black left arrow
- ⬅ black right arrow
- ⇒ Rightwards Double Arrow
- -->
- </p>
- <p>
- A figura 1 ilustra a associação de espaço em memória (<i>RAM</i>) para duas variáveis,
- são associados 16 <i>bits</i> à variável de nome <i>n</i>, para guardar valores inteiros, seguido da associação de
- 32 <i>bits</i> para a variável de nome <i>x</i>, que deve guardar valores "reais".
- Nota-se que a variável "real" tem um esquema mais "complicado", ela implementa o conceito
- de <a href=<a href="#" onclick="trocaPagina('line_introducao_float.html')" title="clique aqui para estudar ponto flutuante" targe="_blank">ponto flutuante</a>,
- usando o padrão
- <a href="https://en.wikipedia.org/wiki/Integer_%28computer_science%29" title="ler a respeito IEEE 754 na WikiPedia" target="_blank">
- IEEE 754</a> (o primeiro <i>bit</i> é o sinal <i>s</i>; os 8 <i>bits</i>
- 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
- <i>m</i> entre 0 e 1).
- </p>
- <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"/>
- <br/>
- <i>Fig. 1. Representação da memória com agrupamentos em <i>bytes</i> (8 <i>bits</i>).</i>
- </center>
- <!--
- https://en.wikipedia.org/wiki/Integer_%28computer_science%29
- int = -32,768 to 32,767, from -(2^15) to 2^15-1
- https://en.wikipedia.org/wiki/Single-precision_floating-point_format
- float = 32 bits
- IEEE 754 single-precision binary floating-point format: binary32
- Sign bit: 1 bit ; Exponent width: 8 bits ; Significand precision: 24 bits (23 explicitly stored)
- float = 0/1 0.mantissa x 10^e
- 24 bits 8
- -->
- <sabermais title="para saber mais">
- Note que, em <i>Python</i>, sempre que existe uma <i>atribuição</i>, a <i>variável</i> que aparece do
- <b>lado esquerdo</b> da atribuição está sendo (re)definida! Isso corresponde à sua <b>declaração</b>!
- <br/>
- 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
- depende do <b>tipo da variável</b>.
- </sabermais>
- <a name="io_simples">
- <span style="font-size:1.2em;color: #0055AA"><b>O que são "entradas de dados" e "saídas de dados"?</b></span>
- </a>
- <p>
- Um <b>algoritmo</b> é uma sequência finita de passos, que ao ser aplicado à um conjunto de dados (<b>entradas</b>) deve produzir
- sempre as mesmas <b>saídas</b>.
- Por exemplo, o algoritmo da divisão ao ser aplicado sobre valores fixados <i>a</i> e <i>b</i>, deve
- produzir sempre o mesmo valor <i>q</i> (de tal forma que <i>q * b = a</i>).
- </p>
- <p>
- Por outro lado, um
- <b style="color:#0000aa" title="um algoritmo implementado em alguma linguagem">programa</b>, em <i>Python</i> ou em qualquer outra linguagem,
- nada mais é que a implementação de um <b>algoritmo</b> na referida linguagem.
- Desse modo, para este programa ser usado, o
- <b style="color:#0000aa" title="quem usa o programa">usuário</b> (aquele que está executando) deve fornecer um conjunto de
- <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
- programa possa ser executado e produzir as <b>saídas</b> desejadas.
- </p>
- <center><img src="img/img_computador_io.png" title="ilustracao processamento entradas x saidas"/>
- <br/><i>Fig. 2. Ilustração da existência de um algoritmo que aplicado sobre as entradas produz as respectivas saídas.</i>
- </center>
- <p>
- Podemos usar o mesmo exemplo da divisão para ilustar a necessidade dos <i>dados de entrada</i> adequados.
- Para que um algoritmo para a divisão de dois números reais seja adequadamente executado,
- devem ser fornecidos os dois valores reais, o primeiro será o
- <b style="color:#0000aa" title="em a/b ⇒ parte de cima é o numerador ⇒ a é o numerador">numerador</b> e o segundo será o
- <b style="color:#0000aa" title="em a/b ⇒ parte de baixo é o denominador ⇒ b é o denominador">denominador</b>.
- Assim, se o <i>usuário</i> digitar apenas um valor, o programa ficará parado até
- <!-- ⇒ = Rightwards Double Arrow -->
- que ele digite o segundo valor.
- </p>
- <sabermais title="para saber um pouco mais">
- 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
- isso é feito por um algoritmo implementado no processador do computador.
- Na verdade, desde a proposta inicial do matemática
- <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"
- >John von Neumann</a>, existe uma
- <a href="https://en.wikipedia.org/wiki/Arithmetic_logic_unit" target="_blank" title="Examinar a página ULA na WikiPedia em Inglês"
- ><b style="color:#0000aa">unidade lógico/aritmética</b></a> especialmente projetada para realizar as
- operações lógicas e aritméticas.
- Embora, o modelo inicialmente proposto por <i>von Neumann</i> preconizase o uso de
- <i>ponto fixo</i>, não o <i>flutuante</i>.
- </sabermais>
- <br/>
- <a name="ex_io_simples">
- <span style="font-size:1.2em;color: #0055AA"><b>Entrada de dados simples: inteiro, real e texto em <i>Python 2</i></b></span>
- </a>
- <!-- ./introducao/codigos/testes/teste_input.py -->
- <p>
- 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
- o processo de "coleta" de dados é <b><tt>input()</tt></b>.
- 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,
- em seguida o <i>usuário</i> deve digitar um (único) valor "real" e novamente é impresso o valor e seu dobro.
- </p>
- <p>
- Em <i>Python</i> é possível fazer impressões mais sofisticadas utilizando um formatador (<tt>%</tt>) com o um caractere indicando o
- tipo da variável ser impressa: <tt>d</tt> => "inteiro"; <tt>f</tt> => "float"; <tt>c</tt> => "caractere"; <tt>s</tt> => "string".
- Por exemplo, pode-se usar os comandos <br/>
- <tt>
- m = 2; f = 2.3; c = 'A';<br/>
- <verd>print</verd>("m=%d, f=%f, c=%c" % (m, f, c)); <cyan># imprime m, f e c</tt></cyan> <br/>
- </tt>
- para imprimir inteiro, "float" e caractere (respectivamente).<br/>
- Ainda pode-se usar um natural para indicar ajuste à direita e assim construir tabelas.
- Experimente: <tt><verd>print</verd>("m=%3d, f=%8.3f, c=%2c" % (m, f, c));</tt>
- </p>
- <p>
- 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>.
- </p>
- <p>
- <center><i>Tab. 1. Exemplo de códigos para entrada e saída de inteiros e "reais" para o Python 2</i><br/>
- <table class="tableCode thBg">
- <tr>
- <td></td><th bgcolor="8aaada"><i>Python 2</i>: impressão com formatador</th>
- <th bgcolor="8aaada"><i>Python 2</i>: com impressão simples</th></tr>
- <tr><td><pre style="font-size: 0.8em;"> 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 18
- 20</pre></td><!-- codigo/ -->
- <td><pre style="font-size: 0.8em;"><cyan># Python 2 (Py2): funciona digitar 2 ou 2.4</cyan>
- <cyan># * O Py2 automaticamente transforma no tipo adequado</cyan>
- <cyan># * Mas o Python 3 (Py3) nao faz isso! Ele le^ tudo como</cyan>
- <cyan># texto, entao precisa converter explicitamente para</cyan>
- <cyan># para o que interssa, e.g. int(input())</cyan>
- <cyan># Se usar, 'leitura1_Py2()' com Py3, resultara' no erro:</cyan>
- <cyan># <verd>print</verd>("%d %s" % (n,n));</cyan>
- <cyan># TypeError: %d format: a number is required, not str</cyan>
- <verm>def</verm> leitura1_Py2 () :
- <verd>print</verd>("Digitar inteiro");
- <cyan># Suponha que digite 2</cyan>
- n = <b><verd>input</verd>()</b>; <cyan># ATENCAO: aqui define o tipo como "int"</cyan>
- m = 3*n; <cyan># como recebe inteiro => tambem sera' "int"</cyan>
- <cyan># Imprime 2 e 6: Py2 automaticamente interpreta como numero</cyan>
- <verd>print</verd>("n=%d 3*n=%d" % (n,m));
- n = 4.7; <cyan># Nova atribuicao => redeclara, agora float</cyan>
- m = 3*n; <cyan># idem, m passa a ser "float"</cyan>
- <cyan># Imprime 2 e 3*4: %f por agora ser "float"</cyan>
- <verd>print</verd>("n=%f 3*n=%f" % (n,m)); <cyan></cyan>
- leitura1_Py2()</pre></td>
- <td><pre style="font-size: 0.8em;"><cyan># Python 2 (Py2): funciona digitar 2 ou 2.4</cyan>
- <cyan># * O Py2 automaticamente transforma no tipo adequado</cyan>
- <cyan># * Mas o Python 3 (Py3) nao faz isso! Ele le^ tudo como</cyan>
- <cyan># texto, entao precisa converter explicitamente para</cyan>
- <cyan># para o que interssa, e.g. int(input())</cyan>
- <cyan># Se usar, 'leitura2_Py2()' com Py3, resultara' no erro:</cyan>
- <cyan># <verd>print</verd>("%d %s" % (n,n));</cyan>
- <cyan># TypeError: %d format: a number is required, not str</cyan>
- <verm>def</verm> leitura2_Py2 () :
- <verd>print</verd>("Digitar inteiro");
- <cyan># Suponha que digite 2</cyan>
- n = <b><verd>input</verd>()</b>; <cyan># ATENCAO: declara "n" como "int"</cyan>
- m = 3*n; <cyan># declara "m" como "int"</cyan>
- <cyan># Imprime 2 e 6</cyan>
- <verd>print</verd>(n,m);
- n = 4.7; <cyan># Nova atribuicao => redeclara, agora float</cyan>
- m = 3*n; <cyan># idem, m passa a ser "float"</cyan>
- <cyan># Imprime 2 e 3*4: %f por agora ser "float"</cyan>
- <verd>print</verd>(n,m); <cyan></cyan>
- leitura2_Py2()</pre></td>
- </table></center>
- </p>
- <p>
- Se o <i>usuário</i>
- desejar inserir outra coisa (em geral uma <i>cadeia de caracteres</i> - "<i>string</i>")
- deve-se usar uma função especial (vide <tt>raw_input</tt> a seguir).
- </p>
- <a name="io_composto">
- <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>
- </a>
- <!-- ./introducao/codigos/testes/teste_input.py -->
- <p>
- Como citado acima, a versão 2 do <i>Python</i> dá <i>prioridade</i> às entradas serem <i>valores numéricos</i>, assim
- usando apenas <tt>input()</tt> automaticamente tenta-se interpretar o que foi digitado como número.
- Se forem digitados vários valores ou alguma palavra ocorre erro (<tt>File "<string>", line 1</tt>).
- </p>
- <p>
- 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>
- (que não mais existe no <i>Python 3</i>!).
- Entretanto, depois é preciso rodar um algoritmo para converter os dados, mas o <i>Python</i> já tem algumas funções/métodos
- pré-definidos para fazer isso como o <tt>split()</tt> que aplicado sobre uma "string" a quebra pegando cada um de seus elementos
- e a função <tt>map(<i>tipo</i>, <i>lista</i>)</tt> que pega uma lista de "strings" e gera uma
- lista de <i>tipos</i>.
- </p>
- <p>
- 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/>
- <tt>m, n = map(int, <verd>raw_input</verd>().split()); <cyan># raw_input pega a "string" digitada "2 4"</cyan></tt>
- <br/>
- É uma sequência de passos:<br/>
- 1. <tt><verd>raw_input</verd>()</tt> pegar a "string" digitada (e.g. supor ter sido digitado <tt>2 4 ENTER</tt>;<br/>
- 2. <tt>split()</tt> quebra a "string", gerando uma lista (e.g. <tt>["2", "4"]</tt>)<br/>
- 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/>
- 4. <tt><verd>print</verd>("m=%d, n=%d" % (m, n, min, max));</tt><br/>
- </p>
- <p>
- Mas com a conversão é uniforme na função <tt>map</tt>, se tiver misturas de valores seria necessário algum "truque".
- Por exemplo, suponha que precise ser digitado 2 inteiros seguindos de 2 "floats" (em um único <tt>ENTER</tt>), pode-se usar o
- conversor para o tipo de "maior tamanho" ("float" no caso) e depois fazer mais uma conversão:
- <pre>
- 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>
- m, n = map(int, [m, n]); <cyan># gere uma lista [m,n] e a converta para inteiro</cyan></pre>
- É uma sequência de passos:<br/>
- 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/>
- 2. <tt>split()</tt> quebra a "string", gerando uma lista (e.g. <tt>("2", "4", "3.1", "6.1")</tt>)<br/>
- 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/>
- 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/>
- 5. <tt><verd>print</verd>("m=%d, n=%d, x=%f, y=%f" % (m, n, x, y));</tt><br/>
- </p>
- <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/14: novo formato, pequenas revisões<br/>
- 2020/07/06: Segunda, 06 Julho 2020, 23:30
- </p>
- </div>
|