MC-102 Aula 11 Strings

Documentos relacionados
Programação Estruturada

CURSO BÁSICO DE PROGRAMAÇÃO AULA 11. Revisão Aula Anterior Vetores Cadeia de Caracteres

Aula 9 Oficina de Programação Strings. Profa. Elaine Faria UFU

MC-102 Aula 17 Strings e Matrizes

Curso Básico de Programação Aula 11. Revisão Aula Anterior Laços de Repetição While; Do-While; For.

Computação 2. Aula 3. Diego Addan Vetores de caracteres (strings)

SITUAÇÃO VETORES. Imagine o seguinte problema:

CURSO BÁSICO DE PROGRAMAÇÃO AULA 15. Revisão Vetores e Matrizes Trabalho

CCO 016 Fundamentos de Programação

Algoritmos e Programação

MC-102 Aula 06 Comandos Repetitivos

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

Strings. Introdução. Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos.

Apêndice B. Cadeias de Caracteres (Strings)

Disciplina de Algoritmos e Programação

Caracteres. Caracteres são representados através de códigos numéricos. Tabela de códigos: Define correspondência entre caracteres e códigos numéricos

Métodos Computacionais em Física

Programação: Vetores

Introdução à Programação. Strings

MC-102 Aula 21 Registros

Linguagem C (repetição)

Vetores e Strings. 4. Funções Básicas para manipulação de Strings. A função gets() lê uma string do teclado. Sua forma geral é:

3. Linguagem de Programação C

Caracteres e Cadeias de Caracteres

Computação Eletrônica. Strings. Prof: Luciano Barbosa. CIn.ufpe.br

Algoritmos e Lógica de Programação 80 horas // 4 h/semana. Para começar... Strings. Para começar... Strings. Exemplo...

Char e Strings de Caracteres

3.1 - Funções para manipular dados de entrada e saída padrão

Tratamento de Caracteres

Métodos Computacionais. Strings (Vetor de Caracteres)

Aula 15: Vetores e Matrizes em C

MC102 Algoritmos e Programação de Computadores

Disciplina de Algoritmos e Programação

Introdução a Computação

Linguagem C vetores. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

INF 1005 Programação I

Vetores e Matrizes. Conceito. Conceito. Conceito. Conceito. Conceito. Variáveis Compostas Homogêneas. Matriz

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Strings. Todas as funções apresentadas neste documento estão no arquivo de cabeçalho string.h.

Aula 8 - Matrizes e Strings

Computação Informática

Algoritmos e Programação

INF 1620 P2-14/10/05 Questão 1 Nome:

ESTRUTURAS COMPOSTAS VETOR

cadeia de caracteres (string) INF Programação I Prof. Roberto Azevedo

INF 1620 P1-11/04/03 Questão 1 Nome:

Introdução à Programação em C Input / Output

ESTRUTURAS COMPOSTAS

Seqüências de Caracteres

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: variáveis compostas homogêneas: Arrays Strings

Linguagem C: Introdução

Introdução à Linguagem C. Strings. Laboratório de Programação Prof.Alfredo Parteli Gomes

Programação: Entrada e Saída de Dados

INF 1620 P1-04/10/03 Questão 1 Nome:

Universidade Federal de Goiás Instituto de Informática Introdução à Computação Professor: Julliano Rosa Nascimento

Introdução a Programação de Jogos

Tabela ASCII de caracteres de controle

Introdução à Programação Aula 10. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

1ª Lista de Exercícios

Linguagem de Programação I Vetores e Strings. Thiago Leite Francisco Barretto

INF 1620 P1-11/04/08 Questão 1 Nome:

Transcrição:

MC-102 Aula 11 Strings Instituto de Computação Unicamp 22 de Setembro de 2016

Roteiro 1 Strings Definição de Strings em C Leitura e Escrita de Strings Inicialização de Strings Strings: Exemplos 2 Biblioteca string.h 3 Processamento de Texto 4 Exercícios (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 2 / 29

Strings em C A linguagem C não possui o tipo string explicitamente, mas podemos considerar um vetor de caracteres como uma string. Em C uma string é sempre terminada pelo caractere especial: \0 Definição Uma string em C corresponde a um vetor de caracteres terminado pelo caractere especial \0. Sempre declare uma string com um caractere a mais do que precisa, já que também será preciso armazenar o caractere \0. Se por exemplo, estivermos trabalhando com strings de 10 caracteres, declare uma variável com tamanho 11: char st[11]; (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 3 / 29

Strings em C Lembre-se: o caractere \0 identifica o final da string. No programa abaixo gostaríamos que fosse impresso ola. char st[80]; st[0] = o ; st[1] = l ; st[2] = a ; printf("%s\n", st); Mas as vezes será impresso uma palavra diferente, como ola8uj, pois não identificamos o final da string. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 4 / 29

Strings em C A versão correta do programa seria esta abaixo. char st[80]; st[0] = o ; st[1] = l ; st[2] = a ; st[3] = \0 ; printf("%s\n", st); Note que a variável st pode armazenar strings com até 79 caracteres, mas neste exemplo só estamos usando 3 (fora o \0 ). (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 5 / 29

Leitura e Escrita de Strings Para ler ou imprimir uma string do teclado usamos o operador especial %s. char st[80]; int id; printf("entre com o nome:"); scanf("%s",st); printf("entre com a idade:"); scanf("%d",&id); printf("digitado: %s e %d\n",st,id); Note que para strings não é utilizado o & antes do identificador da variável no comando scanf. O comando scanf automaticamente coloca um \0 ao final da string lida. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 6 / 29

Leitura e Escrita de Strings O comando scanf com o operador %s faz com que a leitura da string termine em uma quebra de linha ou em um espaço. char st[80]; int id; printf("entre com o nome:"); scanf("%s",st); printf("entre com a idade:"); scanf("%d",&id); printf("digitado: %s e %d\n",st,id); No exemplo acima, se digitarmos Joao da Silva 19 será salvo apenas Joao em st, e um valor diferente de 19 em id. Isto ocorre pois o scanf lê a string até o primeiro espaço, e converte o próximo dado (que é a string da ) em um inteiro. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 7 / 29

Leitura e Escrita de Strings Para ler strings incluindo espaços use o comando fgets cuja sintaxe é: fgets(identificador, limite, stdin); onde identificador é o nome da variável para onde será lida a string, limite-1 é a quantidade máxima de caracteres que poderá ser lida, e stdin é uma palavra reservada que indica que a leitura se dará da entrada padrão. Neste comando serão lidos todos os caracteres até a quebra de linha, e todos serão armazenados na variável, incluindo a quebra de linha. Caso limite-1 caracteres tenham sido lidos, a função para a leitura antes da quebra de linha. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 8 / 29

Leitura e Escrita de Strings #include <stdio.h> char st[80]; int id; printf("entre com o nome:"); fgets(st, 80, stdin); printf("entre com a idade:"); scanf("%d",&id); printf("digitado: %s e %d\n",st,id); No exemplo acima se digitarmos Joao da Silva 19 será salvo Joao da Silva\n\0 em st, e o valor 19 em id. Note que como st pode armazenar até 80 caracteres usamos este valor como parâmetro para o limite de caracteres que podem ser lidos do teclado. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 9 / 29

Inicialização de Strings Em algumas situações, ao criarmos uma string, pode ser útil atribuir valores já na sua criação. No caso de strings, podemos atribuir diretamente uma constante string para a variável. Exemplo char st[100] = sim isto é possível ; O comando de inicialização automaticamente insere o caractere \0 no final da string. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 10 / 29

Strings: Exemplos Ler uma string de até 79 caracteres e salvar a inversa desta em um vetor. Imprimir a inversa da string lida. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 11 / 29

Strings: Exemplos Primeiramente determinamos o tamanho da string. char st[80], stinv[80]; int tam, i, j; printf("entre com a string (max. 79): "); scanf("%s",st); //Determinamos o tamanho da string, que é o valor em tam no final do laço tam = 0; while(st[tam]!= \0 && tam < 80){ tam++;... (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 12 / 29

Strings: Exemplos Depois escrevemos os caracteres em stinv na ordem inversa de aparição em st. char st[80], stinv[80]; int tam, i, j; printf("entre com a string (max. 79): "); scanf("%s",st); //Determinamos o tamanho da string, que é o valor em tam no final do laço... //Depois escrevemos os caracteres na inversa stinv[tam] = \0 ; j = tam-1; i = 0; while(i<tam){ stinv[j] = st[i]; i++; j--; printf("a inversa e: %s\n",stinv); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 13 / 29

Strings: Exemplos char st[80], stinv[80]; int tam, i, j; printf("entre com a string (max. 79): "); scanf("%s",st); //Determinamos o tamanho da string, que é o valor em tam no final do laço tam = 0; while(st[tam]!= \0 && tam < 80){ tam++; //Depois escrevemos os caracteres na inversa stinv[tam] = \0 ; j = tam-1; i = 0; while(i<tam){ stinv[j] = st[i]; i++; j--; printf("a inversa e: %s\n",stinv); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 14 / 29

Strings: Exemplos A mesma coisa mas com laço for: char st1[80], stinversa[80]; int i, j, tam; printf("digite um texto (max. 79):"); scanf("%s",st1); for(tam=0; (st1[tam]!= \0 ) && (tam < 80) ; tam++) ; stinversa[tam] = \0 ; for(j = tam-1, i = 0 ; j >= 0 ; stinversa[j] = st1[i]; j--, i++){ printf("a inversa e: %s\n", stinversa); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 15 / 29

Strings: Exemplos Se usarmos o fgets ao invés do scanf, devemos determinar o tamanho da string excluindo o \n. O programa anterior pode ser alterado considerando strings com espaços. char st1[80], stinversa[80]; int i, j, tam; printf("digite um texto (max. 79):"); fgets(st1, 80, stdin); //Alteraç~ao da condiç~ao de parada aqui --> for(tam=0; (st1[tam]!= \0 ) && (st1[tam]!= \n ) ; tam++) ; stinversa[tam] = \0 ; for(j = tam-1, i = 0 ; j >= 0 ; stinversa[j] = st1[i]; j--, i++){ printf("a inversa e: %s\n", stinversa); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 16 / 29

Biblioteca string.h A biblioteca string.h possui várias funções úteis para se trabalhar com strings. Vamos apresentar algumas funções comuns: char *strcat(char *s1, const char *s2) : Para fazer a concatenação de strings. int strcmp(const char *s1, const char *s2) : Para fazer a comparação lexicográfica (utilizada em ordenação) de duas strings. char *strcpy(char *s1, const char *s2) : Para fazer a cópia de strings. int strlen(const char *s1) : Para se determinar o tamanho de uma string. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 17 / 29

Biblioteca string.h Exemplo de uso da função strcat para fazer concatenação de strings. A função recebe duas strings como parâmetro e concatena a string segundo parâmetro no final da string primeiro parâmetro. Deve haver espaço suficiente na primeira string, caso contrário ocorrerá um erro. #include <stdio.h> #include <string.h> char s1[80]="ola ", s2[80]="turma de 102!"; //concatena s2 no final de s1 strcat(s1, s2); printf("%s\n", s1); Saída será ola turma de 102! (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 18 / 29

Biblioteca string.h Exemplo de uso da função strcmp para fazer comparação de strings. A função recebe duas strings s1 e s2 como parâmetro e devolve: 0 caso as duas strings sejam iguais. um valor menor que 0 caso s1 seja lexicograficamente menor que s2. um valor maior que 0 caso s1 seja lexicograficamente maior que s2. #include <stdio.h> #include <string.h> char s1[80]="aab", s2[80]="aac"; int r; r = strcmp(s1, s2); if(r < 0) printf("%s vem antes que %s\n", s1, s2); else if(r>0) printf("%s vem antes que %s\n", s2, s1); else printf("sao iguais\n"); Saída será aab vem antes que aac (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 19 / 29

Biblioteca string.h Exemplo de uso da função strcpy para fazer cópia de strings. A função recebe duas strings como parâmetro e copia a string segundo parâmetro na string primeiro parâmetro. #include <stdio.h> #include <string.h> char s1[80], s2[80]="ola pessoal"; strcpy(s1, s2); printf("%s\n", s1); Saída será ola pessoal (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 20 / 29

Biblioteca string.h Exemplo de uso da função strlen para calcular o tamanho de uma string. A função recebe uma string como parâmetro e devolve o número de caracteres na string até o \0. #include <stdio.h> #include <string.h> char s1[80]="ola pessoal"; int t; t = strlen(s1); printf("%d\n", t); Saída será 11 (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 21 / 29

Processamento de Texto Como exemplo de uso de strings vamos implementar duas funcionalidades básicas de processadores de texto: 1 Contar o número de palavras em um texto. 2 Fazer a busca de uma palavra em um texto. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 22 / 29

Processamento de Texto Programa que conta o número de palavras em textos sem pontuação: char s[80]; int i=0, n=0; fgets(s, 80, stdin); while(s[i]!= \n && s[i]!= \0 ){ //Enquanto n~ao terminou o texto while(s[i]== ) //Pula possíveis espaços i++; //Achou o começo de uma palavra ou o fim do texto if(s[i]!= \n && s[i]!= \0 ){ //Se achou uma palavra n++; //incrementa numero de palavras while(s[i]!= && s[i]!= \n && s[i]!= \0 )//passa pela palavra i++; printf("total de palavras: %d\n", n); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 23 / 29

Processamento de Texto Fazer um programa que acha todas as posições de ocorrência de uma palavra em um texto. Exemplo: Texto=a tete tetete Palavra=tete A resposta é 2, 7 e 9. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 24 / 29

Processamento de Texto Ideia do algoritmo: Para cada possível posição no texto onde a palavra pode iniciar, checamos se a palavra ocorre naquela posição ou não. Seja tamt (respectivamente tamp) o tamanho do texto (tamanho da palavra respectivamente). As posições válidas onde a palavra pode iniciar no texto vão de 0 até tamt - tamp. char palavra[80], texto[80]; fgets(texto, 80, stdin); fgets(palavra, 80, stdin); int tamt = strlen(texto) - 1; int tamp = strlen(palavra) - 1; //O -1 é pelo \n int i, j; for(i=0; i <= tamt - tamp; i++){ //Para cada i verificar se palavra //ocorre a partir de i... (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 25 / 29

Processamento de Texto Como testar se a palavra ocorre exatamente a partir de uma posição i? Checar se todos os caracteres da palavra são iguais aos do texto a partir de i. //Checa se a palavra ocorre na posiç~ao i do texto j=0; while( j<tamp && palavra[j] == texto[i+j]) j++; if(j==tamp) //Se atingiu o fim do laço porque j==tamp, printf("%d\n", i); // ent~ao a palavra ocorre em i (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 26 / 29

Processamento de Texto Programa completo: char palavra[80], texto[80]; fgets(texto, 80, stdin); fgets(palavra, 80, stdin); int tamt = strlen(texto) - 1; int tamp = strlen(palavra) - 1; //O -1 é pelo \n int i, j; for(i=0; i <= tamt - tamp; i++){ //Para cada possível posiç~ao de inicio j=0; while(j<tamp && palavra[j] == texto[i+j]) //Testa se palavra ocorre j++; if(j==tamp) //Se verdadeiro a palavra ocorre na pos. i printf("%d\n", i); (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 27 / 29

Exercício Escreva um programa que lê uma string de até 50 caracteres, e imprime Palindromo caso a string seja um palindromo e Nao Palindromo caso contrário. OBS: Um palindromo é uma palavra ou frase, que é igual quando lida da esquerda para a direita ou da direita para a esquerda (espaços em brancos são descartados). Assuma que as palavras são todas em minúsculas e sem acentos. Exemplo de palindromo: saudavel leva duas. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 28 / 29

Strings: Exemplos Refaça o exemplo visto em aula de inversão de uma string de tal forma que não seja utilizado nenhum vetor adicional! Ou seja devemos computar a inversa no próprio vetor original. (Instituto de Computação Unicamp) MC-102 Aula 11 22 de Setembro de 2016 29 / 29