alphasil Posted June 13, 2012 Report Share Posted June 13, 2012 Oi ppl; Mais uma batalha que me se tem atravessado no meu caminho. Tenho uma função que vê as perguntas que tenho e imprime os dados todos. void ver_perguntasgp2(struct gp2 *p) { int retorno, cont = 0; FILE *f; if ((f= fopen("gp2.dat", "rb")) == NULL) { printf("Erro ao abrir ficheiro\n"); } printf ("\n*=============================================================================*\n"); printf ("| >>>>Visualizacao de perguntas<<<< |\n"); printf ("*=============================================================================*\n"); printf (" \n"); retorno = fread(p, sizeof *p, 1, f); while ( retorno == 1) { cont++; printf("\nId : %d \n", p->id); printf("\nPergunta : %s", p->ques); printf("\nResposta Correta : %s",p->res); printf("\n"); retorno= fread(p, sizeof *p, 1, f); } printf(" \n\n %d perguntas registadas \n", cont); fclose(f); } Esta está tudo ok Na outra só me imprime o id e a pergunta, não a resposta... void gp2_Ques(struct gp2 *p, char *usr1, int *result) { FILE *f; //apontador para ficheiro f=fopen("gp2.dat", "r"); //abertura do ficheiro char buf[10]; int reg=0,reg1; //Variaveis contadoras de perguntas e random int random; // Variável de random int op; //Variáveis opções utilizadores int qual; //Variáveis resultados rewind(f); //retorna a posição corrente do ficheiro para o início srand(time(NULL)); //função random system("cls"); fseek(f, 0, SEEK_END); reg=ftell(f) /sizeof *p; fseek(f, 0 , SEEK_SET); fread(p, sizeof *p, 1, f); printf("\nId : %d \n", p->id); //Imprime printf("\nPergunta : %s", p->ques); //Imprime printf("\nResposta Correta : %s",p->res); //Não Imprime printf("\n"); } Alguém percebe porquê?? Eu sinceramente não.... gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 13, 2012 Report Share Posted June 13, 2012 Só para despiste: tens a certeza que a 1º pergunta no ficheiro tem uma resposta ? O campo da resposta, no primeiro registo, não estará vazio ? Link to comment Share on other sites More sharing options...
alphasil Posted June 13, 2012 Author Report Share Posted June 13, 2012 Tenho, se na primeira função aparece tudo é sinal que está preenchido. No meu menu gestão, escolho a opção "ver perguntas" e está tudo, 20 perguntas, 20 respostas, agora se nesta aparece os ids e as perguntas por que carga de água não vem a resposta?? Obriagdo gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 13, 2012 Report Share Posted June 13, 2012 Verifica se o a função 'fread' retorna 1 (na 'gp2_Ques'). Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 Pus assim if (fread(p, sizeof *p, 1, f)==1) return 0; else return 1; E quando entra nesta função estoira (segmentaion fault) estranho, mas por que razão me lia o id e a questão?? gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 14, 2012 Report Share Posted June 14, 2012 Estás a passar um ponteiro 'p' válido (memória alocada com malloc ou endereço de variável) ? Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 Não uso malloc, estou a simplificar, estou a usar a mesma estrutura que fiz do gp1_Ques() só que para esta estrutura. gmc11 Link to comment Share on other sites More sharing options...
pmg Posted June 14, 2012 Report Share Posted June 14, 2012 if ((f= fopen("gp2.dat", "rb")) == NULL) Esta está tudo ok Na outra só me imprime o id e a pergunta, não a resposta... f=fopen("gp2.dat", "r"); //abertura do ficheiro O modo de abertura do ficheiro é diferente nas duas versões ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 Bom dia E não é que era mesmo isso...incrível, estive até as 3 da manhã e não reparei nisso. 😕 😕 😕 :confused: Agora já me aparece a resposta se eu quiser. Já agora, se reparar tenho um random para gerar números aleatórios em função do número de registos, e com esse random dá-me uma pergunta, se eu quiser um ciclo for de 8, já não posso usar o random pois não? Obrigado gmc11 Link to comment Share on other sites More sharing options...
pmg Posted June 14, 2012 Report Share Posted June 14, 2012 Explica lá essa coisa do random melhor (possivelmente noutro tópico) ... não tens nenum número aleatório no teu código: tens apenas a chamada à inicialização do gerador de números aleatórios. Essa inicialização deve ser chamada apenas uma vez por execução do programa (e não uma vez por função ou ciclo). Normalmente mete-se o srand(time(NULL)); dentro da função main, e chama-se a função [/tt]rand()[/tt] quando se quer um número aleatório. Podes gerar números aleatórios dentro de ciclos, claro! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 Olá Pois, não reparei que não tinha lá o random, mas prontos, a função é esta: void gp2_Ques(struct gp2 *p, char *usr1, int *result) { FILE *f; //apontador para ficheiro f=fopen("gp2.dat", "rb"); //abertura do ficheiro char buf[10]; int reg=0,reg1; //Variaveis contadoras de perguntas e random int random; // Variável de random int op; //Variáveis opções utilizadores int qual; //Variáveis resultados rewind(f); //retorna a posição corrente do ficheiro para o início srand(time(NULL)); //função random system("cls"); fseek(f, 0, SEEK_END); reg=ftell(f) /sizeof *p; fseek(f, 0 , SEEK_SET); if (reg<=0) //condição que verifica se existem registos { printf ("Sem registos \n"); printf ("\n Necessario ter registos para jogar...\n"); return; } else { if(op==1) { fseek(f, reg1 * sizeof *p, SEEK_SET); fread(p, sizeof *p, 1, f); printf("%s transporta %d pontos da anterior fase \n",usr1, result); printf("\nPergunta : %s", p->ques); printf("\nResposta correta? (facto ou ficcao)\n"); fgets(buf,9,stdin); printf("A variavel buf tem %s", buf); if(strcmp(buf,p->res)==0) //compara as duas stringd { printf("\nAcertou na resposta..."); result++; random=rand()%reg; //função random reg1 = random; //atribui a variavel reg o valor de random fseek(f, reg1 * sizeof *p, SEEK_SET); fread(p, sizeof *p, 1, f); printf("\nPergunta : %s", p->ques); printf("\nResposta correta? (facto ou ficcao)\n"); fgets(buf,9,stdin); if(strcmp(buf,p->res)==0) { printf("\nAcertou na resposta..."); result++; printf("Valor de result %d\n", result); printf("\nPassou a segunda fase...parabens\n"); //por aqui gp3_Ques } else { printf("\nResposta errada\n"); printf("\nFoi eliminado....tente novamente\n"); } } else { printf("Resposta errada"); printf("\nFoi eliminado....tente novamente\n"); Sleep(2000); system("cls"); jogo(); } } Se reparar faço a leitura dos registos com o fseek e atribuo ao reg o valor encontrado, depois faço um random desse valor e atribio a reg1. Isso funciona bem, agora se quiser pôr 10 perguntas, tem que me criar 10 numeros diferentes para pôr 10 perguntas diferentes, isso pode ser dentro do ciclo?? Não estou a ver como. gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 Alguém me consegue explicar isso?? if(result1>=3) { printf("\nTeve um total de %d", result1); printf("Tem %d da fase anterior", result); result+=result1; printf("\n 1. Tem pontuacao total de %d\n", result+result1); printf("\n 2. Tem pontuacao total de %d\n", result); printf("\nVai passar para a fase 3...aguarde \n"); Sleep(2000); } result=2 result1=3 Total no primeiro caso 26 Total no segundo caso 14 Eu tenho de voltar a primária...só pode... gmc11 Link to comment Share on other sites More sharing options...
pmg Posted June 14, 2012 Report Share Posted June 14, 2012 ... agora se quiser pôr 10 perguntas, tem que me criar 10 numeros diferentes para pôr 10 perguntas diferentes, isso pode ser dentro do ciclo?? Não estou a ver como. Para criares números aleatórios sem repetição tens que usar um método mais complicado que apenas gerar números aleatórios. Sugiro o método de Fisher-Yates. Basicamente enche um array com os valores pretendidos, escolhe um elemento ao acaso desse array e depois "apaga" o elemento. Repete até o array estar vazio. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted June 14, 2012 Author Report Share Posted June 14, 2012 (edited) Oi, Optei por criar uma função só com o random e perguntas. int jogo1Gp1(FILE *f, int res1) { struct perg p; int resposta; fseek(f, res1 * sizeof p, SEEK_SET); fread(&p, sizeof p, 1, f); printf("\nPergunta : %s", p.ques); printf("\nOpcao 1 : %s",p.op1); printf("\nOpcao 2 : %s",p.op2); printf("\nOpcao 3 : %s",p.op3); printf("\nOpcao 4 : %s",p.op4); printf("\nResposta correta?\n"); scanf("%d", &resposta); getchar(); if(resposta==p.res) return 1; else return 0; } e agora noutra função chamo esta void gp1_Ques(struct perg *p, char *usr1) { FILE *f; //apontador para ficheiro f=fopen("gp1.dat", "r"); //abertura do ficheiro int reg=0,reg1; //Variaveis contadoras de perguntas e random int random; // Variável de random int op, resposta; //Variáveis opções utilizadores int qual, result=0; //Variáveis resultados rewind(f); //retorna a posição corrente do ficheiro para o início srand(time(NULL)); //função random system("cls"); fseek(f, 0, SEEK_END); reg=ftell(f) /sizeof *p; fseek(f, 0 , SEEK_SET); if (reg<=0) //condição que verifica se existem registos { printf ("Sem registos \n"); printf ("\n Necessario ter registos para jogar...\n"); return; } else { random=rand()%reg; //função random reg1 = random; //atribui a variavel reg o valor de random jogo1Gp1(f,reg1); if ( jogo1Gp1(f,reg1) ) { printf("\nAcertou na resposta...\n"); result++; random=rand()%reg; //função random if ( jogo1Gp1(f,random) ) { printf("\nAcertou novamente na resposta...\n"); result++; } else { printf("Errou nesta questao...\n"); } } } } Quis simplificar para não expandir muito o código, o raciocíonio está certo, a implementação é que está a falhar...lol O que acham? Edited June 14, 2012 by alphasil gmc11 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now