Ir ao conteúdo
  • Cadastre-se

Problema com repetição - quis


dulongo

Posts recomendados

Pessoal, estou fazendo um quis, mas quero que o programa sorteie as questões aleatoriamente, e saia do programa ao responder todas.

Até ai tudo bem consegui fazer, mas o meu problema esta no sorteio das questões, pois esta repetindo, não sei se o problema é no vetor ou no switch, alguém pode me ajudar?

 

Meu código esta como abaixo

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<time.h>main(){	char nome[30];int i,digito[3],errou,acertou,resp,resp2,altsrand (time(NULL));	do	{			system ("cls");							printf ("digite o seu nome:");			scanf ("%s",&nome);								for (i=0;i<3;i++)				{						srand (time(NULL));						printf ("\nsorteando uma pergunta\n");						digito[3] = rand() % 3;												switch (digito[3])						{							case 0: printf ("While em inglês significa \n1) Sem fio \n2) Embora \n3) Enquanto \n4) Branco\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==3)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 3");							}							break;														case 1: printf ("Qual programa da aula de log \n1) C++ \n2) Android \n3) Delphi  \n4) iOS\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;														case 2: printf ("Aaaaa \n1) AA \n2) AAA \n3) AAAAi  \n4) AAAA\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;																	}										}								printf ("parabens voce terminou o quis:");								if (acertou>=12)				{					printf ("conceito A");				}								if (acertou>=8&&acertou<=11)				{					printf ("conceito B");				}								if (acertou==7)				{					printf ("conceito C");				}								if (acertou<7)				{					printf ("conceito D");				}					}while(resp==1);	getch();}
Link para o comentário
Compartilhar em outros sites

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>int main() {    char nome[30];    int i, digito, alt;    int errou = 0;    int acertou = 0;    system ("cls");    printf ("digite o seu nome:");    scanf ("%s", nome);    for (i=0; i<3; i++) {        srand (time(NULL));        printf ("\nsorteando uma pergunta\n");        digito = rand() % 3;        switch (digito)    {            case 0:                printf ("While em inglês significa \n1) Sem fio \n2) Embora \n3) Enquanto \n4) Branco\n");                printf ("escolha a alternativa correta:");                scanf ("%d",&alt);                if (alt == 3) {                    acertou++;                    printf ("\nvoce acertou\n");                } else {                    errou++;                    printf ("\nvocê errou\n A alternativa correta era a 3");                }                break;            case 1:                printf ("Qual programa da aula de log \n1) C++ \n2) Android \n3) Delphi  \n4) iOS\n");                printf ("escolha a alternativa correta:");                scanf ("%d",&alt);                if (alt == 1) {                    acertou++;                    printf ("\nvoce acertou\n");                } else {                    errou++;                    printf ("\nvocê errou\n A alternativa correta era a 1");                }                break;            case 2:                printf ("Aaaaa \n1) AA \n2) AAA \n3) AAAAi  \n4) AAAA\n");                printf ("escolha a alternativa correta:");                scanf ("%d",&alt);                if (alt == 1) {                    acertou++;                    printf ("\nvoce acertou\n");                } else {                    errou++;                    printf ("\nvocê errou\n A alternativa correta era a 1");                }                break;        }    }    printf ("parabens voce terminou o quis:");    if (acertou >= 12)        printf ("conceito A");    if (acertou >= 8 && acertou <= 11)        printf ("conceito B");    if (acertou == 7)        printf ("conceito C");    if (acertou < 7)        printf ("conceito D");    getch();    return 0;}

- Faltava um ";" na parte onde você declarou as variáveis.

- A variável resp e resp2 não estava sendo usada

- Consequentemente o do-while ficava em loop infinito

- A variável digito tava como vetor, mas seus valores não estavam sendo usados

- O vetor "nome" estava sendo passado erroneamente pro primeiro scanf (não precisava usar o sinal de &)

- Variáveis "errou" e "acertou" não tinham sido iniciadas antes de usar o operador ++

Link para o comentário
Compartilhar em outros sites

OK!

Eu acho que podemos resolver isso com uma variável para impor um condição de existência impedindo a repetição consecutiva do numeral sorteado.

