Ir ao conteúdo
  • Cadastre-se

C Validação de Sudoku em C.


Posts recomendados

Bom dia, estou fazendo um Sudoku em C, e preciso de ajuda para fazer as validações de quadrante, linha e coluna, sou iniciante e aceito qualquer ajuda 🙂.

Em resumo, o usuário escolhe a opção de nível do jogo, onde o tabuleiro já vem predisposto. Depois do while preciso começar a validadação, mas não consigo visualizar uma forma de fazê-lo com for, for e if, penso que depois que conseguir fazer uma vez dá pra aplicar em forma de função e só chamar nos outros dois níveis. Obrigada pela ajuda.

Segue a parte importante do código:

 

system("cls");
            printf("A opção escolhida - Fácil.\n");
            tabuleiro_f((tabuleiro[0][2]=9)&&(tabuleiro[0][4]=1)&&(tabuleiro[0][5]=5)&&(tabuleiro[1][3]=3)&&(tabuleiro[2][6]=9)&&
                        (tabuleiro[2][7]=7)&&(tabuleiro[2][8]=8)&&(tabuleiro[3][0]=1)&&(tabuleiro[3][3]=8)&&(tabuleiro[3][6]=7)&&
                        (tabuleiro[3][8]=4)&&(tabuleiro[4][1]=3)&&(tabuleiro[4][2]=7)&&(tabuleiro[4][5]=2)&&(tabuleiro[4][7]=5)&&
                        (tabuleiro[5][0]=8)&&(tabuleiro[5][3]=4)&&(tabuleiro[5][6]=2)&&(tabuleiro[5][8]=9)&&(tabuleiro[6][6]=6)&&
                        (tabuleiro[6][7]=9)&&(tabuleiro[6][8]=2)&&(tabuleiro[7][3]=9)&&(tabuleiro[8][2]=5)&&(tabuleiro[8][4]=4)&&							(tabuleiro[8][5]=6));
            printf("Digite a linha que deseja preencher:\n");
            scanf("%d", &l);
            printf("Digite a coluna que deseja preencher:\n");
            scanf("%d", &c);
            printf("Digite o valor que deseja preencher na linha e coluna desejada:\n");
            scanf("%d", &valor);
            tabuleiro[l][c]=valor;
            do
            {
                system("cls");
                tabuleiro_f(tabuleiro[l][c]);
                printf("Caso deseje verificar os valores inseridos, nas próximas perguntas digite '10':\n");
                printf("Digite a linha que deseja preencher:\n");
                scanf("%d", &l);
                printf("Digite a coluna que deseja preencher:\n");
                scanf("%d", &c);
                printf("Digite o valor que deseja preencher na linha e coluna desejada:\n");
                scanf("%d", &valor);
                tabuleiro[l][c]=valor;
            }
            while((l!=10)&&(c!=10)&&(valor!=10));  // termina preenchimento

 

Link para o comentário
Compartilhar em outros sites

Em 08/12/2021 às 12:37, Muniky A. da Silva disse:

mas não consigo visualizar uma forma de fazê-lo com for, for e if, penso que depois que conseguir fazer uma vez dá pra aplicar em forma de função e só chamar nos outros dois níveis.

 

Sim, tem razão. 

 

Poste o programa todo, algo compilável.

 

Escreva em torno dos dados

 

Use uma estrutura para representar a grade e as sub-grades

 

16 minutos atrás, RPGStreamer disse:

Tem certeza que não pode ser C++? Eu nem consigo enxergar direito o mundo sem OOP

 

OOP é uma disciplina, uma filosofia. Existia antes de C++. Pode usar esses conceitos em C ou qualquer linguagem. 

Link para o comentário
Compartilhar em outros sites

@Muniky A. da Silva Para validar uma linha ou uma coluna:

 

Crie um flag e inicialize com 1;

 

crie um for de 1 a 9 para definir os números a serem procurados e coloque como condição também "&& flag";

 

já dento do for, mude o valor do flag para 0;

 

crie um segundo for de 0 a 8 para percorrer o array, mantendo a linha ou coluna com valor fixo dependendo do caso;

 

