Comment afficher un tableau de "x" avec x nr de ligne et col

Fermé
petitchou - Modifié le 9 janv. 2022 à 17:58
 Petitchou - 10 janv. 2022 à 08:22
Bonjour,

Je souhaite afficher un tableau en java avec des x, mais je n'y arrive pas du tout. je ne vois pas la ou ça cloche...


CLASSE MONDE :

package com.company;

public class Monde {  // La classe Monde.

    public int nbL; // attribut nombre de ligne
    public int nbC; // attribut nombre de colonne
    public Boolean[][] Mat ; // attribut qui defini le tableau en fonction du nombre de ligne et de colonne



    public Monde(Boolean Mat1[][]){ // Le constructeur
        nbL = 10; // nombre de ligne
        nbC = 10; // nombre de colonne
        Mat = new Boolean[Mat1.length][Mat1.length]; //création d'un tableau 2D avec ligne/colonne
            for (int i=0; i< Mat1.length; i++){
                for(int j=10; j< Mat1.length;j++ ){

                    System.out.println("x");
                }
                    
            }


    }

    void affiche (){
        System.out.println("x");


    }
    }

Et dans ma classe main :
package com.company;

public class Main {

    public static void main(String[] args) {

            
            Monde M = new Monde() ;

            M.affiche();

    }
}
A voir également:

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
9 janv. 2022 à 18:05
Bonjour,

Il y a plein d'erreurs partout, je ne vais pas tout corriger mais quelques pistes :
  • Le constructeur ne devrait pas faire d'affichage
  • La méthode affiche() devrait faire plus que ça
  • Tu dois te servir des valeurs Mat[i][j] du tableau
1
Bonjour,

Quand tu parles de la méthode affiche(), c'est dans le main ou dans ma classe monde?
J'ai vraiment du mal a comprendre tout ce que je déclare ..etc en réalité.


Parce-que j'ai modifié quelques lignes.
package com.company;

public class Monde {  // La classe Monde.

    public int nbL; // attribut nombre de ligne
    public int nbC; // attribut nombre de colonne
    public Boolean[][] Mat; // attribut qui defini le tableau en fonction du nombre de ligne et de colonne


    public Monde(Boolean Mat1[][]) { // Le constructeur
        nbL = 10; // nombre de ligne
        nbC = 10; // nombre de colonne
        Mat = new Boolean[Mat1.length][Mat1.length]; //création d'un tableau 2D avec ligne/colonne
        for (int i = 0; i < Mat1.length; i++) {
            for (int j = 10; j < Mat1.length; j++) {


            }

        }


    }

    void affiche(){

        System.out.println("x");
        for (int i = 0; i < Mat.length; i++) {
            System.out.print(Mat[i]);
        }

        System.out.println("x");

        for (int j = 0; j < Mat.length; j++) {
            System.out.print(Mat[j]);
        }
    }
}

Et mon main et plus ou moins identique a avant.
package com.company;

public class Main {

    public static void main(String[] args) {

            Monde M = new Monde[][](true) ;

            M.affiche();

    }
}
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > petitchou
9 janv. 2022 à 20:17
"Quand tu parles de la méthode affiche(), c'est dans le main ou dans ma classe monde?"
C'est la même méthode. Dans la classe monde c'est sa déclaration (ce que doit faire la méthode et comment le faire) et dans le main c'est son appel (quand elle doit être utilisée et avec quels paramètres).

Commençons déjà par la classe Monde.

public Boolean[][] Mat;

Déjà, par convention seuls les noms de classes (Monde par exemple) devraient commencer par une majuscule, tous les autres noms devraient commencer par une minuscule, donc on devrait avoir mat au lieu de Mat.
Ensuite il n'y a pas de raison que ce soit public, à moins de vouloir explicitement faire quelque chose de plus avec tu devrais mettre private par défaut.
Enfin, il n'y a pas de raison d'utiliser la classe Boolean, le type primitif boolean suffira.
Donc :
private boolean[][] mat;


public int nbL; // attribut nombre de ligne
public int nbC; // attribut nombre de colonne

Ça ne sert à rien, ce sont des informations que tu peux déduire, donc inutile de les stocker.
nbL c'est
mat.length
et nbC n'est pas forcément fixe, le nombre de colonne peut être différent pour chaque ligne, il faudrait donc considére
mat[0].length
pour la première ligne,
mat[1].length
pour la deuxième, etc.

