Ir ao conteúdo

Posts recomendados

Postado

Boa noite.

Tenho um arquivo com 16 palavras, gostaria que, ao gerar um numero com a função rand(), esse número correspondesse a uma palavra.

Por exemplo: número 5 foi gerado logo gostaria de ler a quinta palavra.

Alguem tem alguma sugestão? Obrigado desde já.

  • Curtir 1
  • Obrigado 1
Postado

@Bruno Vercelli Você pode ler o arquivo com a função fopen() usando o modo read ("r"), usar um loop para verificar quantas linhas tem no seu arquivo e depois usar a função rand() para gerar um número aleatório com base nessa quantidade de linhas. Por fim, é só fazer um loop contendo a função fgets() para ler as palavras no arquivo até que chegue na linha que foi determinada aleatoriamente.

  • Curtir 2
Postado

@Bruno Vercelli      se você usar a função fscanf em um arquivo do tipo txt , você consegue ler uma palavra de cada vez ,  então depois de abrir o arquivo , use um loop começando de zero e indo até enquanto for menor que o número gerado pelo rand , assim a última palavra lida no arquivo estará na variável usada no fscanf .

  • Curtir 2
Postado
1 hora atrás, Bruno Vercelli disse:

Alguem tem alguma sugestão?

Você quer mesmo esse procedimento em fluxo de arquivo, ou não pensou em usar vetores. 

  • Curtir 2
  • Obrigado 1
Postado
1 hora atrás, devair1010 disse:

@Bruno Vercelli      se você usar a função fscanf em um arquivo do tipo txt , você consegue ler uma palavra de cada vez ,  então depois de abrir o arquivo , use um loop começando de zero e indo até enquanto for menor que o número gerado pelo rand , assim a última palavra lida no arquivo estará na variável usada no fscanf .

Perfeito, obrigado!

adicionado 5 minutos depois
33 minutos atrás, Mauro Britivaldo disse:

Você quer mesmo esse procedimento em fluxo de arquivo, ou não pensou em usar vetores. 

@Mauro Britivaldo Então Mauro, só pra contextualizar eu estou desenvolvendo um Jogo da Forca para um trabalho da faculdade. Nele, há uma função responsável por gerar palavradas aleatórias e as dicas correspondentes a tais palavras. O que tenho no momento é um número n tal que

n = rand() % 16
  switch (n){
    case 0: 
  		strcpy(palavra, "FUTEBOL");
  		strcpy(dica, "ESPORTE");
    case 1: ...
     ...
  }

(EXEMPLO)

 

(tenho 15 palavras/dicas)

 

Pensei em passar as palavras para um arquivo, as dicas para outro, gerar um número e pegar a palavra e a dica correspondentes e tal número, sacou?

 

Aceito sugestões.

 

  • Curtir 3
Postado

assim você pode contar as palavras

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

int main(){
	FILE *fp;
	int count = 0;
	char c;
	if ((fp=fopen("temp.txt", "r"))==NULL)
	{
		printf("DEU ERRO");
		exit(1);
	}
	while((c=getc(fp))&&(!feof(fp)))
	if ( c == ' ' || c == '\n' )count++;
	fclose(fp);
	printf("%d\n", count);
	return (0);
}

 

  • Curtir 3
Postado

@Bruno Vercelli

Lembre-se que você terá que inserir a função rand() da seguinte forma:

rand() % ((maior número - menor número) + 1) + menor número

Como não existe linha 0, o intervalo seria de 1 a 16. Então o que você tinha feito:

39 minutos atrás, Bruno Vercelli disse:

n = rand() % 16

Deveria ser:

n = rand() % 16 + 1

 

39 minutos atrás, Bruno Vercelli disse:

(tenho 15 palavras/dicas)

Não eram 16 palavras?

No caso, eu e @devair1010 propomos ideias semelhantes, mas ele explicou melhor. 😁

Se você tem certeza de que são 16 linhas, e que isso não vai mudar, você não precisa de um loop para contar as linhas, mas o ideal seria ter, para caso acrescentasse ou retirasse palavras, ou usasse essa função em outro programa.

 

Resumindo, você pode fazer o seguinte: apenas abra o arquivo texto no modo de leitura, gere um numero entre 1 e 16 e use fgets() ou fscanf() dentro de um loop para ler as palavras até que chegue na linha/palavra desejada.

Se o usuário precisar de dicas, você pode dar a ele uma letra aleatória da palavra escolhida, ou então pode descrever a palavra, como você já estava fazendo: apenas identifique de qual palavra se trata e imprima a dica. Mas antes, faça isso daí acima.

  • Curtir 3
Postado
1 hora atrás, Lucca Rodrigues disse:

@Bruno Vercelli

Lembre-se que você terá que inserir a função rand() da seguinte forma:


rand() % ((maior número - menor número) + 1) + menor número

Como não existe linha 0, o intervalo seria de 1 a 16. Então o que você tinha feito:

Deveria ser:


n = rand() % 16 + 1

 

Não eram 16 palavras?

O que você considera uma dica? Uma letra?

No caso, eu e @devair1010 propomos ideias semelhantes, mas ele explicou melhor.

Se você tem certeza de que são 16 linhas, e que isso não vai mudar, você não precisa de um loop para contar as linhas. Apenas abra o arquivo texto no modo de leitura, gere um numero entre 1 e 16 e use fgets() ou fscanf() dentro de um loop para ler as palavras até que chegue na linha/palavra desejada.

Se o usuário precisar de dicas, você pode dar a ele uma letra aleatória da palavra escolhida, mas antes, faça isso daí acima.

Realmente, são 16 palavras. 

Uma dica é uma string tambem, exemplo: palavra - "FUTEBOL" / dica - "ESPORTE"

 

Está funcionando quase perfeito. Só estou tentando desconsiderar o '\n' que o fgets recebe.

 

EDIT: Tudo perfeito!

 

Muito obrigado a todos pela sugestão.

  • Curtir 1
  • Obrigado 1
Postado

@Bruno Vercelli Eu tinha feito um programinha que procurava várias palavras em arquivos texto e as concatenava em uma string.

Pra excluir os \n's, eu usei a seguinte função:

void remove_enter(char *str){
    int cont = 0, i;
    for(i = 0; str[i]; i++){
        if(str[i] != '\n'){
            str[cont++] = str[i];
        }
    }
    str[cont] = 0;
}

 

11 minutos atrás, Bruno Vercelli disse:

Uma dica é uma string também, exemplo: palavra - "FUTEBOL" / dica - "ESPORTE"

Não precisa ser necessariamente uma string. Você pode identificar certa palavra e imprimir na tela a dica respectiva. Você usaria apenas estruturas condicionais.

  • Curtir 3
Postado
14 horas atrás, Bruno Vercelli disse:

Só estou tentando desconsiderar o '\n' que o fgets recebe

 

🤔 mesmo sabendo que ele está fixo no final da string? Para um vetor

       char* dica;

não bastaria escrever 

	dica[strlen(dica) - 1] = 0;

? Bastaria.
 

14 horas atrás, Lucca Rodrigues disse:

Pra excluir os \n's, eu usei a seguinte função

 

É possível, mas é fixa a posição do '\n' nesse caso. Vai chamar uma função, que leva uma eternidade comparada a uma simples atribuição, e varrer a string toda até o fim...

  • Curtir 2
  • Obrigado 1
Postado
2 horas atrás, arfneto disse:

 

🤔 mesmo sabendo que ele está fixo no final da string? Para um vetor


       char* dica;

não bastaria escrever 


	dica[strlen(dica) - 1] = 0;

? Bastaria.
 

 

É possível, mas é fixa a posição do '\n' nesse caso. Vai chamar uma função, que leva uma eternidade comparada a uma simples atribuição, e varrer a string toda até o fim...

Realmente, funcionou certinho essa solução e é bem mais prática que a minha.

 

Desculpa a ignorância mas nesse caso o caractere correspondente a dica[strlen(dica) - 1] seria o \n e você o substitui por um caractere nulo (0)? 

 

Obrigado.

  • Curtir 1
Postado

Sim. Como pensou.

 

strings em C são terminadas em zero. fgets() leu ou incluiu o \n porque é super prático. Em geral você quer gravar em outro arquivo e assim do jeito que veio vai.

 

ao colocar um zero lá a string diminui em um byte. Se alocou estaticamente não faz diferença porque um char[30] é um char[30] por exemplo. E se alocou dinamicamente também não porque a alocação é por tamanho também, não por conteúdo.

 

 

  • Curtir 2
  • Obrigado 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!