Ir ao conteúdo
  • Cadastre-se
Visitante

C quis com arquivos em C

Recommended Posts

Visitante

Sou nova aqui, e tenho muita dificuldade em programação, preciso criar um quis :Ao selecionar a opção Jogar do menu, o seu programa deverá abrir o arquivo e ler todas as perguntas
cadastradas para o seu quis. Cada pergunta com suas respectivas respostas deverão ser apresentadas ao
usuário para que o mesmo tente escolher a opção correta para a pergunta. Se o usuário acertar a resposta,
dê parabéns a ele. Caso ele não acerte, diga que infelizmente ele não acertou, mas que ele pode continuar
tentando acertar as próximas perguntas. Ao mostrar a última pergunta ao jogo, e validar se ele acertou ou
não o jogo, você deverá antes de encerrar o jogo, mostrar para o usuário qual o seu percentual de acerto. Ou seja, que no arquivo tinham 10 perguntas cadastradas e ao jogar, o usuário acertou 7 perguntas, você deverá
informar a ele que seu percentual de acertos foi de 70%.

 

A parte de cadastramento eu consegui fazer,mas estou super travada na parte de jogar.

Agradeço muito quem puder me ajudar.

 

Esse é o código até agora:

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


// Estrutura da Resposta
typedef struct {
    char textoResp[200];
    int ehCorreta;
} tpResposta;

// Estrutura da Pergunta
typedef struct {
    char textoPerg[200];
    tpResposta respostas[3];
} tpPergunta;

// Limpar a estrutura de Pergunta
void limparPergunta(tpPergunta *aux){
    int i, r;

    // Limpar o aux para gravar os dados sem lixo
    // Limpando textoPerg
    for(i=0; i<200; i++){
        aux->textoPerg[i] = '\0';
    }
    // Limpanto respostas
    for(r=0; r<3; r++){
        aux->respostas[r].ehCorreta = 3;
        for (i=0; i<200; i++){
            aux->respostas[r].textoResp[i] = '\0';
        }
    }

}

int cadastrarRespostasDaPergunta(tpPergunta *aux){
    int i, c;
    int existeCorretaCadastrada = 0;

    printf("\n\n>>>> Digite as opções de resposta:\n");
    for(i=0; i<3; i++){
        printf("\n\n>>>> Digite a resposta %i:\n", i+1);
        fflush(stdin);
        fgets(aux->respostas[i].textoResp, 199, stdin);

        do{
            printf("\n\n>>>> Se a resposta %i eh a verdadeira resposta da pergunta, digite 1.", i+1);
            printf("\n>>>> Senao digite 0.\n");
            fflush(stdin);
            scanf("%d", &aux->respostas[i].ehCorreta);

            if((aux->respostas[i].ehCorreta != 0) &&
               (aux->respostas[i].ehCorreta != 1)){
                printf("\nResposta inválida. Digite somente 0 ou 1.");
            }

            // Validação de mais de uma resposta como correta
            if((existeCorretaCadastrada == 1)&&(aux->respostas[i].ehCorreta == 1))
            {
                printf("\nResposta inválida. Já existe resposta valida cadastrada.");
                printf("\nDigite novamente a sua opção de resposta.");

                // Limpeza da resposta invalida
                for(c=0; c<200; c++){
                    aux->respostas[i].textoResp[c] = '\0';
                }
                i--;
                break;
            }else if(aux->respostas[i].ehCorreta == 1){
                existeCorretaCadastrada = 1;
            }

        // Validação de entrada do usuário como 0 ou 1
        }while((aux->respostas[i].ehCorreta != 0) &&
              (aux->respostas[i].ehCorreta != 1));

        // Validação de não cadastrar nenhuma resposta correta
        if(existeCorretaCadastrada==0 && i==2){
            printf("\nVocê não cadastrou nenhuma resposta correta.");
            printf("\nLogo, estamos desconsiderando o seu cadastro.");
            return 0;
        }
    }
    return 1;
}

void gravarPerguntaNoArquivo(tpPergunta *aux){
    FILE* arq;

    arq = fopen("bancoquiz.dat", "a");
    if(arq == NULL){
        printf("\nFalha ao abrir o arquivo.");
    }else{
        if(fwrite(aux, sizeof(tpPergunta), 1, arq) == 1)
        {
            printf("\nArquivo salvo com sucesso.");
        }else{
            printf("\nFalha ao salvar no arquivo.");
        }
        fclose(arq);
    }
}

void cadastrarPergunta(){
    tpPergunta aux;

    limparPergunta(&aux);

    printf("\nCadastrando pergunta...");

    printf("\nPara cada pergunta, o usuario deverah cadastrar tres respostas,sendo apenas 1 correta.  ");

    printf("\n\n>>>> Digite a pergunta:\n");
    fflush(stdin);
    fgets(aux.textoPerg, 199, stdin);

    if (cadastrarRespostasDaPergunta(&aux) == 0){
        printf("\nVoce perdeu tempo... Terah que cadastrar novamente toda pergunta!");
        limparPergunta(&aux);
    }else{
        gravarPerguntaNoArquivo(&aux);
    }
}

void jogar(){
    char ler[100];
    int i;
    printf("\n PERGUNTAS\n");

    FILE*arq;
   arq = fopen("bancoquiz.dat", "r");
    if(arq == NULL){
        printf("\nFalha ao abrir o arquivo.");
    }else
    {
     while (!feof(arq))
     {
         fgets(ler,100,arq);
         printf("%s",ler);
     }
    }
    fclose(arq);

}

int menu(){
    int opcao;


    system("cls");
    printf("\n*** quis ***\n\n");
    printf("\n1) Cadastrar Pergunta");
    printf("\n2) Jogar");
    printf("\n3) Sair");

    printf("\n\n>>> Escolha uma das opções acima:");
    scanf("%i", &opcao);

    switch(opcao){
    case 1:
        cadastrarPergunta();
        break;
    case 2:
        jogar();
        break;
    case 3:
        return 0;
    default:
        printf("Opção Inválida! Tente novamente...");
    }

    fflush(stdin);
    getchar();
    return 1;
}

int main()
{
    while(menu() == 1)
    {

    }

    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mayara Tatiellen Bom dia, olhando o seu código, vi que utilizou arquivo binário para salvar tanto as perguntas e as respostas, então por que na hora de abrir não utiliza isto também? a função fread irá ajudar muito, fiz uma função jogar aqui, pode não estar perfeita mas acredito que irá entender a minha ideia

void jogar(){

    tpPergunta p;
    int x, i=0, op, pontos=0;

    FILE*arq;
    arq = fopen("bancoquiz.dat", "r");

    if(arq == NULL){
        printf("\nFalha ao abrir o arquivo.");
        return;
    }

    while(1){

         system("cls");
         fread(&p, sizeof(tpPergunta), 1, arq); 
		/* aqui o fread lendo uma questão por vez 
		e salvando na variavel p, do tipo tpPerguntas */
         if(feof(arq)) break; 

         printf("\n\n\tPergunta %d\n\n", i);
         printf("\n%s", p.textoPerg);

         printf("\nAlternativas:\n\n");
         for(x=0; x<3; x++) printf("\n%d) %s", x, p.respostas[x].textoResp);

         printf("\nInforme uma alternativa: ");
         scanf("%d", &op);
         
         if(verificar(p, op)) pontos++; //se estiver correto a resposta incrementa os pontos do usuario
         i++; //aqui contará quantas perguntas existe no total
     }

     float porcentagem  = (pontos*100)/i; //calculando a porcentagem de acertos

     printf("\n\nAcertos: %d/%d \n\n\tPercentual de acertos: %.0f%%\n\n", pontos, i, porcentagem);


    fclose(arq);

}

Veja que utilizei uma função de verificar, coloquei ela para tentar dar uma organizada kk ainda da pra deixar bem melhor, sem duvidas, mas a função verificar que fiz está aqui

int verificar(tpPergunta p, int n){

    int i;
    
    for(i=0; i<3; i++)
        if(p.respostas[i].ehCorreta == 1 && i == n)
                return 1;
  /* se encontrar a correta e a posicao dela for igual a que o usuario informou,
      	 então ele acertou, retornando 1 e saindo da função */

    return 0; //agora se nao achou nada durante o for, ele errou, e será retorna 0
}

Minha ideia ta ai, como disse da para você fazer algo melhor, foi só uma ideia, boa sorte :D!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há diversas formas, como por exemplo, criar a variável pontos como global, ou criar ela na main, e passar como referência para as funções.

Abaixo é um exemplo passando a variável pontos como referência, e vale lembrar que há a necessidade de usar ponteiro. 

#include <stdio.h>

void jogar(int *pontos){

    (*pontos)++;

}

int main(){

    int pontos=0;

    jogar(&pontos);

    printf("\nPontos = %d\n", pontos); //pode ver que esse printf resultará no valor 1

    return 0;
}

Agora como variável global não tem muito mistério:

#include <stdio.h>

int pontos = 0; //variável global

void jogar(){

   pontos++;

}

int main(){

    jogar();

    printf("\nPontos = %d\n", pontos); //terá o valor de 1

    return 0;
}

Ela como o próprio nome dito, será global, poderá ser usada no programa inteiro. 

 

Agora só escolher a maneira que irá fazer, boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  •    1
    Visitante
    Em 12/11/2018 às 18:18, Asrety disse:

    Obrigada pela ajuda ^^

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro 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 publicações 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

    ×