Ir ao conteúdo
  • Cadastre-se
Gustavo Malheiro

C Determinar o número de vezes que uma letra ocorre em uma string

Recommended Posts

Olá! Gostaria que alguém me explicasse como posso fazer para saber o número de vezes que determinada letra aparece em uma string.

> Letra escolhida: a

> String digitada pelo usuário: Banana

> Exibido na tela: A letra a aparece 3 vezes na palavra banana.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal! Consegui achar um meio de resolver o problema. Caso alguém esteja com a mesma dúvida, irei disponibilizar o código! 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

int main(void){

	setlocale(LC_CTYPE,"portuguese");
	char palavra[60]; // Um vetor para armazenar a palavra
	char letra[1]; // Um vetor para armazenar a letra
	int i,j = 0; 

	printf("\nDigite uma letra\n");
	scanf("%c",&letra);

	printf("\nDigite uma palavra\n");
	scanf("%s",&palavra);

	for(i=0; i < strlen(palavra); i++ ) { // aqui no parâmetro do for, usei a função strlen() como limite pro loop
            if(letra[1] == palavra[i]) { // utilizei o for e o if para percorrer cada índice do vetor e comparar as strings
                j++; // o j++ está servindo apenas para contar quantas vezes a letra se repete
            }
            else {
                continue; // caso a letra não se repetir, o laço continua
            }
        }

    printf("\nA letra %c aparece %d vezes na palavra %s \n", letra[1] ,j ,palavra); 




    system("pause");
	return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citação

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

int main(void){

	setlocale(LC_CTYPE,"portuguese");
	char palavra[60]; // Um vetor para armazenar a palavra
	char letra[0]; // Um vetor para armazenar a letra  -> vetores começam em  0 não em  1
	int j ,len ;
	j = 0; 
	
	printf("\nDigite uma letra\n");
	scanf("%c",&letra[0]);

	printf("\nDigite uma palavra\n");
	scanf("%s",palavra); // -> inicialização de string não começa com & , iguais os outros tipos
	
	len = strlen(palavra);
	
	for(int i=0 ; i < len ; i++ ) { 
		if(letra[0] == palavra[i]){
			j++; 
		}
            // não é necessário continue , o laço irá continuar se o "if" for incorreto de qualquer forma.
	}

    printf("\nA letra %c aparece %d vezes na palavra %s \n", letra[0] ,j ,palavra); 
	return 0;
	
}

 



Fiz alguns ajustes , umas observações pra melhorar a fluência do código , por exemplo o for(i = 0;i<strlen(string)...
Isso não é legal fazer no for , aparentemente deixa o código menor , mas na prática , toda vez que o for reinicializar no loop , ele faz a contagem do tamanho da string. Então isso aumenta o tempo de execução do código.
Outra coisa , quando for usar scanf pra string , não usa o operador unário "&" ou operador de endereço. 
 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
char letra[0];

@Poisoned00 Isso está errado, na declaração de vetores coloca-se o comprimento do vetor (não índice), não existe nada com comprimento 0.

 

 

@Gustavo Malheiro

char letra[1];

Não deveria ter os colchetes se é apenas 1 caractere, declare como qualquer outra variável:

char letra;

 

O código com correções:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

int main(void){

	setlocale(LC_CTYPE,"portuguese");
	char palavra[60]; // Um vetor para armazenar a palavra
	char letra; // Um CARACTERE
	int i,j = 0; 

	printf("\nDigite uma letra\n");
	scanf("%c",&letra);

	printf("\nDigite uma palavra\n");
	scanf("%s",palavra); //O nome de um vetor já é uma referência, não vai & antes

	for(i=0; i < strlen(palavra); i++ ) { // aqui no parâmetro do for, usei a função strlen() como limite pro loop
            if(letra == palavra[i]) { // utilizei o for e o if para percorrer cada índice do vetor e comparar as strings
                j++; // o j++ está servindo apenas para contar quantas vezes a letra se repete
            }
            /* Já vai continuar mesmo sem esse else, ele é desnecessário
            else {
                continue; // caso a letra não se repetir, o laço continua
            }*/
        }

    printf("\nA letra %c aparece %d vezes na palavra %s \n", letra ,j ,palavra); 




    system("pause");
	return 0;
}

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Para complementar, segue algumas sugestões:

 

1#
Prefira usar "espaços" em vem vez de "tabulação", ou seja, a sugestão seria configurar o seu editor de texto para inserir espaços quando pressionar tab.

 

obs.: não tenho uma referência para explicar agora, nem lembro exatamente as vantagens para citar, mas alguns programadores mais experientes já comentaram sobre isso.

 

No DevC++, por exemplo, seria assim:

sem_tabulacao.png

 

 

 

2#

Sobre as características do problema.

 

Vejamos o enunciado:

Em 30/05/2018 às 12:30, Gustavo Malheiro disse:

Olá! Gostaria que alguém me explicasse como posso fazer para saber o número de vezes que determinada letra aparece em uma string.

 

Então, na minha interpretação, ao ser solicitado "o número de vezes que determinada letra aparece", não está se importando se a letra está maiúscula ou minúscula... entretanto, o C e C++ são Case-sensitive, ou seja, distinguem, por exemplo, "A" de "a"... logo, o resultado pode dar errado.

 

Se eu quiser contar os "a" de "Arara", no seu código vai resultar 2, mas pelo argumentado, deveria ser 3!

 

Dica: acho que o comando toupper(), ou similar, ajudaria nesse caso.

 

 

 

3#

Ainda sobre as características...

Em 30/05/2018 às 12:30, Gustavo Malheiro disse:

Olá! Gostaria que alguém me explicasse como posso fazer para saber o número de vezes que determinada letra aparece em uma string.

> Letra escolhida: a

> String digitada pelo usuário: Banana

> Exibido na tela: A letra a aparece 3 vezes na palavra banana.

 

Veja, o enunciado fala de string, ou seja, não especificamente em "uma palavra"... Nesse sentido, o programa deveria receber uma FRASE... podendo ter uma ou mais palavras...

 

 

 

4#

Sobre o cabeçalho do código, sugiro seguintes alterações/correções:

#include <stdio.h> //printf(), scanf()
//#include <stdlib.h>   NÃO UTILIZADA, LOGO NÃO PRECISA DECLARAR
#include <locale.h> //setlocale()
#include <string.h> //strlen()

int main(void) {
    setlocale(LC_CTYPE,"Portuguese_Brazil"); //para os "acentos" funcionarem no console
    //char palavra[60]; // Um vetor para armazenar a palavra    "ser vetor já está implícito com [] e seria melhor falar em "frase"
    //char letra;       // Um CARACTERE                         "ser um caractere também já é implícido da declaração em si"
    char frase[60]; //frase a ser verificada       "ou seja, comentário refererenete a funcionalidade da variável
    char letra;     //letra a ser verificada    
    //int i,j = 0;
    int i; //auxiliar utilizado para percorrer o vetor
    int qtd = 0; //quantidade de vezes que a letra aparece

 

Ai faria os ajustes no código...

 

***

 

Por ai vai.

 

Caso queira implementar essas sugestões, sugiro FAZER POR ETAPAS... Por exemplo, primeiro só se preocupe em fazer aceitar maiúsculas e minúsculas... só depois tente fazer ler uma frase OU ajustar o cabeçalho. Não tente fazer mais de uma alteração de vez.

 

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×