INF 1005 • Programação I • lista 12
Caracteres e cadeias de caracteres (strings) 1. [tarefa 42] Implemente e teste uma função que receba uma string como parâmetro e modifique
essa string trocando todos os caracteres minúsculos por maiúsculos e vice-versa. Caracteres que
não forem letras não devem ser alterados. Por exemplo, se for passado como parâmetro a string
"PUC-Rio", essa função deve transformar essa string em "puc-rIO". Essa função deve obedecer o
seguinte protótipo:
void inverte_letra (char str[]); 2. [tarefa 43] Implemente e teste uma função que receba como parâmetro uma string e dois
caracteres (original e novo), e substitua todas as ocorrências do caractere original na string pelo
caractere novo. Essa função deve obedecer o seguinte protótipo:
void troca_letra (char str[], char original, char novo); 3. [tarefa 44] Implemente e teste uma função que receba como parâmetro uma string e a inverta. Por
exemplo, recebendo como parâmetro a string “Aluno”, essa função transformaria a string em
“onulA”. Essa função deve obedecer o seguinte protótipo:
void inverte_string (char str[]); 4. Uma palavra é denominada um palíndromo se for mantida igual quando invertida. Algumas
palavras que são palíndromos são: aba, radar, reter, rever, rir, rotor, dentre outras. Implemente e
teste uma função que verifique se uma palavra digitada pelo usuário é ou não um palíndromo.
5. Implemente e teste uma função que leia uma string e imprima as palavras em ordem inversa à
lida. Considere que cada palavra é separada por apenas um espaço. Por exemplo:
Isto é um exemplo ===> exemplo um é Isto 6. Modifique a função anterior considerando que cada palavra pode ser separada por uma quantidade
qualquer de espaços.
7. Implemente e teste um programa que leia um nomes completos e imprima:
a) as iniciais de todos os componentes do nome e o sobrenome completo. Por exemplo:
João Pedro Albuquerque Cardoso Silva ===> J P A C Silva b) o sobrenome completo e as iniciais de cada nome. Por exemplo:
João Pedro Albuquerque Cardoso Silva ===> Silva J P A C 8. Implemente e teste uma função que receba duas strings, verifique se a string2 é substring da
string1 e retorne 0 se string2 não for substring da string1 ou a posição onde a string2 ocorre pela
primeira vez na string1. Por exemplo: substr_pos("banana","ana") retorna 1.
9. Implemente e teste uma função que receba duas strings, verifique se a string2 é substring da
string1 e retorne 0 se string2 não for substring da string1 ou o número de vezes que a string2
ocorre na string1. Exemplo: substr_qt("banana","ana") retorna 2.
10. Implemente e teste uma função que receba 3 strings e substitua todas as ocorrências da string2 na
string1 pela string3, retornando o número de substituições realizadas. Por exemplo:
string1:"banana" string2: "ana" string3: "or" ==> string1: "borna" retorna 1 Hélio Côrtes Vieira Lopes
[email protected]
Departamento de Informática
Rua Marquês de São Vicente, 225 • Gávea • 22451-900
Rio de Janeiro • RJ • Tel. (21) 3527-1500 r.4350 • Fax (21) 3527-1530
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
string1: "banana" string2: "ana" string3: "ora" ==> string1: “borora” retorna 2 11. Implemente e teste uma função que receba uma string e embaralhe suas letras, utilizando as
funções srand e rand da biblioteca padrão stdlib.
12. [tarefa 36] Considere um arquivo de texto que contém o cadastro dos alunos de uma turma. Cada
linha do arquivo contém o nome do aluno, delimitado por aspas simples, e três notas obtidas pelo
aluno, representadas por números reais. Considere que os nomes dos alunos têm no máximo 80
caracteres. O arquivo pode conter eventuais linhas em branco. Um exemplo deste formato é
mostrado abaixo:
'Fulano de Tal' 5.6 7.6 8.1 'Sicrano Silva' 2.0 4.6 4.2 'Beltrano Alves' 10.0 8.8 9.0 Escreva um programa completo que leia o arquivo "entrada.txt", que contém um cadastro de
alunos no formato descrito acima, e imprima na tela, com uma casa decimal, a maior média obtida
por um aluno considerando as três notas com pesos iguais. Se não for possível abrir o arquivo, o
programa deve ter como saída a mensagem "ERRO". Se não existir nenhum aluno descrito no
arquivo (arquivo existente, mas vazio), deve-se imprimir a mensagem "VAZIO".
13. Considere um arquivo de texto que contém o cadastro dos alunos de uma turma. Cada linha do
arquivo contém o nome do aluno, delimitado por aspas simples, e três notas obtidas pelo aluno,
representadas por números reais. Considere que os nomes dos alunos têm no máximo 80
caracteres. O arquivo pode conter eventuais linhas em branco. Um exemplo deste formato é
mostrado abaixo:
'Fulano de Tal' 5.6 7.6 8.1 'Sicrano Silva' 2.0 4.6 4.2 'Beltrano Alves' 10.0 8.8 9.0 Escreva um programa completo que leia o arquivo "entrada.txt", que contém um cadastro de
alunos no formato descrito acima, e escreva num arquivo "saida.txt" os nomes, notas e a média
aritmética (com uma casa decimal) de cada aluno. Se não for possível abrir o arquivo de entrada
(ou de saída), o programa deve imprimir na tela a mensagem "Erro ao abrir o arquivo de entrada"
(ou "Erro ao abrir o arquivo de saída"). Se não existir nenhum aluno descrito no arquivo (arquivo
existente, mas vazio), deve-se imprimir a mensagem "Arquivo vazio".
14. Implemente e teste um jogo da forca, que leia as palavras que podem ser utilizadas de um arquivo
de dicionário, escolhe uma palavra aleatoriamente e permite que o usuário tente adivinhar a
palavra, digitando um caractere de cada vez, e permitindo até 5 erros. Desafio: a cada tentativa,
exiba as letras já digitadas, redesenhe a palavra com lacunas nas letras ainda não descobertas e a
forca no estado atual.
1) Faça um programa que implemente uma máquina de calcular com operações +, -, *, / e %, através
da leitura de dois operandos numéricos inteiros e do operador (tipo caracter), no formato: operando1
operador operando2. Verifique casos de operações que não podem ser realizadas (antes de operá-las).
2) Faça um programa que calcula a área de determinadas figuras geométricas. O programa deverá
apresentar um menu com as seguintes opções:
Página 2 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
2
(Q) quadrado ( lado )
(R) retângulo (comprimento * largura)
(C) círculo (3,14 * raio2 )
(T) trapézio ((base maior + base menor) * altura / 2)
3) Faça um programa que imprima as letras minúsculas do alfabeto e seus respectivos códigos
decimais da tabela ASCII.
4) Faça um programa que leia uma seqüência de caracteres terminada por ‘#’ e imprima o número de
caracteres lidos.
5) Faça o chinês do programa abaixo, mostrando exatamente o que seria impresso se fossem
digitados os seguintes caracteres na entrada: EVA e ADAO#
void main (void)
{
char ch;
int i = 0;
while ((i<=10) && (ch=getch())!=‘#’)
switch (ch)
{
case ‘A’:
case ‘O’:
i++;
putchar (‘E’);
break;
case ‘ ‘:
putchar (‘!’);
case ‘L’:
i = i +2;
putchar (‘$’);
break;
default:
putchar (‘?’);
i++;
}
printf (“\nAcabou”);
}
6) (Prova 1 - 95/2) Uma equipe de vôlei paga aos seus jogadores, além do salário, um valor
adicional ao salário mensal (bicho) que é função da produtividade de cada um. Essa produtividade é
paga de acordo com a tabela a seguir:
classe
Nome da classe valor adicional
A
Excelente
+100%
B
Bom
+80%
C
médio
+50%
D
regular
+30%
E
Precisa treinar
+10%
mais
F
te cuida
+5%
G
tsktsk
nada
Faça um programa que, dados o salário (float) e o código da classe de um jogador (char), calcule e
imprima o seu salário final e o nome da sua classe.
7) Faça um programa que leia uma seqüência de caracteres terminada por um <Enter> (linha de
texto) e imprima a quantidade de caracteres lidos.
8) Faça um programa que leia uma linha de texto (seqüência de caracteres terminada por um
<Enter>) e os imprima novamente na tela com exceção dos caracteres de espaço em branco que não
devem ser impressos.
Página 3 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
9) Faça um programa que leia uma linha de texto (seqüência de caracteres terminada por um
<Enter>) e imprima a quantidade de vogais minúsculas, a quantidade de consoantes minúsculas e a
quantidade de caracteres não letras encontrados.
10) Faça um programa que leia uma linha de texto (seqüência de caracteres terminada por um
<Enter>) e imprima a quantidade total de caracteres lidos e a porcentagem de caracteres do tipo letra
encontrados.
11) Faça um programa que leia uma linha de texto e imprima a quantidade de letras maiúsculas e a
quantidade de letras minúsculas encontradas.
12) Durante a segunda guerra mundial, havia necessidade de codificação das mensagens transmitidas,
para isso eram necessários códigos secretos, um desses códigos era o POLAR/ZENIT, que consistia
em trocar as ocorrências da letra P pela letra Z e vice-versa, as letras O pelas letras E, e vice-versa, e
assim por diante. Faça um programa que leia uma linha de texto e imprima os caracteres codificados
segundo o código POLAR/ZENIT.
13) Faça um programa que leia uma linha de texto e imprima o número de palavras que compõe a
linha. Considere que cada palavra esta separada por, exatamente, um único caracter de espaço.
14) Faça um programa que leia um caracter e uma linha de texto e imprima a posição do caracter na
linha a cada vez que ele for digitado. O caracter pode aparecer mais de uma vez na linha.
15) Faça um programa que leia uma linha de texto e converta os caracteres maiúsculos em
minúsculos.
16) Faça um programa que leia uma linha de texto e converta os caracteres maiúsculos para
minúsculos e vice-versa.
Exercícios Propostos
17) (Prova 2 - 94/1) Faça um programa que leia da entrada padrão (teclado) uma seqüência de
caracteres, terminada pelo caractere '#' e imprima quantos caracteres, quantas palavras e quantas
frases foram lidas.
Observações: Para facilitar, considere que: cada frase é delimitada por '?', '!'ou '.'; cada palavra é
delimitada por '\n', '\t' ou espaço; não existem espaços antes e depois de um sinal de pontuação; cada
palavra é separada das demais por um único espaço; o texto começa por uma letra; não existem sinais
de pontuação consecutivos.
18) (Prova 1 - 97/1) Faça um programa que leia uma linha de texto e substitua cada vogal lida por N
vogais iguais, onde N representa o número de vogais lidas até então. Para os demais caracteres, o
programa deve imprimir apenas o próprio caractere. Considere que o usuário digitará apenas
caracteres minúsculos. O programa deverá imprimir, ao final, o percentual de consoantes em relação
ao total de caracteres digitados. Exemplo:
Texto lido:
um exemplo!!!
Saída do programa: um eexeeemploooo!!!
Percentual:
33.333333
15. Faça uma função chamada copia_str que recebe duas strings como parâmetros e copie todos os
elementos da segunda string para a primeira, apagando-a.
16. Faça uma função chamada tam_str que recebe uma string como parâmetro e retorne o número de
caracteres da string. O caracter ‘\0’ não deve ser considerado na contagem.
17. Faça uma função chamada concat_str que recebe duas strings como parâmetros e copie todos os
caracteres da segunda string para o final da primeira string.
18. Faça uma função chamada compara_str que recebe duas strings (s1 e s2) como parâmetros e
compara os seus conteúdos. A função retorna um número < 0 se s1 for menor que s2, um número
> 0 se a s1 for maior que s2 e 0 (zero) se as strings forem iguais.
19. Faça uma função chamada imp_str que recebe uma string como parâmetro e imprime seu
conteúdo na tela. Após imprimir a string, a função deve “pular uma linha”.
Página 4 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
20. Faça uma função chamada le_str que recebe uma string como parâmetro e preenche esta string
com os caracteres lidos através do teclado. A leitura termina quando o usuário digitar <Enter>
(que não deverá fazer parte da string).
21. Faça uma função que receba uma string como parâmetro e imprima a string invertida.
22. Faça uma função que receba uma string como parâmetro e converta todos as letras minúsculas
encontradas em letras maiúsculas. Os demais caracteres devem permanecer inalterados.
23. Faça uma função que receba uma string como parâmetro e retorne o número de palavras
encontradas. Cada palavra pode estar separada por um ou mais caracteres de espaço. Não
considere os caracteres de pontuação como separadores de palavras.
24. Refaça a questão anterior considerando os caracteres ‘.’, ‘,’, ‘;’ como separadores de palavras,
além do espaço em branco.
25. Faça uma função que receba uma string como parâmetro e um caracter. A função deve retornar a
primeira posição onde o caracter foi encontrado na string ou -1 caso o caracter não apareça na
string.
26. Faça uma função que receba uma string como parâmetro e um caracter. A função deve retornar a
última posição onde o caracter foi encontrado na string ou -1 caso o caracter não apareça na
string.
27. Faça uma função que receba uma string como parâmetro e um caracter. A função deve retirar
todas as ocorrências deste caracter da string.
28. Faça uma função que receba uma string como parâmetro e dois caracteres. A função deve trocar
toda a ocorrência do primeiro caracter na string pelo segundo caracter.
29. Faça uma função que receba uma string como parâmetro e um caracter. A função deve retornar o
número de vezes que o caracter aparece na string.
30. Faça uma função que receba uma string como parâmetro, um caracter e um valor numérico. A
função deve preencher a string com tantos caracteres quanto for o valor numérico passado com
parâmetro.
31. Faça uma função chamada strncpy que recebe duas strings (s1 e s2) e um valor numérico como
parâmetros. A função deve copiar tantos caracteres quanto o valor numérico, da string s2 para a
string s1.
32. Faça uma função chamada copia_str_i que compara duas strings (s1 e s2) passadas como
parâmetro, não diferenciando maiúsculas de minúsculas. A função deve retornar: 0 se as strings
forem iguais; um valor menor que 0 se s1 for menor que s2 e um valor maior que 0 se s1 for
maior que s2.
33. (Prova 3 - 94/1) Faça uma função que receba como parâmetro uma string de, no máximo, 80
caracteres e converta todas as letras para minúsculas, exceto a primeira letra de cada palavra, que
deve ser maiúscula. Considere que a string só possui letras e espaços e entre as palavras existe um
único espaço.
Exemplo:
Frase recebida:
EsTa fRase e apENAS uM EXEmPLO
Frase gerada:
Esta Frase E Apenas Um Exemplo
34. Faça uma função que receba uma string como parâmetro e imprima esta string em modo
justificado, ou seja, preenchendo os intervalos entre as palavras com espaços em branco de
maneira proporcional. Considere este procedimento apenas para strings com menos de 80
caracteres. As strings com mais de 80 caracteres devem ser impressas sem alteração.
Página 5 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
35. Faça uma função que receba uma string como parâmetro e a imprima. Se a string tiver mais de 40
caracteres, ela deve ser particionada, quantas vezes for necessário, de modo a imprimir no
máximo 40 caracteres por linha, sendo que nenhuma palavra deve ser impressa fragmentada.
36. Modifique a função do item anterior de modo a imprimir a string em modo justificado, além de
realizar o seu particionamento.
37. Faça uma função que receba duas strings como parâmetro (s1 e s2) e retorne a posição da string
s2 dentro da string s1, caso a string s1 contenha a string s2, ou -1 em caso contrário.
Exemplo:
s1 ‘c’ ‘a’ ‘m’ ‘a’ ‘l’ ‘e’ ‘ã’ ‘o’ ‘\0’
s2 ‘l’ ‘e’ ‘ã’ ‘o’ ‘\0’
A função deve retornar o valor 4, pois é o valor da posição onde começa a string “leão” na string
“camaleão”.
38. Faça uma função que receba uma string como parâmetro e verifique se é um palíndrome, isto é,
da esquerda para direita ou da direita para a esquerda têm-se a mesma seqüência de caracteres.
Exemplos: ama, ovo, asa.
39. (Prova 3 - 94/1) Considere a seguinte lista de países e respectivas capitais:
Canadá
Ottawa
Inglaterra
Londres
França
Paris
Portugal
Lisboa
Japão
Tóquio
Escreva um programa interativo que aceite um nome de um país como entrada e imprima o nome de
sua capital. O programa deve executar repetidamente até que seja digitada a palavra FIM.
40. (Prova 3 - 96/1) Faça uma função que receba duas strings e um inteiro como parâmetros. Esta
função inclui a segunda string a primeira a partir da posição indicada pelo inteiro. Exemplo
(apenas um exemplo!!!):
1a string: “isto é exemplo”
resultado após execução da função:
2a string: “apenas um ”
1a string: “isto é apenas um exemplo”
inteiro: 7
2a string: “apenas um ”
19) (Prova 4 - 96/1) Faça uma função chamada strmix que receba 3 strings (s1, s2 e s3) e misture s1
e s2 do seguinte modo:
1o caracter de s3: 1o caracter de s1
2o caracter de s3: 1o caracter de s2
3o caracter de s3: 2o caracter de s1 e assim sucessivamente
Observações: a string resultante deverá ser armazenada em s3. As strings s1 e s2 podem ter tamanhos
diferentes.
Exemplo:
s1: “abcde”
s2: “012”
string resultante (s3): “a0b1c2de”
20) (Prova 3 - 96/2) Faça uma função que receba duas strings e retire da primeira todo caracter que
fizer parte da segunda string. Exemplo:
1a string: “EFBACDEIEBBLBBD”
2a string: “EBD”
Resultado
1a string: “FACIL”
2a string: “EBD”
Página 6 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
41. (Prova 3 - 97/1) Faça uma função chamada compara() que receba duas strings e dois inteiros pos
e qtd, onde pos é a posição nas strings a partir da qual vamos comparar qtd caracteres. A
comparação NÃO deve levar em conta se os caracteres são maiúsculos ou minúsculos. A função
retorna 0 (zero) se as porções de strings forem iguais, senão, ela retorna -1. Dica: use uma função
que converta uma letra para maiúsculo. Considere que os valores de pos e qtd são sempre válidos.
Exemplo:
string 1: Banana
string 2: ANNA MARIA
pos = 2
qtd = 2
retorna 0
string 1: Banana
string 2: ANNA MARIA
pos = 2
qtd = 3
retorna -1
42. (Prova 4 - 96/2) Faça uma função chamada xxx() que receba duas strings como parâmetros e
retorne a posição da 2a string de trás para frente dentro da 1a string ou um número negativo caso
não encontre.
Faça um programa para testar se esta função que você fez está funcionando.
Obs.: note que as strings podem ter qualquer tamanho!!!
Exemplos:
Exemplo 1
Exemplo 2
1a string:
Esta é uma linha Esta é uma linha
2a string:
amu
uma
resultado: 7
-1542
43. (Prova 4 - 97/1) Faça uma função chamada cria_string() que recebe como parâmetros uma string
s1 (de tamanho suficiente), um formato fmt (também uma string) e um número inteiro positivo
num (nesta ordem). Esta função irá preencher a string s1 de acordo com o formato passado como
parâmetro e o valor do inteiro num. O formato irá conter uma seqüência de caracteres que devem
ser integralmente copiados para a string s1, com exceção da seqüência %d. No seu lugar deve ser
copiado o valor do inteiro num convertido para caracteres.
Dica: lembre-se que o maior numero inteiro que pode ser representado no TC é 32767 (5 dígitos).
Exemplos:
Exemplo 1
Parâmetros passados:
s1: (irrelevante, mas de tamanho suficiente)
fmt: “O valor %d é a resposta”
num: 15
Resultado após a execução da função
s1: “O valor 15 é a resposta”
fmt: (irrelevante)
num: (irrelevante)
Exemplo 2
Parâmetros passados:
s1: (irrelevante, mas de tamanho suficiente)
fmt: “Converta o %d para caracteres”
num: 17430
Resultado após a execução da função
s1: “Converta o 17430 para caracteres”
fmt: (irrelevante)
num: (irrelevante)
Página 7 de 8
INF 1005 • Programação I • lista 12 • Caracteres e cadeias de caracteres (strings)
44. (Prova 3 – 2000/1) A função strcmp ( ) considera os caracteres ‘A’ e ‘Ã’ diferentes em termos de
ordenação alfabética. O mesmo acontece para os demais caracteres acentuados. Faça uma função
chamada minha_compara_str ( ) que receba 2 strings (s1 e s2) e um vetor de caracteres de 256
posições, previamente preenchido. A função deve retornar o mesmo valor que a função strcmp ( )
mas funcionando também para caracteres acentuados. O conteúdo do vetor de caracteres é o
seguinte:
•
•
posições 0 a 127
o caracteres sem acentuação na sua posição correspondente
o exemplo: na posição de índice X, temos armazenado o caracter cujo código ASCII é
X
posições 128 a 255
o corresponde aos caracteres acentuados
o exemplo: na posição de índice ê (índice e código ASCII 234), temos armazenado o
caracter e (código ASCII 101)
45. (Prova 3 – 2000/2) Faça uma função chamada abrevia que receba uma string contendo o nome de
uma pessoa. A função deve alterar a string, de modo a restar apenas a 1 a e a última palavra. Você
pode assumir que cada nome tem mais de 2 palavras e que entre duas palavras haverá apenas um
espaço em branco.
Exemplo:
Antes: Joao Jose da Silva Santos
Depois:
Joao Santos
46. (Prova Final – 2000/2) Faça uma função que receba os seguintes parâmetros: uma string (frase),
um vetor de strings (palavras), outro vetor de strings (abreviacoes) e um inteiro indicando o
tamanho dos vetores de strings. A função deve verificar se cada palavra da frase pode ser
substituída por uma abreviação. Para isto, a função deve comparar cada palavra encontrada na
frase com o vetor de palavras. Se a palavra for encontrada no vetor palavras, ela deverá ser
substituída pela abreviação equivalente. Para auxiliar na construção de sua função faça as
seguintes funções:
a) Pega_palavra: recebe uma string (S) e um valor inteiro (inicio) como parâmetros. O parâmetro
inicio indica o índice da string S onde começa a procura por uma nova palavra. A função deve
retornar o índice de S onde termina a palavra. Cada palavra é separada por um único espaço em
branco. Você pode assumir que na frase existem pelo menos duas palavras.
b) Retira_palavra: recebe uma string (frase), dois inteiros (inicio e fim) e outra string (palavra). A
função deve preencher a string palavra com a palavra delimitada pelos inteiros inicio e fim, que
está na string frase.
c) Apaga_palavra: recebe uma string (frase) e dois inteiros (inicio e fim) como parâmetros. A função
deve retirar da string os caracteres delimitados por inicio e fim (delimitam uma palavra),
arrumando a string.
d) Insere_palavra: recebe uma string (frase) como parâmetro, um inteiro (pos) e outra string
(abreviacao).
e) Busca: recebe um vetor de strings (palavras), seu tamanho e uma string (S). A função deve
devolver –1 caso S não pertença ao vetor palavras ou o índice (inteiro) onde S foi encontrada no
vetor.
f)
Página 8 de 8
Download

lista 12 caracteres e strings - Departamento de Informática - PUC-Rio