introducao_inteiro_float.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <!--
  2. Introducao `a Programacao - desde 2017 - Prof. Leo^nidas de Oliveira Branda~o
  3. Introdução à conversão inteiro/flutuante e divisões
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material dida'tico
  7. Pode usar livrevemente este material para fins nao comerciais, devendo sempre fazer referencia `a autoria.
  8. Sugestoes/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "Material de introducao 'a programacao")
  9. Autoria: 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. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  19. <div class="pagina">
  20. <center><p>[
  21. <a href="declaracao" title="sobre declaracao de variaveis e tipos"
  22. onclick="frames['iFrame'].document.getElementById('declaracao').scrollIntoView();return false">Declaração</a> &nbsp; | &nbsp;
  23. <a href="#C" title="conversao entre tipo inteiro-flutuante em C"
  24. onclick="frames['iFrame'].document.getElementById('C').scrollIntoView();return false">Conversão</a> &nbsp; | &nbsp;
  25. <a href="#python" title="conversao de tipo inteiro-flutuante em Python"
  26. onclick="frames['iFrame'].document.getElementById('python').scrollIntoView();return false">Python</a> &nbsp; &nbsp;
  27. ]</p>
  28. </center>
  29. <p class="secao">Introdução à conversão inteiro/flutuante e divisões</p>
  30. <!-- p>
  31. <b>Alterações</b>: - .
  32. </p -->
  33. <p>
  34. Nesta seção apresentaremos a conversão entre variáveis inteiras e flutuantes, além de destacar como
  35. obter o quociente e o resto da divisão entre inteiros.
  36. </p>
  37. <p>
  38. Na seção seguinte apresentamos um resumo sobre variáveis inteiras e flutuantes tanto em <i>C</i> quanto
  39. em <i>Python</i> e nas duas seções seguintes individualizamos as explicações para cada uma das duas linguagens.
  40. </p>
  41. <a name="declaracao" id="declaracao"></a>
  42. <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>
  43. <p>
  44. Como o próprio nome diz, uma variável inteira pode representar apenas números inteiros, mas o significado de uma variável
  45. em <i>ponto flutuante</i> não é tão óbvio, mas simplificadamente, podemos entender que é o tipo de variável que
  46. permite trabalhar com valores "reais", por exemplo, para podermos armazenar valores como <tt>5/2 = 2.5</tt>.
  47. As explicações sobre a razão desse tipo de variável ser denotada por <i>ponto flutuante</i> é
  48. <a href="#" onclick="trocaPagina('introducao_float.html')" title="seguir para explicacao de float">explicada em outro texto</a>.
  49. </p>
  50. <p>
  51. <span style="color: #0055AA">Variável = posição de memória + tamanho (em <i>bits</i>).</span>
  52. Como explicado em outros textos, uma variável está associada à determinada posição de memória e à uma quantidade
  53. conhecida de <i>bits</i>, pois desse modo pode-se interpretar corretamente o valor ali representado.
  54. 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>.
  55. </p>
  56. <p>
  57. <span style="color: #0055AA">Definição de tipo.</span>
  58. Na linguagem <i>Python</i>, o <i>tipo</i> é definido na primeira vez que a variável é interpretada, por exemplo,
  59. se ela recebe um valor inteiro, será inteira.
  60. 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é
  61. </p>
  62. <p><span style="color: #0055AA">Formatador de tipo.</span>
  63. Para se conseguir registrar um valar digitado pelo usuário ou, inversamente, para se imprimir um valor, deve-se também
  64. saber como estão organizados os <i>bits</i> associados ao valor, alẽm de saber quantos <i>bits</i> determinada variável usa.
  65. Ou seja, existe um algoritmo interno para converter os <i>bits</i> para o valor legível (usualmente em decimal).
  66. 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>
  67. (<i>saída</i>). A linguagem <i>C</i> também precisa desse formatador para a <b>leitura</b> (<i>entrada</i>).
  68. </p>
  69. <p>
  70. O <b>formatador para inteiro é o <tt>%d</tt></b> e o <b>formatador para flutuante é o <tt>%f</tt></b>.
  71. Entretanto não é acusado erro de compilação (<i>C</i>) ou interpretação (<i>Python</i>) se usar um formatador
  72. errado para imprimir uma variável, embora em <i>C</i> o efeito é desagradável, tanto imprimir inteiro com flutuante,
  73. quanto imprimir flutuante como inteiro, produz valores "estranhos" (por <i>Python</i> ser mais dinâmico, quase não
  74. se percebe essa dificuldade de conversão).
  75. Os demais tipos de variáveis tem outros formatadores.
  76. </p>
  77. <p>
  78. Nos três exemplos a seguir ilustramos como é a leitura e impressão de variáveis inteiras e flutuantes.
  79. </p>
  80. <p>
  81. <b>Exemplo 1 [<i>C</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir na mesma linha os 2 valores lidos.
  82. <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>
  83. </p>
  84. <p>
  85. Na linguagem <i>Python</i> não é necessário declarar as variáveis, mas ao ler um valor é preciso convertê-lo para o tipo
  86. 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.
  87. </p>
  88. <p>
  89. <b>Exemplo 2 [<i>Python</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir em linhas separadas os 2 valores lidos.
  90. <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>
  91. <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>
  92. </pre>
  93. </p>
  94. <p>
  95. <b>Exemplo 3 [<i>Python</i>]</b>: ler 1 valor inteiro, ler 1 valor "real", imprimir na mesma linha os 2 valores lidos
  96. (usando diferente técnicas).
  97. <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>
  98. <cyan># mas para isso precisa carregar a biblioteca 'print_function' como na linha abaixo</cyan>
  99. from __future__ import print_function <cyan># no Python 3 esta linha e' desnecessaria...</cyan>
  100. <verm>der</verm> main () : <cyan># declara uma funcao de nome 'main'</cyan>
  101. v1 = 2; v2 = 5.0;
  102. <cyan># Tecnica 1 para imprimir na mesma linha: mais facil</cyan>
  103. <verd>print</verd>("v1=", v1, "v2=", v2);
  104. <cyan># Tecnica 2: o %d e %f indica que ali virao valores 'int' e 'float', respectivamente,</cyan>
  105. <cyan># e o ultimo % indica que a seguir deve vir uma lista com os valores para %d e %f (nessa ordem)</cyan>
  106. <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>
  107. <cyan># Tecnica 3: permite fazer uma impressao e NAO quebrar a linha, ou seja, o proximo 'print' vai para a mesma linha</cyan>
  108. <verd>print</verd>("v1=", v1, ", v2=", v2, end = ""); <cyan># o ultimo parametro 'end=""' manda nao quebrar a linha</cyan>
  109. <verd>print</verd>(" ***"); <cyan># portanto, esses asteriscos irao para a mesma linha do 'v1= 5, v2= 2'</cyan>
  110. main(); <cyan># invoque a funcao 'main()'</cyan>
  111. </pre>
  112. </p>
  113. <a name="C" id="C"></a>
  114. <span style="color: #0055AA;font-size:1.2em">Conversão de tipo em <i>C</i> (inteiro e "real")</span>
  115. <p>
  116. Em <i>C</i> é preciso cuidado ao realizar operações com variáveis, por exemplo se realizar uma divisão entre
  117. variáveis (ou constante) inteiras, o resultado é um valor inteiro, mesmo que a variável armazenando o resultado
  118. seja "real" (flutuante).
  119. </p>
  120. <p>
  121. <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>.
  122. <pre style="font-size:0.8em">#include &lt;stdio.h&gt;
  123. <verm>int</verm> main (void) {
  124. <verm>int</verm> v1;
  125. <verm>float</verm> v2;
  126. v1 = 5/2; <cyan>// como 5 e 2 sao inteiro => faz-se a divisao inteira!</cyan>
  127. v2 = 5/2; <cyan>// idem! (ou seja, o fato de v2 ser float nao altera o resultado)</cyan>
  128. <verd>printf</verd>("v1=%d, v2=%f\n", v1, v2); <cyan>// o resultado sera': v1=2, v2=2.000000</cyan>
  129. return 1; <cyan>// se foi algum outro programa que invocou este, devolva o valor 1</cyan>
  130. }</pre>
  131. </p>
  132. <p>
  133. Assim, se o desejado é que <tt>v2</tt> receba o valor <tt>2.5</tt>, então deve-se usar um conversor de tipo
  134. (<i>type cast</i>), convertendo ou o <tt>5</tt> ou o <tt>2</tt> para <i>float</i>.
  135. Assim:
  136. <tt>v2 = (float)5 / 2; <cyan>// ou v2 = 5 / (float) 2</tt>.</cyan>
  137. </p>
  138. <p>
  139. Agora se o interesse for obter o resto da divisão inteira, não é preciso de um truque "matemático", basta usar o
  140. operador especial <tt>%</tt>, como indicado no exemplo 5 abaixo.
  141. </p>
  142. <p>
  143. <b>Exemplo 5</b>: um programa para imprimir o resto da divisão inteira entre dois inteiros.
  144. <pre style="font-size:0.8em">#include &lt;stdio.h&gt;
  145. <verm>int</verm> main (void) {
  146. <verm>int</verm> v1, v2;
  147. <verd>scanf</verd>("%d %d", &v1. &v2); <cyan>// solicita que sejam digitados 2 valores inteiros</cyan>
  148. <verd>printf</verd>("v1=%d, v2=%f\n", v1, v2); <cyan>// imprime o que foi digitado</cyan>
  149. <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>
  150. <verd>printf</verd>("resto da divisao entre %d e %d e': %d\n", v1, v2, v1 % v2); <cyan>// note o "v1 % v2"</cyan>
  151. <cyan>// pode-se fazer a impressao ou armazenar o resto da divisao usando constantes</cyan>
  152. <verd>printf</verd>("%d\n", 5%2); <cyan>// imprime: 1</cyan>
  153. v1 = 5%2; <cyan>// v1 recebe o resto da divisao inteira de 5 por 2 (ou seja, recebe 1)</cyan>
  154. return 1;
  155. }</pre>
  156. </p>
  157. <a name="python" id="python"></a>
  158. <span style="color: #0055AA;font-size:1.2em">Conversão de tipo em <i>Python</i> (inteiro e "real")</span>
  159. <p>
  160. Em <i>Python</i> existem vários opções para impressão, mas deve-se tomar cuidado com as variáveis/valores, pois
  161. dependendo do "tipo", o valor pode ser truncado.
  162. Outro cuidado que deve-se tomar é que, ao solicitar que o usuário digite um valor numérico, deve-se convertë-lo
  163. para o tipo desejado.
  164. </p>
  165. <p>
  166. <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"
  167. (ou ponto flutuante, (<i>float</i>)
  168. e fazê-las receber o resultado de <tt>5 / 2</tt>.
  169. <pre style="font-size:0.8em"><verm>der</verm> main () :
  170. v1 = 5/2; <cyan># o resultado e' 2</cyan>
  171. v2 = float(5)/2); <cyan># obrigatorio converter um dos operandos para conseguir 2.5 - veja que "float(5/2)" resulta "2.0"</cyan>
  172. <cyan># imprimir de modo mais simples</cyan>
  173. <verd>print</verd>("v1=", v1, "v2=", v2); <cyan># resultado: v1=2, v2=2.5</cyan>
  174. <cyan># agora imprimindo usando formatadores %d e %f e uma lista de valores (v1, v2)</cyan>
  175. <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># resultado: v1=2, v2=2</cyan>
  176. <verd>print</verd>("v1=%f, v2=%f" % (v1, v2)); <cyan># resultado: v1=2.000000, v2=2.500000</cyan>
  177. <verd>print</verd>("v1=%d, v2=%f" % (v1, v2)); <cyan># resultado: v1=2, v2=2.500000</cyan>
  178. main();
  179. </pre>
  180. </p>
  181. <p>
  182. Note que no exemplo acima, aparece <tt>(v1, v2)</tt> que é uma <b>lista</b> do <i>Python</i>, no caso com dois
  183. valores numéricos, o primeiro deles será lançado sobre o formatador (no caso o <tt>%d</tt>)
  184. e o segundo deles irá para o segundo formatador (no caso o <tt>%f</tt>).
  185. </p>
  186. <p>
  187. Outra nota deve ser feita sobre o significado dos <i>formatadores</i>, o <tt>%d</tt> prepara uma saída do tipo
  188. <i>int</i>, enquanto o <tt>%f</tt> é para saída de valores "reais" (na verdade <i>float</i>).
  189. Assim, mesmo que determinada variável (<tt>v2</tt> no caso) armazene <i>float</i>
  190. se usar o formatador <tt>%d</tt> será impressa a parte inteira do número (ou seja, ele é <b>truncado</b>).
  191. </p>
  192. <p>
  193. No exemplo abaixo, fazemos a leitura de um valor inteiro e de um valor "real".
  194. Precisamos usar as funções conversoras de tipo <tt>int(...)</tt> e <tt>float(...)</tt>,
  195. respectivamente para converter os valores lidos para <tt>int</tt> e para <tt>float</tt>, respectivamente.
  196. </p>
  197. <p>
  198. <b>Exemplo 7</b>: usar variáveis <tt><verm>int</verm> v1</tt> e <tt><verm>float</verm> v2</tt>.
  199. <pre style="font-size:0.8em"><verm>der</verm> main () :
  200. v1 = int(<verd>input</verd>()); <cyan># ler um valor do tipo inteiro</cyan>
  201. v2 = float(intput()); <cyan># ler um valor do tipo "float"</cyan>
  202. <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># imprimir assim, o v2 sera' truncado para inteiro</cyan>
  203. <verd>print</verd>("v1=%d, v2=%f" % (v1, v2)); <cyan># aqui imprime corretamente v1 como "int" e v2 como "float"</cyan>
  204. <verd>print</verd>("v1=" + str(v1) + ", v2=" + str(v2)); <cyan># pode-se imprimir concatenando "strings" - a funcao "str(...)" converte valor para "string"</cyan>
  205. main();
  206. </pre>
  207. </p>
  208. <p>
  209. Do mesmo modo que <i>C</i>, a linguagem <i>Python</i> tem um operador que permite obter o resto da divisão inteira,
  210. que é o operador especial <tt>%</tt>, como indicado no exemplo 8 abaixo.
  211. </p>
  212. <p>
  213. <b>Exemplo 8</b>: um programa para imprimir o resto da divisão inteira entre dois inteiros.
  214. <pre style="font-size:0.8em"><verm>der</verm> main () :
  215. v1 = int(<verd>input</verd>()); <cyan># ler um valor do tipo inteiro</cyan>
  216. v2 = float(intput()); <cyan># ler um valor do tipo "float"</cyan>
  217. <verd>print</verd>("v1=%d, v2=%d" % (v1, v2)); <cyan># o que foi digitado</cyan>
  218. <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>
  219. main();</pre>
  220. </p>
  221. <p class="autoria">
  222. <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/>
  223. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  224. </p>
  225. <p class="rodape">
  226. <b>Alterações</b>:<br/>
  227. 2019/07/31: redesenhada a estrutura da página e vários pequenas correções;<br/>
  228. 2018/04/02: versão inicial;
  229. </p>
  230. </div>