CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo VIII Cadeias de Caracteres Programa 8.1: Leitura e escrita de cadeias de caracteres Cad1 #include <stdio.h> ‘2’ ? ‘3’ ? ‘4’ ? ‘\0’ ? ? ? ? ? ? ‘1’ ? #include <conio.h> void main () { 1 2 3 4 5 6 7 8 9 0 char Cad1[10], Cad2[] = "abcde"; int i; printf ("Digite uma cadeia de caracteres:\n\n"); scanf ("%s", Cad1); Cad2 printf ("\nCad1 = %s", Cad1); ‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘\0’ printf ("\nCad2 = %s", Cad2); printf ("\n"); 1 2 3 4 5 0 for (i = 0; i <= 9; i++) printf ("\n\tCad1[%d] = '%c' ou %d", i, Cad1[i], Cad1[i]); printf ("\n"); Supor Foi escrito: a digitação de 1234<enter> for (i = 0; i <= 5; i++) Cad1 = 1234 printf ("\n\tCad2[%d] = '%c' ou %d", i, Cad2[i], Cad2[i]); Cad2 = abcde printf ("\n\nDigite algo para encerrar: "); getch (); Copiar, salvar Cuidado para não digitar mais } que 9 caracteres para Cad1 e executar Programa 8.2: O formato %s para leitura de cadeias de caracteres Copiar, salvar e executar #include <stdio.h> Digite uma frase: #include <conio.h> typedef char cadeia[20]; gosto muito de CES-10 void main () { cadeia Cad1, Cad2; Cad1 = gosto printf ("Digite uma frase:\n\n"); Cad2 = muito scanf ("%s%s", Cad1, Cad2); Digite algo para encerrar printf ("\nCad1 = %s", Cad1); Resultado printf ("\nCad2 = %s", Cad2); de uma printf ("\n\nDigite algo para encerrar: "); execução getch (); } Com o formato %s, scanf encerra a leitura para uma variável, quando encontra um espaço em branco, ou um ‘enter’, ou tabulação Programa 8.3: Comprimento de cadeias de caracteres #include <stdio.h> Copiar, salvar #include <string.h> e executar #include <conio.h> typedef char cadeia[50]; ‘strlen’ retorna o no de caracteres void main () { de uma cadeia, sem contar o ‘\0’ cadeia Cad; printf ("Digite uma cadeia de caracteres:\n\n"); scanf ("%s", Cad); printf ("\n\tComprimento (%s) = %d", Cad, strlen(Cad)); printf ("\n\nDigite algo para encerrar: "); Resultado de getch (); uma execução } Digite uma cadeia de caracteres: anticonstitucionalissimamente Comprimento (anticonstitucionalissimamente) = 29 Digite algo para encerrar Programa 8.4: Vetor de cadeias de caracteres #include <stdio.h> Cadeias poderão Copiar, salvar #include <string.h> ter no máximo 20 e executar #include <conio.h> caracteres typedef char cadeia[21]; void main () { cadeia VetCadeia[30]; int i, n, Comprimento[30]; printf ("Armazenamento de cadeia de caracteres:\n\n"); printf ("Armazenar quantas cadeias (maximo 30 cadeias)? "); scanf ("%d", &n); for (i = 0; i <= n-1; i++) { printf ("\nDigite uma cadeia (maximo 20com caracteres): "); Vetor o Vetor de no máximo scanf30("%s", comprimento das cadeias VetCadeia[i]); de Comprimento[i] cadeias do vetor caracteres = strlen (VetCadeia[i]); } VetCadeia printf ("\n\n%30s|%15s", "Cadeia", "Comprimento"); printf ("\n----------------------------------------------"); for (i = 0; i <= n-1; i++) printf ("\n%30s|%15d", VetCadeia[i], Comprimento[i]); printf ("\n\nDigite algo para encerrar: "); getch (); } Programa 8.5: a função gets Copiar, salvar #include <stdio.h> e executar #include <conio.h> void main ( ) { int i, n; char Frase[200]; A frase digitada poderá ter printf ("Numero de frases: "); caracteres brancos e tabulações scanf ("%d", &n); printf ("\n"); for (i = 1; i <= n; i++) { printf ("\n\nDigite a %da frase: ", i); fflush (stdin); gets (Frase); printf ("\n\tFrase digitada: %s", Frase); } printf ("\n\nDigite algo para encerrar: "); getch (); A função ‘fflush’ esvazia o buffer } do teclado antes da chamada de ‘gets’ Programa 8.6: Conjuntos máximos de um arquivo Sejam as seguintes definições: Conjunto: sequência de caracteres imprimíveis não brancos, dentro de um arquivo-texto Subconjunto de um dado conjunto: conjunto contido nesse dado conjunto Subconjunto próprio de um dado conjunto: subconjunto desse conjunto dado diferente do mesmo Conjunto máximo: conjunto que não é subconjunto próprio de nenhum outro conjunto #include <stdio.h> #include <conio.h> typedef char cadeia1[31], cadeia2[11]; void main ( ) { Criar um arquivo de nome arquivo01 com o seguinte int x, n; conteúdo: 198 0 17439&() 100110100011101 cadeia1 ConjMax; 82736193826 01101001 1b5FD4 1 cadeia2 FileName; 34528178 00 ff123e ABGkJX 98271 10 FILE *arq; printf ("Conjuntos maximos de um arquivo: "); printf ("\n\nDigite o nome do arquivo: "); scanf ("%s", FileName); arq = fopen (FileName, "r"); Copiar, salvar n = 0; x = fscanf (arq, "%s", ConjMax); e executar while (x > 0) { printf ("\n%s", ConjMax); n++; x = fscanf (arq, "%s", ConjMax); } printf ("\n\nTotal: %d conjuntos maximos", n); printf ("\n\nDigite algo para encerrar: "); getch (); } Exercício 8.1: Vetor de conjuntos máximos Alterar o Programa 8.6 para que ele coloque todos os conjuntos máximos num vetor de cadeias de caracteres e os comprimentos desses conjuntos num vetor de inteiros Usar as seguintes declarações: cadeia1 VetCadeia[40]; int Comprimento[40]; Sendo a e b duas cadeias de caracteres, para copiar o conteúdo da cadeia b na cadeia a, usar: strcpy (a, b); ao invés de a = b; strcpy ConjMax); A função strcpy (VetCadeia[i], está no arquivo string.h No final, escrever o conteúdo do vetor VetCadeia, com cada cadeia ao lado de seu comprimento Exemplo de saída, usando como entrada o arquivo01: Conjuntos maximos de um arquivo: Digite o nome do arquivo: arquivo01 arquivo01 198 0 17439&() 100110100011101 82736193826 01101001 1b5FD4 1 34528178 00 ff123e ABGkJX 98271 10 Total: 14 conjuntos maximos 198 0 17439&() 100110100011101 82736193826 01101001 1b5FD4 1 34528178 00 ff123e ABGkJX 98271 10 Saída no vídeo Digite algo para encerrar: 3 1 8 15 11 8 6 1 8 2 6 6 5 2 Exercício 8.2: Alterar o programa do Exercício 8.1 para: Montar um vetor de nome VetBin, com os conjuntos máximos de VetCadeia que contenham apenas 0’s e 1’s Considerando tais conjuntos máximos como sendo números binários em complemento de 2, montar um vetor de nome Compl2 contendo o valor em decimal correspondente a cada um desses conjuntos máximos No final, o programa deve escrever cada número binário em complemento de 2 ao lado do valor correspondente em decimal Obs.: sendo A[i] = “abcde”, então A[i][0] = ‘a’; A[i][1] = ‘b’; A[i][2] = ‘c’; etc 0 = Compl-2 (0) e 1 = Compl-2 (-1) Exemplo de saída, usando como entrada o arquivo01: Conjuntos maximos de um arquivo: Digite o nome do arquivo: arquivo01 Total: 14 conjuntos maximos 198 0 17439&() 100110100011101 82736193826 01101001 1b5FD4 1 34528178 00 ff123e ABGkJX 98271 10 3 1 8 15 11 8 6 1 8 2 6 6 5 2 6 numeros binarios 0 100110100011101 01101001 1 00 10 Digite algo para encerrar: = = = = = = compl-2 compl-2 compl-2 compl-2 compl-2 compl-2 (0) (-13027) (105) (-1) (0) (-2) Exercício 8.3: Alterar o programa do Exercício 8.2 para: Montar um vetor de nome VetDec com os conjuntos máximos de VetCadeia que contenham apenas dígitos decimais e não correspondam a números binários Montar um vetor de números reais de nome Log10 tal que, se VetDec[i] tiver 9 ou menos dígitos, Log10[i] é o logaritmo na base 10 do número correspondente; senão, Log10[i] = -1 No final, o programa deve escrever cada elemento do vetor VetDec ao lado do elemento correspondente no vetor Log10 Exemplo de saída, usando como entrada o arquivo01: 6 numeros binarios 0 100110100011101 01101001 1 00 10 = = = = = = compl-2 compl-2 compl-2 compl-2 compl-2 compl-2 (0) (-13027) (105) (-1) (0) (-2) 4 numeros decimais 198 82736193826 34528178 98271 Digite algo para encerrar: Log10 ***** Log10 Log10 ( 198) Valor muito ( 34528178) ( 98271) = 2.296665 grande ***** = 7.538174 = 4.992425 Exercício 8.4: Alterar o programa do Exercício 8.3 para: Montar um vetor de nome VetHexa com os conjuntos máximos de VetCadeia que contenham apenas dígitos hexadecimais e não correspondam a números binários Montar um vetor de números inteiros de nome ValBase10 tal que, se VetHexa[i] tiver 7 ou menos dígitos, ValBase10[i] é o valor na base 10 do número correspondente; senão, ValBase10[i] = -1 No final, o programa deve escrever cada elemento do vetor VetHexa ao lado do elemento correspondente no vetor ValBase10 Exemplo de saída, usando como entrada o arquivo01: 6 numeros binarios 0 100110100011101 01101001 1 00 10 = = = = = = compl-2 compl-2 compl-2 compl-2 compl-2 compl-2 (0) (-13027) (105) (-1) (0) (-2) 4 numeros decimais 198 82736193826 34528178 98271 Log10 ***** Log10 Log10 ( 198) Valor muito ( 34528178) ( 98271) = 2.296665 grande ***** = 7.538174 = 4.992425 6 numeros hexadecimais 198 82736193826 1b5FD4 34528178 ff123e 98271 Digite algo para encerrar: = (408)10 ***** Valor muito grande ***** = (1794004)10 ***** Valor muito grande ***** = (16716350)10 = (623217)10