Ir ao conteúdo

Alguem Ja Fez Um Trabalho Como Este?


Computado

Posts recomendados

Postado

Implementar um programa C recebe um texto qualquer como entrada, calcula e exibe a freqüência de ocorrência das letras que aparecem no texto.

Inicialmente o programa deve ler um texto da entrada-padrão, até ser digitado EOF (uma nova linha seguida de CTRL-D no Linux ou CTRL-Z no Windows) e contar o número de ocorrencia de cada uma das letras que aparecem no texto. Para a contagem devem ser desconsiderados qualquer caracteres que não sejam letras. Letras maiúsculas e minúsculas não devem ser diferenciadas (por exemplo contar 'a' como se fosse 'A' ).

Finalmente, deve ser exibida uma tabela, ordenada pela freqüência, contendo em cada linha: a letra, a freqüência absoluta e freqüência percentual (relativa ao total de letras), esta última formatada com uma casa decimal.

Para o armazenamento dos dados o programa deve utilizar um vetor, dinamicamente alocado, utilizando a seguinte declaração de estrutura.:

struct caracteres{

char letra;

int freqüência;

};

Os texto digitado não precisa ser armazenado. Basta ler um caracter por vez e imediatamente atualizar a contagem referente ao caracter lido. Somente letras que aparecerem no texto devem ocupar espaço no vetor e aparecer no resultado.

O programa deve aceitar os seguintes argumentos (opções) na linha de comando:

-d Exibe ordenado em ordem decrescente

--help: Exibe mensagem de ajuda ao usuário indicando como o programa deve ser utilizado

A implementação do programa deverá respeitar ainda as seguintes restrições:

* Nenhuma variável global poderá ser declarada;

* O programa deverá ter, além da função main, pelo menos duas funções que recebam parâmetro e uma que retorne valor (pode ser uma das anteriores);

* O programa deve funcionar com textos de qualquer tamanho;

* O programa seá compilado no linux (compilador gcc) com a opção gcc -ansi -pedantic -Wall e não deverá gerar nenhuma mensagem de erro ou advertência.

Postado

Cara eu fiz algo parecido . mas foi para um trabalho de criptoanalise!

vou deixar alguns modulos aqui do programa que você terá de usar no seu ..claso usei classe mas ai voce troca por struct ..a ideia aqui é te dar ideia de como fazer!


#include <iostream.h> //cin>> e cout<< saida e entrada de dados
#include <conio.h>  //somente getch(); segura a tela
#include <fstream.h> // arquivo
#define TAM 1000 //define o valor maximo do texto

class CriptoAnalise{
    private:
       char *texto; //texto de entrada ..entrada.txt
       int *vetorLetras;
       double indiceCoincidencia;
    public:
       CriptoAnalise();
       int strlen();
       int strlenSemEspaco();
       void leArquivo();
       void contaLetras();
       double indiceDeCoincidencia();
       void histograma();
       void classefreqüência();
       void tabelaKullBack();
       double tipoCifra();
       void testePHI();
       void imprime();
};

/*==============================================================================
                       LÊ ARQUIVO DE ENTRADA DE DADOS
==============================================================================*/
/* Este procedimento lê o arquivo definido como "entrada.txt" e por base nele
faz toda a análise do texto. */

void CriptoAnalise::leArquivo(){
   int i;
   ifstream arquivoEntrada("entrada.txt");
    for(i=0;!arquivoEntrada.eof();i++)
         texto[i] = arquivoEntrada.get();
   texto[i] = '\0';
}

/*==============================================================================
                      FIM LÊ ARQUIVO DE ENTRADA DE DADOS
==============================================================================*/

/*==============================================================================
                          CONTA LETRAS NO TEXTO
==============================================================================*/
/* Este procedimento faz a contagem de todas as letras no texto, maiusculas
e minusculas ignorando letras acentuadas e caracteres especiais!*/

void CriptoAnalise::contaLetras(){
 char letra = 'a';
 char letraM = 'A';
 int cont=0;
 int i=0;
   while(i<26){
       for(int j=0; texto[j] != '\0'; j++){
            if(texto[j] == letra )
                cont++;
            else if(texto[j] == letraM)
                cont++;
       }
        vetorLetras[i] =  cont;
        i++;
        letra++;
        letraM++;
        cont=0;
   }
}

/*==============================================================================
                         FIM CONTA LETRAS NO TEXTO
==============================================================================*/

==============================================================================*/
// Procedimento que exibe o histograma de letras no texto

void CriptoAnalise::histograma(){
   int i,j;
   char letra = 'A';
   cout<<"\n\nHISTOGRAMA DAS LETRAS NO TEXTO \n\n";
   for(i=0;i<26;i++){
        cout<<endl;
        cout<<letra<<" - ";
        for(j=0;j<vetorLetras[i];j++)
            cout<<"|";
        cout<<"   "<<vetorLetras[i];
        letra++;
   }
}


/*==============================================================================
                      FIM HISTOGRAMA DE LETRAS NO TEXTO
==============================================================================*/

/*==============================================================================
                         CLASSE DE FREQUÊNCIA
==============================================================================*/
/* Procedimento que imprime o numero de vogais, consoantes de Alta, Média e
baixa frequência no texto, assim também como sua porcentagem no texto! */

void CriptoAnalise::classefreqüência(){
    int vogais[5] = {0,4,8,14,20}; //vogais
    int caf[7] = {2,3,12,13,17,18,19};//caf = Consoantes de Alta freqüência
    int cmf[8] = {1,5,6,7,11,15,16,21};//cmf = Consoate de Média freqüência
    int cbf[6] = {9,10,22,23,24,25,};//cbf = Consoantes de Baixa freqüência
    int totalVogais=0, totalCaf=0, totalCmf=0, totalCbf=0; //soma das letras!
    double porcentagemVogais=0, porcentagemCaf=0, porcentagemCmf=0;
    double porcentagemCbf=0;
    int totalLetras = strlenSemEspaco();
    int i;
    for(i=0;i<5;i++)
        totalVogais += vetorLetras[vogais[i]];
    for(i=0;i<7;i++)
        totalCaf += vetorLetras[caf[i]];
    for(i=0;i<8;i++)
        totalCmf += vetorLetras[cmf[i]];
    for(i=0;i<6;i++)
        totalCbf += vetorLetras[cbf[i]];
    porcentagemVogais = totalVogais * 100 / totalLetras;
    porcentagemCaf = totalCaf * 100 / totalLetras;
    porcentagemCmf = totalCmf * 100 / totalLetras;
    porcentagemCbf = totalCbf * 100 / totalLetras;
    cout<<"\n\n\nTOTAL LETRAS NO TEXTO "<<strlenSemEspaco();
    cout<<endl<<totalVogais <<" VOGAIS A,E,I,O,U "<<" PORCETAGEM "<<porcentagemVogais <<"%";
    cout<<endl<<totalCaf<<" Consoantes de Alta freqüência C,D,M,N,R,S,T "<<" PORCETAGEM "<<porcentagemCaf <<"%";
    cout<<endl<<totalCmf<<" Consoantes de Media freqüência B,F,G,H,L,P,V "<<" PORCETAGEM "<<porcentagemCmf <<"%";
    cout<<endl<<totalCbf  <<" Consoantes de Baixa freqüência J,K,W,X,Y,Z "<<" PORCETAGEM "<<porcentagemCbf <<"%";
}

/*==============================================================================
                        FIM CLASSE DE FREQUÊNCIA
==============================================================================*/

/*==============================================================================
                           STRLEN SEM ESPAÇO
==============================================================================*/
/* Esta função diferente da strlen, ela ignora os espaços no texto contando
apenas os caracteres diferentes de espaço e \n = pula linha!*/

int CriptoAnalise::strlenSemEspaco(){
  int i=0;
  int espaco=0;
  int retorno=0;
    while(texto[i] != '\0'){
          if(texto[i] == ' ' || texto[i] == '\n')
              espaco++;
       i++;
   }
   retorno = i - espaco - 1; // - 1 o ultimo espaço do texto...
   return(retorno);
}

/*==============================================================================
                         FIM STRLEN SEM ESPAÇO
==============================================================================*/

Basicamente seu exercicio é isso ai, com algumas modificacoes é claro!!

O tamanho do texto é 1000 caracteres no máximo, fora isso voce vai ter de fazer uma função para alocar dinamicamente o espaço!

Boa sorte, []s

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!