Ir ao conteúdo

Posts recomendados

Postado

Bom dia, estou tendo problemas para resolver um exercicio em C onde é necessário exibir as letras mais repetidas de uma palavra, exemplo:

Se a palavra for Cida a saida deve ser a propria palavra Cida pois todos se repetem uma única vez.

Não sei se existe uma função um pouco mais fácil pra isso, mas a principio pensei em contar quantas letras individuais existem, mas ficaria gigante pois temos 26 letras no alfabeto e ainda por cima maiúsculas e minusculas, depois pensei em fazer um "ranking" das letras usando Char e mandando exibir a ou as primeira(s) posição(ões). portanto estou perdido, aceito ajuda... 

Postado

Como assim, no caso se a palavra for: arara, seria pra mostrar: A, que é o que mais se repete (3x) ?

 

Tem a biblioteca string.h, onde uma de suas funções, faz exatamente isso.

 

Mas acredito que o professor queira que você implemente a função. Você ja viu função? Se não vai ficar complicado, mas da pra fazer.

 

Da uma olha na biblioteca string.

  • Curtir 1
Postado

Se a entrada for Cida a saída pode ser acdi? Ou seja, exibir as letras mais repetidas na ordem alfabética ao invés de na ordem que aparecem na palavra?

Postado

exatamente isso @Pablo Freitas creio que é pra usar uma função dessas mesmo... mas até agora não obtive sucesso... eu pensei em usar a Strlen mas ela vai contar todas... a opção seria contar letra por letra do alfabeto? fazer um contador pra cada uma delas?

adicionado 4 minutos depois
Em 16/03/2017 às 12:04, isrnick disse:

Se a entrada for Cida a saída pode ser acdi? Ou seja, exibir as letras mais repetidas na ordem alfabética ao invés de na ordem que aparecem na palavra?

não man não necessita ser em ordem alfabetica... apenas exibir as letras mais mencionadas na string... por exemplo: *****

saida: A

 

Postado

velho, isso dá trabalho demais, acho que por que eu nem entendia o sentido de map, mas agora melhorou:

#include <map>
#include <iostream>

using namespace std;

int main() {
    string palavra;
    cout << "Digite uma palavra: \n";
    cin >> palavra;
    map<char,int> contarletras;
    for (unsigned int i=0; i<palavra.size(); i++)
        contarletras[palavra[i]]++;

    for (map<char, int>::iterator it = contarletras.begin(); it != contarletras.end(); ++it)
        cout << it->first << ": " << it->second << endl;

    return 0;
}

 

Postado
2 horas atrás, santos container disse:

velho, isso dá trabalho demais, acho que por que eu nem entendia o sentido de map, mas agora melhorou:


#include <map>
#include <iostream>

using namespace std;

int main() {
    string palavra;
    cout << "Digite uma palavra: \n";
    cin >> palavra;
    map<char,int> contarletras;
    for (unsigned int i=0; i<palavra.size(); i++)
        contarletras[palavra[i]]++;

    for (map<char, int>::iterator it = contarletras.begin(); it != contarletras.end(); ++it)
        cout << it->first << ": " << it->second << endl;

    return 0;
}

 

salve man.. isto é C++? 

Postado

Sim, usando map no C++ ficaria um pouco mais simples, mas o @28guga28 quer fazer o programa em C. Mas não muda muita coisa, um vetor normal nesse caso já atende.

 

Primeiro é preciso entender que char é um tipo de inteiro, ou seja chars são números inteiros, o menor inteiro da linguagem C com no mínimo 8 bits, se você mandar imprimir um char no printf usando %d vai ser impresso um número inteiro.

 

Quando se usa o %c no printf o que ele faz é usar uma tabela para converter o número inteiro para o caractere correspondente, ou seja existem tabelas de caracteres em que cada caractere corresponde a um número, uma bem simples e bem conhecida é a tabela ASCII, mas existem muitas tabelas diferentes com muito mais caracteres, mas elas costumam estender a ASCII que contém os caracteres básicos (letras, números, espaço, nova linha, operadores matemáticos, etc).

 

Então, você poderia consultar a tabela, e usá-la para atribuir um número para a variável char e imprimir com %c para obter o caractere. Os caracteres que representam os números de '0' a '9' por exemplo correspondem aos números 48 até 57 na tabela, e as letras minúsculas de 'a' até 'z' vão de 97 a 122, e as maiúsculas de 65 até 90.

 