crie um if, e se o valor no índice atual do array for igual o valor procurado (contador do primeiro for), mude o valor do flag para 1;

 

feche o if e os fors.

 

Pronto, se o valor de flag ainda for 1, os números de 1 a 9 foram encontrados.

 

Para procurar em um quadrante o procedimento é quase o mesmo, mas use 3 fors sendo os 2 os dois mais internos para percorrer a linha e coluna (de 0 a 2);

Link para o comentário
Compartilhar em outros sites

5 horas atrás, RPGStreamer disse:

@arfneto Fica difícil sem overloading, (polimorfismo em geral), herança, encapsulamento, e etc;

 

overloading nesse caso nada iria acrescentar. polimorfismo e herança acabam sempre em uma VFT, conhecida dos programadores C desde os anos 70. E assim sempre foi usada em C. void* e cast são um mecanismo de overload, como qualquer chamada a qsort() em C pode mostrar.

 

encapsulamento é mais uma filosofia que um recurso da linguagem. A bem da verdade qualquer API ou mesmo a biblioteca padrão são um encapsulamento.

 

claro que C++ é muito mais expressiva que C e em C++ é muito mais simples criar modelos e desenvolver e especializar classes, mas acho que o tempo em que se podia escolher a linguagem para programar algo se foi há muitos anos. Quem escolhe hoje é o comprador, o orientador, a filosofia da empresa, os contratos, a equipe, o framework...

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto Nós todos sabemos que no final o código vira instruções de máquina. Programar diretamente nelas não é viável. É necessário um nível mais alto de abstração pra que o ser humano trabalhe melhor. OOP oferece um bom nível de abstração que C não oferece. Não existem métodos, por exemplo. Não é importante nesse caso saber das virtual tables, mangling, etc. Nós estamos no nível de resolver o problema.

Link para o comentário
Compartilhar em outros sites

Em 10/12/2021 às 23:23, RPGStreamer disse:

Nós todos sabemos que no final o código vira instruções de máquina. Programar diretamente nelas não é viável. É necessário um nível mais alto de abstração pra que o ser humano trabalhe melhor

 

off-topic

 

Não sei dizer o que "nós todos sabemos". Sei poucas coisas, isso eu sei. 

 

No entanto eu posso te dizer que 

  • se "programar em instruções de máquina" seria algo como programar em assembler é perfeitamente viável.
  • o nível de abstração pode não estar na linguagem mas sim na composição dos dados. De nada adianta reclamar se apenas se pode programar em C ou Python ou FORTRAN ou COBOL em um certo programa, e não tem certas facilidades.  É o que se tem para o momento. Raramente se pode escolher. Por certo raramente mesmo em um curso de programação na universidade.
Em 10/12/2021 às 23:23, RPGStreamer disse:

OOP oferece um bom nível de abstração que C não oferece

 

OOP oferece uma filosofia apenas. E linguagens oferecem mais ou menos disso em cada caso.

 

Em 10/12/2021 às 23:23, RPGStreamer disse:

Não existem métodos, por exemplo

 

Que significa isso?

 

Em 10/12/2021 às 23:23, RPGStreamer disse:

Não é importante nesse caso saber das virtual tables, mangling, etc.

 

Sim, é importante. um objeto em C pode e sempre foi encapsulado usando essas coisas. O mesmo em C++. Uma classe --- o objeto em C --- é descrita e implementada usando precisamente isso. E usando isso em C se pode criar as mesmas "classes". Um construtor retorna isso: ponteiros para função. Herança é implementada através de ponteiros para função. Classes virtuais são implementadas através de VFT, tabelas de ponteiros pra função. Construtores de cópia, move constructors, tudo pode ser expresso assim em C.

 

Um void* pode ser visto como uma opção de overload em C. E disponível e usado em C++ por vezes.
 

Em 10/12/2021 às 23:23, RPGStreamer disse:

Nós estamos no nível de resolver o problema.

 

Não sei se estamos no mesmo nível de solução de algo.

 

off-topic

 

Se precisa de algum exemplo abra um tópico e posso usar algum que eu tenha escrito antes.

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...