Ir ao conteúdo

Posts recomendados

Postado

Prezados, Boa noite.

 

Estou tentando resolver este problema, mas não faço a menor ideia de como resolve-lo 100%. Tentei fazer o melhor que pude, meu código não faz o que se pede por eu não saber como resolver, porém, tentei ir o mais longe que consegui. Estou há dias tentando resolver e não consigo sair do lugar mais, qualquer ajuda será muito bem vinda. Segue o código abaixo:

 

E desde já, muito obrigado.

 

Explicando meu código para mais fácil compreensão de todos:

 

O melhor que consegui fazer foi contar a quantidade de palavras digitadas em uma frase a partir dos espaços dados pelo usuário. Porém, não sei como comparar as palavras e verificar se são iguais. Com isso, meu programa só conta a quantidade de palavras.

 

Exemplo: "Gostaria de sua ajuda"

              Palavras digitadas: 4.

 

 

Obs:  Sei que no "soma+1" poderia ter inicializado a variavel contadora com 1 ao invés de 0, mas preferi somar 1 ao final da frase por questão de gosto somente. Se isso interferir em algo, sintam-se livres para altera-lo.

 

Att; Matheus.

 

 

/* Escrever um programa em C que calcule a frequência de uso de cada palavra dentro de uma cadeia de caracteres que possui diversas palavras. Considerar o tamanho máximo da cadeia como sendo de 80 colunas. */

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


int main (void)
{
	char frase[80];
	int i;
	int soma =0;

	printf("\nDigite: ");
	fgets(frase, 80, stdin);

	for(i=0;i<strlen(frase);i++)
		{
			if(frase[i] == ' ')
				{
					soma++; /*soma a quantidade de espaços digitados na frase */
				}
		}
	printf("\nA quantida de palavras digitadas foi de: %d", soma+1);

	/*(soma+1) pois soma todos os espaços antes da ultima palavra e a soma tb */

	return 0;
}

 

  • Obrigado 1
Postado

Olá @matheuscrluiz,  boa noite!

 

Você está fazendo algum curso técnico / superior ou é autoaprendizagem?

 

Para solução de desse problema como você menciona existe também alguma restrição enquanto ao uso de bibliotecas de funções prontas que você esqueceu de mencionar ou não? Notei que importou a biblioteca string e nela existem funções que, com prática e em poucas linhas, quebram teu galho!

  • Obrigado 1
Postado

@BEZERRA_BRITO Boa noite. É autoaprendizagem, tive uma matéria em c há anos, porém dada muito superficialmente.

 

E quanto a uso de funções prontas: O ideal seria sem funções como strtok() ou semelhantes. Mas se seu domínio nesta questão for usando funções e puder me ajudar as usando, sua ajuda será muito bem vinda visto que estou com enorme dificuldade nesta questão. Logo, o ideal seria sem funções prontas, mas se a única solução conhecida for a usando, será bem vinda. 

 

Desde já, muito obrigado pela ajuda.

  • Curtir 1
Postado

@matheuscrluiz    seu código está bom , e com algumas modificações poderia ser assim   :

/* Escrever um programa em C que calcule a frequência de uso de cada palavra dentro de uma cadeia de caracteres que possui diversas palavras. Considerar o tamanho máximo da cadeia como sendo de 80 colunas. */

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define pausar for(f=0;f<50000000;f++);
#define qtd 280
#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{black,blue,green,cyan,red,magenta,brown,lightgray,darkgray,   /* nome das cores */
lightblue,lightgreen,lightcyan,lightred,lightmagenta,yellow,white} colors;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = lightgray;