Mas não se preocupe, você não vai ter que sair decorando tabelas, ou consultar tabelas toda vez que tiver que fazer um programa desse tipo envolvendo caracteres.

 

 

O que importa é que sabendo disso você pode realizar operações e comparações entre caracteres.

Ou seja:
'a' + 1 = 'b'
'A' + 4 = 'E'
'a' - 'a' = 0
'z' - 'a' = 25
'c' > 'a'  resulta em verdadeiro
'd' > 'z'  resulta em falso

Obs: 'A' é diferente de 'a', e pertencem a intervalos de números
diferentes na tabela, portanto não faça operações ou comparações
entre maiúsculas e minúsculas, como 'B' - 'c'.

 

 

 

Agora, como utilizar isso no programa?

 

Podemos criar um vetor de contadores de 26 posições, inicializado com valores 0 em todas as posições:

int contadores[26] = {0};

Onde cada posição entre 0 a 25, armazenará a quantidade de uma das letras do alfabeto de A a Z respectivamente. E para converter a letra da palavra para seu respectivo número de 0 a 25 basta subtrair 'A', e então pode usar o resultado entre os colchetes do vetor.

 

Ex:

char c = 'G';
int i = (int)(c - 'A');  // 6
contadores[i]++;

 

 

Agora só precisamos garantir que as letras sempre serão maiúsculas, e para isso basta usar a função toupper() para transformar a letra para maiúscula, essa função recebe um caractere e se for uma letra minúscula ela retorna o caractere da letra maiúscula correspondente, do contrário retorna o próprio caractere.

 

Ex:

toupper('a')   // 'A'
toupper('B')   // 'B'

Obs: Também existe a função tolower() que faz o oposto.

 

 

Agora você tem como contar as letras da palavra, seu programa ainda precisa achar o valor máximo, e no fim basta percorrer esse vetor ver todas as posições com valor igual ao valor máximo e fazer o oposto, somar o número da posição a 'A' e imprimir o caractere na saída.

Postado
21 minutos atrás, isrnick disse:

Sim, usando map no C++ ficaria um pouco mais simples, mas o @28guga28 quer fazer o programa em C. Mas não muda muita coisa, nesse caso um vetor normal nesse caso já atende.

 

Primeiro é preciso entender que char é um tipo de inteiro, ou seja chars são números inteiros, o menor inteiro da linguagem C com no mínimo 8 bits, se você mandar imprimir um char no printf usando %d vai ser impresso um número inteiro.

 

Quando se usa o %c no printf o que ele faz é usar uma tabela para converter o número inteiro para o caractere correspondente, ou seja existem tabelas de caracteres em que cada caractere corresponde a um número, uma bem simples e bem conhecida é a tabela ASCII, mas existem muitas tabelas diferentes com muito mais caracteres, mas elas costumam estender a ASCII que contém os caracteres básicos (letras, números, espaço, nova linha, operadores matemáticos, etc).

 

Então, você poderia consultar a tabela, e usá-la para atribuir um número para a variável char e imprimir com %c para obter o caractere. Os caracteres que representam os números de '0' a '9' por exemplo correspondem aos números 48 até 57 na tabela, e as letras minúsculas de 'a' até 'z' vão de 97 a 122, e as maiúsculas de 65 até 90.

 

Mas não se preocupe, você não vai ter que sair decorando tabelas, ou consultar tabelas toda vez que tiver que fazer um programa desse tipo envolvendo caracteres.

 

 

O que importa é que sabendo disso você pode realizar operações e comparações entre caracteres.


Ou seja:
'a' + 1 = 'b'
'A' + 4 = 'E'
'a' - 'a' = 0
'z' - 'a' = 25
'c' > 'a'  resulta em verdadeiro
'd' > 'z'  resulta em falso

Obs: 'A' é diferente de 'a', e pertencem a intervalos de números
diferentes na tabela, portanto não faça operações ou comparações
entre maiúsculas e minúsculas, como 'B' - 'c'.

 

 

 

Agora, como utilizar isso no programa?

 

Podemos criar um vetor de contadores de 26 posições, inicializado com valores 0 em todas as posições:


int contadores[26] = {0};

