Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS II Ricardo de Almeida (ricardo.almeida@univix.edu.br) 1. Relembrando... 2. Caracteres 3. Cadeia de Caracteres 4. Declarações da Cadeia de Caracteres 5. Leitura de Caracteres e Cadeia de Caracteres 6. Exercícios de Fixação 7. Revisão Agenda Quais pontos foram vistos na última aula? • Variáveis Indexadas Bidimensionais (Matrizes) • Declaração de Matriz • Índices de Matriz • Inicialização de Matriz • Alocação de Matriz Relembrando... Caracteres Caracteres Efetivamente, a linguagem C não oferece um tipo caractere. Os caracteres são representados por códigos numéricos. A linguagem oferece o tipo char, que pode armazenar valores inteiros “pequenos”: um char tem tamanho de 1 byte, 8 bits, e sua versão com sinal pode representar valores que variam de –128 a 127 (256 caracteres distintos). Como os códigos associados aos caracteres estão dentro desse intervalo, usamos o tipo char para representar caracteres. A correspondência entre os caracteres e seus códigos numéricos é feita por uma tabela de códigos. Em geral, usa-se a tabela ASCII, mas diferentes máquinas podem usar diferentes códigos. Caracteres Caracteres ASCII (acrônimo para American Standard Code for Information Interchange, que em português significa "Código Padrão Americano para o Intercâmbio de Informação") é uma codificação de caracteres de oito bits baseada no alfabeto inglês. Os códigos ASCII representam texto em computadores e equipamentos de comunicação. Desenvolvida a partir de 1960, grande parte das codificações de caracteres a utilizam como base. A codificação define 256 caracteres, desses, 33 são como caracteres de controle, atualmente não utilizáveis para edição de texto. Exceto pelo caractere de espaço, o restante é composto por caracteres imprimíveis. Caracteres Caracteres Como ilustração, mostramos a seguir os códigos associados a alguns caracteres segundo a tabela ASCII. Caracteres Exemplo 2.7 e 2.8: Visualizemos a Tabela ASCII e percebam a sequência em que os caracteres aparecem, e como os caracteres são tratados pela linguagem C. /* Exemplo 2.7 - Tabela ASCII */ #include<stdio.h> #include<stdlib.h> int main() { int c=-128; while(c < 128) { printf("%c [%d]\t",c ,c); c++;} printf ("\n"); system ("PAUSE"); return (0); } /* Exemplo 2.8 - Ordem da Tabela */ #include<stdio.h> #include<stdlib.h> int main() { char c = 'a'; printf("%c [%d]\n",c ,c); c = 'b'; printf("%c [%d]\n",c ,c); c = '0'; printf("%c [%d]\n",c ,c); c = '1'; printf("%c [%d]\n",c ,c); system ("PAUSE"); return (0); } Caracteres Além de agregar portabilidade e clareza ao código, o uso de constantes caracteres nos livra de conhecermos os códigos associados a cada caractere. Independente da tabela de códigos numéricos utilizada, garante- se que os dígitos são codificados em seqüência. Deste modo, se o dígito zero ('0') tem código 48, o dígito um ('1') tem obrigatoriamente código 49, e assim por diante. As letras minúsculas e as letras maiúsculas também formam dois grupos de códigos seqüenciais. Os exemplos a seguir tiram proveito desta seqüência dos códigos de caracteres. Caracteres #include<stdio.h> #include<stdlib.h> int main() { char c; do { printf("Informe um numero de 0 a 9: "); scanf("\n%c",&c); /* use \n na frente do % */ } while ((c<'0')||(c>'9')); printf ("Ok, o numero escolhido foi: %c\n", c); system ("PAUSE"); return (0); } Caracteres Exemplo 2.9: Queremos escrever uma função para testar se um caractere c é um dígito (um dos caracteres entre '0' e '9'). #include<stdio.h> #include<stdlib.h> int main() { char c, M; printf("Informe uma letra minuscula: "); scanf("%c",&c); /* Verifica se já é maiúscula */ if ((c>='A')&&(c<='Z')) printf ("A letra [%c] digitada ja eh maiuscula\n", c); else { /* Converte para maiúcula */ M = c - 'a' + 'A'; printf ("A maiuscula de [%c] eh [%c]\n", c, M); } system ("PAUSE"); return (0); } Caracteres Exemplo 2.10: Queremos escrever uma função para converter um caractere minúsculo em um caractere maiúsculo. Cadeia de Caracteres Cadeias de caracteres (strings), em C, são representadas por vetores do tipo char terminadas, obrigatoriamente, pelo caractere nulo ('\0'). Portanto, para armazenarmos uma cadeia de caracteres, devemos reservar uma posição adicional para o caractere de fim da cadeia. Todas as funções que manipulam cadeias de caracteres (e a biblioteca padrão de C oferece várias delas) recebem como parâmetro um vetor de char, isto é, um ponteiro para o primeiro elemento do vetor que representa a cadeia, e processam caractere por caractere, até encontrarem o caractere nulo, que sinaliza o final da cadeia. Cadeia de Caracteres Cadeia de Caracteres Por exemplo, o especificador de formato %s da função printf permite imprimir uma cadeia de caracteres. A função printf então recebe um vetor de char e imprime elemento por elemento, até encontrar o caractere nulo. A vantagem de ter o final da cadeia delimitado pelo caractere nulo está no fato de não ser necessário passar explicitamente para as funções que recebem cadeias de caracteres o número de caracteres a ser considerado. A partir do ponteiro para o primeiro caractere, as funções processam caractere a caractere até que um '\0' seja encontrado. Cadeia de Caracteres Cadeia de Caracteres O código abaixo ilustra a representação de uma cadeia de caracteres. Como queremos representar a palavra Rio, composta por 3 caracteres, declaramos um vetor com dimensão 4 (um elemento adicional para armazenarmos o caractere nulo no final da cadeia). O código preenche os elementos do vetor, incluindo o caractere '\0', e imprime a palavra na tela. Exemplo 2.11 #include<stdio.h> #include<stdlib.h> int main() { char cidade[4]; cidade[0] = 'R'; cidade[1] = 'i'; cidade[2] = 'o'; cidade[3] = '\0'; printf("%s \n", cidade); system ("PAUSE"); return 0; } Cadeia de Caracteres Cadeia de Caracteres Como as cadeias de caracteres são vetores, podemos reescrever o código anterior inicializando os valores dos elementos do vetor: A inicialização de cadeias de caracteres é tão comum em códigos C que a linguagem permite que elas sejam inicializadas escrevendo-se os caracteres entre aspas duplas. Cadeia de Caracteres #include<stdio.h> #include<stdlib.h> int main() { /* 2.12 – Cadeia */ char cidade[ ] = {'R', 'i', 'o', '\0'}; printf("%s \n", cidade); system ("PAUSE"); return 0; } #include<stdio.h> #include<stdlib.h> int main() { /* 2.13 – Cadeia */ char cidade[ ] = "Rio"; printf("%s \n", cidade); system ("PAUSE"); return 0; } Declarações da Cadeia de Caracteres Vejamos exemplos das declarações da Cadeia de Caracteres: • s1 cadeia de caracteres vazia (armazena o caractere '\0'). • s2 armazena cadeia de 14 caracteres (vetor com 15 elementos). • s3 armazena cadeia com até 80 caracteres dimensionada com 81 elementos, mas não inicializada, com conteúdo desconhecido. • s4 armazena cadeias com até 80 caracteres primeiros quatro elementos atribuídos na declaração {'R', 'i', 'o', '\0'}. Cadeia de Caracteres char s1[] = "" ; char s2[] = "Rio de Janeiro";char s3[81]; char s4[81] = "Rio"; Leitura de Caracteres e Cadeia de Caracteres Para capturarmos o valor de um caractere simples fornecido pelo usuário via teclado, usamos a função scanf, os especificadores é quem definirão o comportamento da função: scanf com o Especificador de formato %c • lê o valor de um único caractere fornecido via teclado. • não pula os “caracteres brancos”; caractere branco = espaço (' '), tabulação ('\t') ou nova linha ('\n' ). Cadeia de Caracteres char a; ... scanf("%c", &a); ... Leitura de Caracteres e Cadeia de Caracteres scanf com o Especificador de formato %c (continuação) se o usuário teclar um espaço antes da letra: • o código do espaço será capturado. • a letra será capturada apenas na próxima chamada de scanf. para pular todos os “caracteres brancos” antes do caractere: • basta incluir um espaço em branco no formato, antes do especificador. Cadeia de Caracteres char a; ... scanf(" %c", &a); /* o branco no formato pula brancos da entrada */ ... Leitura de Caracteres e Cadeia de Caracteres scanf com o Especificador de formato %s lê uma cadeia de caracteres não brancos. pula os eventuais caracteres brancos antes da cadeia. &cidade não é usada pois a cadeia é um vetor. o código acima funciona apenas para capturar nomes simples: • se o usuário digitar Rio de Janeiro, apenas Rio será capturada, pois %s lê somente uma seqüência de caracteres não brancos. Cadeia de Caracteres char cidade[81]; ... scanf("%s", cidade); ... Leitura de Caracteres e Cadeia de Caracteres scanf com o Especificador de formato %[...] %[...] lista entre os colchetes todos os caracteres aceitos na leitura. • lê sequências de vogais. • leitura prossegue até encontrar um caractere que não seja uma vogal. %[^...] lista entre os colchetes todos os caracteres não aceitos na leitura. • lê sequências de caracteres que não são vogais. • leitura prossegue até encontrar um caractere que seja uma vogal. Cadeia de Caracteres %[aeiou]; %[^aeiou]; Leitura de Caracteres e Cadeia de Caracteres scanf com o caractere de mudança de linha ('\n'). Lê uma sequência de caracteres até que seja encontrado o caractere de mudança de linha ('\n'): • Captura linha fornecida pelo usuário até que ele tecle “Enter”. • Inclusão do espaço no formato garante que eventuais caracteres brancos que precedam a cadeia de caracteres sejam descartados. Cadeia de Caracteres char cidade[81]; ... scanf(" %[^\n]", cidade); ... Leitura de Caracteres e Cadeia de Caracteres gets (get string) função da biblioteca string.h O gets não é uma função muito confiável, pois se o usuário digitar mais caracteres do que o previsto, ela pega mais caracteres que o tamanho da sua string, o que pode interferir em outras variáveis do seu programa. • Nas novas versões da linguagem C, esta função gets já não existe mais, foi excluída. Cadeia de Caracteres char cidade[81]; ... printf ("Digite uma cidade: "); gets (cidade); ... Exercícios Práticos de Fixação Exercícios Práticos de Fixação E como seria para trabalharmos com Caracteres? É o que veremos na próxima aula, quando discutirmos: • Manipulação de Caracteres. • Funções de Caracteres. Cadeia de Caracteres Revisão Quais pontos foram vistos nesta aula? • Caracteres. • Cadeia de Caracteres. • Declarações da Cadeia de Caracteres. • Leitura de Caracteres e Cadeia de Caracteres. ALGORITMOS II Ricardo de Almeida (ricardo.almeida@univix.edu.br)
Compartilhar