Baixe o app para aproveitar ainda mais
Prévia do material em texto
AULA 10 CARACTERES Nesta aula vamos estudar um novo tipo primitivo de dados, o tipo caractere. O tipo ca- ractere é um tipo primitivo que podemos trabalhar com um conjunto pequeno e previsível de valores. Na linguagem C existem dois tipos de caracteres: caractere com sinal e caractere sem sinal. Esses dois tipos são apenas interpretações diferentes do conjunto de todas as sequências de 8 bits, sendo que essa diferença é irrelevante na prática. O estudo dos caracteres será esten- dido, mais útil e melhor compreendido na aula 11, quando veremos as cadeias de caracteres. Esta aula é completamente baseada nas referências [6, 10]. 10.1 Representação gráfica Na prática, em todas as linguagens de programação de alto nível incluindo a lingua- gem C, cada caractere é armazenado em um único byte na memória do computador, ou seja, em 8 bits. Consequentemente, na linguagem C um caractere sem sinal é um nú- mero do conjunto {0, 1, . . . , 254, 255} e um caractere com sinal é um número do conjunto {−128, . . . ,−1, 0, 1, . . . , 127}. Ou seja, um caractere é uma sequência de 8 bits, dentre as 256 sequências de 8 bits possíveis. A impressão de um caractere na saída padrão é a sua representação como um símbolo gráfico. Por exemplo, o símbolo gráfico do caractere 97 é a . Alguns caracteres têm repre- sentações gráficas especiais, como o caractere 10 que é representado por uma mudança de linha. Os símbolos gráficos dos caracteres 0 a 127 , de 7 bits, foram codificados e padronizados pelo Código Padrão Americano para Troca de Informações (do inglêsAmerican Standard Code for Information Interchange). Por conta disso, essa representação gráfica dos caracteres é conhecida como tabela ASCII. Essa codificação foi desenvolvida em 1960 e tem como base o alfabeto da língua inglesa. Muitas das codificações de caracteres mais modernas herdaram como base a tabela ASCII. As limitações do conjunto de caracteres da proposta da tabela ASCII, e também da tabela EBCDIC, logo mostraram-se aparentes e outros métodos foram desenvolvidos para estendê-las. A necessidade de incorporar múltiplos sistemas de escrita, incluindo a família dos caracteres do leste asiático, exige suporte a um número bem maior de caracteres. Por exemplo, o repertório completo do UNICODE compreende mais de 100 mil caracteres. Outros repertórios comuns incluem ISO 8859-1 bastante usado nos alfabetos latinos e, por isso, também conhecido como ISO Latin1. 100 10 CARACTERES 101 Dos 128 caracteres padronizados da tabela ASCII e de seus símbolos gráficos correspon- dentes, 33 deles são não-imprimíveis e os restantes 95 são imprimíveis. Os caracteres não- imprimíveis são caracteres de controle, criados nos primórdios da computação, quando se usa- vam máquinas teletipo e fitas de papel perfurado, sendo que atualmente grande parte deles estão obsoletos. Na tabela a seguir, apresentamos alguns desses caracteres não-imprimíveis. Muitos deles não são mostrados por opção ou por terem caído em desuso. Bin Dec Significado 0000 0000 00 Nulo 0000 0111 07 Campainha 0000 1001 09 Tabulação horizontal 0000 1010 10 Mudança de linha 0000 1011 11 Tabulação vertical 0000 1100 12 Quebra de página 0000 1101 13 Retorno do carro/cursor 0111 1111 127 Delete A tabela a seguir mostra os 95 caracteres imprimíveis da tabela ASCII. Bin Dec Sim Bin Dec Sim Bin Dec Sim 0010 0000 32 0100 0000 64 @ 0110 0000 96 ‘ 0010 0001 33 ! 0100 0001 65 A 0110 0001 97 a 0010 0010 34 " 0100 0010 66 B 0110 0010 98 b 0010 0011 35 # 0100 0011 67 C 0110 0011 99 c 0010 0100 36 $ 0100 0100 68 D 0110 0100 100 d 0010 0101 37 % 0100 0101 69 E 0110 0101 101 e 0010 0110 38 & 0100 0110 70 F 0110 0110 102 f 0010 0111 39 ’ 0100 0111 71 G 0110 0111 103 g 0010 1000 40 ( 0100 1000 72 H 0110 1000 104 h 0010 1001 41 ) 0100 1001 73 I 0110 1001 105 i 0010 1010 42 * 0100 1010 74 J 0110 1010 106 j 0010 1011 43 + 0100 1011 75 K 0110 1011 107 k 0010 1100 44 , 0100 1100 76 L 0110 1100 108 l 0010 1101 45 - 0100 1101 77 M 0110 1101 109 m 0010 1110 46 . 0100 1110 78 N 0110 1110 110 n 0010 1111 47 / 0100 1111 79 O 0110 1111 111 o 0011 0000 48 0 0101 0000 80 P 0111 0000 112 p 0011 0001 49 1 0101 0001 81 Q 0111 0001 113 q 0011 0010 50 2 0101 0010 82 R 0111 0010 114 r 0011 0011 51 3 0101 0011 83 S 0111 0011 115 s 0011 0100 52 4 0101 0100 84 T 0111 0100 116 t 0011 0101 53 5 0101 0101 85 U 0111 0101 117 u 0011 0110 54 6 0101 0110 86 V 0111 0110 118 v 0011 0111 55 7 0101 0111 87 W 0111 0111 119 w 0011 1000 56 8 0101 1000 88 X 0111 1000 120 x 0011 1001 57 9 0101 1001 89 Y 0111 1001 121 y 0011 1010 58 : 0101 1010 90 Z 0111 1010 122 z 0011 1011 59 ; 0101 1011 91 [ 0111 1011 123 { 0011 1100 60 < 0101 1100 92 \ 0111 1100 124 | 0011 1101 61 = 0101 1101 93 ] 0111 1101 125 } 0011 1110 62 > 0101 1110 94 ^ 0111 1110 126 ~ 0011 1111 63 ? 0101 1111 95 _ FACOM UFMS 10 CARACTERES 102 Os caracteres com sinal, quando dispostos em ordem crescente, apresentam-se de tal forma que as letras acentuadas precedem as não-acentuadas. Os caracteres sem sinal, ao contrário, em ordem crescente apresentam-se de forma que as letras não-acentuadas precedem as acentuadas. Essa é a única diferença entre caracteres com e sem sinal. 10.2 Constantes e variáveis Uma variável do tipo caractere com sinal pode ser declarada na linguagem C com a palavra reservada char . Uma variável do tipo caractere sem sinal pode ser declarada com a mesma palavra reservada char , mas com o especificador de tipo unsigned a precedendo. Especifi- cadores de tipos básicos serão estudados em detalhes em uma próxima aula. Dessa forma, char c, d, e; unsigned char f, g, h; são declarações válidas de variáveis do tipo caractere. Uma constante do tipo caractere é um número no intervalo de 0 a 255 ou de−128 a 127. Por exemplo, para as variáveis c , d e e declaradas acima, podemos fazer c = 122; d = 59; e = 51; Mais comum e confortavelmente, podemos especificar uma constante do tipo caractere atra- vés da representação gráfica de um caractere, envolvendo-o por aspas simples. Por exemplo, ’z’ , ’;’ e ’3’ são exemplos de constantes do tipo caractere. Assim, é bem mais cômodo fazer as atribuições c = ’z’; d = ’;’; e = ’3’; que, na prática, são idênticas às anteriores. Alguns caracteres produzem efeitos especiais tais como acionar um som de campainha ou realizar uma tabulação horizontal. Para representar um caractere como esse na linguagem C usamos uma sequência de dois caracteres consecutivos iniciada por uma barra invertida. Por exemplo, ’\n’ é o mesmo que 10 e representa uma mudança de linha. A tabela a seguir mostra algumas constantes do tipo caractere. FACOM UFMS 10 CARACTERES 103 caractere constante símbolo gráfico 0 ’\0’ caractere nulo 9 ’\t’ tabulação horizontal 10 ’\n’ mudança de linha 11 ’\v’ tabulação vertical 12 ’\f’ quebra de página 13 ’\r’ retorno do carro/cursor 32 ’ ’ espaço 55 ’7’ 7 92 ’\\’ \ 97 ’a’ a Na linguagem C, um branco (do inglês whitespace) é definido como sendo um caractere que é uma tabulação horizontal, uma mudança de linha, uma tabulação vertical, uma quebra de página, um retorno de carro/cursor e um espaço. Ou seja, os caracteres 9, 10, 11, 12, 13 e 32 são brancos e as constantes correspondentes são ’\t’ , ’\n’ , ’\v’ , ’\f’ , ’\r’ e ’ ’ . A função scanf trata todos os brancos como se fossem ’ ’ , assim como outras funções da linguagem C também o fazem. Para imprimir um caractere na saída padrão com a função printf devemos usar o especi- ficador de conversão de tipo caractere %c na sequência de caracteres de formatação. Para ler um caractere a partir da entrada padrão com a função scanf também devemos usar o mesmo especificador de conversão de tipo caractere %c na sequência de caracteres de formatação. Um exemplo de uso do tipo básico caractere é mostrado no programa 10.1. Programa 10.1: Um programa usando o tipo char . #include <stdio.h> int main(void) { char c;c = ’a’; printf("%c\n", c); c = 97; printf("%c\n", c); printf("Informe um caractere: "); scanf("%c", &c); printf("%c = %d\n", c, c); return 0; } Como vimos até aqui nesta seção, por enquanto não há muita utilidade para constantes e variáveis do tipo caractere. Mas em breve iremos usá-las para construir um tipo de dados muito importante chamado de cadeia de caracteres. FACOM UFMS 10 CARACTERES 104 10.3 Expressões com caracteres Como caracteres são implementados como números inteiros em um byte, as expressões envolvendo caracteres herdam todas as propriedades das expressões envolvendo números in- teiros. Em particular, as operações aritméticas envolvendo variáveis do tipo unsigned char e char são executadas em aritmética int . Dessa forma, considere o trecho de código a seguir: unsigned char x, y, z; x = 240; y = 65; z = x + y; Na última linha o resultado da expressão x + y é 305 . No entanto, atribuições de núme- ros inteiros a variáveis do tipo caractere são feitas módulo 256. Por isso, a variável z acima receberá o valor 49 . Do mesmo modo, após a execução do trecho de código a seguir: unsigned char x; char c; x = 256; c = 136; a variável x conterá o valor 0 e a variável c conterá o valor -120 . Expressões relacionais podem naturalmente envolver caracteres. No trecho de código a seguir, algumas expressões lógicas envolvendo caracteres são mostradas: ... char c; c = ’a’; if (’a’ <= c && c <= ’z’) c = c - ’ ’; printf("%c = %d\n", c, c); if (65 <= c && c < 122) c = c + 1; printf("%c = %d\n", c, c); ... Tente verificar a saída gerada pelas duas chamadas da função printf no trecho de código acima. FACOM UFMS 10 CARACTERES 105 Exercícios 10.1 Verifique se o programa 10.2 está correto. Programa 10.2: O que faz este programa? #include <stdio.h> int main(void) { char c; for (c = 0; c < 128; c++) printf("."); printf("\ntchau!\n"); return 0; } 10.2 Escreva um programa que imprima todas as letras minúsculas e todas as letras maiúscu- las do alfabeto. 10.3 Escreva um programa que traduz um número de telefone alfabético de 8 dígitos em um número de telefone na forma numérica. Suponha que a entrada é sempre dada em carac- teres maiúsculos. Exemplo: Se a entrada é URGENCIA a saída deve ser 87436242 . Se a entrada é 1111FOGO a saída deve ser 11113646 . Se você não possui um telefone, então as letras que correspondem às teclas são as seguin- tes: 2=ABC, 3=DEF, 4=GHI, 5=JKL, 6=MNO, 7=PQRS, 8=TUV e 9=WXYZ. 10.4 Scrabble é um jogo de palavras em que os jogadores formam palavras usando pequenos quadrados que contêm uma letra e um valor. O valor varia de uma letra para outra, ba- seado na sua raridade. Os valores são os seguintes: AEILNORSTU=1, DG=2, BCMP=3, FHVWY=4, K=5, JX=8 e QZ=10. Escreva um programa que receba uma palavra e compute o seu valor, somando os va- lores de suas letras. Seu programa não deve fazer distinção entre letras maiúsculas e minúsculas. Exemplo: Se a palavra de entrada é programa a saída tem de ser 13 . 10.5 Escreva um programa que receba dois números inteiros a e b e um caractere op, tal que op pode ser um dos cinco operadores aritméticos disponíveis na linguagem C ( + , - , * , / , % ), realize a operação a op b e mostre o resultado na saída. FACOM UFMS Caracteres Representação gráfica Constantes e variáveis Expressões com caracteres Cadeias de caracteres Literais Vetores de caracteres Cadeias de caracteres Referências bibliográficas
Compartilhar