Onde cada posição entre 0 a 25, armazenará a quantidade de uma das letras do alfabeto de A a Z respectivamente. E para converter a letra da palavra para seu respectivo número de 0 a 25 basta subtrair 'A', e então pode usar o resultado entre os colchetes do vetor.

 

Ex:


char c = 'G';
int i = (int)(c - 'A');  // 6
contadores[i]++;

 

 

Agora só precisamos garantir que as letras sempre serão maiúsculas, e para isso basta usar a função toupper() para transformar a letra para maiúscula, essa função recebe um caractere e se for uma letra minúscula ela retorna o caractere da letra maiúscula correspondente, do contrário retorna o próprio caractere.

 

Ex:


toupper('a')   // 'A'
toupper('B')   // 'B'

Obs: Também existe a função tolower() que faz o oposto.

 

 

Agora você tem como contar as letras da palavra, seu programa ainda precisa achar o valor máximo, e no fim basta percorrer esse vetor ver todas as letras as posições com valor igual ao valor máximo e fazer o oposto, somar o número da posição a 'A' e imprimir o caractere na saída.

Muito obrigado man... vou montar agr.. acho que entendi... 

  • Curtir 1
Postado

@isrnick

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int contadores[26] = {0};
    char c = 'G';
    int i = (int)(c - 'A');  // 6
    contadores++;
    printf("%c", contadores);
}

 

 

eu fiz assim pra testar a ideia do contador mas ele ta imprimindo um simbola

3 horas atrás, isrnick disse:

 


char c = 'G';
int i = (int)(c - 'A');  // 6
contadores[i]++;

 

na hora que apliquei isso... ele me retorna a variavel contadores  com o valor 1 ela somou certo.. agora pra exibir a letra que corresponde a esse 1.. eu faço como ? 

Postado

O seu teste ficaria assim:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int contadores[26] = {0};
    char c = 'G';
    int i = c - 'A';
  
    // contadores é um vetor, você precisa indicar a posição entre os colchetes:
    contadores[i]++;
    
    /* Podemos obter o caractere da i-ésima posiçao do vetor somando 'A' a
    posição e obter a quantidade usando/acessando a posição do vetor. Veja: */
    printf("O caractere %c repete %d vez(es).\n", i + 'A', contadores[i]);
    
    return 0;
}

 

Postado

Vi que você ta quase conseguindo ai, mas também fiz aqui de uma forma um pouco diferente.

Assim:

 

*************************************************************************************************
 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define TAMANHO 20 // Tamanho maximo de uma palavra

int CaractereRepetido(char str[TAMANHO],char caract) // Função que retorna o número de vezes que um caractere se repete numa determinada palavra.
{
    int i, total;
    for(i=0,total=0; str!='\0'; i++)
        {
            if(str==caract)
                total++;
        }
    return total;
}
 
int main(void)
{
    setlocale(LC_ALL,"Portuguese");

    char palavra[TAMANHO], letra;

    printf("Digite uma palavra qualquer: ");
    gets(palavra);
    printf("Digite o caractere a ser verificado na palavra: ");
    scanf(" %c",&letra);
    printf("O caractere '%c', aparece %dx na palavra %s\n\n",letra,CaractereRepetido(palavra,letra),palavra);
    system("pause");
    return 0;
} 
 

 

 

 

Postado

Esse programa pode te ajudar, ele faz o que voce inicialmente queria, que era contar cada letra.

 

http://www.programmingsimplified.com/c-program-find-characters-frequency

 



#include <stdio.h>
#include <string.h>
 
int main()
{
   char string[100];
   int c = 0, count[26] = {0};
 
   printf("Enter a string\n");
   gets(string);
 
   while (string[c] != '\0')
   {
      /** Considering characters from 'a' to 'z' only
          and ignoring others */
 
      if (string[c] >= 'a' && string[c] <= 'z') 
         count[string[c]-'a']++;
 
      c++;
   }
 
   for (c = 0; c < 26; c++)
   {
      /** Printing only those characters 
          whose count is at least 1 */
 
      if (count[c] != 0)
         printf("%c occurs %d times in the entered string.\n",c+'a',count[c]);
   }
 
   return 0;
}

 

Postado

Encontrei, eu lembrava que tinha postado um programa em C contando letras aqui no fórum, aqui está:

Esse era contando as letras de uma frase, não apenas uma palavra, e no final o programa apenas lista todas as letras encontradas e quantas vezes se repetem. Mas talvez te ajude...

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...