introducao_char.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução aos caracteres
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didático
  7. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Prof. Leônidas de Oliveira Brandã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. <p class="secao">Introdução aos caracteres</p>
  21. <center><p>[
  22. <a href="#caracteres" title="Introdução aos caracteres">Erros</a> |
  23. <a href="#ascii" title="O código ASCII para representar caracteres">Código ASCII</a> |
  24. <a href="#io" title="Entrada/saída de caracteres">Entrada/saída</a></a>
  25. ]</p>
  26. </center>
  27. <p>
  28. Nesta seção examinaremos resumidamente como utilizar caracteres tanto em <em>C</em> quanto em <em>Python</em>.
  29. </p>
  30. <a name="caracteres">
  31. <p class="secao">Interpretando sequência de <i>bits</i> como número ou caractere</p>
  32. </a>
  33. <p>
  34. Como citado na seção sobre
  35. <a href="#" onclick="trocaPagina('introducao_var.html')" title="variaveis">variáveis</a>, a informação básica
  36. nos computadores digitais é uma sequência de <i>bits</i> e o contexto é quem indica como estes <i>bits</i> devem ser interpretados.
  37. exemplo, a sequência <tt>1000001</tt> poderia ser interpretada como um valor inteiro (neste caso seria o valor
  38. <i>65 = 1*2<sup>6</sup>+1*2<sup>0</sup></i>) ou como um caractere (nesse caso a letra <i>A</i>, vide abaixo explicação
  39. sobre código <i>ASCII</i>).
  40. De modo semelhante, se a sequência <tt>110000</tt> deve ser interpretada como caractere, seria o dígito <i>0</i>,
  41. por outro lado, se for interpretada como inteiro (desconsiderando a questão do sinal), seria o
  42. <i>48 = 1*2<sup>5</sup>+1*2<sup>4</sup> = 32 + 16</i>).
  43. Ou seja, existe uma tabela associando valor numérico e caractere, como explicado na seção abaixo.
  44. </p>
  45. <p>
  46. Resumidamente o tratamento de dados em um computador digital, se resume à processar sequências de digitos.
  47. Assim, ao tentar examinar determinado dado em memória, deve-se saber em que posição da memória o dado está em um quanto <i>bits</i> tem tal dado.
  48. A figura ilustra isso, com 3 variáveis de tamanho 1 <i>bytes</i> (<i>a</i>, <i>b</i> e <i>c</i>) e uma ocupando 2 <i>bytes</i> (<i>x</i>).
  49. No caso de caracteres (símbolos que devem ser apresentados, como é o caso dos <i>dígitos</i> e das <i>letras</i>), basta existir
  50. uma <i>associação</i> (ou <i>mapeamento</i>) entre os <i>bits</i> e o símbolo a ser mostrado. Claro que está associação depende também do tamanho,
  51. quanto <i>bits</i> são usados para representar cada símbolo.
  52. Na seção seguinte apresento a primeira tabela de associação entre <i>bits</i> e símbolos, a
  53. <a href="#ascii" title="seguir para seção da tabela ASCII">tabela ASCII</a>.
  54. </p>
  55. <center>
  56. <img src="img/img_intr_char_memoria.png" title="Ilustracao de RAM com variável 'a' no endereço P, 'b' iniciando em P+1 e assim por diante"/>
  57. <br/>
  58. <i>Fig. 1. Representação da memória, com 3 variáveis usando 1 <i>bytes</i> (8 <i>bits</i>) e outra usando 2 <i>bytes</i>.</i>
  59. </center>
  60. <p>
  61. Mas o tratamento de números <i>reais</i> apresentam questões mais difíceis, para começar não existem valores que,
  62. por maior que seja a precisão do equipamento, seria impossível representá-los.
  63. Um exemplo simples é o valor correspondente à fração <i>1/3</i>, que é uma <i>dízima periódica</i>, portanto com
  64. dígitos (<i>0.3333...</i>).
  65. Além disso existe a dificuldade de representar número grande e número muito próximos de zero.
  66. O truque usual para <i>simular</i> reais (representação em <i>ponto flutuante</i>), estude esse assunto no texto sobre
  67. <a href="#" onclick="trocaPagina('introducao_float.html')" title="seguir para secao sobre ponto flutuante">representação em ponto flutuante</a>.
  68. </p>
  69. <a name="ascii">
  70. <p class="secao">Código ASCII</p>
  71. </a>
  72. <p>
  73. Um primeiro padrão para representar os caracteres é o
  74. <a href="https://en.wikipedia.org/wiki/ASCII" title="ver detalhes na WikiPedia"
  75. target="_blank" i><b>American Standard Code for Information Interchange</b></a>.
  76. O padrão ASCII é bastante antigo, ainda da década de 1960 e por isso utiliza apenas 8 <i>bits</i> para representar todos os possíveis
  77. caracteres, o que resultava em um número reduzidíssimo de 512 códigos/símbolos distintos.
  78. </p>
  79. <p>
  80. Como o código ASCII foi baseado no alfabeto em lingua Inglesa, eles presentam apenas caracteres sem acentos.
  81. Usualmente associamos um natural a cada símbolo, assim no ASCII pode-se associar caracteres aos <b>códigos ASCII</b>
  82. 0 até 512.
  83. </p>
  84. <p>
  85. Como exemplos de código ASCII a letra 'A' é associada ao natural 65, o 'B' ao 66 e assim por diante.
  86. Do mesmo modo, o 'a' é associada ao natural 97 e o caractere 'z' ao 122.
  87. Já o natural 48 é associado do dígito '0', o 49 ao '1' e assim por diante até o 57 associado '9'.
  88. </p>
  89. <a name="io">
  90. <p class="secao">Entrada e saída de caracteres em <i>C</i> e em <i>Python</i></p>
  91. </a>
  92. <p>
  93. Como já citado nas outras seções, o contexto deve definir como sequências de <i>bits</i> devem ser tratadas.
  94. Para tratar como caractere deve-se indicar isso ao computador de alguma forma.
  95. Tanto a linguagem <i>C</i> como a linguagem <i>Python</i> dispõe um tipo especial variável para tratar com caracteres.
  96. </p>
  97. <p>
  98. Na linguagem <i>C</i> tem o tipo <tt>char</tt>, que precisa do formatador <tt>%c</tt>, mas pode-se imprimir uma
  99. variável <tt>char</tt> como inteiro e vice-versa, neste caso usa-se seu código ASCII.
  100. Já em <i>Python 2</i> é preciso de uma função especial para leitura (a <tt>raw_input()</tt>) e na impressão
  101. não é preciso qualquer diferenciação, pois <i>Python</i> aplica um filtro para tratar se a variávem sendo impressa
  102. é inteira, flutuante ou caractere. Vide <a href="#tab2">tabela 1</a> abaixo.
  103. </p>
  104. <center>
  105. <a name="tab2">
  106. Tab. 1. Sobre a leitura de caracteres em <i>C</i> e em <i>Python</i></a>
  107. <br/>
  108. <table class="tbCodeLinCol">
  109. <tr><th>C </th> <th>Python 2</th> <th>Python 3</th></tr>
  110. <tr valign="top"><td><table class="tbCode">
  111. <tr><td><pre>char x; // declaracao de variavel em "ponto flutuante"
  112. scanf("%c", &x); // leia como "caractere"
  113. <verd>printf</verd>("%c", x); // imprima como "caractere"
  114. </pre></td></tr>
  115. </table></td>
  116. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  117. # "nome", a variavel x recebera' a "string" toda
  118. x = raw_input(); # leia como "caractere"
  119. <verd>print</verd>(x);
  120. </pre></td></tr>
  121. </table></td>
  122. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  123. # "nome", a variavel x recebera' a "string" toda
  124. x = input(); # leia como "caractere"
  125. <verd>print</verd>(x);
  126. </pre></td></tr>
  127. </table></td>
  128. </tr>
  129. </table></center>
  130. </p>
  131. <p>
  132. Vale notar que para atribuir constantes do tipo caractere, é
  133. necessário que um único caractere esteja cercado por aspas simples.
  134. Por exemplo, para atribuir a constante 'a' à uma variável do tipo
  135. caractere de nome <tt>varc</tt> deve-se usar: <tt>varc = 'a';</tt> (o
  136. finalizador ';' é opcional em <i>Python</i>).
  137. </p>
  138. <p>
  139. Abaixo um exemplo de código que imprime primeiro o caractere associado ao código ASCII dado e depois
  140. o contrário. Ao rodar este código será impresso os caracteres de código 48, 49, 97, 98, 65 e 66, respectivamente
  141. '0', '1', 'a', 'b', 'A' e 'B'.
  142. <center>
  143. Tab. 2. Sobre conversão entre o caractere ASCII e seu código inteiro<br/>
  144. <table class="tbCodeLinCol">
  145. <tr><th>C </th> <th>Python 2</th></tr>
  146. <tr valign="top"><td><table class="tbCode">
  147. <tr><td><pre>#include &lt;stdio.h&gt;
  148. <verm>int</verm> main (void) {
  149. <verm>int</verm> <cyan>// Criando 6 variaveis como (implicitamente) do tipo "int".</cyan>
  150. val1 = 48, <cyan>// Cada variavel recebera um valor inteiro que depois sera'</cyan>
  151. val2 = 49, <cyan>// interpretado como caractere.</cyan>
  152. num1 = 97,
  153. num2 = 98,
  154. Num1 = 65,
  155. Num2 = 66;
  156. <verm>char</verm> <cyan>// Declarando variaveis tipo caractere</cyan>
  157. charN1 = '0', <cyan>// NOTE que para constantes do tipo</cyan>
  158. charN2 = '1', <cyan>// caractere, deve-se usar aspa simples</cyan>
  159. Char1 = 'A',
  160. Char2 = 'B',
  161. char1 = 'a',
  162. char2 = 'b';
  163. <verd>printf</verd>(" int | codigo\n"); <cyan>// '\n' usado para forcar quebra de linha na impressao</cyan>
  164. <verd>printf</verd>(" %d | %c\n", val1, val1);
  165. <verd>printf</verd>(" %d | %c\n", val2, val2);
  166. <verd>printf</verd>(" %d | %c\n", num1, num1);
  167. <verd>printf</verd>(" %d | %c\n", num2, num2);
  168. <verd>printf</verd>(" %d | %c\n", Num1, Num1);
  169. <verd>printf</verd>(" %d | %c\n", Num2, Num2);
  170. <verd>printf</verd>(" int | codigo\n");
  171. <verd>printf</verd>(" %c | %d\n", charN1, charN1);
  172. <verd>printf</verd>(" %c | %d\n", charN2, charN2);
  173. <verd>printf</verd>(" %c | %d\n", char1, char1);
  174. <verd>printf</verd>(" %c | %d\n", char2, char2);
  175. <verd>printf</verd>(" %c | %d\n", Char1, Char1);
  176. <verd>printf</verd>(" %c | %d\n", Char2, Char2);
  177. return 0;
  178. }</pre></td></tr>
  179. </table></td>
  180. <td><table class="tbCode"><pre><verm>def</verm> main():
  181. val1 = 48 <cyan># Criando 6 variaveis como (implicitamente) do tipo "int".</cyan>
  182. val2 = 49 <cyan># Cada variavel recebera um valor inteiro que depois sera'</cyan>
  183. num1 = 97 <cyan># interpretado como caractere.</cyan>
  184. num2 = 98
  185. Num1 = 65
  186. Num2 = 66
  187. <verd>print</verd>(" int | codigo")
  188. <verd>print</verd>(" ", val1, " | ", chr(val1)) <cyan># A funcao chr(...) devolve</cyan>
  189. <verd>print</verd>(" ", val2, " | ", chr(val2)) <cyan># o caractere associado ao</cyan>
  190. <verd>print</verd>(" ", num1, " | ", chr(num1)) <cyan># codigo ASCII dado</cyan>
  191. <verd>print</verd>(" ", num2, " | ", chr(num2))
  192. <verd>print</verd>(" ", Num1, " | ", chr(Num1))
  193. <verd>print</verd>(" ", Num2, " | ", chr(Num2))
  194. charN1 = '0' <cyan># NOTE que para constantes do tipo</cyan>
  195. charN2 = '1' <cyan># caractere, deve-se usar aspa simples</cyan>
  196. Char1 = 'A'
  197. Char2 = 'B'
  198. char1 = 'a'
  199. char2 = 'b'
  200. <verd>print</verd>(" int | codigo")
  201. <verd>print</verd>(" ", charN1, " | ", ord(charN1)) <cyan>#</cyan> A funcao ord(...) devolve</cyan>
  202. <verd>print</verd>(" ", charN2, " | ", ord(charN2)) <cyan>#</cyan> o codigo ASCII do caractere dado</cyan>
  203. <verd>print</verd>(" ", char1, " | ", ord(char1))
  204. <verd>print</verd>(" ", char2, " | ", ord(char2))
  205. <verd>print</verd>(" ", Char1, " | ", ord(Char1))
  206. <verd>print</verd>(" ", Char2, " | ", ord(Char2))
  207. main()</pre></td></tr>
  208. </table></td></tr>
  209. </table></center>
  210. </p>
  211. <p>
  212. <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/>
  213. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  214. </p>
  215. <p class="rodape">
  216. <b>Alterações</b>:<br/>
  217. 2020/08/10: nova versão, sem a parte de "float";<br/>
  218. 2019/07/31: acerto no formato da página e em várias frases;<br/>
  219. 2017/05/01: versão inicial
  220. </p>
  221. </div>