Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème lecture de fichier .txt

    16 mai 2022 à 19:26:32

    EDIT : Il aura fallut que j'écrive ici pour enfin allumer sur certains trucs! Par contre, j'ai encore besoin de vous! ;)

    Bonjour à vous tous!

    Je suis nouvelle dans la programmation Java et j'aurais besoin de votre aide pour un projet.

    Je dois faire un Sudoku qui utilise des fichiers .txt et je dois le transformer en tableau 9x9.

    J'ai déjà fait un Sudoku mais qui utilise la méthode Random, pensez-vous que je peux simplement modifier mon programme pour ajouter les chiffres que je veux?

    EDIT : J'ai changé la Random pour Scanner et ça fonctionne.

    Deuxième question : mes fichiers .txt sont comme ceci :

    Contenu du fichier partie2.txt
    
    016 112 214 319 417 511 618 713 815 027 129 221 328 425 523 626 722 824 033 138 235 332 436 534 631 737 839 048 141 243 347 449 545 644 746 842 059 157 252 351 454 556 655 758 853 065 164 266 363 462 568 667 769 861 074 173 279 376 471 577 672 775 878 081 186 288 385 483 582 689 784 887 092 195 297 394 498 599 693 791 89
    • x: numéro de la ligne.
    • y: numéro de la colonne.
    • z: valeur

    Je ne trouve pas comment je peux introdire dans mon code que 014 c'est x=0 y=1 et z=4.

    EDIT : En utilisant Scanner, ça fonctionne en partie.

    Pouvez-vous m'aider? :euh:

    Merci :D

    EDIT : J'avais oublié mon code!

    package com.company;
    import javax.imageio.IIOException;
    import java.io.*;
    import java.util.Random;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) throws FileNotFoundException {
            File FichierNombre1 = new File("partie2.txt");
            try (
                    FileReader Nombre1 = new FileReader(FichierNombre1);
                    BufferedReader in = new BufferedReader(Nombre1);
            )
            {
                System.out.println(in.readLine());
            } catch (IOException e){
                System.out.println("Fichier introuvable");
            }
    
            int p = 0;
            Scanner r = new Scanner(FichierNombre1);
            int i1=r.nextInt(8);
            while (p == 0) {//Ouverture de notre boucle while.
                int x = i1, v = 0;
                int[][] a = new int[9][9];//Notre tableau sera de 9x9.
                int[][] b = new int[9][9];
                for (int i = 0; i < 9; i++) {
                    for (int j = 0; j < 9; j++) {
                        if ((x + j + v) <= 9)
                            a[i][j] = j + x + v;
                        else
                            a[i][j] = j + x + v - 9;
                        if (a[i][j] == 10)
                            a[i][j] = 1;
                    }
                    x += 3;
                    if (x >= 9)
                        x = x - 9;
                    if (i == 2) {
                        v = 2;
                        x = i1;
                    }
                    if (i == 5) {
                        v = 3;
                        x = i1;
                    }
                }
                int opt;
                Scanner in = new Scanner(System.in);
                System.out.println("Voulez-vous jouer? 1 = Oui  2 = Non");
                opt = in.nextInt();
                switch (opt) {
                    case 1 -> {//On découvre tous les chiffres du sudoku proposé.
                        b[0][0] = a[0][0];
                        b[0][1] = a[0][1];
                        b[0][2] = a[0][2];
                        b[0][3] = a[0][3];
                        b[0][4] = a[0][4];
                        b[0][5] = a[0][5];
                        b[0][6] = a[0][6];
                        b[0][7] = a[0][7];
                        b[0][8] = a[0][8];
                        b[1][0] = a[1][0];
                        b[1][1] = a[1][1];
                        b[1][2] = a[1][2];
                        b[1][3] = a[1][3];
                        b[1][4] = a[1][4];
                        b[1][5] = a[1][5];
                        b[1][6] = a[1][6];
                        b[1][7] = a[1][7];
                        b[1][8] = a[1][8];
                        b[2][0] = a[2][0];
                        b[2][1] = a[2][1];
                        b[2][2] = a[2][2];
                        b[2][3] = a[2][3];
                        b[2][4] = a[2][4];
                        b[2][5] = a[2][5];
                        b[2][6] = a[2][6];
                        b[2][7] = a[2][7];
                        b[2][8] = a[2][8];
                        b[3][0] = a[3][0];
                        b[3][1] = a[3][1];
                        b[3][2] = a[3][2];
                        b[3][3] = a[3][3];
                        b[3][4] = a[3][4];
                        b[3][5] = a[3][5];
                        b[3][6] = a[3][6];
                        b[3][7] = a[3][7];
                        b[3][8] = a[3][8];
                        b[4][0] = a[4][0];
                        b[4][1] = a[4][1];
                        b[4][2] = a[4][2];
                        b[4][3] = a[4][3];
                        b[4][4] = a[4][4];
                        b[4][5] = a[4][5];
                        b[4][6] = a[4][6];
                        b[4][7] = a[4][7];
                        b[4][8] = a[4][8];
                        b[5][0] = a[5][0];
                        b[5][1] = a[5][1];
                        b[5][2] = a[5][2];
                        b[5][3] = a[5][3];
                        b[5][4] = a[5][4];
                        b[5][5] = a[5][5];
                        b[5][6] = a[5][6];
                        b[5][7] = a[5][7];
                        b[5][8] = a[5][8];
                        b[6][0] = a[6][0];
                        b[6][1] = a[6][1];
                        b[6][2] = a[6][2];
                        b[6][3] = a[6][3];
                        b[6][4] = a[6][4];
                        b[6][5] = a[6][5];
                        b[6][6] = a[6][6];
                        b[6][7] = a[6][7];
                        b[6][8] = a[6][8];
                        b[7][0] = a[7][0];
                        b[7][1] = a[7][1];
                        b[7][2] = a[7][2];
                        b[7][3] = a[7][3];
                        b[7][4] = a[7][4];
                        b[7][5] = a[7][5];
                        b[7][6] = a[7][6];
                        b[7][7] = a[7][7];
                        b[7][8] = a[7][8];
                        b[8][0] = a[8][0];
                        b[8][1] = a[8][1];
                        b[8][2] = a[8][2];
                        b[8][3] = a[8][3];
                        b[8][4] = a[8][4];
                        b[8][5] = a[8][5];
                        b[8][6] = a[8][6];
                        b[8][7] = a[8][7];
                        b[8][8] = a[8][8];
                        p++;
                    }
                    case 2 -> {
                        System.out.println("Bonne journée");
                        p++;
                        continue;
                    }
                    default -> {
                        System.out.println("Sélectionnez une option svp");
                        continue;
                    }
                }
                for (int y = 0; y < 9; y++) {
                    for (int z = 0; z < 9; z++) {
                        System.out.print(b[y][z] + " ");
                    }
                    System.out.println("");
                }
            }
        }
    }

    Et cela me donne ceci :

    016 112 214 319 417 511 618 713 815 027 129 221 328 425 523 626 722 824 033 138 235 332 436 534 631 737 839 048 141 243 347 449 545 644 746 842 059 157 252 351 454 556 655 758 853 065 164 266 363 462 568 667 769 861 074 173 279 376 471 577 672 775 878 081 186 288 385 483 582 689 784 887 092 195 297 394 498 599 693 791 89
    Voulez-vous jouer? 1 = Oui  2 = Non
    1
    
    5 6 7 8 9 1 11 12 13 
    8 9 1 2 3 4 5 6 7 
    2 3 4 5 6 7 8 9 1 
    7 8 9 1 11 12 13 14 15 
    1 2 3 4 5 6 7 8 9 
    4 5 6 7 8 9 1 2 3 
    8 9 1 11 12 13 14 15 16 
    2 3 4 5 6 7 8 9 1 
    5 6 7 8 9 1 2 3 4 
    
    Process finished with exit code 0

    Qu'es-ce que je dois rajouter pour que si cela ne ressemble pas à un Sudoku, il affiche une erreure?

    Merci encore :D


    -
    Edité par AbridgedRiver76 16 mai 2022 à 19:58:19

    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2022 à 3:03:05

      Alors, je ne connais pas Java, mais il ressemble à d'autres langages comme C ou C++
      Si j'ai bien compris, ton fichier contient 38 nombres de 0 à 999 (ou plutôt 888)
      Le premier des 3 chiffres du nombre représente x, ...
      Est-ce qu'il y a le modulo en Java?
      x = nombre / 100;   // division entière
      y = (nombre / 10) % 10;
      z = nombre % 10;

      Pour tester, il faut 0 <= x < 9 et 0 <= y < 9 et 1 <= z <= 9.

      En principe, on ne met pas 0 dans une case, c'est 0 par défaut, alors:

      if(0 <= x && x < 9 && 0 <= y && y < 9 && 1 <= z && z <= 9) {

          // faire le sudoku

      } else {

          // message d'erreur

          // exit ...

      }

      edit: je t'ai un peu trop simplifié les choses.

      Avant la lecture, tu peux initialiser une variable  erreur = 0

      Si c'est correct, tu fais a[x][y] = z

      Sinon, tu fais  erreur++;

      Quand tu as tout lu et avant d'essayer de résoudre, tu testes si  erreur == 0  ou pas
      Pour recopier  a  dans  b ,pourquoi ne peux-tu pas faire:
      for(int i = 0; i < 9; i++) {
          for(int j = 0; j < 9; j++) {
              b[i][j] = a[i][j];
          }
      }

      -
      Edité par PierrotLeFou 17 mai 2022 à 3:52:00

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        17 mai 2022 à 7:41:33

        Autre solution, lire les positions des chiffres sous forme de chaînes de 3 caractères, au lieu d'entiers.

        Merci de remplacer les 81 affectations par une boucle, ca fait mal aux yeux. Et il faut décomposer ce main qui fait tout en méthodes qui  ne font qu'une chose (dialogue utilisateur, lecture des données dans fichier, affichage, exécution d'une partie,...), mais le font bien.

        Programmer, c'est realiser un programme qui fait ce qu'on veut, en combinant les trucs de base que nous fournit le langage.  En general il en faut un certain nombre pour faire le boulot, alors la difficulté c'est de construire ça sans s'y perdre.

        Et pour ça, il faut organiser le code. Le découpage en méthodes, c'est une manière d'arriver rapidement à ce que ça marche. Pas un truc pour faire joli qu'on se garde pour la fin, le jour où ça marchera.

        -
        Edité par michelbillaud 17 mai 2022 à 8:59:57

        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2022 à 9:51:58

          Bonjour, 

          j'imagine le temps pris pour ecrire ses affectation

          scanner.nextLine() pour avoir la ligne ( je suppose que tout est sur la meme ligne)

          ensuite tu fais un split par espace sur la chaine retourné car si j'ai bien lu c'est sous le format xyz xyz xyz....

          ensuite tu fais une boucle sur le résultat du String.split(" ")

          sur chaque string retourné un ta_chaine.toCharArray() pour le passer en tableau de caractère et donc les indices 0 1 et 3 contiendrait x y et z 

          edit : les indices 0-1-2

          ca marchera uniquement si chacun des x y z font toujours 1 caractères je ne connais pas sudoku mais je pense vu ce que tu as mis que 1 caractère suffit

          -
          Edité par zvheer 17 mai 2022 à 9:54:58

          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2022 à 12:20:22

            Exemple de démarrage de projet.

            Au départ on ne s'embête pas avec un fichier, on charge la grille à partir d'une chaine.Et on la fait écrire pour vérifier.

               public static void main(String[] args) {
                    var donnees = "001 016 325 632 551 889";
                   
                    var grille = new int[9][9];
                    remplir_grille(grille, donnees);
                    afficher_grille(grille);
                }
            

            On prendra les données dans un fichier plus tard.

            Un Scanner peut prendre ses données dans une chaîne, pas seulement dans un fichier. Ne nous en privons pas

                /**
                 * Ajoute dans la grille les valeurs indiquées par la chaine de données :
                 * pour chaque case un entier avec son numero de ligne et de colonne 
                 * entre 0 et 8, et la valeur entre 1 et 9.
                 * @param grille
                 * @param donnees 
                 */
                private static void remplir_grille(int[][] grille, String donnees) {
                    var scanner = new Scanner(donnees);
                    while (scanner.hasNextInt()) {
                        var element = scanner.nextInt();
                        var l = element / 100;
                        var c =(element / 10) % 10;
                        var v = element % 10;
                        grille[l][c] = v;
                    }
                }
            

            Remarque : on appelle les numéros de ligne et de colonnes l et c, parce que c'est plus simple à comprendre que i et j.

            Pour l'affichage on se permet des fantaisies, une barre de séparation horizontale / verticale toutes les 3 cases.

            On met un point pour les cases qui ont la valeur 0 (qui représentent une case vide)

                private static void afficher_grille(int[][] grille) {
                    final String separation = "+---------+---------+---------+";
                    System.out.println(separation);
                    for (int l = 0; l < 9; l++) {
                        System.out.print("|");
                        for (int c = 0; c < 9; c++) {
                            if (grille[l][c] == 0) {
                                System.out.print(" . ");
                            } else {
                                System.out.format(" %d ", grille[l][c]);
                            }
                            if (c % 3 == 2) {
                                System.out.print("|");
                            }
                        }
                        System.out.println();
                        if (l % 3 == 2) {
                            System.out.println(separation);
                        }
                    }
                }


            Résultat

            +---------+---------+---------+
            | 1  6  . | .  .  . | .  .  . |
            | .  .  . | .  .  . | .  .  . |
            | .  .  . | .  .  . | .  .  . |
            +---------+---------+---------+
            | .  .  5 | .  .  . | .  .  . |
            | .  .  . | .  .  . | .  .  . |
            | .  .  . | .  .  1 | .  .  . |
            +---------+---------+---------+
            | .  .  . | 2  .  . | .  .  . |
            | .  .  . | .  .  . | .  .  . |
            | .  .  . | .  .  . | .  .  9 |
            +---------+---------+---------+


            ---

            à part ça tu nous a balancé du code, mais tu ne nous a pas dit ce qu'il était censé faire exactement. Vérifier le contenu d'un fichier de données ? c-a-d que toutes les cases y sont indiquées une fois et une seule, avec un contenu entre 1 et 9 ?

            -
            Edité par michelbillaud 17 mai 2022 à 12:24:31

            • Partager sur Facebook
            • Partager sur Twitter
              17 mai 2022 à 15:12:09

              @michelbillaud:
              AbridgedRiver76parle bien d'un Sudoku.
              Il serait souhaitable d'apprendre et de comprendre la récursivité.
              Il ne s'agit pas pour l'instant de faire du code sophistiqué. Une simple force brute suffira.
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                17 mai 2022 à 15:46:04

                Je ne vois nulle part écrit qu'il s'agit de faire un programme qui

                • Résoud un problème
                • Ou permet à un joueur de faire une partie (apparemment le fichier contient les 81 cases)
                • Ou de construire une grille problème à partir d'une solution.
                • Ou autre chose ?

                "Faire un sudoku", c'est vague. Si on ne sait pas quel est le probleme, c'est hasardeux de proposer des indications pour la solution.

                -
                Edité par michelbillaud 17 mai 2022 à 15:48:09

                • Partager sur Facebook
                • Partager sur Twitter
                  17 mai 2022 à 17:37:49

                  Nous attendrons que AbridgedRiver76 nous précise son problème. :)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    17 mai 2022 à 17:47:48

                    > Qu'es-ce que je dois rajouter pour que si cela ne ressemble pas à un Sudoku, il affiche une erreure?

                    if (! ressemble_sudoku(cela)) {
                        System.out.println("une erreure");
                    }
                    

                    Faudrait juste savoir qui est "cela", et ce qu'on entend exactement par "ressembler à un Sudoku".

                    -
                    Edité par michelbillaud 17 mai 2022 à 17:49:36

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 mai 2022 à 19:45:01


                      AbridgedRiver76 a écrit:

                      Je dois faire un Sudoku qui utilise des fichiers .txt et je dois le transformer en tableau 9x9.

                      bon juste une petite remarque pourquoi ne pas utiliser csv au lieu de txt tu peux regarder opencsv pour java mais si tu est debutant je ne sais si tu vas sortir avec cet lib ,  justement csv va resoudre ta plus grande partit de ton probleme donc moi je ne conseil opencsv bien qu'il faudrait apprendre a utilise un package manager pour java et a l'installer et bien sur a l'utiliser 

                      une autre remarque : dans le milieu professionnel il faudra apprendre (malheuresement chers francophone) a parler anglais et a coder en anglais  

                      -
                      Edité par TheSmiley 18 mai 2022 à 8:47:41

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mai 2022 à 0:49:00

                        Je ne vois pas l'intérêt d'utiliser un fichier CSV. Un fichier .txt se gère très facilement.
                        Sa ligne est un peu longue. J'espère que son éditeur peut la prendre.
                        Avec Bloc-Notes (Notepad) sur Windows, on peut gérer beaucoup plus long.

                        On peut également utiliser le format suivant que j'ai parfois rencontré sur certains sites:
                        4...3.......6..8..........1....5..9..8....6...7.2........1.27..5.3....4.9........
                        On linéarise la grille de telle sorte que les positions (i*9, i*9+8) représentent une ligne (i=0 à 8)
                        Pour un débutant, ce n'est pas si mauvais d'écrire en français.
                        Ça évite d'utiliser les mots clés du langage comme variable. Par exemple: new
                        Ou un fichier copy.py en Python ...

                        -
                        Edité par PierrotLeFou 18 mai 2022 à 0:59:08

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          18 mai 2022 à 8:48:26

                          c'est a dire qu'avec une lib csv java, elle va checker si il y a le meme nombre de colone dans chaque line ce qui te facilite le travail pour checker si c'est un sudoku 

                          TheSmiley a écrit:

                          une autre remarque : dans le milieu professionnel il faudra apprendre (malheuresement chers francophone) a parler anglais et a coder en anglais  

                          -
                          Edité par TheSmiley il y a moins de 5s


                          dans le milieu professionel:)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 mai 2022 à 15:20:19

                            PierrotLeFou a écrit:

                            On peut également utiliser le format suivant que j'ai parfois rencontré sur certains sites:
                            4...3.......6..8..........1....5..9..8....6...7.2........1.27..5.3....4.9........

                            Si on rajoute l'idée d'ignorer tous les caractères sauf les points et les chiffres, ça permet de présenter les données sous une forme tout à fait naturelle

                            4...3....
                            ...6..8..
                            ........1
                            ....5..9.
                            .8....6..
                            .7.2.....
                            ...1.27..
                            5.3....4.
                            9........

                            (Visuel :    9 lignes de 9 caractères)

                            et même

                            +---------+---------+---------+
                            | 1  6  . | .  .  . | .  .  . |
                            | .  .  . | .  .  . | .  .  . |
                            | .  .  . | .  .  . | .  .  . |
                            +---------+---------+---------+
                            | .  .  5 | .  .  . | .  .  . |
                            | .  .  . | .  .  . | .  .  . |
                            | .  .  . | .  .  1 | .  .  . |
                            +---------+---------+---------+
                            | .  .  . | 2  .  . | .  .  . |
                            | .  .  . | .  .  . | .  .  . |
                            | .  .  . | .  .  . | .  .  9 |
                            +---------+---------+---------+


                            (Visuel : une grille décorée, avec des tirets, des "pipes" etc comme en produit la méthode afficher_grille montrée plus haut).

                            Pas très compliqué à faire, une fois résolue la lecture d'un fichier caractère par caractère (bufferedReader + boucle sur read()

                                private static void lire_grille(int[][] grille, String chemin) 
                                                       throws FileNotFoundException, IOException {
                                    var reader = new BufferedReader(new FileReader(chemin));
                                    for (int l = 0; l < 9; l++) {
                                        for (int c = 0; c < 9; c++) {
                                            while (true) {
                                                var ch = reader.read();
                                                System.out.println("car " + ch);
                                                if (ch == '.') {
                                                    grille[l][c] = 0;
                                                    break;
                                                } else if (Character.isDigit(ch)) {
                                                    grille[l][c] = ch - '0';
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }


                            @TheSmiley "ce qui te facilite le travail" : please show the code.



                            -
                            Edité par michelbillaud 18 mai 2022 à 17:41:31

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 mai 2022 à 15:25:57

                              Je parlais de la ssaisie et non de l'affichage.
                              C'est vrai que 9 lignes de 9 colonnes c'est à la fois très visuel et facile à lire.

                              On pourrait entrer des 0 qui ne sont pas valides ou des lettres. Un fichier CSV ne règlerait pas le problème.

                              -
                              Edité par PierrotLeFou 18 mai 2022 à 17:31:36

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                23 mai 2022 à 4:14:33

                                michelbillaud a écrit:

                                ---

                                à part ça tu nous a balancé du code, mais tu ne nous a pas dit ce qu'il était censé faire exactement. Vérifier le contenu d'un fichier de données ? c-a-d que toutes les cases y sont indiquées une fois et une seule, avec un contenu entre 1 et 9 ?

                                Effectivement, j'ai omis quelques informations! Je vais donc vous copier-coller toutes les informations que j'ai :)

                                Problème

                                Dans un jeu de Sudoku, nous devons re-construire une grille comprenant 9 rangées et 9 colonnes. Chaque rangée et chaque colonne doit contenir tous les entiers de 1 à 9.

                                Vous devez créer un logiciel qui permet de charger des grilles de Sudoku à partir de fichiers, de manipuler les grilles (placements, vérifications), puis enfin de reproduire de nouveau les grilles soit à l’écran soit dans des fichiers. Les fichiers de Sudoku comportent une suite de triplets de chiffres séparés par des espaces, où chaque triplet correspond à :

                                • x: numéro de la ligne.
                                • y: numéro de la colonne.
                                • z: valeur

                                En informatique, on numérote le plus souvent des colonnes et des rangées en commençant par zéro.

                                Exemples:

                                Contenu du fichier partie1.txt
                                001 012 023 034 045 056 067 078 089 102 113 124 135 146 157 168 179 181 203 214 225 236 247 258 269 271 282 304 315 326 337 348 359 361 372 383 405 416 427 438 449 451 462 473 484 506 517 528 539 541 552 563 574 585 607 618 629 631 642 653 664 675 686 708 719 721 732 743 754 765 776 787 809 811 822 833 844 855 866 877 888

                                Contenu du fichier partie2.txt
                                016 112 214 319 417 511 618 713 815 027 129 221 328 425 523 626 722 824 033 138 235 332 436 534 631 737 839 048 141 243 347 449 545 644 746 842 059 157 252 351 454 556 655 758 853 065 164 266 363 462 568 667 769 861 074 173 279 376 471 577 672 775 878 081 186 288 385 483 582 689 784 887 092 195 297 394 498 599 693 791 89

                                Contenu du fichier partie3.txt
                                014 116 218 313 411 517 615 712 819 022 127 225 324 428 529 623 726 821 031 133 239 335 436 532 637 734 838 045 148 246 349 447 541 642 743 844 057 159 252 356 454 553 651 758 855 063 161 264 362 465 568 669 767 866 079 174 273 371 472 576 678 775 877 086 182 287 388 489 585 684 781 883 098 195 291 397 493 594 696 799 892

                                Dans ces exemples, les données ne sont pas nécessairement correctes. C’est votre travail de créer un programme qui peut traiter les erreurs.

                                Fonctionnalités/classes demandées Votre programme doit faire trois opérations spécifiques:

                                1. Charger un fichier contenant des données selon le format spécifié (une suite de triplets de chiffres séparés par des espaces). Vous pouvez choisir l’approche que vous préférez. Le fichier peut être récupéré en ligne, par l’ouverture d’un fichier sur votre disque ou par l’entrée standard (<tt>stdin</tt>). Votre code doit gérer les erreurs de lecture.
                                2. Valider que le ficher correspond à un tableau Sudoku valable. C’est-à-dire qu’il doit correspondre à un tableau 9×9 où chaque chiffre de 1 à 9 apparaît une seule fois par colonne et une seule fois par rangée. Pour les fins de ce travail, nous n’exigeons pas que chaque sous-grille de 3×3 contienne tous les chiffres de 1 à 9 (vous pouvez cependant faire cette vérification supplémentaire si vous le souhaitez). En cas d’erreur, votre programme doit générer une exception.
                                3. Votre programme doit ensuite appliquer une transposition au tableau correspondant à un calcul de matrice transposée et afficher le résultat à l’écran. Au lieu de l’afficher à l’écran, vous (en tant que programmeur) pouvez l’enregistrer comme nouveau fichier ou utiliser un autre moyen de transmission. Choisissez l’approche qui vous plaît le plus en tant que programmeur. Vous devez tester votre solution avec plus d’une grille; en particulier, incluez une grille qui est asymétrique (qui n’est pas identique à sa transposée) dans vos tests. Donnez le résultat d’au moins deux tests différents, au-delà du fichier partie1.txt. Vous pouvez utiliser des saisies d’écran pour présenter vos résultats.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 mai 2022 à 7:02:19

                                  As-tu réussi à charger les fichiers et valider que les entrées sont correctes?
                                  On ne te demande pas de résoudre un Sudoku mais de valider si c'est correct.
                                  Heureusement pour toi, on ne tedemande pas de valider les carrés, seulement les lignes et les colonnes.
                                  Réfléchis tout de même sur la façon de le faire.

                                  Je vois 4 boucles imbriquées, les 2 premières par pas de 3 sur une longueur de 9 et les 2 dernières par pas de 1 sur une longueur de 3.

                                  Mieux encore, les carrés sont numérotés de 0 à 8. Ça te sauvera une boucle.

                                  la ligne de départ est (numéro/3)*3 et la colonne de départ est (numéro%3)*3

                                  edit: alors, un petit cadeau, :)
                                      // Je suppose que  v  est un tableau de booléens de longueur 10 (pour éviter de soustraire 1)
                                      for(int carre = 0; carre < 9; carre++) {
                                          // Je remet à false mon tableau de booléens:
                                          for(int i=1; i<10; i++) v[i] = false;
                                          int l0 = carre / 3 * 3;
                                          int c0 = carre % 3 * 3;
                                          for(int l=l0; l<l0+3; l++) {
                                              for(int c=c0; c<c0+3; c++) {
                                                  int chiffre = a[l][c];
                                                  if(v[chiffre]) {
                                                      // afficher erreur et terminé si requis
                                                  }
                                                  v[chiffre] = true;
                                              }
                                          }
                                      }
                                  Pour valider, on peut se faire un tableau de booléens de 9 ou 10 positions (pas de calcul d'indice)

                                  Tu remets à false toutes les valeurs de cetableau avant chaque ligne et/ou colonne.
                                  Tu commences par valider par lignes.
                                  Pour chaque valeur rencontrée sur la ligne, tu vérifies si la case correspondante dans ton tableau de booléen est vraie (true), si oui, c'est une erreur.
                                  Ensuite, tu mets la case à vrai. Si tous les chiffres sont différents, ça ne te dira jamais que la case est vraie avant de le mettre.
                                  Et tu recommences avec les colonnes.
                                  Pour la transposition, je te suggère de transposer dans une nouvelle matrice. N'essaies pas de le faire sur place.

                                  Dans mon premier message je t'ai presque donné la solution:

                                   il faut juste écrire:   b[j][i] = a[i][j];
                                  As-tu du code à nous présenter?

                                  -
                                  Edité par PierrotLeFou 23 mai 2022 à 18:32:13

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Le Tout est souvent plus grand que la somme de ses parties.

                                    28 mai 2022 à 1:00:06

                                    PierrotLeFou a écrit:

                                    As-tu réussi à charger les fichiers et valider que les entrées sont correctes?

                                    Bon, non, je n'ai pas réussis :'(

                                    Je me suis aidé beaucoup des codes de michelbillaud mais je n'y arrive toujours pas! Je commence sérieusement à perdre espoire de réussir mon cours :o
                                    J'ai l'impression de ne pas bien assembler les morceaux du casse-tête.

                                    Voici ce que j'ai de (re)fait en ce moment (ps: il me reste a rejouter ce que tu m'a fournis comme information pour la validation) :

                                    package com.company;
                                    import java.io.*;
                                    import java.util.Scanner;
                                    
                                    public class Main {
                                    
                                        public static void main(String[] args) throws IOException {
                                    
                                            var donnees = "partie2.txt";
                                            var grille = new int[9][9];
                                            var chemin = "partie2.txt";
                                            remplir_grille(grille, donnees);
                                            afficher_grille(grille);
                                            lire_grille(grille, chemin);
                                    
                                            File FichierNombre1 = new File("partie2.txt");
                                            try (
                                                    FileReader chemin1 = new FileReader(FichierNombre1);
                                                    BufferedReader in = new BufferedReader(chemin1)
                                            ) {
                                                System.out.println(in.readLine());
                                            } catch (IOException e) {
                                                System.out.println("Fichier introuvable");
                                            }
                                        }
                                    
                                        private static void remplir_grille(int[][] grille, String donnees) {
                                            var scanner = new Scanner(donnees);
                                            while (scanner.hasNextInt()) {
                                                var element = scanner.nextInt();
                                                var l = element / 100;
                                                var c = (element / 10) % 10;
                                                var v = element % 10;
                                                grille[l][c] = v;
                                            }
                                        }
                                    
                                        private static void afficher_grille(int[][] grille) {
                                            int opt;
                                            Scanner in = new Scanner(System.in);
                                            System.out.println("Voulez-vous jouer? 1 = Oui  2 = Non");
                                            opt = in.nextInt();
                                            int p = 0;
                                            while (p == 0) {
                                                switch (opt) {
                                                    case 1 -> {
                                                        final String separation = "+---------+---------+---------+";
                                                        System.out.println(separation);
                                                        int c = 0;
                                                        int l;
                                                        for (l = 0; l < 9; l++) {
                                                            System.out.print("|");
                                                            for (c = 0; c < 9; c++) {
                                                                if (grille[l][c] == 0) {
                                                                    System.out.print(" . ");
                                                                } else {
                                                                    System.out.format(" %d ", grille[l][c]);
                                                                }
                                                                if (c % 3 == 2) {
                                                                    System.out.print("|");
                                                                }
                                                            }
                                                            System.out.println();
                                                            if (l % 3 == 2) {
                                                                System.out.println(separation);
                                                            }
                                                        }
                                                        //grille[l][c] = grille[c][l];
                                                        p++;
                                                    }
                                                    case 2 -> {
                                                        System.out.println("Bonne journée");
                                                        p++;
                                                        //continue;
                                                    }
                                                    default -> {
                                                        System.out.println("Sélectionnez une option svp");
                                                        //continue;
                                                    }
                                                }
                                            }
                                        }
                                    
                                        private static void lire_grille (int[][] grille, String chemin) throws IOException {
                                            var reader = new BufferedReader(new FileReader(chemin));
                                            for (int l = 0; l < 9; l++) {
                                                for (int c = 0; c < 9; c++) {
                                                    while (true) {
                                                        var ch = reader.read();
                                                        //System.out.println("car " + ch);
                                                        if (ch == '.') {
                                                            grille[l][c] = 0;
                                                            break;
                                                        } else if (Character.isDigit(ch)) {
                                                            grille[l][c] = ch - '0';
                                                            break;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    Et ça me donne ceci :

                                    Voulez-vous jouer? 1 = Oui  2 = Non
                                    1
                                    +---------+---------+---------+
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    +---------+---------+---------+
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    +---------+---------+---------+
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    | .  .  . | .  .  . | .  .  . |
                                    +---------+---------+---------+
                                    016 112 214 319 417 511 618 713 815 027 129 221 328 425 523 626 722 824 033 138 235 332 436 534 631 737 839 048 141 243 347 449 545 644 746 842 059 157 252 351 454 556 655 758 853 065 164 266 363 462 568 667 769 861 074 173 279 376 471 577 672 775 878 081 186 288 385 483 582 689 784 887 092 195 297 394 498 599 693 791 89
                                    
                                    Process finished with exit code 0
                                    




                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 mai 2022 à 3:28:59

                                      Je n'ai pas saisi si tu utilisais des caractères ou des nombres.
                                      Pour les cases vides, ce sera '.' ou 0?
                                      Pour moi, la fonction remplir_grille  devrait mettre des 0 dans la grille.
                                      Pourquoi ne pas appeler afficher_grille après lire_grille?
                                      Dans ton code initial, tu semblais capable de lire tes nombres à partir du fichier, je me trompe?
                                      Tu appelles:
                                              remplir_grille(grille, donnees);
                                              afficher_grille(grille);
                                              lire_grille(grille, chemin);
                                      Avant d'ouvrir le fichier. Tu ne pourras rien lire de cette façon.
                                      Ta fonction afficher_grille ne devrait faire rien d'autre que d'afficher la grille justement.
                                      Le reste tu le mets dans la fonction main.
                                      Ce que tu fais dans remplir_grille pour mettre le contenu du fichier dans la grille, tu devrais le faire dans lire_grille.
                                      La logique du programme devrait être:
                                      tant qu'on veut jouer:
                                          ouvrir le fichier suivant
                                          initialiser la grille
                                          lire la grille
                                          afficher la grille
                                          valider la grille   (je sais, c'est pas fait)
                                      redemander si on veut jouer.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Le Tout est souvent plus grand que la somme de ses parties.

                                        28 mai 2022 à 6:05:38

                                        J'utilise des nombres dans les fichiers .txt.

                                        Pour les cases vides, ce sera ".".

                                        Dans mon code initial, j'avais que quelques chiffres qui fonctionnaient mais pas plus malheureusement.

                                        Donc si je comprend bien, dans la fonction afficher_grille je garde que la mise en forme de la grille et ma boucle je l'envoie dans le main.
                                        Je comprend que tu veux que je fusionne les deux méthodes remplir_grille et lire_grille?
                                        J'ai mis mon ouverture de ficher avant remplir_grille dans le main.

                                        Avec les quelques changements :

                                        package com.company;
                                        import java.io.*;
                                        import java.util.Scanner;
                                        
                                        public class Main {
                                        
                                            public static void main(String[] args) throws IOException {
                                        
                                                File FichierNombre1 = new File("partie2.txt");
                                                try (
                                                        FileReader chemin1 = new FileReader(FichierNombre1);
                                                        BufferedReader in = new BufferedReader(chemin1)
                                                ) {
                                                    System.out.println(in.readLine());
                                                } catch (IOException e) {
                                                    System.out.println("Fichier introuvable");
                                                }
                                        
                                                var donnees = "partie2.txt";
                                                var grille = new int[9][9];
                                                var chemin = "partie2.txt";
                                                //remplir_grille(grille, donnees);
                                        
                                                int p = 0;
                                                Scanner r = new Scanner(FichierNombre1);
                                                int i1=r.nextInt(8);
                                                while (p == 0) {
                                                    int x = i1, v = 0;
                                                    int[][] a = new int[9][9];
                                                    int[][] b = new int[9][9];
                                                    for (int l = 0; l < 9; l++) {
                                                        for (int c = 0; c < 9; c++) {
                                                            if ((x + c + v) <= 9)
                                                                a[l][c] = c + x + v;
                                                            else
                                                                a[l][c] = c + x + v - 9;
                                                            if (a[l][c] == 10)
                                                                a[l][c] = 1;
                                                        }
                                                        x += 3;
                                                        if (x >= 9)
                                                            x = x - 9;
                                                        if (l == 2) {
                                                            v = 2;
                                                            x = i1;
                                                        }
                                                        if (l == 5) {
                                                            v = 3;
                                                            x = i1;
                                                        }
                                                    }
                                                    int opt;
                                                    Scanner in = new Scanner(System.in);
                                                    System.out.println("Voulez-vous jouer? 1 = Oui  2 = Non");
                                                    opt = in.nextInt();
                                                    switch (opt) {
                                                        case 1 -> {
                                                            afficher_grille(grille);
                                                            for (int l = 0; l < 9; l++) {
                                                                for (int c = 0; c < 9; c++) {
                                                                    b[l][c] = a[c][l];
                                                                    lire_grille(grille, chemin, donnees);
                                                                }
                                                            }
                                                            p++;
                                                        }
                                                        case 2 -> {
                                                            System.out.println("Bonne journée");
                                                            p++;
                                                            continue;
                                                        }
                                                        default -> {
                                                            System.out.println("Sélectionnez une option svp");
                                                            continue;
                                                        }
                                                    }
                                                    for (int y = 0; y < 9; y++) {
                                                        for (int z = 0; z < 9; z++) {
                                                            System.out.print(b[y][z] + " ");
                                                        }
                                                        System.out.println("");
                                                    }
                                                }
                                            }
                                        
                                            //private static void remplir_grille(int[][] grille, String donnees) {
                                            //    var scanner = new Scanner(donnees);
                                            //    while (scanner.hasNextInt()) {
                                            //        var element = scanner.nextInt();
                                            //        var l = element / 100;
                                             //       var c = (element / 10) % 10;
                                             //       var v = element % 10;
                                             //       grille[l][c] = v;
                                             //   }
                                            //}
                                        
                                            private static void lire_grille (int[][] grille, String chemin, String donnees) throws IOException {
                                                var reader = new BufferedReader(new FileReader(chemin));
                                                var scanner = new Scanner(donnees);
                                                //for (int l = 0; l < 9; l++) {
                                                    //for (int c = 0; c < 9; c++) {
                                                        while (scanner.hasNextInt()) {
                                                            var ch = reader.read();
                                                            var element = scanner.nextInt();
                                                            var l = element / 100;
                                                            var c = (element / 10) % 10;
                                                            var v = element % 10;
                                                            grille[l][c] = v;
                                                            //System.out.println("car " + ch);
                                                            if (ch == '.') {
                                                                grille[l][c] = 0;
                                                                break;
                                                            } else if (Character.isDigit(ch)) {
                                                                grille[l][c] = ch - '0';
                                                                break;
                                                            }
                                                        }
                                                   // }
                                                //}
                                            }
                                        
                                            private static void afficher_grille(int[][] grille) {
                                                final String separation = "+---------+---------+---------+";
                                                System.out.println(separation);
                                                for (int l = 0; l < 9; l++) {
                                                    System.out.print("|");
                                                    for (int c = 0; c < 9; c++) {
                                                        if (grille[l][c] == 0) {
                                                            System.out.print(" . ");
                                                        } else {
                                                            System.out.format(" %d ", grille[l][c]);
                                                        }
                                                        if (c % 3 == 2) {
                                                            System.out.print("|");
                                                        }
                                                    }
                                                    System.out.println();
                                                    if (l % 3 == 2) {
                                                        System.out.println(separation);
                                                    }
                                                }
                                            }
                                        }

                                        Le résultat :

                                        016 112 214 319 417 511 618 713 815 027 129 221 328 425 523 626 722 824 033 138 235 332 436 534 631 737 839 048 141 243 347 449 545 644 746 842 059 157 252 351 454 556 655 758 853 065 164 266 363 462 568 667 769 861 074 173 279 376 471 577 672 775 878 081 186 288 385 483 582 689 784 887 092 195 297 394 498 599 693 791 89
                                        Voulez-vous jouer? 1 = Oui  2 = Non
                                        1
                                        +---------+---------+---------+
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        +---------+---------+---------+
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        +---------+---------+---------+
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        | .  .  . | .  .  . | .  .  . |
                                        +---------+---------+---------+
                                        5 8 2 7 1 4 8 2 5 
                                        6 9 3 8 2 5 9 3 6 
                                        7 1 4 9 3 6 1 4 7 
                                        8 2 5 1 4 7 11 5 8 
                                        9 3 6 11 5 8 12 6 9 
                                        1 4 7 12 6 9 13 7 1 
                                        11 5 8 13 7 1 14 8 2 
                                        12 6 9 14 8 2 15 9 3 
                                        13 7 1 15 9 3 16 1 4 
                                        

                                        Comme tu peux voir, j'ai que 2 chiffres qui fonctionne :colere:

                                        Donc voici ce que j'ai de fait! Je continue de travailler dessus! :D


                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 mai 2022 à 7:41:18

                                          Ton main, c'est le bazar (+ de 60 lignes). A decouper en méthodes qui ont chacune un rôle clairement identifiable.

                                          Écris une méthode qui fait la lecture d'une grille dans un fichier, et lance une exception si les données sont invalides. C'est ce qu'on te demande.

                                          Il y a plusieurs cas : données non numériques, ligne ou colonne qui vaut 9, case qui vaut 0, case déjà remplie, violation de contrainte ligne/colonne/bloc...

                                          Ta cuisine avec la variable x, tu peux expliquer ? 

                                          Pour la vérification par bloc quand on a ajouté en (l,c)

                                          • Trouver les indices du coin du bloc (bl, bc)
                                          • Le bloc contient les cases (bl+i, bc+j) pour i et j entre 0 et 2

                                          Bl s'obtient en arrondissant l au multiple de 3 inférieur.

                                          Pour transposer (sur place), échanger les contenus de (l,c) et (c,l), .... pour l < c.  Dans une méthode à part. 

                                          -
                                          Edité par michelbillaud 28 mai 2022 à 8:15:02

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 mai 2022 à 7:47:05

                                            Je ne comprend pas ce que tu veux faire avec ce code:
                                                                if ((x + c + v) <= 9)
                                                                    a[l][c] = c + x + v;
                                                                else
                                                                    a[l][c] = c + x + v - 9;
                                                ... et bien d'autres lignes ... calculs étranges ?
                                             
                                            Pour remplir la grille au début avant de lire le fichier:
                                                for(int l=0; l<9; l++) {
                                                    for(int c=0; c<9; c++) {
                                                        a[i][j] = 0;
                                                    }
                                                }
                                             
                                            Après que tu l'as remplie de cette façon, tu lis les valeurs du fichier sous forme de triplets de chiffres.
                                            Et tu fais le calcul que j'ai montré et qui se trouve dans lire_grille.

                                            edit:

                                            Je tente une modification:

                                            Excuses mon mauvais Java. :)

                                            -

                                            package com.company;
                                            import java.io.*;
                                            import java.util.Scanner;
                                             
                                            public class Main {
                                             
                                                public static void main(String[] args) throws IOException {
                                             
                                                    File FichierNombre1 = new File("partie2.txt");
                                                    try (
                                                            FileReader chemin1 = new FileReader(FichierNombre1);
                                                            BufferedReader in = new BufferedReader(chemin1)
                                                    ) {
                                                        System.out.println(in.readLine());
                                                    } catch (IOException e) {
                                                        System.out.println("Fichier introuvable");
                                                    }
                                             
                                                    var donnees = "partie2.txt";
                                                    var grille = new int[9][9];
                                                    var chemin = "partie2.txt";
                                             
                                                    int p = 0;
                                                    Scanner r = new Scanner(FichierNombre1);
                                                    int i1=r.nextInt(8);
                                                    while (p == 0) {
                                                        remplir_grille(grille, donnees);
                                                        int opt;
                                                        Scanner in = new Scanner(System.in);
                                                        System.out.println("Voulez-vous jouer? 1 = Oui  2 = Non");
                                                        opt = in.nextInt();
                                                        switch (opt) {
                                                            case 1 -> {
                                                                afficher_grille(grille);
                                                                for (int l = 0; l < 9; l++) {
                                                                    for (int c = 0; c < 9; c++) {
                                                                        b[l][c] = a[c][l];
                                                                        lire_grille(grille, chemin, donnees);
                                                                    }
                                                                }
                                                                p++;
                                                            }
                                                            case 2 -> {
                                                                System.out.println("Bonne journée");
                                                                p++;
                                                                continue;
                                                            }
                                                            default -> {
                                                                System.out.println("Sélectionnez une option svp");
                                                                continue;
                                                            }
                                                        }
                                                        for (int y = 0; y < 9; y++) {
                                                            for (int z = 0; z < 9; z++) {
                                                                System.out.print(b[y][z] + " ");
                                                            }
                                                            System.out.println("");
                                                        }
                                                    }
                                                }
                                             
                                                private static void remplir_grille(int[][] grille) {
                                                    for(int l=0; l<9; l++) {
                                                        for(int c=0; c<9; c++) {
                                                            a[l][c] = 0;
                                                        }
                                                    }
                                                }
                                             
                                                private static void lire_grille (int[][] grille, String chemin, String donnees) throws IOException {
                                                    var reader = new BufferedReader(new FileReader(chemin));
                                                    var scanner = new Scanner(donnees);
                                                    while (scanner.hasNextInt()) {
                                                        var ch = reader.read();
                                                        var element = scanner.nextInt();
                                                        var l = element / 100;
                                                                var c = (element / 10) % 10;
                                                                var v = element % 10;
                                                                grille[l][c] = v;
                                                    }
                                                }
                                             
                                                private static void afficher_grille(int[][] grille) {
                                                    final String separation = "+---------+---------+---------+";
                                                    System.out.println(separation);
                                                    for (int l = 0; l < 9; l++) {
                                                        System.out.print("|");
                                                        for (int c = 0; c < 9; c++) {
                                                            if (grille[l][c] == 0) {
                                                                System.out.print(" . ");
                                                            } else {
                                                                System.out.format(" %d ", grille[l][c]);
                                                            }
                                                            if (c % 3 == 2) {
                                                                System.out.print("|");
                                                            }
                                                        }
                                                        System.out.println();
                                                        if (l % 3 == 2) {
                                                            System.out.println(separation);
                                                        }
                                                    }
                                                }
                                            }

                                            -
                                            Edité par PierrotLeFou 29 mai 2022 à 3:55:24

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Le Tout est souvent plus grand que la somme de ses parties.

                                            Problème lecture de fichier .txt

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            • Editeur
                                            • Markdown