public Monde(Boolean Mat1[][]) { // Le constructeur
    nbL = 10; // nombre de ligne
    nbC = 10; // nombre de colonne
    Mat = new Boolean[Mat1.length][Mat1.length]; //création d'un tableau 2D avec ligne/colonne
    for (int i = 0; i < Mat1.length; i++) {
        for (int j = 10; j < Mat1.length; j++) {

        }
    }
}

Même remarques : que précédemment, on devrait avoir
boolean[][] mat1
et on oublie nbL et nbC.
Ensuite new Boolean[Mat1.length][Mat1.length]; est faux puisque tu créés le nombre de colonnes avec le nombre de lignes, ce qui n'est vrai que pour les matrices carrées, mais faux en général. De toute façon tu n'as pas besoin de créer un tableau pour mat; il existe déjà c'est ton paramètre mat1.
Ensuite ta boucle ne sert à rien, elle ne fait rien, et en plus l'initialisation de j à 10 est fausse.

Tu devrais tout simplement avoir :
public class Monde {
    private boolean[][] mat;

    public Monde(boolean[][] mat1) {
        mat = mat1;
    }

La méthode affiche maintenant :
void affiche(){

    System.out.println("x");
    for (int i = 0; i < Mat.length; i++) {
        System.out.print(Mat[i]);
    }

    System.out.println("x");

    for (int j = 0; j < Mat.length; j++) {
        System.out.print(Mat[j]);
    }
}

Tout d'abord, elle devrait être public, ici ça fonctionne car tu est dans le même package, mais c'est faux en général.
Ensuite l'affichage des "x" est inutile.
Plus problématique, tu affiches des Mat[i] et des Mat[j] de la même manière, cela va faire deux fois la même chose (à part que c'est d'abord un i puis un j, mais ça ne change absolument rien), donc Mat[i] (ou Mat[j]) c'e sont des lignes, alors que toi ce que tu veux afficher a priori ce sont des valeurs, donc des Mat[i][j] qui en l’occurrence vont valoir true ou false puisque ce sont des boolean.
Il faut reprendre la structure à deux boucles imbriquées que tu avais dans le constructeur (mais en la corrigeant bien sûr)
public void affiche(){
    for (int i = 0; i < mat.length; i++) {
        for (int j = 0; j < mat[i].length; j++) {
            System.out.print(mat[i][j]);
        }
        System.out.println();
    }
}

Passons à la classe Main.

Ceci ne compile pas :
Monde M = new Monde[][](true);
la bonne syntaxe devrait être
new Monde(mat1);
pour correspondre au constructeur
public Monde(boolean mat1[][])
donc déjà il faut créer mat1.
Remarque : il n'est pas obligatoire d'avoir dans le code d'appel exactement le même le nom que la paramètre dans le constructeur, on pourrait par exemple l'appeler matrice, mais surtout il faut lui donner une valeur, sinon ça ne sert à rien.

Exemple :
public class Main {
    public static void main(String[] args) {
        boolean[][] mat1 = {
                { true, false, true }, // ligne 0
                { false, true } // ligne 1
        };
        Monde monde = new Monde(mat1);
        monde.affiche();
    }
}
0
petitchou > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
Modifié le 9 janv. 2022 à 21:48
bonsoir,
merci encore pour ton aide.
Tu n'as peut être pas tout compris de ce que je souhaitais faire.
En faite, c'est un tableau Avec uniquement des x. Mais j'aimerais par exemple que ça soit un 10X10 avec des x. Ou bien 15X15. Je sais pas si tu vois ce que je veux dire ....
C'est pour ça que j'avais mis NBL et NBC. Je pensais que par la suite, j'aurais pu modifier le nombre de ligne et de colonne.

Car la, quand je lance le code, j'obtiens un tableau mais constitué de truefalsetrue
falsetrue

Si je veux des x il faut que je passe par un string?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > petitchou
9 janv. 2022 à 22:26
Tu as des true/false car tu avais mis un tableau boolean[][] mais peut être que ça aussi est à revoir dans ton code...

Quel intérêt d'avoir un tableau avec que des x ?

En gros la seule chose que doit faire ton programme c'est afficher des carrés ?

Parce que dans ce cas tu n'as pas besoin de ton tableau, tu as juste besoin de connaître la taille du carré.
0
Petitchou > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
10 janv. 2022 à 08:22
L’intérêt c’est que par la suite, je doit afficher des x pour par la suite, simuler un robot pollueur … c’est un tp scolaire. Mais je voulais commencer par afficher ce tableau rempli de x
0