Ir ao conteúdo
  • Cadastre-se

C++ calcular e exibir um histograma de caracteres passados como argumento


Ir à solução Resolvido por arfneto,

Posts recomendados

Boa tarde gurizada!

Hoje faremos a apresentação de algum dos trabalhos que tivemos durante o semestre. Devemos escolher o trabalho com a nota mais baixa, refazer com os conhecimentos adquiridos durante o semestre, e, apresentar para a turma.

Eu refiz meu primeiro trabalho, fiz duas versões dele, gostaria que alguém desse a opinião de qual ficou mais conciso.

 

Citação

Escreva um programa C++ que recebe o argumento (passado na execução) para calcular e exibir um histograma de caracteres passados como argumento. Após receber uma palavra como parâmetro, busque caracteres repetidos. No final apresente um relatório com o número de ocorrências (repetições) de caracteres, quais caracteres não se repetem e o(s) caractere(s) com maior número de ocorrências.

 

 

Primeiro código

#include <iostream>
#include <string>
using namespace std;

const int tamanho = 26;
const int nLetras = 26;
int counts[nLetras] = {};
void count(char [], int []);

int main()
{
	int counts[nLetras];
	char t[tamanho];
	cout << "Digite algo: ";
	cin.getline(t, '\n');
	count(t, counts);

	for (int i = 0; i < nLetras; i++)
	{
		cout << counts[i] << " " << static_cast<char>(i + 'a') << endl;
	}

}

void count(char s[], int counts[])
{
	for (int i = 0; i < nLetras; i++)
	{
		counts[i] = 0;
	}

	for (int i = 0; i < tamanho; i++)
	{
		{
			s[i] = tolower(s[i]);
			counts[s[i] - 'a'] ++;
		}
	}
}

 

 

 

Segundo código

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{                                                 // pede um argumento que seria a palavra
    string palavra = argv[1];                     // aqui é o segundo argumento
    cout << "A palavra selecionada é: " << argv[1] << endl; // mostra a palavra que foi escolhida
    char letra[palavra.length()];                 // determina o tamanho do arranjo, porque o palavra.length é o tamanho da palavra.
    int letrasRepetidas[palavra.length()];
    int contador = 0;
    int maisRepetido = 0;
    char letraRepetida; // para dizer quais letras foram repetidas
    for (int i = 0; i < palavra.length(); i++)
    {
        for (int j = 0; j < palavra.length(); j++)
        {
            letra[j] = palavra[j];    // vai organizar a palavra dentro do arranjo
            if (letra[i] == letra[j]) // se a letra for igual a outra letra vai contar no letras repetidas
            {
                contador++;
                letrasRepetidas[i] = contador;
            }
        }
        contador = 0; // é pra dizer que a letra antes de repetir tem valor 0 e quando ela se repete ela vai atribuindo o valor de 1.
        if (letrasRepetidas[i] > 1)
        {
            cout << "'" << letra[i] << "' Apareceu mais de uma vez" << endl;
        }
        else
        {
            cout << "'" << letra[i] << "' Apareceu uma vez" << endl;
        }
        if (maisRepetido < letrasRepetidas[i])
        {
            maisRepetido = letrasRepetidas[i];
            letraRepetida = letra[i];
        }
    }
    cout << "\nO Caractere que mais se repitiu foi '" << letraRepetida << "' com " << maisRepetido << " repetições" << endl;
    return EXIT_SUCCESS;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@junglerfullclear   creio que o primeiro esteja melhor , pois funcionou bem ,  e no entanto o segundo  nem compilou , apresentando esse erro desconhecido ,

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, devair1010 disse:

e no entanto o segundo  nem compilou , apresentando esse erro desconhecido ,

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

 

Como não compilou e deu um erro ao rodar o programa? Poste o código que usou.

 

De todo modo o programa tem vários erros. Você está certo de que passou um argumento, por exemplo, que seria a palavra? Ou só rodou o programa sem ler o código depois de corrigir um óbvio erro de compilação?

 

Se fez isso o programa vai claro cancelar quando tentar acessar o argv[1] que você não passou

 

 

 

 

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

  • Solução

Sobre os programas

 

Acho que não estão assim bons. em muitos erros ainda, em especial o segundo.

 

Claro que os dois deviam ser iguais exceto por usar a linha de comando para passar a palavra a ser usada, e claro que o segundo é muito melhor. Ao usar o programa (que lê uma única palavra) o cara já sabe qual é a palavra e é um porre ter que chamar o programa e ficar esperando o prompt para digitar a palavra que o cara já sabe qual é para depois teclar ENTER de novo.

 

Imagine o compilar te perguntando a cada vez: "Digite o nome do programa que deseja compilar:"

 

Sobre o enunciado

 

 

Está claro que é para receber uma palavra como parâmetro então o primeiro programa não está ok, mesmo usando uma função que recebe a palavra

 

Em 08/12/2022 às 16:08, junglerfullclear disse:

Escreva um programa C++ que recebe o argumento (passado na execução) para calcular e exibir um histograma de caracteres passados como argumento. Após receber uma palavra como parâmetro, busque caracteres repetidos. No final apresente um relatório com o número de ocorrências (repetições) de caracteres, quais caracteres não se repetem e o(s) caractere(s) com maior número de ocorrências.

 

E o primeiro programa só mostra o histograma. E o resto? O tal relatório?

 

Do primeiro programa

 

const int tamanho         = 26;
const int nLetras         = 26;
int       counts[nLetras] = {};
void      count(char[], int[]);

int main()
{
    int  counts[nLetras];
    char t[tamanho];
// ...

 

Isso está errado e o compilador te avisou. Declarou duas vezes counts[].

 

O programa vai dar erro se vierem caracteres especiais na palavra porque não vai ter índice no vetor para armazenar, uma vírgula por exemplo.

 

    count(t, counts);

 

Essa não foi uma escolha feliz para os nomes.

 

No segundo programa

 

    char letra[palavra.length()];  // determina o tamanho do

 

não pode declarar o tamanho do vetor com um tamanho conhecido apenas quando o programa está rodando. Use std::array em C++ por exemplo. Ou std::string.

 

Isso está errado:

 

int main(int argc, char* argv[])
{  // pede um argumento que seria a palavra
    string palavra = argv[1];  // aqui é o segundo argumento
    cout << "A palavra selecionada é: " << argv[1]
         << endl;  // mostra a palavra que foi escolhida

 

E se o cara não digitar nada? Existe uma razão para argc existir e é essa. Teste.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!