123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- <!--
- Introducao `a Programacao - desde 2017 - Prof. Leo^nidas de Oliveira Branda~o
- Introdução à conversão inteiro/flutuante e divisões
- LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
- IME - USP
- Material dida'tico
- Pode usar livrevemente este material para fins nao comerciais, devendo sempre fazer referencia `a autoria.
- Sugestoes/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "Material de introducao 'a programacao")
- Autoria: 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'>
- <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
- <div class="pagina">
- <center><p>[
- <a href="declaracao" title="sobre declaracao de variaveis e tipos"
- onclick="frames['iFrame'].document.getElementById('declaracao').scrollIntoView();return false">Declaração</a> |
- <a href="#C" title="conversao entre tipo inteiro-flutuante em C"
- onclick="frames['iFrame'].document.getElementById('C').scrollIntoView();return false">Conversão</a> |
- <a href="#python" title="conversao de tipo inteiro-flutuante em Python"
- onclick="frames['iFrame'].document.getElementById('python').scrollIntoView();return false">Python</a>
- ]</p>
- </center>
- <p class="secao">Introdução à conversão inteiro/flutuante e divisões</p>
- <!-- p>
- <b>Alterações</b>: - .
- </p -->
- <p>
- Nesta seção apresentaremos a conversão entre variáveis inteiras e flutuantes, além de destacar como
- obter o quociente e o resto da divisão entre inteiros.
- </p>
- <p>
- Na seção seguinte apresentamos um resumo sobre variáveis inteiras e flutuantes tanto em <i>C</i> quanto
- em <i>Python</i> e nas duas seções seguintes individualizamos as explicações para cada uma das duas linguagens.
- </p>
- <a name="declaracao" id="declaracao"></a>
- <span style="color: #0055AA;font-size:1.2em">Declaração de tipo <i>inteiro</i> e <i>flutuante</i> em <i>C</i> e em <i>Python</i></span>
- <p>
- Como o próprio nome diz, uma variável inteira pode representar apenas números inteiros, mas o significado de uma variável
- em <i>ponto flutuante</i> não é tão óbvio, mas simplificadamente, podemos entender que é o tipo de variável que
- permite trabalhar com valores "reais", por exemplo, para podermos armazenar valores como <tt>5/2 = 2.5</tt>.
- As explicações sobre a razão desse tipo de variável ser denotada por <i>ponto flutuante</i> é
- <a href="#" onclick="trocaPagina('introducao_float.html')" title="seguir para explicacao de float">explicada em outro texto</a>.
- </p>
- <p>
- <span style="color: #0055AA">Variável = posição de memória + tamanho (em <i>bits</i>).</span>
- Como explicado em outros textos, uma variável está associada à determinada posição de memória e à uma quantidade
- conhecida de <i>bits</i>, pois desse modo pode-se interpretar corretamente o valor ali representado.
- Desse modo podemos dizer que cada variável é de um <b>tipo</b> especĩfico, como <i>tipo inteiro</i> ou <i>tipo real/flutuante</i>.
- </p>
- <p>
- <span style="color: #0055AA">Definição de tipo.</span>
- Na linguagem <i>Python</i>, o <i>tipo</i> é definido na primeira vez que a variável é interpretada, por exemplo,
- se ela recebe um valor inteiro, será inteira.
- Já na linguagem <i>C</i>, como é obrigatório declarar todas as variáveis que serão usadas, a associação é feita no momento dé
- </p>
- <p><span style="color: #0055AA">Formatador de tipo.</span>
- Para se conseguir registrar um valar digitado pelo usuário ou, inversamente, para se imprimir um valor, deve-se também
- saber como estão organizados os <i>bits</i> associados ao valor, alẽm de saber quantos <i>bits</i> determinada variável usa.
- Ou seja, existe um algoritmo interno para converter os <i>bits</i> para o valor legível (usualmente em decimal).
- Para isso as linguagens <i>C</i> e <i>Python</i>, dispõe de um <i>formatador</i> que indica qual o tipo a ser <b>impresso</b>
- (<i>saída</i>). A linguagem <i>C</i> também precisa desse formatador para a <b>leitura</b> (<i>entrada</i>).
- </p>
- <p>
- O <b>formatador para inteiro é o <tt>%d</tt></b> e o <b>formatador para flutuante é o <tt>%f</tt></b>.
- Entretanto não é acusado erro de compilação (<i>C</i>) ou interpretação (<i>Python</i>) se usar um formatador
- errado para imprimir uma variável, embora em <i>C</i> o efeito é desagradável, tanto imprimir inteiro com flutuante,
- quanto imprimir flutuante como inteiro, produz valores "estranhos" (por <i>Python</i> ser mais dinâmico, quase não
- se percebe essa dificuldade de conversão).
- Os demais tipos de variáveis tem outros formatadores.
- </p>
- <p>
- Nos três exemplos a seguir ilustramos como é a leitura e impressão de variáveis inteiras e flutuantes.
- </p>
- <p>
- <b>Exemplo 1 [<i>C</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir na mesma linha os 2 valores lidos.
- <pre><verm>int</verm> v1; <verm>float</verm> v2; <verd>scanf</verd>("%d %f", &v1. &v2); <verd>printf</verd>("v1=%d, v2=%f\n", v1, v2);</pre>
- </p>
- <p>
- Na linguagem <i>Python</i> não é necessário declarar as variáveis, mas ao ler um valor é preciso convertê-lo para o tipo
- a ser trabalhado, além disso, em impressões pode-se usar os formatadores para <tt>%d</tt> para inteiro e <tt>%f</tt> para flutuante.
- </p>
- <p>
- <b>Exemplo 2 [<i>Python</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir em linhas separadas os 2 valores lidos.
- <pre style="font-size:0.8em">v1 = int(<verd>input</verd>()); v2 = float(<verd>input</verd>()); <cyan># ler 2 valores, o primeiro como int, o segundo como float</cyan>
- <verd>print</verd>("v1=", v1); <verd>print</verd>("v2=", v2); <cyan># note que neste caso havera uma quebra de linha entre v1 e v2</cyan>
- </pre>
- </p>
- <p>
- <b>Exemplo 3 [<i>Python</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir na mesma linha os 2 valores lidos
- (usando diferente técnicas).
- <pre style="font-size:0.8em"><cyan># No Python pode-se imprimir sem mudar de linha usando o parametro ' , end = ""' assim: <verd>print</verd>("Algo ", end = "");</cyan>
- <cyan># mas para isso precisa carregar a biblioteca 'print_function' como na linha abaixo</cyan>
- from __future__ import print_function <cyan># no Python 3 esta linha e' desnecessaria...</cyan>
- <verm>der</verm> main () : <cyan># declara uma funcao de nome 'main'</cyan>
- v1 = 2; v2 = 5.0;
- <cyan># Tecnica 1 para imprimir na mesma linha: mais facil</cyan>
- <verd>print</verd>("v1=", v1, "v2=", v2);
- <cyan># Tecnica 2: o %d e %f indica que ali virao valores 'int' e 'float', respectivamente,</cyan>
- <cyan># e o ultimo % indica que a seguir deve vir uma lista com os valores para %d e %f (nessa ordem)</cyan>
- <verd>print</verd>("v1=%d, v2=%f\nxxx" % (v1, v2)); <cyan># dentro das aspas o \n forca uma quebra de linha => o xxx vai para a prox linha</cyan>
- <cyan># Tecnica 3: permite fazer uma impressao e NAO quebrar a linha, ou seja, o proximo 'print' vai para a mesma linha</cyan>
- <verd>print</verd>("v1=", v1, ", v2=", v2, end = ""); <cyan># o ultimo parametro 'end=""' manda nao quebrar a linha</cyan>
- <verd>print</verd>(" ***"); <cyan># portanto, esses asteriscos irao para a mesma linha do 'v1= 5, v2= 2'</cyan>
- main(); <cyan># invoque a funcao 'main()'</cyan>
- </pre>
- </p>
- <a name="C" id="C"></a>
- <span style="color: #0055AA;font-size:1.2em">Conversão de tipo em <i>C</i> (inteiro e "real")</span>
- <p>
- Em <i>C</i> é preciso cuidado ao realizar operações com variáveis, por exemplo se realizar uma divisão entre
- variáveis (ou constante) inteiras, o resultado é um valor inteiro, mesmo que a variável armazenando o resultado
- seja "real" (flutuante).
- </p>
- <p>
- <b>Exemplo 4</b>: usar variáveis <tt><verm>int</verm> v1</tt> e <tt><verm>float</verm> v2</tt> e fazê-las receber o resultado de <tt>5 / 2</tt>.
- <pre style="font-size:0.8em">#include <stdio.h>
- <verm>int</verm> main (void) {
- <verm>int</verm> v1;
- <verm>float</verm> v2;
- v1 = 5/2; <cyan>// como 5 e 2 sao inteiro => faz-se a divisao inteira!</cyan>
- v2 = 5/2; <cyan>// idem! (ou seja, o fato de v2 ser float nao altera o resultado)</cyan>
- <verd>printf</verd>("v1=%d, v2=%f\n", v1, v2); <cyan>// o resultado sera': v1=2, v2=2.000000</cyan>
- return 1; <cyan>// se foi algum outro programa que invocou este, devolva o valor 1</cyan>
- }</pre>
- </p>
- <p>
- Assim, se o desejado é que <tt>v2</tt> receba o valor <tt>2.5</tt>, então deve-se usar um conversor de tipo
- (<i>type cast</i>), convertendo ou o <tt>5</tt> ou o <tt>2</tt> para <i>float</i>.
- Assim:
- <tt>v2 = (float)5 / 2; <cyan>// ou v2 = 5 / (float) 2</tt>.</cyan>
- </p>
- <p>
- Agora se o interesse for obter o resto da divisão inteira, não é preciso de um truque "matemático", basta usar o
- operador especial <tt>%</tt>, como indicado no exemplo 5 abaixo.
- </p>
- <p>
- <b>Exemplo 5</b>: um programa para imprimir o resto da divisão inteira entre dois inteiros.
- <pre style="font-size:0.8em">#include <stdio.h>
- <verm>int</verm> main (void) {
- <verm>int</verm> v1, v2;
- <verd>scanf</verd>("%d %d", &v1. &v2); <cyan>// solicita que sejam digitados 2 valores inteiros</cyan>
- <verd>printf</verd>("v1=%d, v2=%f\n", v1, v2); <cyan>// imprime o que foi digitado</cyan>
- <cyan>// Supondo que foi digitado 5 para v1 e 2 para v2, o proximo 'printf' imprime: resto da divisao entre 5 e 2 e': 1</cyan>
- <verd>printf</verd>("resto da divisao entre %d e %d e': %d\n", v1, v2, v1 % v2); <cyan>// note o "v1 % v2"</cyan>
- <cyan>// pode-se fazer a impressao ou armazenar o resto da divisao usando constantes</cyan>
- <verd>printf</verd>("%d\n", 5%2); <cyan>// imprime: 1</cyan>
- v1 = 5%2; <cyan>// v1 recebe o resto da divisao inteira de 5 por 2 (ou seja, recebe 1)</cyan>
- return 1;
- }</pre>
- </p>
- <a name="python" id="python"></a>
- <span style="color: #0055AA;font-size:1.2em">Conversão de tipo em <i>Python</i> (inteiro e "real")</span>
- <p>
- Em <i>Python</i> existem vários opções para impressão, mas deve-se tomar cuidado com as variáveis/valores, pois
- dependendo do "tipo", o valor pode ser truncado.
- Outro cuidado que deve-se tomar é que, ao solicitar que o usuário digite um valor numérico, deve-se convertë-lo
- para o tipo desejado.
- </p>
- <p>
- <b>Exemplo 6</b>: usar variáveis <tt>v1</tt> e <tt>v2</tt>, a primeira para inteiro (<i>int</i>) e a segunda para "real"
- (ou ponto flutuante, (<i>float</i>)
- e fazê-las receber o resultado de <tt>5 / 2</tt>.
- <pre style="font-size:0.8em"><verm>der</verm> main () :
- v1 = 5/2; <cyan># o resultado e' 2</cyan>
- v2 = float(5)/2); <cyan># obrigatorio converter um dos operandos para conseguir 2.5 - veja que "float(5/2)" resulta "2.0"</cyan>
- <cyan># imprimir de modo mais simples</cyan>
- <verd>print</verd>("v1=", v1, "v2=", v2); <cyan># resultado: v1=2, v2=2.5</cyan>
- <cyan># agora imprimindo usando formatadores %d e %f e uma lista de valores (v1, v2)</cyan>
- <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># resultado: v1=2, v2=2</cyan>
- <verd>print</verd>("v1=%f, v2=%f" % (v1, v2)); <cyan># resultado: v1=2.000000, v2=2.500000</cyan>
- <verd>print</verd>("v1=%d, v2=%f" % (v1, v2)); <cyan># resultado: v1=2, v2=2.500000</cyan>
- main();
- </pre>
- </p>
- <p>
- Note que no exemplo acima, aparece <tt>(v1, v2)</tt> que é uma <b>lista</b> do <i>Python</i>, no caso com dois
- valores numéricos, o primeiro deles será lançado sobre o formatador (no caso o <tt>%d</tt>)
- e o segundo deles irá para o segundo formatador (no caso o <tt>%f</tt>).
- </p>
- <p>
- Outra nota deve ser feita sobre o significado dos <i>formatadores</i>, o <tt>%d</tt> prepara uma saída do tipo
- <i>int</i>, enquanto o <tt>%f</tt> é para saída de valores "reais" (na verdade <i>float</i>).
- Assim, mesmo que determinada variável (<tt>v2</tt> no caso) armazene <i>float</i>
- se usar o formatador <tt>%d</tt> será impressa a parte inteira do número (ou seja, ele é <b>truncado</b>).
- </p>
- <p>
- No exemplo abaixo, fazemos a leitura de um valor inteiro e de um valor "real".
- Precisamos usar as funções conversoras de tipo <tt>int(...)</tt> e <tt>float(...)</tt>,
- respectivamente para converter os valores lidos para <tt>int</tt> e para <tt>float</tt>, respectivamente.
- </p>
- <p>
- <b>Exemplo 7</b>: usar variáveis <tt><verm>int</verm> v1</tt> e <tt><verm>float</verm> v2</tt>.
- <pre style="font-size:0.8em"><verm>der</verm> main () :
- v1 = int(<verd>input</verd>()); <cyan># ler um valor do tipo inteiro</cyan>
- v2 = float(intput()); <cyan># ler um valor do tipo "float"</cyan>
- <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># imprimir assim, o v2 sera' truncado para inteiro</cyan>
- <verd>print</verd>("v1=%d, v2=%f" % (v1, v2)); <cyan># aqui imprime corretamente v1 como "int" e v2 como "float"</cyan>
- <verd>print</verd>("v1=" + str(v1) + ", v2=" + str(v2)); <cyan># pode-se imprimir concatenando "strings" - a funcao "str(...)" converte valor para "string"</cyan>
- main();
- </pre>
- </p>
- <p>
- Do mesmo modo que <i>C</i>, a linguagem <i>Python</i> tem um operador que permite obter o resto da divisão inteira,
- que é o operador especial <tt>%</tt>, como indicado no exemplo 8 abaixo.
- </p>
- <p>
- <b>Exemplo 8</b>: um programa para imprimir o resto da divisão inteira entre dois inteiros.
- <pre style="font-size:0.8em"><verm>der</verm> main () :
- v1 = int(<verd>input</verd>()); <cyan># ler um valor do tipo inteiro</cyan>
- v2 = float(intput()); <cyan># ler um valor do tipo "float"</cyan>
- <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># o que foi digitado</cyan>
- <verd>print</verd>("resto da divisao entre %d e %d e': %d" % (v1, v2, v1 % v2)); <cyan># apos o '%' deve vir uma lista (v1,v2,v1%v2)</cyan>
- main();</pre>
- </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/>
- 2019/07/31: redesenhada a estrutura da página e vários pequenas correções;<br/>
- 2018/04/02: versão inicial;
- </p>
- </div>
|