problème sur un résolveur de sudoku

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je vais aller en DUT informatique et j'ai donc voulu apprendre java et j'ai voulu faire un petit projet. Je voulais faire un résolveur de sudoku. Néanmoins lors de la validation du sudoku il y a une erreur. Une variable booléenne que j'ai mis à true et qui ne changé que si elle respecte une condition mais la variable change sans respecter la condition. J'aimerais avoir votre avis. Le lien du projet est ici. Voici l'extrait problématique:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
for (int[] i:sudoku)
                {
                    //System.out.println("resultat : " + Section_sudoku.validation(i));
                    if (Section_sudoku.validation(i)==true);
                    {
                        verif2=false;
                        System.out.println("a");
                        break boucle_for;
                    }
                }
                System.out.println("etape 2");
                for(int i=0;i<Case_sudoku.max;i++)
                {
                    System.out.println("fg");
                    if(!Section_sudoku.validation(sudoku[i][0],sudoku[i][1],sudoku[i][2],sudoku[i][3],sudoku[i][4],sudoku[i][5],sudoku[i][6],sudoku[i][7],sudoku[i][8]))
                    {
                        verif2=false;
                        System.out.print("b");
                        break boucle_for;
                    }
                }
                for(int i=0;i<Case_sudoku.max;i=i+3)
                {
                    for(int j=0;j<Case_sudoku.max;j=j+3)
                    {
                        if(!Section_sudoku.validation(sudoku[i][j],sudoku[i][j+1],sudoku[i][j+2],sudoku[i+1][j],sudoku[i+1][j+1],sudoku[i+1][j+2],sudoku[i+2][j],sudoku[i+2][j+1],sudoku[i+2][j+2]))
                        {
                            verif2=false;
                            System.out.print("c");
                            break boucle_for;
                        }
                    }
                }
            }
            if (!verif2)
            {
                System.out.println("Erreur: Le sudoku n'est pas conforme");
            }

la fonction correspondante:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    static boolean validation(int ... section)
    {
        boolean validite=true;
        boucle:for(int i=0;i<Case_sudoku.max+1;i++)
        {
            for(int j=i+1;j<Case_sudoku.max;j++)
            {
                //System.out.println("boucle");
                System.out.println("validite: " + validite);
                System.out.println(section[i] + " " + section[j]);
                if (section[i]==section[j] && section[i]!=-1)
                {
                    System.out.println("bla");
                    validite=false;
                    System.out.println("validite2: " + validite);
                    break boucle;
                }
            }
        }
        System.out.println("validite3: " + validite);
        return validite;
    }

ainsi que la sortie console:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
validite: true
4 8
validite: true
4 -1
validite: true
4 2
validite: true
4 -1
validite: true
4 -1
validite: true
4 3
validite: true
4 7
validite: true
4 -1
validite: true
8 -1
validite: true
8 2
validite: true
8 -1
validite: true
8 -1
validite: true
8 3
validite: true
8 7
validite: true
8 -1
validite: true
-1 2
validite: true
-1 -1
validite: true
-1 -1
validite: true
-1 3
validite: true
-1 7
validite: true
-1 -1
validite: true
2 -1
validite: true
2 -1
validite: true
2 3
validite: true
2 7
validite: true
2 -1
validite: true
-1 -1
validite: true
-1 3
validite: true
-1 7
validite: true
-1 -1
validite: true
-1 3
validite: true
-1 7
validite: true
-1 -1
validite: true
3 7
validite: true
3 -1
validite: true
7 -1
validite3: true
a
Erreur: Le sudoku n'est pas conforme
------------------Exception in thread "main" java.lang.NullPointerException
    at sudoku.Sudoku.affiche_sudoku(Sudoku.java:212)
    at PremProg.main(PremProg.java:16)

Merci d'avance

+0 -0

Cette réponse a aidé l'auteur du sujet

Dans ton code, tu as un truc comme ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
for(int i=0;i<Case_sudoku.max;i++)
     {
      // Traitement
     }
 for(int i=0;i<Case_sudoku.max;i=i+3)
    {
     for(int j=0;j<Case_sudoku.max;j=j+3)
          {
           // traitement similaire
          }
    }

Si je ne m'abuse, avec ces boucles, tu traites, chaque ligne, et chaque carré, mais tu ne traites pas les colonnes. C'est peut-être voulu, ou peut-être pas.

+0 -0
Auteur du sujet

