IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Besoin d'aide pour un programme en javas'cool


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Besoin d'aide pour un programme en javas'cool
    Bonjour, j'ai un projet à présenter pour mon oral d'isn,
    Avec mon groupe, on a voulu programmé un sudoku en javas'cool, et je n'arrive pas à traduire ces lignes de code.
    Je sais qu'elles servent pour qu'il n'y ait pas le même chiffre dans la même colonne, ligne et sous-grilles.
    Mais je n'arrive pas à comprendre à quoi servent chacune des lignes.

    Quelqu'un pourrait m'aider à traduire ces lignes en français s'il vous plaît ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    boolean creation(int[][]GRILLE, int x, int y) {
       int[] LISTE = new int[4];
       LISTE[0] = random(1, 5);
       for (int l = 1; l < 4; l ++) {
          for (boolean valable = false; ! valable;) {
             LISTE[l] = random(1, 5);
             valable = true;
          for (int c = 0; c < l; c ++) {
                if (LISTE[l] == LISTE[c]) {
                   valable = false;
                }}}}
     
       for (int l = 0; l < 4; l ++) {
          if (check(GRILLE, x, y, LISTE[l])) {
             GRILLE[x][y] = LISTE[l];
             if ((x == 3) && (y == 3)) {
                return  true;
             }
             if (x == 3) {
                if (creation(GRILLE, 0, y +1)) {
                   return  true;
                }
             } else {
                if (creation(GRILLE, x +1, y)) {
                   return  true;
                }}}}
     
       GRILLE[x][y] =0;
       return  false;
    }
    boolean check(int[][]GRILLE, int x, int y, int a) {
       for (int i = 0; i < x; i ++) {
          if (GRILLE[i][y] == a) {
             return  false;
          }}
       for (int j = 0; j < y; j ++) {
          if (GRILLE[x][j] == a) {
             return  false;
          }}
       int xx = (x /2) *2;
       int yy = (y /2) *2;
       for (int i = 0; i < 2; i ++) {
       for (int j = 0; j < 2; j ++) {
             if (GRILLE[xx + j][yy + i] == a) {
                return  false;
             }
             if ((xx + j == x) && (yy + i == y)) {
                return  true;
             }}}
       return  true;
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. boolean check(int[][]GRILLE, int x, int y, int a) {Que fait cette méthode ?
      1. if (GRILLE[ligne][colonne] == a) {return false;}
        si on trouve a dans la case ligne,colonne on retourne false. Donc

        1. Code : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          for (int i = 0; i < x; i ++) {
                if (GRILLE[i][y] == a) {
                   return  false;
                }}
          si on trouve a dans la colonne y, dans l'une des x premières lignes, on retourne false

        2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
             for (int j = 0; j < y; j ++) {
                if (GRILLE[x][j] == a) {
                   return  false;
                }}
          si on trouve a dans la ligne x, dans l'une des y premières colonne, on retourne false

        Donc si on trouve a dans la partie de la grille entre (0,0) et (x,y) on retourne false.

      2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        int xx = (x /2) *2;
        int yy = (y /2) *2;
        A/B*B=B en math. Comme le type est int, A/B donne un int, celui le plus grand inférieur à A/B.
        Donc si x = 5, par exemple, alors x/2 vaut 2, et x*2 vaut 4. Si x=4, alors x/2 vaut 2, et x*2 vaut 4, soit x.
        En résumé, si x est impaire, alors on prend x-1. Et si x est pair, on prend x.
        Idem pour y


      3. On parcourt une sous grille : si on trouve a dans cette sous grille, on retourne false.
      4. A la fin, on fait return true;, soit on retourne vrai par défaut.
      5. en résumé, la méthode retourne
        • faux si a est dans la grille (0,0)-(x-1,y-1) (tous index inclus)
        • faux si a est dans la sous grille
          1. (x,y)-(x+1,y+1) si x pair et y pair
          2. (x-1,y)-(x,y+1) si x impair, y pair
          3. (x,y-1)-(x+1,y) si x pair et y impair
          4. (x-1,y-1)-(x,y) si x impair, y impair

          En résumé, chaque grille est une grille 2x2 qui "tourne" autour de x,y.
          Nom : grid.jpg
Affichages : 147
Taille : 110,0 Ko
        • vrai sinon

        Cette méthode permet de déterminer si a est dans la grille à certains endroits.
    2. La partie principale maintenant
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      boolean creation(int[][]GRILLE, int x, int y) {

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
         
           int[] LISTE = new int[4];
           LISTE[0] = random(1, 5);
        On commence par créer un tableau de 4 cases et on met un nombre aléatoire entre 1 et 4 inclus, dans la première
      • for (int l = 1;l < 4; l ++) { : on parcourt les éléments du tableau du deuxième au dernier avec l'indice l.

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
         
              for (boolean valable = false; ! valable;) {
                 LISTE[l] = random(1, 5);
                 valable = true;
              for (int c = 0; c < l; c ++) {
                    if (LISTE[l] == LISTE[c]) {
                       valable = false;
                    }}}}
        ça c'est un peu tordu pour être facilement compris. On a deux boucles :

        • une sur un booléen, valable. On démarre avec valable = false et on boucle tant qu'il est faux
        • on commence à chaque itération à mettre un nombre aléatoire dans la case l de LISTE et à dire que valable est vrai.
        • puis on fait une seconde boucle qui parcourt les éléments dans le tableau LISTE avant LISTE[l], et si l'un d'eux est égal à LISTE[l], alors on dit que valable est false

        EN résumé, on place dans chaque case un nombre aléatoire différent (parce qu'il n'a pas déjà été placé dans une case avant).
        On a donc juste la liste de nombres 1,2,3,4, dans un ordre aléatoire.

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
           for (int l = 0; l < 4; l ++) {
              if (check(GRILLE, x, y, LISTE[l])) {
        On parcourt la liste des nombres, et pour chacun on vérifie "sa présence" dans la grille en appelant check().
        Et si ce n'est pas le cas, on le met dans la grille à l'endroit x,y : GRILLE[x][y] = LISTE[l];

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
                 if ((x == 3) && (y == 3)) {
                    return  true;
                 }
        Si on est en x=3, y=3, on a terminé et on retourne à l'appelant. En résumé, si le nombre peut être placé en 3,3, on le fait et on arrête en disant à l'appelant que ça bien été fait.

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
         
                 if (x == 3) {
                    if (creation(GRILLE, 0, y +1)) {
                       return  true;
                    }
                 }
        Si x est 3 alors, on appelle récursivement creation pour la case 0,y+1, et si elle est place bien un nombre, on retourne à l'appelant en disant que ça c'est bien passé, sinon on continue la suite...

      • Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
         
         else {
                    if (creation(GRILLE, x +1, y)) {
                       return  true;
                    }}}}
        La suite est on fait la même chose pour x+1, y, et si on arrive toujours pas on boucle pour essayer le nombre suivant dans la boucle

      • A la fin, après avoir essayer chaque nombre de la liste
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
         
           GRILLE[x][y] =0;
           return  false;
        Si on n'a pas réussi à placer/valider quoique ce soit, on met 0 dans la case de grille et on retourne false


      Pour le décodage de cette boucle+récursivité, en français :
      Si on veut parcourir (toutes les cases d') une grille, on va fait varier des coordonnées de cases dans cette grille. On peut faire cette variation par une boucle (double). Ici elle est fait par une récursivité.
      En simplifiant, pour voir les deux cas :


      Donc
      1. On va commencer par x=0; y=0
      2. Ensuite, on peut parcourir ligne après ligne ou colonne après colonne, et dans chaque, chaque case. Essayons ligne après ligne : on parcourt donc chaque case en faisant varier x, ne l'incrémentant à chaque fois. Ici le parcourt est fait par récursivité : on appelle la méthode à nouveau avec x+1,y. Quand on arrive au bout de la ligne, soit x=3, on passe à la ligne suivante en faisant x=0,y+1, et qu'on on arrive au bout (x=3 et y=3), on a terminé, et on arrête



      En résumé, on essaye tour à tour de placer un nombre parmi 1, 2, 3 ou 4, de manière à ce qu'il ne soit pas déjà dans une partie de la grille, et si x et y correspondent à une certaine condition, on arrête, sinon, on refait ça dans une autre case.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, tu me sauve !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/04/2007, 10h18
  2. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  3. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo