Ir ao conteúdo
  • Cadastre-se
dulongo

Problema com repetição - quis

Recommended Posts

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();}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, 

Posso estar errado, mas o erro está na função que faz o sorteio de forma aleatória. Não lembro, mas acredito que necessário usar uma outra função de uma biblioteca externa.

Compartilhar este post


Link para o post
Compartilhar em outros sites
digito[3] = rand() % 3;switch (digito[3])

Pelo que entendi, deveria ser:

digito[i] = rand() % 3;switch (digito[i])

 

Mas ele repete mesmo assim, creio que seja por causa do Switch

Compartilhar este post


Link para o post
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 ++

Compartilhar este post


Link para o post
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);                }

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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);                }

Compartilhar este post


Link para o post
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();}

Compartilhar este post


Link para o post
Compartilhar em outros sites

De nada !

:)

Só mais uma coisa;

no lugar de    switch (i)

de ver o         switch (atual)

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

×