problème sur un résolveur de sudoku

a marqué ce sujet comme résolu.

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

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.

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

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.

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 ?

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

+0 -0

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

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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