c_introducao_leituras.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <!--
  2. Introdução à entrada de dados em C
  3. m, n = map(int, raw_input().split());
  4. href: line_introducao_float.html ; line_introducao_char.html
  5. -->
  6. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  7. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  8. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  9. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  10. <script src="css_img_js_conf/defineLInE.js"></script> <!-- referencia documentos internos -->
  11. <div class="pagina">
  12. <!--
  13. declaracao
  14. io_simples
  15. ex_io_simples
  16. io_composto
  17. -->
  18. <a name="declaracao">
  19. <p class="secao">Qual a diferença entre <i>declarar</i> e usar uma variável?</p>
  20. </a>
  21. <p>
  22. Uma <a href=#" onclick="trocaPagina('introducao_var.html#declaracao')" "introducao_var.html#declaracao" title="ver explicacao">variável</a>
  23. nada mais é que um nome associado à uma posição de <i>memória</i> do computador:
  24. 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.
  25. Como a linguagem <i>C</i> é <b style="color:#0000aa" title="Necessário traduzir tudo para linguagem da máquina">compilada</b>,
  26. nela é necessário <b style="color:#0000aa" title="Reservar espaço na memória e associar esse espaço a um nome">declarar</b> cada variável
  27. e isso (geralmente) é feito no início da função.
  28. Uma vez que variável foi declarada, pode-se usá-la (recebendo valores ou em expressões).
  29. <pre style="font-size:0.9em"><verm>int</verm> main (<verm>void</verm>) {
  30. <verm>int</verm> n, i=0; <cyan>// declara 2 variaveis para inteiro de nome 'n' e 'i' (i sendo iniciada com valor 0)</cyan>
  31. <verm>float</verm> x = 0.5, y; <cyan>// declara 2 variaveis para inteiro de nome 'x' e 'y' (x sendo iniciada com valor 0.5)</cyan>
  32. ...
  33. }</pre>
  34. <i>Cód. 1. Código ilustrando a declaração de variáveis inteiras e flutuantes.</i>
  35. </p>
  36. <p>
  37. Outro conceito essencial às variáveis é o de
  38. <b style="color:#0000aa" title="Alterar o valor guardado pela variável">atribuição</b> de valor.
  39. Sua sintaxe em <i>C</i>, e em muitas outras linuguagens, é usar do
  40. <b style="color:#0000aa" title="lado esquerdo da atribuição">lado esquerdo</b> da atribuição um nome de variável e do
  41. <b style="color:#0000aa" title="lado direito da atribuição">lado direito</b> da atribuição uma expressão aritméitca válida.
  42. No código 1, <tt>i=0</tt> e <tt>x=0.5</tt> são atribuições, tendo como <i>lado esquerdo</i> as variáveis <i>i</i> e <i>x</i>
  43. e como <i>lado direito</i> as expressões constantes <i>0</i> e <i>0.5</i>.
  44. </p>
  45. <p>
  46. Ainda usando como estrutura o código 1, outro exemplo de atribuição poderia ser <tt>i = n/2</tt>, que tem como
  47. <i>lado direito</i> a expressão <i>n/2</i>.
  48. 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>),
  49. 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>.
  50. Mas vale adiantar outra possibilidade de "forçar" o resultado a ser <i>flutuante</i>, usar o coversor de tipo:
  51. <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>.
  52. <!--
  53. &#11013; black left arrow
  54. &#11013; black right arrow
  55. &#8658; Rightwards Double Arrow
  56. -->
  57. </p>
  58. <p>
  59. A figura 1 ilustra a associação de espaço em memória (<i>RAM</i>) para duas variáveis,
  60. são associados 16 <i>bits</i> à variável de nome <i>n</i> para valores inteiros, seguido da associação de
  61. 32 <i>bits</i> para a variável de nome <i>x</i>, que deve guardar valores "reais".
  62. Nota-se que a variável "real" tem um esquema mais "complicado", ela implementa o conceito
  63. de <a href="#" onclick="trocaPagina('introducao_float.html')" title="clique aqui para estudar ponto flutuante" targe="_blank">ponto flutuante</a>,
  64. usando o padrão
  65. <a href="https://en.wikipedia.org/wiki/Integer_%28computer_science%29" title="ler a respeito IEEE 754 na WikiPedia" target="_blank">
  66. IEEE 754</a> (o primeiro <i>bit</i> é o sinal <i>s</i>; os 8 <i>bits</i>
  67. 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
  68. <i>m</i> entre 0 e 1).
  69. </p>
  70. <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"/>
  71. <br/>
  72. <i>Fig. 1. Representação da memória com agrupamentos em <i>bytes</i> (8 <i>bits</i>).</i>
  73. </center>
  74. <!--
  75. https://en.wikipedia.org/wiki/Integer_%28computer_science%29
  76. int = -32,768 to 32,767, from -(2^15) to 2^15-1
  77. https://en.wikipedia.org/wiki/Single-precision_floating-point_format
  78. float = 32 bits
  79. IEEE 754 single-precision binary floating-point format: binary32
  80. Sign bit: 1 bit ; Exponent width: 8 bits ; Significand precision: 24 bits (23 explicitly stored)
  81. float = 0/1 0.mantissa x 10^e
  82. 24 bits 8
  83. -->
  84. <a name="io_simples">
  85. <p class="secao">O que são "entradas de dados" e "saídas de dados"?</p>
  86. </a>
  87. <p>
  88. 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
  89. <b>saídas</b>.
  90. Por exemplo, o algoritmo da divisão ao ser aplicado sobre valores fixados <i>a</i> e <i>b</i>, deve
  91. produzir sempre o mesmo valor <i>q</i> (de tal forma que <i>q * b = a</i>).
  92. </p>
  93. <p>
  94. Por outro lado, um
  95. <b style="color:#0000aa" title="um algoritmo implementado em alguma linguagem">programa</b>, em <i>C</i> ou em qualquer outra linguagem,
  96. nada mais é que a implementação de um <b>algoritmo</b> na referida linguagem.
  97. Desse modo, para este programa ser usado, o
  98. <b style="color:#0000aa" title="quem usa o programa">usuário</b> (aquele que está executando) deve fornecer um conjunto de
  99. <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
  100. programa possa ser executado e produzir as <b>saída</b> desejadas.
  101. </p>
  102. <center><img src="img/img_computador_io.png" title="ilustracao processamento entradas x saidas"/>
  103. <br/><i>Fig. 2. Ilustração da existência de um algoritmo que aplicado sobre as entradas produz as respectivas saídas.</i>
  104. </center>
  105. <p>
  106. Podemos usar o mesmo exemplo da divisão para ilustar a necessidade dos <i>dados de entrada</i> adequados.
  107. Para que um algoritmo para a divisão de dois números reais seja adequadamente executado,
  108. devem ser fornecidos os dois valores reais, o primeiro será o
  109. <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
  110. <b style="color:#0000aa" title="em a/b &#8658; parte de baixo é o denominador &#8658; b é o denominador">denominador</b>.
  111. Assim, se o <i>usuário</i> digitar apenas um valor, o programa ficará parado até
  112. <!-- &#8658; = Rightwards Double Arrow -->
  113. que ele digite o segundo valor.
  114. </p>
  115. <sabermais title="para saber um pouco mais">
  116. Vale observar que, usando uma linguagem como <i>C</i>, não existe a necessidade de implementar algo tão básico (a <i>divisão</i>, pois
  117. isso é feito por um algoritmo implementado no processador do computador.
  118. Na verdade, desde a proposta inicial do matemática
  119. <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"
  120. >John von Neumann</a>, existe uma
  121. <a href="https://en.wikipedia.org/wiki/Arithmetic_logic_unit" target="_blank" title="Examinar a página ULA na WikiPedia em Inglês"
  122. ><b style="color:#0000aa">unidade lógico/aritmética</b></a> especialmente projetada para realizar as
  123. operações lógicas e aritméticas.
  124. Embora, o modelo inicialmente proposto por <i>von Neumann</i> preconizase o uso de
  125. <i>ponto fixo</i>, não o <i>flutuante</i>.
  126. </sabermais>
  127. <br/>
  128. <a name="ex_io_simples">
  129. <p class="secao">Saídas de dados simples: inteiro, real e texto em <i>C</i></p>
  130. </a>
  131. <!-- ./introducao/codigos/testes/teste_input.c -->
  132. <p>
  133. A linguagem <i>C</i> preconiza o uso de <b style="color:#00aa00">formatador</b> para cada tipo de variável, tanto
  134. para as <i>entradas</i> quanto para as <i>saídas</i>.
  135. Os formatadores básicos são:
  136. <center><i>Tab. 1. Formatadores de acordo com tipo, com exemplo para entra e para saída em <i>C</i></i><br/>
  137. <table class="tableCode thBg">
  138. <tr>
  139. <th class="thBg" >Tipo de variável</th><th class="thBg" >Tipo em <i>C</i></th>
  140. <th class="thBg" >Leitura</th><th class="thBg" >Impressão</th></tr>
  141. <tr>
  142. <tr>
  143. <td>Inteiro</td><td class="code"><verm>int</verm> a, b;</td>
  144. <td class="code"><verd>scanf</verd>("%d %d", &a, &b);</td><td class="code"><verd>printf</verd>("%d %d\n", a, b);</td></tr>
  145. <tr>
  146. <td>Caractere</td><td class="code">char a, b;</td>
  147. <td class="code"><verd>scanf</verd>("%c %c", &a, &b);</td><td class="code"><verd>printf</verd>("%c %c\n", a, b);</td></tr>
  148. <tr>
  149. <td>Flutuante</td><td class="code"><verm>float</verm> a, b;</td>
  150. <td class="code"><verd>scanf</verd>("%f %f", &a, &b);</td><td class="code"><verd>printf</verd>("%f %f\n", a, b);</td></tr>
  151. <tr>
  152. <td>Duplo</td><td class="code">double a, b;</td>
  153. <td class="code"><verd>scanf</verd>("%lf %lf", &a, &b);</td><td class="code"><verd>printf</verd>("%lf %lf\n", a, b);</td></tr>
  154. </table></center>
  155. </p>
  156. <p>
  157. Em <i>C</i> a conversão entre inteiros e caracteres é direta, basta trocar o formatador.
  158. Isso é possível devido à conversão inteiro-binário e binário-caractere.
  159. Para isso utiliza-se a primeira tabela de representação de caracteres que se popularizou, a tabela
  160. <b style="color:#00aa00" title="American Standard Code for Information Interchange: código de 8 bits para caracteres">ASCII</b>.
  161. Para saber mais consulte o texto
  162. <a href="#" onclick="trocaPagina('introducao_char.html')" title="seguir para introdução aos caracteres">introdutório sobre caracteres</a>.
  163. Na tabela 1, o código à esquerda ilustra como testar a tabela <i>ASCII</i>.
  164. </p>
  165. <!-- ∑ N-Ary Summation
  166. HTML-code: &#8721; -->
  167. <!-- ./introducao/codigos/introducao_leituras_c.c -->
  168. <p>
  169. <center><i>Tab. 1. Exemplo de códigos para entrada e saída de inteiros e "reais" para o C 2</i><br/>
  170. <table class="tableCode thBg">
  171. <tr>
  172. <th>Exemplo de tabela
  173. <b style="color:#00aa00" title="American Standard Code for Information Interchange: código de 8 bits para caracteres">ASCII</b></th>
  174. <th>Exemplo de tabela numérica &#8721;<sub>i=0</sub><sup>10</sup> 0.5<sup>i</sup></th></tr>
  175. <tr>
  176. <td><pre style="font-size: 0.8em;">#include &lt;stdio.h&gt;
  177. <verm>void</verm> main (<verm>void</verm>) {
  178. <verm>int</verm> i;
  179. <verd>printf</verd>("Int | ASCII\n");
  180. for (i=48; i<91; i++) {
  181. <verd>printf</verd>(" %2d | '%2c'\n", i, i);
  182. <cyan>// "Pular" os caracteres:</cyan>
  183. if (i==57) <cyan>// 58=':' 59=';' 60='<' 61='='</cyan>
  184. i = 64; <cyan>// 62='>' 63='?' 64='@'</cyan>
  185. }
  186. }</pre></td>
  187. <td><pre style="font-size: 0.8em;">#include &lt;stdio.h&gt;
  188. <verm>void</verm> main (<verm>void</verm>) {
  189. <verm>float</verm> soma = 0, pot = 1;
  190. <verm>int</verm> i;
  191. <verd>printf</verd>("Int | Soma 0.5^0+...+0.5^i\n");
  192. for (i=0; i<11; i++) {
  193. soma += pot;
  194. <verd>printf</verd>(" %2d | %8.2f\n", i, soma);
  195. pot *= 0.5 * pot;
  196. }
  197. }</pre></td></tr>
  198. </table></center>
  199. </p>
  200. <p>
  201. Se o <i>usuário</i>
  202. desejar inserir outra coisa (em geral uma <i>cadeia de caracteres</i> - "<i>string</i>")
  203. deve-se usar uma função especial (vide <tt>raw_input</tt> a seguir).
  204. </p>
  205. <a name="io_composto">
  206. <p class="secao">Entradas de dados em <i>C</i></p>
  207. </a>
  208. <!-- ./introducao/codigos/testes/teste_input.py -->
  209. <p>
  210. Em <i>C</i> o processo para <i>leitura</i> de valores via teclado é tratado em <i>lote</i>, quer dizer,
  211. durante a execução de um programa, a cada momento que o usuário <i>digitar</i> uma sequẽncia de valores e pressionar
  212. a tecla para registro (<i>Enter</i>), todos os valores digitados serão armazenador em um <i>reservatório</i>
  213. (em Inglês <i>buffer</i>) e a cada momento que o programa encontrar um comando para <i>leitura</i> será usado a
  214. próxima parte disponível do <i>reservatório</i>.
  215. <br/>
  216. Para verficar a existência do <i>reservatório</i>, experimente testar o código 2, de dois modos:
  217. <ol>
  218. <li> digitando todos os valores e um único <i>Enter</i> (<tt>CR</tt>) ao final (i.e. algo como
  219. <tt style="color:#00aa00" title="digitar '2 3 ABD D E 0.5 2.3' (sem apóstrofe) e teclar Enter">2 3 ABD D E 0.5 2.3 CR</tt>)
  220. </li>
  221. <li> digitando cada um dos 9 itens teclando <i>Enter</i> em diferentes locais
  222. (e.g. como:
  223. <tt style="color:#00aa00" title="digitar '2' depois CR, '3' depois CR, 'ABD' depois CR e assim por diante"
  224. >2 CR 3 CR ABD CR D CR E CR 0.5 CR 2.3 CR</tt>).
  225. </li>
  226. </ol>
  227. Você deverá notar que em ambos os modos todos os valores serão corretamente capturados, com qualquer variação de <i>Enter</i>
  228. (<tt>CR</tt>)
  229. <i style="color:#00aa00" title="Por exemplo, não é adequado teclar CR no meio do '0.5', ou seja, não pode ser '0. CR 5'">adequado</i>,
  230. os valores serão armazenados nas variáveis <i>i1, i1, c1, c2, c3, c4, c5, x</i> e <i>y</i> da mesma forma.
  231. </p>
  232. <p>
  233. <center><i>Tab. 2. Exemplo de código para entrada de valors, caracteres e "reais"</i><br/>
  234. <table class="tableCode thBg">
  235. <tr>
  236. <th>Exemplo de código para entrada em <i>C</i></th></tr>
  237. <tr>
  238. <td><pre style="font-size: 0.8em;">#include &lt;stdio.h&gt;
  239. <verm>void</verm> main (<verm>void</verm>) {
  240. <verm>float</verm> x, y;
  241. <verm>int</verm> i1, i2;
  242. char c1, c2, c3, c4, c5;
  243. <verd>printf</verd>("Digite 9 itens, separados por espaco em branco (2 int, 5 char, 2 float): "); <cyan>// neste ordem: inteiro, inteiro</cyan>
  244. <verd>scanf</verd>("%d %d %c %c %c %c %c %f %f", &i1, &i2, &c1, &c2, &c3, &c4, &c5, &x, &y);
  245. <cyan>// Experimente comentar a linha acima e testar com variacoes como abaixo (sera igual)</cyan>
  246. <cyan>// <verd>scanf</verd>("%d %d", &i1, &i2);</cyan>
  247. <cyan>// <verd>scanf</verd>("%c %c %c %c %c", &c1, &c2, &c3, &c4, &c5);</cyan>
  248. <cyan>// <verd>scanf</verd>("%f %f", &x, &y);</cyan>
  249. <verd>printf</verd>("i1=%d, i2=%d, c1=%c, c1=%c, c1=%c, c1=%c, c1=%c, x=%f, y=%f\n", i1, i2, c1, c2, c3, c4, c5, x, y);
  250. }</pre></td></tr>
  251. </table></center>
  252. </p>
  253. <p>
  254. Experimente copiar e colar cada um dos códigos acima em seu ambiente para programação <i>C</i> preferido.
  255. Procure alterar o código até que esteja certo de ter assimilado a sintaxe e os detalhes de cada conceito aqui explorado.
  256. </p>
  257. <p class="autoria">
  258. <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/>
  259. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  260. </p>
  261. <p class="rodape">
  262. <b>Alterações</b>:<br/>
  263. 2020/08/17: primeira versão do texto
  264. </p>
  265. </div>