Non ce n'est pas voulu mais dans ton extrait du code tu as oublié d'inclure une boucle voici l'extrait complet sans l'erreur

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
            boucle_for:{
                for (int[] i:sudoku) //vérification des lignes
                {
                    //System.out.println("resultat : " + Section_sudoku.validation(i));
                    if (Section_sudoku.validation(i)==true);
                    {
                        verif2=false;
                        System.out.println("a");
                        break boucle_for;
                    }
                }
                System.out.println("etape 2");
                for(int i=0;i<Case_sudoku.max;i++) //vérification des colonnes
                {
                    System.out.println("fg");
                    if(!Section_sudoku.validation(sudoku[0][i],sudoku[1][i],sudoku[2][i],sudoku[3][i],sudoku[4][i],sudoku[5][i],sudoku[6][i],sudoku[7][i],sudoku[8][i]))
                    {
                        verif2=false;
                        System.out.print("b");
                        break boucle_for;
                    }
                }
                for(int i=0;i<Case_sudoku.max;i=i+3) //vérification des cases
                {
                    for(int j=0;j<Case_sudoku.max;j=j+3)
                    {
                        if(!Section_sudoku.validation(sudoku[i][j],sudoku[i][j+1],sudoku[i][j+2],sudoku[i+1][j],sudoku[i+1][j+1],sudoku[i+1][j+2],sudoku[i+2][j],sudoku[i+2][j+1],sudoku[i+2][j+2]))
                        {
                            verif2=false;
                            System.out.print("c");
                            break boucle_for;
                        }
                    }
                }
            }

Édité par eragon12

+0 -0

Avec des commentaires , c'est effectivement mieux ! Surtout quand on cherche un bug, ou qu'on demande à d'autres de trouver un bug.

Ta procédure Validation() renvoie true quand la partie testée est conforme, et false sinon. Et dans la boucle sur les lignes, tu demandes de quitter dès qu'il y a une ligne conforme.

Dans ta fonction validation, ligne 4, tu peux remplacer i<Case_sudoku.max+1 par i<Case_sudoku.max-1 ; ça ne changera rien, mais ce sera plus cohérent.

+0 -0

Désolé pour les commentaires d'habitude je fais des programmes seul.

eragon12

Oula, si tu pars là dessus, tu es mal barré. Vas relire un programme (un minimum complexe) que tu as fais il y a 1 mois, tu comprendras pourquoi je dis ça. Quand on développe, on est dans le truc, on réfléchit à comment fonctionne notre programme, mais une fois passé à autre chose, tu oublies toutes les détails qui expliquent ce que tu fais et pourquoi tu le fais.

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+1 -0

Cette réponse a aidé l'auteur du sujet

Je ne fais pas de Java, mais en lisant la doc, je ne crois pas qu'un if prenne un point-virgule. Faute de copie ? (l4/5 de ton code)

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -0

Dans mon précédent message, je disais : Ta procédure Validation() renvoie true quand la partie testée est conforme, et false sinon. Et dans la boucle sur les lignes, tu demandes de quitter dès qu'il y a une ligne conforme.

Si j'ai bien lu, ce serait une bonne raison de bug. Tu as vérifié ce point ?

+0 -0
Auteur du sujet

Pour le if c'est une faute je viens de le corriger et pour la condition du if c'est bien l'inverse, j'avais testé en inversant la condition pour voir si cela changerais quelque chose et j'avais oublié de changer. Après rectification du code, le problème est parti mais un autre est venu. Voici la fin de la sortie console (le début n'a pas changé):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
validite: true
-1 -1
validite: true
-1 8
validite: true
-1 4
validite: true
-1 8
validite: true
-1 4
validite: true
8 4
validite3: true
Exception in thread "main" java.lang.NullPointerException
    at sudoku.Case_sudoku.<init>(Case_sudoku.java:39)
    at sudoku.Sudoku.<init>(Sudoku.java:65)
    at PremProg.main(PremProg.java:15)

Je vais chercher la solution (le problème viens de l'initialisation de l'itérateur) et commenter le code je n'ai pas pu le faire hier soir

Édité par eragon12

+0 -0
Auteur du sujet

J'ai trouvé où est le problème mais je ne sais pas quel est le problème

1
2
3
4
5
            for(int i=1;i<10;i++)
            {
                possibilite.add(i);
            }
            it = possibilite.listIterator();

J'ai regardé des exemples où cela est écrit donc je ne vois pas de où viens le problème

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte