Jump to content
Dexter's Lab

Sorteio totoloto [Ajuda]

Recommended Posts

Dexter's Lab

Viva pessoal,

o meu professor pediu-me para fazer o seguinte programa:

Sorteio de 1 a 50 numeros. O utilizador digita 6 valores e o PC gera 6 ao acaso em que NENHUM PODE REPETIR. Por cada valor igual corresponde a um ponto.

Agora eis a dificuldade: não posso usar arrays.

Isto gera obviamente uma data de if's. Eu queria perguntar-vos se encontram uma forma melhor de o fazer sem todos estes if's, porque como eu estou a fazer começa a parecer-me demasiado fora de mão.

Não acabei ainda, mas gostava de saber entretanto a vossa opinião para poder repensar melhor.

Agradeço qualquer ajuda.

# include <stdio.h>
# include <time.h>
# define PAUSE getch()
void PEDE_VALORES();
void RANDOMIZE(int ka, int kb, int kc, int kd, int ke, int kf);
void CONFIRMA();
int main (void)
{
srand(time(NULL));
PEDE_VALORES();

return 0;
}
void PEDE_VALORES()
{
int val1, val2, val3, val4, val5, val6;
val1 = val2 = val3 = val4 = val5 = val6 = 0;

printf ("\n VALOR: "); scanf("%d", &val1);
printf ("\n VALOR: "); scanf("%d", &val2);
printf ("\n VALOR: "); scanf("%d", &val3);
printf ("\n VALOR: "); scanf("%d", &val4);
printf ("\n VALOR: "); scanf("%d", &val5);
printf ("\n VALOR: "); scanf("%d", &val6);

RANDOMIZE(val1, val2, val3, val4, val5, val6);
}
void RANDOMIZE(int ka, int kb, int kc, int kd, int ke, int kf)
{
int cont = 0;

int chava = rand()%50+1;
int chavb = rand()%50+1;
int chavc = rand()%50+1;
int chavd = rand()%50+1;
int chave = rand()%50+1;
int chavf = rand()%50+1;

if (chava == chavb || chava == chavc || chava == chavd || chava == chave || chava == chavf) {
chava++;
}
if (chavb == chava || chavb == chavc || chavb == chavd || chavb == chave || chavb == chavf) {
chavb++;
}
if (chavc == chava || chavc == chavb || chavc == chavd || chavc == chave || chavc == chavf) {
chavc++;
}
if (chavd == chava || chavd == chavb || chavd == chavc || chavd == chave || chavd == chavf) {
chavd++;
}
if (chave == chava || chave == chavb || chave == chavc || chave == chavd || chave == chave) {
chave++;
}
if (chavf == chava || chavf == chavb || chavf == chavc || chavf == chavd || chave == chavf) {
chavf++;
}

if (chava == ka) {
cont++;
}
if (chavb == kb) {
cont++;
}
if (chavc == kc) {
cont++;
}
if (chavd == kd) {
cont++;
}
if (chave == ke) {
cont++;
}
if (chavf == kf) {
cont++;
}

printf ("\n%d", chava);
printf ("\n%d", chavb);
printf ("\n%d", chavc);
printf ("\n%d", chavd);
printf ("\n%d", chave);
printf ("\n%d", chavf);


printf("\n Tem %d pontos", cont);
PAUSE;
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

conheço uma solução simples sem arrays, mas tenho as minhas duvidas que irás perceber:

com um inteiro de 64 bits, bitmasks e ciclos


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Eu esforço-me por perceber qualquer ajuste que venha.

A ideia do meu professor é mesmo percebermos o que os arrays vão fazer antes de os usarmos, passo a passo.

Mesmo assim agradecia a explicação.

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... mas não digas que é demasiado complicado :

#include <stdint.h>

#define N_NUMBERS 6

#define CHOICE_BITSIZE (64 / N_NUMBERS)
#define CHOICE_READ(n, i) ((n >> (i * CHOICE_BITSIZE)) & 63L)
#define CHOICE_WRITE(n, i, v) n = (((v & 63L) << (i * CHOICE_BITSIZE)) | (n & ~(63L << (i * CHOICE_BITSIZE))))

int checkIndex(uint64_t choice, int n, int input)
{
 int i;

 for (i = 0; i < n; i++)
 {
   if (CHOICE_READ(choice, i) == input)
   {
     return i;
   }
 }

 return -1;
}

int main()
{
 uint64_t choice;
 int iter, input, inserted;

 choice = 0;

 for (iter = 0; iter < N_NUMBERS; iter++)
 {
   do
   {
     // ler dados para input
     input = ...

     if (inserted = (checkIndex(choice, iter, input) != -1))
     {
       printf("O valor %d já foi inserido na posicao %d\n", input, inserted);
     }
     else
     {
       CHOICE_WRITE(choice, iter, input);
       printf("O valor %d foi inserido na posicao %d\n", input, iter);
     }
   } while (inserted);
 }

 return 0;
}

ps : isto é uma solução e não uma explicação do que um array faz !!!

pss : correcção de um bug

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Epá, de fato tenho tudo a aprender em C. Embora não consiga interpretar algumas partes desse código serviu-me de motivação. Muito obrigado.

HHHippo, o que fizeste para que nunca te repetisse o número dos 50 valores gerado pelo computador?

Share this post


Link to post
Share on other sites
HappyHippyHippo

verifico com um ciclo se já foi inserido com a função "checkIndex", e se foi inserido, volta a pedir o número


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Se calhar não me expliquei bem, ou então li mal o código. Mas o que não se pode repetir são os números gerados pelo computador. Por exemplo: o PC gera 6 numeros aleatorios entre 1 e 50. Desses, nenhum dos 6 pode ser repetido. O meu dilema está aí, fazer esta questão sem acesso a arrays e mantendo o código o mais pequeno e simples possível.

Depois, dos que o utilizador digitasse (entre um e 50, e aí pode repetir) os que tivessem o mesmo valor que algum dos por ele digitados, ganharia um ponto.

Ainda estou a pensar no que posso fazer sem recorrer a tantos if's.

Share this post


Link to post
Share on other sites
pmg

O Hippo está a usar um "array disfarcado" :)

O objecto que ele usa é um valor do tipo "uint64_t", so que em vez de o tratar como um numero (42, 8 milhoes, etc) trata-o como uma sequencia ordenada de bits (um array de bits).

Para resolveres o teu problema sem arrays e sem "truques", tens de usar tantos if's!

Mas suponho que é esse mesmo o objectivo do exercicio: ver as vantagens no uso de arrays (e nao arranjar truques).


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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

e onde está a dificuldade em pegar no código de leitura dos valores do utilizador e mudar para a escolha aleatória do computador ?

int main()
{
 uint64_t choice, random;
 int iter, input, inserted;

 choice = 0;
 random = 0;

 for (iter = 0; iter < N_NUMBERS; iter++)
 {
   do
   {
     // ler dados para input
     input = ...

     if (inserted = (checkIndex(choice, iter, input) != -1))
     {
       printf("O valor %d já foi inserido na posicao %d\n", input, inserted);
     }
     else
     {
       CHOICE_WRITE(choice, iter, input);
       printf("O valor %d foi inserido na posicao %d\n", input, iter);
     }
   } while (inserted);
 }

 for (iter = 0; iter < N_NUMBERS; iter++)
 {
   do
   {
     // criar valor aleatório com a função rand()
     input = ...

     if (!(inserted = (checkIndex(random, iter, input) != -1)))
     {
       CHOICE_WRITE(random, iter, input);
     }
   } while (inserted);
 }

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Boas pessoal. Tinha acabado o código na segunda, mas não tive tempo de voltar para postá-lo.

Percebi agora que o código tem qualquer coisa que, mesmo eu andando aqui às voltas, não me parece encontrar o erro.

# include <stdio.h>
# include <time.h>
# define PAUSE getch() ; system("cls")
void RANDOMIZE();
void CONFIRMA(int chave_a, int chave_b, int chave_c, int chave_d, int chave_e, int chave_f);
double COMP(int teste, int *chave_a, int *chave_b, int *chave_c, int *chave_d, int *chave_e, int *chave_f);
void PREMIADO(int premio);
int main (void)
{

RANDOMIZE();

return 0;
}
void RANDOMIZE()
{
    srand(time(NULL));

int a = rand()%50+1;
int b = rand()%50+1;
while (a == b) {
a = rand()%50+1;
}
int c = rand()%50+1;
while (a == c || b == c) {
c = rand()%50+1;
}
int d = rand()%50+1;
while (a == d || b == d || c == d) {
d = rand()%50+1;
}
int e = rand()%50+1;
while (a == e || b == e || c == e || d == e) {
e = rand()%50+1;
}
int f = rand()%50+1;
while (a == f || b == f || c == f || d == f || e == f) {
f = rand()%50+1;
}

CONFIRMA(a, b, c, d, e, f);
}
void CONFIRMA(int chave_a, int chave_b, int chave_c, int chave_d, int chave_e, int chave_f)
{
int val1, val2, val3, val4, val5, val6;
double count = 0.0;

puts ("DIGITE VALORES [separados por enter]");
scanf("\n%d%d%d%d%d%d", &val1, &val2, &val3, &val4, &val5, &val6);

    count += COMP(val1, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);
    count += COMP(val2, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);
    count += COMP(val3, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);
    count += COMP(val4, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);
    count += COMP(val5, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);
    count += COMP(val6, &chave_a, &chave_b, &chave_c, &chave_d, &chave_e, &chave_f);

    PREMIADO(count);

printf ("\n\n\t ..:: SORTEIO ::..\n [ %d ] [ %d ] [ %d ] [ %d ] [ %d ] [ %d ] \n\n", chave_a, chave_b, chave_c, chave_d, chave_e, chave_f);

printf ("TIROS: %d %d %d %d %d %d", val1, val2, val3, val4, val5, val6);
printf ("\n\n\t PREMIO DE: %.2f EUROS", count);

PAUSE;
RANDOMIZE();
}
double COMP(int teste, int *chave_a, int *chave_b, int *chave_c, int *chave_d, int *chave_e, int *chave_f)
{
if (teste == *chave_a || teste == *chave_b || teste == *chave_c || teste == *chave_d || teste == *chave_e || teste == *chave_f) {
    printf ("\n\t\t\tNumero coincidente: %d", teste);
    return 10.0;
}
}
void PREMIADO(int premio)
{
(premio == 60 ) ? puts("\n\nPARABENS, VENCEDOR!!!") : printf("\n\nTENTA O JACKPOT NOVAMENTE...");
}

O erro acontece quando: eu acerto um valor, o prémio deveria de ser de 10€ mas ele dá-me o valor de 30€. Não percebo a razão deste output.

Obrigado em avanço pela atenção.

Edited by pmg
Falta LP

Share this post


Link to post
Share on other sites
pmg

Liga os warnings TODOS do teu compilador.

Nao aceites um programa que compile com warnings. Melhora-o de modo a nao apresentar o warning.

Por exemplo, no meu compilador, o teu codigo queixa-se (com um warning) que a funcao srand() term uma declaracao implicita. Para resolver este warning, bastou-me acrescentar o include correcto.


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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.