Logo Hardware.com.br
Matheus frota
Matheus frot... Novo Membro Registrado
10 Mensagens 0 Curtidas

Programa dando erro de execução

#1 Por Matheus frot... 11/06/2015 - 23:22
Boa noite, eu estou tentando executar um programa que eu fiz, um joguinho da forca... Mas quando eu coloco para "jogar novamente no código do programa ele dá um erro de execução e para de funcionar, alguém pode me ajudar a resolver? Segue abaixo o código. OBS: CÓDIGO EM C

[HASHTAG]#include[/HASHTAG] <stdio.h>
[HASHTAG]#include[/HASHTAG] <stdlib.h>
[HASHTAG]#include[/HASHTAG] <time.h>
[HASHTAG]#include[/HASHTAG] <string.h>

[HASHTAG]#define[/HASHTAG] NUM_PALAVRAS 3 //Define o número de palavras no arquivo

int main()
{
char nome[10],
tentd,
palavra[20],vet1[20],
espaco[20],vet2[20],
teste,
aux=0,
tam,
*result;
int i,
chances,
x,
ganhou,
indexPalavra, //Variável do controle do index da palavra
j; //Variáveis de controle de loop
FILE *fp; //Ponteiro de arquivo


fp = fopen("lista.txt", "r&quot; //Abre o arquivo
if(fp) //Se arquivo existir
{
srand(time(NULL)); //Pega a semente do número randômico
indexPalavra = rand()%NUM_PALAVRAS; //Gera o número da palavra (index)
for(i=0, j=0; j<indexPalavra; i++) //Enquanto não achar o index
{
if(fgetc(fp) == '\n') //Se achar próxima palavra
j++; //Passa para o próximo index;
/** Enquanto isso o ponteiro 'fp' armazena em si mesmo a posição do arquivo
que é navegada por 'fgetc()'. A cada consulta de caractere a posição do arquivo é passada pra frente **/
}
}
else //Se não achar arqquivo
{
printf("Lista nao encontrada.\n&quot;
fclose(fp); //destrói o ponteiro
return 0; //Fecha o programa com sucesso
}

//Basta ler a palavra agora
i = -1;
do
{
i++;
tam++;
palavra<em> = fgetc(fp); //Lê letra por letra
if(palavra<em> == '\n') //Se caractere lido for de próxima linha

break; //Terminou a palavra
} while(palavra<em> != EOF); //Enquanto não fim do arquivo
palavra<em> = '\0'; //Substitui o último caractere da palavra para indicar fim de frase
tam=tam-1;
tentd='s';
system("cls&quot;
printf("><><><><><><><><><><><><><>JOGO DA FORCA<><><><><><><><><><><><><><>\n&quot;
while(tentd!='n' ){
for(i=0;i<tam;i++){
espaco<em>='_';
}
chances=6;
printf("Escreva o nome do jogador! \n&quot;
scanf("%s",&nome);
while(chances!=0 ){
aux=0;
system("cls&quot;
printf("O jogador(a): %s\n",nome);
printf("Chance: %d ganhou: %d",chances,ganhou);
printf("\n ÉÍÍÍÍÍÍÍÍÍÍÍ»&quot;
printf("\n º º&quot;
printf("\n º Ê&quot;
printf("\n º&quot;if(chances<=5){printf(" |&quot;}
printf("\n º&quot;if(chances<=4){printf(" (xx)&quot;}
printf("\n º&quot;if(chances<=3){printf(" /| |\\ &quot;}
printf("\n º&quot;if(chances<=2){printf(" / | | \\ &quot;}
printf("\n º&quot;if(chances<=1){printf(" / \\ &quot;}
printf("\n º&quot;if(chances<=0){printf(" / \\ &quot;}
printf("\n º&quot;
printf("\n Ê\n&quot;
for(i=0;i<tam;i++){
printf("%c ",espaco<em&gt;
}
printf("\n&quot;

setbuf(stdin,NULL);
printf("Digite uma letra! \n&quot;
scanf("%c",&teste);

for(i=0;i<tam;i++){
if(teste==palavra<em&gt{
espaco<em>=teste;
aux=1;
}
}

if(aux==0){
chances--;
}
else{
ganhou++;
}

}

if(chances==0){
setbuf(stdin,NULL);
system("cls&quot;
printf("Voce PERDEUUUU! \n&quot;


}
if(strcmp(espaco,palavra)==0){
setbuf(stdin,NULL);
system("cls&quot;
printf("Voce GANHOUUUU! \n&quot;

}
else{
setbuf(stdin,NULL);
system("cls&quot;
printf("Voce PERDEUUUU! \n&quot;
}
printf("Voce deseja jogar novamente? 's' ou 'n' \n&quot;
fflush(stdin);
scanf("%c",tentd);
system("cls&quot;

}
fclose(fp);
system("pause&quot;


} </em></em></em></em></em></em></em></em>
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#3 Por tpcvasco
12/06/2015 - 10:15
Vamos lá, seu erro principal: scanf("%c", &tentd);
Outro erro: scanf("%c%*c",&teste);

Outras dicas:
-Inicialize as variáveis "ganhou" e "tam" (com zero, acredito eu). No seu pc deve ter funcionado, mas no meu, por exemplo, ficam com um valor louco (lixo de memória), pq vc não inicializou. Aliás, é bom inicializar todas as variáveis, lembre-se q nunca há garantias q o compilador irá zerar a memória...
-Pq vc não usou fgets() ao invés de fgetc()?
Matheus frota
Matheus frot... Novo Membro Registrado
10 Mensagens 0 Curtidas
#4 Por Matheus frot...
12/06/2015 - 20:41
Obrigado, eu vou tentar ajeitar a parti das dicas que vcs me deram... Quando eu terminar o codigo aqui eu posto como ficou, e se eu n conseguir possto aqui denovo as duvidas...
>
Eu recomecei o codigo, fiz alguma modificações, queria saber como alguem pode me ajudar... Não to conseguindo fazer com que ele exiba toda a palavra, diga ao usuario que ele digitou a letra mais de uma vez se ja tiver sido digitada e por enquanto é só, segue a baixo o codigo novo OBS: Obrigado por estarem me ajudando.

[HASHTAG]#include[/HASHTAG] <stdio.h>
[HASHTAG]#include[/HASHTAG] <stdlib.h>
[HASHTAG]#include[/HASHTAG] <time.h>
[HASHTAG]#include[/HASHTAG] <string.h>

[HASHTAG]#define[/HASHTAG] NUM_PALAVRAS 3 //Define o número de palavras no arquivo

main()
{
char nome[20],
tentd,
palavra[10],
espaco[10],
letra;

int i,j,x,
na=0,
ne=0,
chances,
tam,
index_Word,
aux;

FILE *fp; //Ponteiro de arquivo


fp = fopen("lista.txt", "r&quot; //Abre o arquivo
if(fp) //Se arquivo existir
{
srand(time(NULL)); //Pega a semente do número randômico
index_Word = rand()%NUM_PALAVRAS; //Gera o número da palavra (index)
for(i=0, j=0; j<index_Word; i++) //Enquanto não achar o index
{
if(fgetc(fp) == '\n') //Se achar próxima palavra
j++; //Passa para o próximo index;
/** Enquanto isso o ponteiro 'fp' armazena em si mesmo a posição do arquivo
que é navegada por 'fgetc()'. A cada consulta de caractere a posição do arquivo é passada pra frente **/
}
}
else //Se não achar arqquivo
{
printf("Lista nao encontrada.\n&quot;
fclose(fp); //destrói o ponteiro
return 0; //Fecha o programa com sucesso
}

do
{
i++;
tam++;
palavra<em> = fgetc(fp); //Lê letra por letra
if(palavra<em> == '\n') //Se caractere lido for de próxima linha

break; //Terminou a palavra
} while(palavra<em> != EOF); //Enquanto não fim do arquivo
palavra<em> = '\0'; //Substitui o último caractere da palavra para indicar fim de frase
tam=tam-1;

tentd='s';
system("cls&quot;
printf("><><><><><><><><><><><><><>JOGO DA FORCA<><><><><><><><><><><><><><>\n&quot;

while(tentd=='s')
{
for(i=0;i<tam;i++)
{
espaco<em>='_';
}

printf("Escreva o nome do jogador! \n&quot;
scanf("%s",&nome);

while(ne!=6 || na!=tam)
{
aux=0;

system("cls&quot;
printf("O jogador(a): %s\n",nome);
printf("Numero de acertos: %d Numero de erros: %d",na,ne);
printf("\n ÉÍÍÍÍÍÍÍÍÍÍÍ»&quot;
printf("\n º º&quot;
printf("\n º Ê&quot;
printf("\n º&quot;if(ne>=1){printf(" |&quot;}
printf("\n º&quot;if(ne>=2){printf(" (xx)&quot;}
printf("\n º&quot;if(ne>=3){printf(" /| |\\ &quot;}
printf("\n º&quot;if(ne>=4){printf(" / | | \\ &quot;}
printf("\n º&quot;if(ne>=5){printf(" / \\ &quot;}
printf("\n º&quot;if(ne>=6){printf(" / \\ &quot;}
printf("\n º&quot;
printf("\n Ê\n&quot;

for(i=0;i<tam;i++)
{
printf("%c ",espaco<em&gt;
}
printf("\n&quot;

setbuf(stdin,NULL);
printf("Digite uma letra! \n&quot;
scanf("%c",&letra);

for(i=0;i<tam;i++)
{
if(letra==palavra<em&gt
{
espaco<em>=letra;
aux=1;
}
}

if(aux==0)
{
ne++;
}
else
{
na++;
}

for(i=0;i<=tam;i++)
{
while(letra==espaco<em> || i!=tam)
{

if(letra==espaco<em&gt
{
printf("A letra ja foi utilizada! Digite outra letra: \n&quot;
}
else
{
break;
}

}
}



}





}
}</em></em></em></em></em></em></em></em></em></em>
jofrelscalvet
jofrelscalve... Veterano Registrado
1.3K Mensagens 51 Curtidas
#7 Por jofrelscalve...
13/06/2015 - 11:20
Matheus frota disse:
Ei como eu faço para ele dizer se a letra ja foi digitada ou n?

Não vou ajudar muito, mas ...
Invés de gravar a letra digitada em um char você poderia grava-la num vetor de char. Toda vez que uma letra for digitada você verifica se ela já está no vetor.

Algumas idéias só por diversão:
fgets lê uma linha por vez ao inves de um caracter por vez, isso simplificaria bastante seu codigo.
Já que você está trabalhando em modo texto provavelmente via manter a interface bem simples, mas se você fosse montar telas mais elaboradas poderia ser interessante também ter um vetor dizendo se a a letra digitada foi achada ou não. Isso permitiria que você mostrasse na tela todas as teclas já digitadas destacando de alguma forma se elas fazem ou não parte do que se busca.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#9 Por tpcvasco
14/06/2015 - 01:15
jofrelscalvet disse:
Invés de gravar a letra digitada em um char você poderia grava-la num vetor de char. Toda vez que uma letra for digitada você verifica se ela já está no vetor.


Ele já faz isso. Apesar de usar fgetc() para ler, ele usa "palavra" para guardar.

jofrelscalvet disse:
poderia ser interessante também ter um vetor dizendo se a a letra digitada foi achada ou não.


Ele tb já faz isso... Usando "espaco", só falta ele acertar o algoritmo de busca.

Matheus frota disse:
Cara, vc pode me da uma luz pf... Eu estou faz hrs tentando desenvolver esse programa. Ei como eu faço para ele dizer se a letra ja foi digitada ou n?


Do seu setbuffer para baixo:

do {
setbuf(stdin,NULL);
printf("Digite uma letra! \n&quot;
scanf("%c",&letra);
aux = 0;
for(i=0;i<=tam;i++) {
if(letra==espaco[i]) {
printf("A letra ja foi utilizada! Digite outra letra: \n&quot;
aux=1;
break;
}
}
} while (aux);
for(i=0;i<tam;i++) {
if(letra==palavra[i]) {
espaco[i]=letra;
aux=1;
}
}
if(aux==0) {
ne++;
}
else {
na++;
}


Não tenho certeza se está tudo OK, fiz de cabeça, sem compilar, mas o conceito taí.
Matheus frota
Matheus frot... Novo Membro Registrado
10 Mensagens 0 Curtidas
#11 Por Matheus frot...
14/06/2015 - 17:58
tpcvasco disse:
Ele já faz isso. Apesar de usar fgetc() para ler, ele usa "palavra" para guardar.



Ele tb já faz isso... Usando "espaco", só falta ele acertar o algoritmo de busca.



Do seu setbuffer para baixo:

do {
setbuf(stdin,NULL);
printf("Digite uma letra! \n&quot;
scanf("%c",&letra);
aux = 0;
for(i=0;i<=tam;i++) {
if(letra==espaco[i]) {
printf("A letra ja foi utilizada! Digite outra letra: \n&quot;
aux=1;
break;
}
}
} while (aux);
for(i=0;i<tam;i++) {
if(letra==palavra[i]) {
espaco[i]=letra;
aux=1;
}
}
if(aux==0) {
ne++;
}
else {
na++;
}


Não tenho certeza se está tudo OK, fiz de cabeça, sem compilar, mas o conceito taí.


Cara nessa parte aki:
' }
} while (aux);'
eu n tendi direito, pode explicar??
Matheus frota
Matheus frot... Novo Membro Registrado
10 Mensagens 0 Curtidas
#13 Por Matheus frot...
15/06/2015 - 12:01
tpcvasco disse:
vc não entendeu o conceito do "do while" ou oq está dentro dele?
Se é o conceito, o "do while(x)" é praticamente a mesma coisa q "while(x)", a única diferença é q enquanto o while testa se x é verdadeiro antes de tudo, o do while sempre realiza a primeira iteração e depois q ele faz o teste x.

É que eu não entendi a parte que vc coloca a condição while(aux), o pq de vc ter colocado essa condição.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#14 Por tpcvasco
15/06/2015 - 12:13
Matheus frota disse:
É que eu não entendi a parte que vc coloca a condição while(aux), o pq de vc ter colocado essa condição.


o while(aux) quer dizer q ele vai executar o loop enquanto aux for diferente de zero. Isso vc entendeu?
E quando aux é diferente de zero? Quando ele entra na condição onde a letra já foi utilizada. Quando isso acontece, ele deve pedir a letra novamente, correto?
Aí a cada novo loop eu zero aux novamente. Se ele não encontrar letra já utilizada, aux vai continuar sendo zero, aí vai sair do while e continuar o programa.
Matheus frota
Matheus frot... Novo Membro Registrado
10 Mensagens 0 Curtidas
#15 Por Matheus frot...
15/06/2015 - 21:09
tpcvasco disse:
o while(aux) quer dizer q ele vai executar o loop enquanto aux for diferente de zero. Isso vc entendeu?
E quando aux é diferente de zero? Quando ele entra na condição onde a letra já foi utilizada. Quando isso acontece, ele deve pedir a letra novamente, correto?
Aí a cada novo loop eu zero aux novamente. Se ele não encontrar letra já utilizada, aux vai continuar sendo zero, aí vai sair do while e continuar o programa.

Cara muito obrigado...
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal