Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dexter's Lab

Sorteio totoloto [Ajuda]

Mensagens Recomendadas

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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por pmg
Falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.