introducao_caracteres.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <!--
  2. Introdução aos caracteres
  3. Prof. Leônidas de Oliveira Brandão
  4. Material didático para apoio aos cursos de Introdução à Programação
  5. Direitos reservados
  6. Pode ser usado mediante citação de autoria (Prof. Leônidas de Oliveira Brandão) e origem (https://www.ime.usp.br/~leo/mac2166/introducao/)
  7. Versao 2 [2018/04/28] Revisao, acerto no 2^8 (que estava 512...)
  8. Versao 1 [2017/05/01]
  9. -->
  10. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  11. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  12. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  13. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  14. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  15. <div class="pagina">
  16. <p class="secao">Introdução aos caracteres</p>
  17. <!--
  18. <center><p>[
  19. <a href="#erro">Erros</a> |
  20. <a href="#pontoflutuante">Ponto flutuante</a> |
  21. <a href="#exemplo">Exemplo</a> |
  22. <a href="#io">Entrada/saída</a></a>
  23. ]</p>
  24. </center>
  25. -->
  26. <p>
  27. Nesta seção examinaremos resumidamente como utilizar caracteres tanto em <em>C</em> quanto em <em>Python</em>.
  28. Desse modo, quem está aprendendo uma das linguagens poderá aprender o funcionamento equivalente na outra.
  29. </p>
  30. <a name="caracteres"><span style="color: #0050A0">Representação como caractere</span></a>
  31. <p>
  32. Como citado na seção sobre
  33. <a href="#" onclick="trocaPagina('introducao_var.html')" title="variaveis">variáveis</a>, a informação básica
  34. nos computadores digitais é uma sequência de <i>bits</i> e o contexto é quem indica como estes <i>bits</i> devem ser
  35. interpretados.
  36. Por exemplo, a sequência com 6 <i>bits</i> <tt>100001</tt>, poderia ser interpretada como um valor inteiro e
  37. neste caso seria o valor 33, pois <tt>1*2^5 + 0*2^4 + 0*2^3 + 0*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 32+1 = 33</tt>.
  38. Por outro lado, a mesma sequência poderia ser interpretada como um caractere, no caso o <tt>'!'</tt> (exclamação).
  39. </p>
  40. <p>
  41. <!-- Um exemplo do problema numérico está ilustrado no exemplo abaixo, quando tentamos imprimir as somas de <tt>0.1</tt> -->
  42. Assim as linguagens de programação possibilita a interpretação de uma sequência de <i>bits</i> como um caractere
  43. (e.g. como uma letra ou um dígito).
  44. Deste modo para apresentá-lo é preciso estabelecer uma tabela de conversão, por exemplo, que indique que a sequência
  45. <tt>110000</tt> deve ser interpretada como o caracteres <tt>'0'</tt>, que corresponde ao decimal
  46. <tt>1*2^5 + 1*2^4 + 0*2^3 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0 = 32+16 = 48</tt>.
  47. </p>
  48. <a name="ascii">
  49. <p class="subsecao">Código ASCII</p>
  50. </a>
  51. <p>
  52. Um primeiro padrão para representar os caracteres é o
  53. <a href="https://en.wikipedia.org/wiki/ASCII" title="ver detalhes na WikiPedia"
  54. target="_blank"><b>American Standard Code for Information Interchange</b></a>.
  55. O padrão ASCII é bastante antigo, ainda da década de 1960 e por isso utiliza um número reduzido de <i>bits</i>,
  56. somente 8, o que possibilita a codificação de apenas <i>2<sup>8</sup>=256</i> símbolos distintos.
  57. <!-- codigos/ -->
  58. </p>
  59. <center>
  60. <a name="tab1">
  61. <i>Tab. 1. Os 20 primeiros números naturais na base binária (0, 1) e correspondente decimal</i>
  62. </a>
  63. <br/>
  64. <table><tr><td>
  65. <table class="tbCodeLinCol">
  66. <tr><th>Binário</th> <th>Decimal</th></tr>
  67. <tr><td><tt>00000000</tt></td><td align="right"><tt> 0</tt></td></tr>
  68. <tr><td><tt>00000001</tt></td><td align="right"><tt> 1</tt></td></tr>
  69. <tr><td><tt>00000010</tt></td><td align="right"><tt> 2</tt></td></tr>
  70. <tr><td><tt>00000011</tt></td><td align="right"><tt> 3</tt></td></tr>
  71. <tr><td><tt>00000100</tt></td><td align="right"><tt> 4</tt></td></tr>
  72. <tr><td><tt>00000101</tt></td><td align="right"><tt> 5</tt></td></tr>
  73. <tr><td><tt>00000110</tt></td><td align="right"><tt> 6</tt></td></tr>
  74. <tr><td><tt>00000111</tt></td><td align="right"><tt> 7</tt></td></tr>
  75. <tr><td><tt>00001000</tt></td><td align="right"><tt> 8</tt></td></tr>
  76. <tr><td><tt>00001001</tt></td><td align="right"><tt> 9</tt></td></tr>
  77. </table></td>
  78. <td>
  79. <table class="tbCodeLinCol">
  80. <tr><th>Binário</th> <th>Decimal</th></tr>
  81. <tr><td><tt>00001010</tt></td><td align="right"><tt> 10</tt></td></tr>
  82. <tr><td><tt>00001011</tt></td><td align="right"><tt> 11</tt></td></tr>
  83. <tr><td><tt>00001100</tt></td><td align="right"><tt> 12</tt></td></tr>
  84. <tr><td><tt>00001101</tt></td><td align="right"><tt> 13</tt></td></tr>
  85. <tr><td><tt>00001110</tt></td><td align="right"><tt> 14</tt></td></tr>
  86. <tr><td><tt>00001111</tt></td><td align="right"><tt> 15</tt></td></tr>
  87. <tr><td><tt>00010000</tt></td><td align="right"><tt> 16</tt></td></tr>
  88. <tr><td><tt>00010001</tt></td><td align="right"><tt> 17</tt></td></tr>
  89. <tr><td><tt>00010010</tt></td><td align="right"><tt> 18</tt></td></tr>
  90. <tr><td><tt>00010011</tt></td><td align="right"><tt> 19</tt></td></tr>
  91. </table></td></tr>
  92. </table></center>
  93. </p>
  94. <p>
  95. Como o padrão <i>ASCII</i> foi criado nos Estados Unidos e a lingua Inglesa não utiliza símbolos especiais,
  96. na pratica eles utilizavam apenas 7 <i>bits</i>, ou seja, usavam 128 diferentes caracteres.
  97. <!--
  98. Como o código ASCII foi baseado no alfabeto em lingua Inglesa, eles presentam apenas caracteres sem acentos.
  99. Usualmente associamos um natural a cada símbolo, assim no ASCII pode-se associar caracteres aos <b>códigos ASCII</b>
  100. 0 até 256. -->
  101. </p>
  102. <p>
  103. Como exemplos de código ASCII a letra 'A' é associada ao natural 65, o 'B' ao 66 e assim por diante.
  104. Do mesmo modo, o 'a' é associada ao natural 97 e o caractere 'z' ao 122.
  105. Já o natural 48 é associado do dígito '0', o 49 ao '1' e assim por diante até o 57 associado '9'.
  106. </p>
  107. <a name="io">
  108. <p class="subsecao">Entrada e saída de caracteres em <i>C</i> e em <i>Python</i></p>
  109. </a>
  110. <p>
  111. Como já citado nas outras seções, o contexto deve definir como sequências de <i>bits</i> devem ser tratadas.
  112. Para tratar um conjunto <i>bits</i> como caractere deve-se indicar isso ao computador de alguma forma.
  113. Por exemplo, as linguagens de programação geralmente dispõem de um tipo de variável especial para caracteres.
  114. <!--
  115. Tanto a linguagem <i>C</i> como a linguagem <i>Python</i> dispõe um tipo especial variável para tratar com caracteres.
  116. -->
  117. </p>
  118. <p>
  119. Na linguagem <i>C</i> existe o tipo <tt>char</tt> e tanto para leitura quanto para impressão, utiliza-se o formatador
  120. <tt>%c</tt>. Mas pode-se imprimir uma variável <tt>char</tt> como se fosse um número inteiro e vice-versa,
  121. neste caso usa-se seu código ASCII.
  122. </p>
  123. <p>
  124. Já em <i>Python 2</i> é preciso de uma função especial para leitura de caracteres, a função <tt>raw_input()</tt>.
  125. Na impressão, se não for usada impressões especiais, não é preciso qualquer diferenciação, pois o <i>Python</i>
  126. aplica um filtro para tratar se a variávem sendo impressa é inteira, flutuante ou caractere.
  127. Vide <a href="#tab2">tabela</a> abaixo.
  128. </p>
  129. <center>
  130. <a name="tab2">
  131. <i>Tab. 2. Sobre a leitura de caracteres em <i>C</i> e em <i>Python</i></i>
  132. </a>
  133. <br/>
  134. <table class="tbCodeLinCol">
  135. <tr><th>C </th> <th>Python 2</th> <th>Python 3</th></tr>
  136. <tr valign="top"><td><table class="tbCode">
  137. <tr><td><pre>char x; // declaracao de variavel para armazenar caracteres
  138. scanf("%c", &x); // leia como "caractere"
  139. printf("%c", x); // imprima como "caractere"
  140. </pre></td></tr>
  141. </table></td>
  142. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  143. # "nome", a variavel x recebera' a "string" toda
  144. x = raw_intput(); # leia como "caractere"
  145. print(x);
  146. </pre></td></tr>
  147. </table></td>
  148. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  149. # "nome", a variavel x recebera' a "string" toda
  150. x = intput(); # leia como "caractere"
  151. print(x);
  152. </pre></td></tr>
  153. </table></td>
  154. </tr>
  155. </table></center>
  156. </p>
  157. <a name="constantes">
  158. <p class="subsecao">Constantes do tipo caractere em <i>C</i> e em <i>Python</p>
  159. </a>
  160. <p>
  161. Assim como várias outras linguagens, <i>C</i> e <i>Python</i>, adotam o uso de apóstrofes para
  162. indicar que deve pegar o caractere entre os apóstrofes.
  163. Por exemplo, para atribuir a constante 'a' à uma variável do tipo caractere, de nome <tt>varc</tt>,
  164. deve-se usar
  165. <center><tt>varc = 'a';</tt> (o finalizador ';' é opcional em <i>Python</i>).</center>
  166. <br/>
  167. A necessidade de um marcador pode ser facilmente entendida ao escrevermos o código
  168. <tt>varc = a;</tt>, que corresponde a guardar o valor atual da variável <i>a</i> na variável <i>varc</i>.
  169. </p>
  170. <p>
  171. Abaixo um exemplo de código que imprime primeiro o caractere associado ao código ASCII dado e depois
  172. o contrário. Ao rodar este código será impresso os caracteres de código 48, 49, 97, 98, 65 e 66, respectivamente
  173. '0', '1', 'a', 'b', 'A' e 'B'.
  174. <center>
  175. <i>Tab. 3. Sobre conversão entre o caractere ASCII e seu código inteiro</i>
  176. <br/>
  177. <table class="tbCodeLinCol">
  178. <tr><th>C </th> <th>Python 2</th></tr>
  179. <tr valign="top"><td><table class="tbCode">
  180. <tr><td><pre>#include &lt;stdio.h&gt;
  181. int main (void) {
  182. int // Criando 6 variaveis como (implicitamente) do tipo "int".
  183. val1 = 48, // Cada variavel recebera um valor inteiro que depois sera'
  184. val2 = 49, // interpretado como caractere.
  185. num1 = 97, //
  186. num2 = 98, //
  187. Num1 = 65, //
  188. Num2 = 66; //
  189. char // Declarando variaveis tipo caractere
  190. charN1 = '0', // NOTE que para constantes do tipo
  191. charN2 = '1', // caractere, deve-se usar aspa simples
  192. Char1 = 'A', //
  193. Char2 = 'B', //
  194. char1 = 'a', //
  195. char2 = 'b'; //
  196. printf(" int | codigo\n"); // '\n' usado para forcar quebra de linha na impressao
  197. printf(" %d | %c\n", val1, val1);
  198. printf(" %d | %c\n", val2, val2);
  199. printf(" %d | %c\n", num1, num1);
  200. printf(" %d | %c\n", num2, num2);
  201. printf(" %d | %c\n", Num1, Num1);
  202. printf(" %d | %c\n", Num2, Num2);
  203. printf(" int | codigo\n");
  204. printf(" %c | %d\n", charN1, charN1);
  205. printf(" %c | %d\n", charN2, charN2);
  206. printf(" %c | %d\n", char1, char1);
  207. printf(" %c | %d\n", char2, char2);
  208. printf(" %c | %d\n", Char1, Char1);
  209. printf(" %c | %d\n", Char2, Char2);
  210. return 0;
  211. }</pre></td></tr>
  212. </table></td>
  213. <td><table class="tbCode"><pre>def main():
  214. val1 = 48 # Criando 6 variaveis como (implicitamente) do tipo "int".
  215. val2 = 49 # Cada variavel recebera um valor inteiro que depois sera'
  216. num1 = 97 # interpretado como caractere.
  217. num2 = 98 #
  218. Num1 = 65 #
  219. Num2 = 66 #
  220. print(" int | codigo")
  221. print(" ", val1, " | ", chr(val1)) # A funcao chr(...) devolve
  222. print(" ", val2, " | ", chr(val2)) # o caractere associado ao
  223. print(" ", num1, " | ", chr(num1)) # codigo ASCII dado
  224. print(" ", num2, " | ", chr(num2))
  225. print(" ", Num1, " | ", chr(Num1))
  226. print(" ", Num2, " | ", chr(Num2))
  227. charN1 = '0' # NOTE que para constantes do tipo
  228. charN2 = '1' # caractere, deve-se usar aspa simples
  229. Char1 = 'A' #
  230. Char2 = 'B' #
  231. char1 = 'a' #
  232. char2 = 'b' #
  233. print(" int | codigo")
  234. print(" ", charN1, " | ", ord(charN1)) # A funcao ord(...) devolve
  235. print(" ", charN2, " | ", ord(charN2)) # o codigo ASCII do caractere dado
  236. print(" ", char1, " | ", ord(char1))
  237. print(" ", char2, " | ", ord(char2))
  238. print(" ", Char1, " | ", ord(Char1))
  239. print(" ", Char2, " | ", ord(Char2))
  240. main()</pre></td></tr>
  241. </table></td></tr>
  242. </table></center>
  243. </p>
  244. <a name="tabela">
  245. <p class="subsecao">Como gerar uma tabelas ASCII em <i>C</i> e em <i>Python</p>
  246. </a>
  247. <p>
  248. Vale destacar que a codificação dos caracteres segue uma organização lógica, uma vez que o código para o
  249. caractere <i>0</i> é o <i>48</i>, então o <i>49</i> é para o <i>1</i> e assim por diante. Do mesmo modo, sendo
  250. <i>65</i> o código do caractere <i>A</i>, <i>66</i> é o caractere <i>B</i> e assim por diante.
  251. </p>
  252. <p>
  253. Assim, podemos fazer um código para gerar tabelas dos caracteres e seu código ASCII, como ilustrado
  254. abaixo. Experimente alterar os limites do controle do laço, mas cuidado com os caracteres especiais, alguns
  255. podem "quebrar" linhas ou corresponder a outros caracteres de controle que podom deixar a tela "suja".
  256. </p>
  257. <p>
  258. Em <i>C</i> a converção entre inteiro ou caractere é praticamente direta, bastando usar o formatador correto
  259. (<tt>%d</tt> para inteiro ou <tt>%c</tt> para caractere). Entretanto em <i>Python</i> é necessário
  260. usar duas funções pré-definidas para isso, <tt>ord(inteiro)</tt> e <tt>chr(caractere)</tt>:
  261. sendo <tt>i</tt> inteiro, <tt>chr(i)</tt> fornece o caractere cujo código é <tt>i</tt>;
  262. sendo <tt>c</tt> caractere, <tt>ord(c)</tt> fornece o código do caractere <tt>c</tt>.
  263. </p>
  264. <center>
  265. Tab. 4. Como imprimir uma tabela código ASCII e o correspondente caractere<br/>
  266. <table class="tbCodeLinCol">
  267. <tr><th>C </th> <th>Python 2</th></tr>
  268. <tr valign="top"><td><table class="tbCode">
  269. <tr><td><pre>#include &lt;stdio.h&gt;
  270. int main (void) {
  271. int i, ini = 48, fim = 58;
  272. printf("cod. : car.\n");
  273. for (i=ini; i&lt;fim; i++)
  274. printf(" %3d : %3c\n", i, i);
  275. printf("------------\n");
  276. ini = 65; fim = 91;
  277. for (i=ini; i&lt;fim; i++)
  278. printf(" %3d : %3c\n", i, i);
  279. printf("------------\n");
  280. ini = 97; fim = 123;
  281. for (i=ini; i&lt;fim; i++)
  282. printf(" %3d : %3c\n", i, i);
  283. printf("------------\n");
  284. return 0;
  285. }</pre></td></tr>
  286. </table></td>
  287. <td><table class="tbCode"><pre>def main () :
  288. ini = 48; fim = 58;
  289. print("cod. : car.\n");
  290. for i in range(ini, fim) :
  291. print(" %3d : %3c" % (i, chr(i)));
  292. print("------------\n");
  293. ini = 65; fim = 91;
  294. for i in range(ini, fim) :
  295. print(" %3d : %3c" % (i, chr(i)));
  296. print("------------");
  297. ini = 97; fim = 123;
  298. for i in range(ini, fim) :
  299. print(" %3d : %3c" % (i, chr(i)));
  300. print("------------");
  301. main();</pre></td></tr>
  302. </table></td></tr>
  303. </table></center>
  304. </p>
  305. <p>
  306. Primeiro notem que usamos os formatadores <tt>%3d</tt> e <tt>%3c</tt> para ajustar 3 colunas à
  307. direita, o que é bastante útil para imprimir tabelas.
  308. O <tt>%d</tt> é utilizado para imprimir inteiro, enquanto <tt>%c</tt> para caractere,
  309. tanto em <i>C</i>, quanto em <i>Python</i>.
  310. Logo após a cadeia de caracteres, com eventuais valores a serem substituidos, deve vir uma
  311. lista de variáveis/valores compatíveis. No exemplo, a cadeia era formada por
  312. <tt>" %3d : %3c"</tt>, portanto deveria vir a seguir 2 valores, o primeiro inteiro e o segundo caractere.
  313. </p>
  314. <p>
  315. Entretanto existe uma diferença na sintaxe das duas linguagens, em <i>C</i> a lista de parâmetros vem
  316. separadas por vírgula simples, mas em <i>Python</i> precisa do símbolo de percentagem (<tt>%</tt>) após
  317. a cadeia de caracteres
  318. (<tt>" %3d : %3c"</tt>) e, havendo mais de um valor a substituir, deve-se usar a sintaxe de
  319. <i>lista</i> (<tt>(i, chr(i))</tt>).
  320. </p>
  321. <p>
  322. Note que o <i>Python</i> precisa de uma função especial para conveter inteiro em caractere,
  323. <tt>chr(i)</tt>, que devolve o caractere cujo código seja o valor armazenado na variável <i>i</i>
  324. (que deve ser inteira).
  325. Para fazer o oposto deve-se usar a função <tt>ord(varc)</tt> que é a função que devolve o código
  326. ASCII (<i>ord</i>enado) do caractere armazenado na variável <i>varc</i> (que neste caso deve ser
  327. para caractere - <i>char</i>).
  328. </p>
  329. <p>
  330. <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/>
  331. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  332. </p>
  333. <p class="rodape">
  334. <b>Alterações</b>:<br/>
  335. 2020/08/19: novo formato, pequenas correções<br/>
  336. 2019/04/18: acerto '0010'=4 para '100001'=33, explicita funções <tt>ord</tt> e <tt>chr</tt>)<br/>
  337. 2018/04/28: acertos no texto (valor 2^8) e cortada a parte sobre numero em ponto flutuante<br/>
  338. 2017/05/01: primeira versão
  339. </p>
  340. </div>