alphasil Posted June 13, 2012 at 11:34 PM Report Share #462595 Posted June 13, 2012 at 11:34 PM 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 at 11:49 PM Report Share #462597 Posted June 13, 2012 at 11:49 PM 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 at 11:52 PM Author Report Share #462598 Posted June 13, 2012 at 11:52 PM 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 at 11:57 PM Report Share #462599 Posted June 13, 2012 at 11:57 PM 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 at 12:07 AM Author Report Share #462604 Posted June 14, 2012 at 12:07 AM 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 at 12:11 AM Report Share #462605 Posted June 14, 2012 at 12:11 AM 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 at 12:17 AM Author Report Share #462609 Posted June 14, 2012 at 12:17 AM 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 at 09:01 AM Report Share #462622 Posted June 14, 2012 at 09:01 AM 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 at 09:13 AM Author Report Share #462627 Posted June 14, 2012 at 09:13 AM 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 at 09:23 AM Report Share #462632 Posted June 14, 2012 at 09:23 AM 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 at 09:54 AM Author Report Share #462650 Posted June 14, 2012 at 09:54 AM 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 at 11:35 AM Author Report Share #462710 Posted June 14, 2012 at 11:35 AM 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 at 12:33 PM Report Share #462733 Posted June 14, 2012 at 12:33 PM ... 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 at 02:31 PM Author Report Share #462805 Posted June 14, 2012 at 02:31 PM (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 at 02:32 PM 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