void textcolor_2 (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}
int main(){
    char frase[qtd],   aux[20],
         matriz[20][1][20]={0};
    int i,soma=0,w=0,k ,
        vetor[80]={0},f;
    printf("Digite : ");
    fgets(frase, qtd, stdin);
    for(i=0; i<strlen(frase); i++){
        aux[w]=frase[i];
        if(frase[i] == ' ' || frase[i] == '\n'){
            aux[w]='\0';
            strcpy(matriz[soma][0],aux);
            soma++; /*soma a quantidade de espaços digitados na frase */
            w=-1;
        }
        w++;
    }
    printf("\nA quantida de palavras digitadas foi de : %d\n\n", soma);
	for(w=0;w<soma;w++){                             /* comparando as palavras da frase            */
        if( ! vetor[w] )vetor[w]++;                  /* inicia cada posição do vetor com valor hum */
        for(i=0;i<soma;i++){
            if(strcmp(matriz[w][0],matriz[i][0])==0 && w != i ){
                vetor[w]++;
                strcpy(matriz[i][0],"");
            }
        }
	}
	printf("\n\n");
    for(w=0;w<soma;w++)
        if(strcmp(matriz[w][0],"")!=0){
            textcolor_2(11,0);
            printf("A Palavra ");
            textcolor_2(10,12);
            printf("%10s ",matriz[w][0]);
            textcolor_2(11,0);
            printf(" Apareceu ");
            textcolor_2(14,0);
            if(vetor[w]>3)textcolor_2(12,8);
            printf("%2d ",vetor[w]);
            textcolor_2(11,0);
            if(vetor[w]==1)printf(" Vez   ");
            else printf(" Vezes ");
            printf("Na Frase\n");
        }

    printf("\n   Tecle . . .  !\n\n");
    while( ! kbhit() ){                  /* huma animação                              */
        printf("      | \r"   );pausar;
        printf("      / \r"   );pausar;
        printf("      - \r"   );pausar;
        printf("      %c\r",92);pausar;
    }
	printf("\n\n\n");
	textcolor_2(7,0);
    return 0;
}

 

  • Obrigado 1
Postado

Há claro um milhão de maneiras de fazer isso. Vou te falar de duas, as duas sendo uma representação no programa do que você faria numa folha de papel

 

O mais comum: uma tabela e um contador


Em geral as pessoas programam isso assim: você varre a entrada e vai criando uma lista de palavras numa tabela, ordenada pra facilitar a busca. Ao inserir cada palavra você vê na tabela de palavras já encontradas: se já tem você incrementa um contador para aquela palavra e continua. Quando acabar a linha você imprime a tabela e pronto. Em C seria um loop até o fim da linha. Para cada palavra encontrada: veja se já tem na lista. Se tem incrementa um contador, que pode ser um outro vetor, mas de int. Se não tem cria uma nova palavra e inicia novo contador. Para criar as palavras pode usar alocação dinâmica, afinal já sabe o tamanho da palavra afinal. Basta alocar com esse tamanho mais um, por causa do byte com zero que termina cada string. É melhor usar o zero no fim porque assim pode usar a função strcmp() para comparar a palavra que acha com cada uma que está no vetor. Mas não é essencial, já que pode simplesmente comparar letra a letra.
Não é obrigado a usar alocação dinâmica: pode usar um vetor de strings. Cada string pode ter no maximo o tamanho da linha, claro. E quantas podem ser? Pense assim: o maior número vai ser com strings bem pequenas, A menor tem uma letra só e estaria entre dois brancos, então se sua linha tem 10 caracteres por exemplo vão caber no máximo... 

0123456789
a b c d e 


metade do tamanho do vetor. Então se sua linha tem 80 caracteres pode ter no máximo 40 strings. No caso da maior string terá uma única string do tamanho da linha. No caso das menores terá no máximo umas 40 delas. considerando o que discutimos aqui.
Exemplo dos dados

char        linha[80];
char        palavras[40][81];
int         contadores[40];

Algo até mais simples: um crivo
Solução bem antiga, os gregos usavam desde antes de Cristo. Como o crivo de Eratóstenes que a gente aprende no ensino fundamental para achar números primos.

Você lê a linha, pode até imprimir para ajudar a testar claro. Mas depois que leu nem precisa mais dela ou das palavras de verdade: você vai ler as palavras uma a uma, mas resolve a vida com cada palavra assim que a vê. Não espera compilar o resultado todo. afinal não é um livro, é só uma frase.
Você lê uma palavra, posiciona um indicador para a posição logo a seguir dela pra continuar depois. Aí pega essa palavra e procura pra diante na frase toda e vai contando. Quando acha uma palavra marca no contador, que pode ser um só afinal, e apaga na frase a palavra. Quer dizer, troca por espaços todas as ocorrências extras da palavra. Imprime a palavra e o total de vezes.
E continua para as próximas palavras. No final da linha o final do programa. Só isso. No final vai sobrar a linha com a lista de palavras únicas, se quiser imprimir para confirmar

Exemplo dos dados

char        linha[80];
char        palavra[80];
int         contador;

Teste antes com uma linha como essa
a b c d a b c d
uma linha com uma palavra só
palavra
e uma linha vazia, claro

 

Pode usar soluções "não invasivas" também: sem declarar novas palavras, apenas declarando um vetor de início e  outro de fim de cada palavra e atualizando um vetor de contadores. Mas recomendo uma dessas duas de que falei

 

Conseguiu escrever algo nesses dias? Acha que consegue escrever um desse de que falei? Escreva mais


 

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!