Ir ao conteúdo

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


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

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
Postado

@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
Postado
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
  • Solução
Postado

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

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...