Uma variável chama numero_anterior armazena o último numeral selecionado, se caso o novo numeral de retorno de rand() for igual ao anterior a condição força a realizar novamente sorteio até obter um resultado diferente de numero_anterior; 

 

    int anteiro;    int atual;            atual    =            anterior = 0;                srand(time(NULL));                int i;                for(i = 0; i < 3/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir consecutivos numerais                     while( (atual = rand()%3) == anterior)                    continue;                    anterior = atual; //Aqui estabelecemos a futura condição                    printf("Numeral: %d <-\n", atual);                }

E possível estende ainda mais a condição para tando crie mais variável anti-repetição 

:) Observe que fiz logo abaixo um algoritmo que completo o que mencionei acima:

    int jh[3];    int atual;                srand(time(NULL));                int i;                for(i = 0; i < 3/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir;                    while( (atual = rand()%3)                             == jh[0]                    || atual == jh[1]                    || atual == jh[2] )                    continue;                     jh[1] = jh[2]; //Absolutamente nunca repete.                     jh[2] = jh[0];                     jh[0] = atual;                    printf("Numeral: %d <-\n", atual);                }
Link para o comentário
Compartilhar em outros sites

 

OK!

Eu acho que podemos resolver isso com uma variável para impor um condição de existência impedindo a repetição consecutiva do numeral sorteado.

Uma variável chama numero_anterior armazena o último numeral selecionado, se caso o novo numeral de retorno de rand() for igual ao anterior a condição força a realizar novamente sorteio até obter um resultado diferente de numero_anterior; 

 

    int anteiro;    int atual;            atual    =            anterior = 0;                srand(time(NULL));                int i;                for(i = 0; i < 3/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir consecutivos numerais                     while( (atual = rand()%3) == anterior)                    continue;                    anterior = atual; //Aqui estabelecemos a futura condição                    printf("Numeral: %d <-\n", atual);                }

E possível estende ainda mais a condição para tando crie mais variável anti-repetição 

:) Observe que fiz logo abaixo um algoritmo que completo o que mencionei acima:

    int jh[3];    int atual;                srand(time(NULL));                int i;                for(i = 0; i < 3/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir;                    while( (atual = rand()%3)                             == jh[0]                    || atual == jh[1]                    || atual == jh[2] )                    continue;                     jh[1] = jh[2]; //Absolutamente nunca repete.                     jh[2] = jh[0];                     jh[0] = atual;                    printf("Numeral: %d <-\n", atual);                }

 

 

Obrigado pelas dicas com a sua segunda sugestão eu consegui rodar, mas caso eu aumente para 15 questões, eu teria que fazer manualmente?

 

E na primeira ele buga pra mim a parte do while

Link para o comentário
Compartilhar em outros sites

Nada, segue o mesma linhas de raciocínio.
Observe o exemplo abaixo, onde estabeleci a possibilidades ilimitada: 

#define LEN 15//Questões.int jh[LEN];    int atual;         atual = 0;         int i;         for(i = 0; i < LEN; i++)            jh[i] = LEN;                srand(time(NULL));                for(i = 0; i < LEN/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir consecutivos numeral                    while( (atual = rand()%LEN) == jh[atual] )                    continue;                    jh[atual] = atual; //Absolutamente nunca repete                    printf("Numeral: %d <-\n", atual);                }
Link para o comentário
Compartilhar em outros sites

 

Nada, segue o mesma linhas de raciocínio.

Observe o exemplo abaixo, onde estabeleci a possibilidades ilimitada: 

#define LEN 15//Questões.int jh[LEN];    int atual;         atual = 0;         int i;         for(i = 0; i < LEN; i++)            jh[i] = LEN;                srand(time(NULL));                for(i = 0; i < LEN/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir consecutivos numeral                    while( (atual = rand()%LEN) == jh[atual] )                    continue;                    jh[atual] = atual; //Absolutamente nunca repete                    printf("Numeral: %d <-\n", atual);                }

 

 

Cara valeu muito pela força, consegui resolver utilizando seu método!!

 

Segue o código completo do quis caso ajude pessoas com a mesma duvida no futuro

 

obrigado novamente!!  :D  :D  :D

#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <math.h>#include <string.h>main(){#define LEN 5//Questões.int jh[LEN];int atual, errou,acertou,resp,alt;atual = 0;int i;char nomedojogador[30];	do	{		system ("cls");		printf ("digite o seu nome:");		scanf ("%s",&nomedojogador);					for(i=0;i<5;i++)		{						    for(i = 0; i < LEN; i++)        	    jh[i] = LEN;                srand(time(NULL));                for(i = 0; i < LEN/*Sorteios*/; i++)                {                    //Em hipótese nenhuma será possível repetir consecutivos numeral                    while( (atual = rand()%LEN) == jh[atual] )                    continue;                    jh[atual] = atual; //Absolutamente nunca repete                                        switch (i)						{							case 0: printf ("While em inglês significa \n1) Sem fio \n2) Embora \n3) Enquanto \n4) Branco\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==3)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 3");							}							break;														case 1: printf ("Qual programa da aula de log \n1) C++ \n2) Android \n3) Delphi  \n4) iOS\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;														case 2: printf ("Aaaaa \n1) AA \n2) AAA \n3) AAAAi  \n4) AAAA\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;														case 3: printf ("bbbbbbbbbbbbbbb \n1) bbbbbbbbbbb \n2) bbbbbbbbbbbbb \n3) bbbbbbbbbbbbbb  \n4) bbbbbbbbbbbbb\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;														case 4: printf ("cccccccccccccc \n1) cccc \n2) ccccccccc \n3) ccccccccccc  \n4) ccccccccccc\n");							printf ("escolha a alternativa correta:");							scanf ("%d",&alt);							if (alt==1)							{							acertou++;							printf ("\nvoce acertou\n");							}							else							{							errou++;							printf ("\nvocê errou\n A alternativa correta era a 1");							}							break;						}                }           			    	}    			printf ("\nParabens %s voce terminou o quis:\n", nomedojogador);    			   			    			if (acertou>=12)				{					printf ("Sua avaliacao e: conceito A\n");				}								if (acertou>=8&&acertou<=11)				{					printf ("Sua avaliacao e: conceito B\n");				}								if (acertou==7)				{					printf ("Sua avaliacao e: conceito C\n");				}								if (acertou<7)				{					printf ("Sua avaliacao e: conceito D\n");				}								                printf ("\ndeseja jogar novamente? 1.sim 2.nao");				scanf ("%d",&resp);						}while(resp==1);                                getch();}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...