Ir ao conteúdo
  • Cadastre-se

Lógica do bingo (random, sem repetição)


Renan Jacomassi

Posts recomendados

Oi pessoal, boa tarde.

 

  • Fiz um código para o problema abaixo (em azul), mas parece que minha lógica está com algum furo. Já revisei, e não entendo o porque ainda tenho números repetidos. Alguém consegue me dar uma força? Obrigado!!

 

  • A lógica que eu pensei do código é a seguinte: Eu preencho um campo da matriz, com "i" e "j" e comparo com os anteriores, através de outro FOR, com "k" "z". Caso este campo que acabei de preencher seja igual a um campo anterior, eu volto uma posição  (j = j -1) e começo o FOR novamente. Para isso eu utilizei 4 FOR`s (um dentro do outro, para entrar na matriz e fazer a comparação), 4 variáveis (i,j,k,z) e uma "aux" que serve como minha condicional para parada. 

 

  • Importante: Eu fiz o código com uma matriz 4x4 para testá-lo. Depois vou replicar para uma matriz 99x99.

 

  • Segue o problema: Faça um programa para gerar automaticamente números entre 0 e 99 de uma cartela de bingo. Sabendo que cada cartela deverá conter 5 linhas e 5 números, gere estes dados de modo a não ter números repetidos dentro da cartela.

 

  • Segue o Código: 

 

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

int main () {

	int M[4][4], i,j,k,z, aux = 0;

	srand(time(NULL));
	
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
		
			aux = 0;
			M[i][j] = 1+ rand() % 16;
	
			for(k = i; k >= 0; k--){

				if(aux == 1){
					j = j - 1;
					break;
				}

				for(z = j; z >= 0; z--){
					if((M[k][z] == M[i][j] && k != i && z != j)){
						aux = 1;
						break;
					}
				}
			}
		}
	}
			

	printf("\n\n\n\n");

	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			printf("%d\t", M[i][j]);
		}
		printf("\n");
	}

	return 0;
}
Link para o comentário
Compartilhar em outros sites

Não entendi muito bem o que você tentou fazer, mas mudei o pedaço de verificar se o número já havia sido sorteado e parece que funciona.

 

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

int main () {

	int M[4][4], i,j,k,z, aux;

    for(i=0;i<4;i++)
		for(j=0;j<4;j++)
            M[i][j]=0;

	srand(time(NULL));

	for(i=0;i<4;i++){
		for(j=0;j<4;j++){

            aux=1;
            while(aux==1){
                aux=0;
                //Sorteia o numero
                M[i][j] = 1+ rand() % 16;

                //Verifica se o numero e repetido
                for(k=0;k<4&&aux==0;k++){
                    for(z=0;z<4&&aux==0;z++){
                        if(M[i][j]==M[k][z]&&(i!=k||j!=z)){
                            aux=1;
                        }
                    }
                }
                //Se for repetido sorteia denovo

            }

		}
	}


	printf("\n\n\n\n");

	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			printf("%d\t", M[i][j]);
		}
		printf("\n");
	}

	return 0;
}

Podia usar DO WHILE em vez de WHILE, mas eu particularmente prefiro o WHILE sozinho rsrs.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!