Partage
  • Partager sur Facebook
  • Partager sur Twitter

Creation tableau

Sujet résolu
    16 janvier 2022 à 23:38:40

    Bonjourr à tous

    Je débute en Java et j´ai ecrit le code suivant:

    public static void main(String[] args)
        {   
            //creation tableau
            Scanner sc = new Scanner(System.in);
            System.out.println("Entrez le nombre de lignes et de colonnes");
            int ligne = sc.nextInt();
            int colonne = sc.nextInt();
            String [][] T = new String [ligne][colonne];
    
            // remplissage tableau
            for (int i=0; i<T.length; i++)
            {
                for (int j=0;j<T[i].length; j++)
                {
                    System.out.println("Entrez attribut "+ i+ j);
                    String attribut = sc.nextLine();
                    T[i][j]= attribut;
                }
            }
           
            // vu tableau
            for (int i=0; i<T.length; i++)
            {
                for (int j=0;j<T[i].length; j++)
                {
                    System.out.print(" | " +T[i][j]+" | ");
                }
                System.out.println();
            }
           
        sc.close();
        }

    Mon problème c´est que mon code ne me laisse pas entrer l´index T[0][0]. La première "colonne" de ma première "ligne" est tout bonnement ignorée. J´ai beau chercher je ne comprend pas pourquoi. Avez vous une piste. ?

    outcome:

    |  |  | 1 |  | 2 |  | 3 |
     | 4 |  | 5 |  | 6 |  | 7 |

    Merci :)

    -
    Edité par koursk 17 janvier 2022 à 19:25:59

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2022 à 7:56:30

      Bonjour,

      Quand tu tapes une réponse au clavier, elle est mise dans un buffer. Par exemple, si tu tapes "Bonjour" puis <Entrée>, le buffer va contenir les caractères B o n j o u r et \n (n comme "new line", le caractère de la touche <Entrée>).

      La méthode nextLine fonctionne ainsi : elle consomme tous les caractères jusqu'au \n (le \n est consommé aussi) et elle retourne une String contenant tous les caractères consommés sauf le \n. Dans mon exemple, elle retournerait "Bonjour".

      Au fait, consommer un caractère, ça veut dire le lire puis le retirer du buffer.

      La méthode nextInt, elle, ne consomme que des chiffres. Quand tu tapes 42 puis <Entrée>, le buffer contient 4, 2 et \n.

      Si tu fais, nextInt, ça va consommer les caractère 4 et 2, et retourner l'entier 42. Il va rester \n dans le buffer.

      La prochaine fois que tu vas faire nextLine, il va consommer tous les caractères jusqu'au \n et comme il n'y a aucun caractère à consommer avant le \n, il va retourner une chaine vide.

      Il y a deux solutions à ton problème

      // Solution "bricolage"
      // On ajoute un nextLine pour consommer la ligne vide
      int colonne = sc.nextInt();
      sc.nextLine();
      // Solution "propre"
      // On lit la ligne entière et on la transforme en entier
      int colonne = Integer.parseInt(sc.nextLine());

      Je trouve la deuxième solution plus propre pour lire les nombres saisis au clavier. Ca t'évitera pas mal de bugs "incompréhensibles" comme celui que tu as expérimenté.


      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2022 à 9:05:35

        Bonjour,

        Merci de colorer votre code à l'aide du bouton Code

        Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: java;">Votre code ici</pre>.

        Merci de modifier votre message d'origine en fonction.

        Liens conseillés

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2022 à 20:04:27

          Bonjour AbcAbc6,

          Le code a été colorisé.

          Bonjour brubru777,

          Merci pour ta réponse très clair, ca m´aide beaucoup.

          Du coup j´aurai pu aussi fermer mon premier scanner et en recréer un pour la boucle, ca aurai purgé le buffer je suppose et je n´aurai pas eu de problème.

          Pour la methode parseInt pourquoi faut il mettre "Integer." devant ?

          Merci :)

          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2022 à 20:23:47

            Fermer un scanner en cours de lecture pour en ouvrir un autre, c'est encore pire que la solution "bricolage".

            Une méthode n'existe pas "toute seule". Soit c'est une méthode d'instance, et elle s'appelle à partir d'un objet (appelé aussi "instance"). Soit c'est une méthode de classe, et elle s'appelle à partir de sa classe.

            Dans le cas de la méthode parseInt, c'est une méthode de la classe Integer. Il faut donc précéder son nom du nom de la classe pour pouvoir l'appeler.

            • Partager sur Facebook
            • Partager sur Twitter
              17 janvier 2022 à 20:32:15

              koursk a écrit:

              Du coup j´aurai pu aussi fermer mon premier scanner et en recréer un pour la boucle, ca aurai purgé le buffer je suppose et je n´aurai pas eu de problème.

              Quelle cuisine...

              Bon, le programme fonctionne en mode "texte" interactif. Ce type de programme, ça envoie une question et ça attend que l'utilisateur tape sa réponse (les deux nombres) sur une ligne suivie par entrée.

              Donc

              var clavier = new Scanner(System.in);
              System.out.println("nombre de lignes et de colonnes ?");   

              devrait être suivi de la lecture d'une ligne de réponse

              String ligne = clavier.nextLine();

              qui contient les deux nombres attendus.

              Seconde étape, il faut maintenant extraire ces deux nombres de la ligne. Là on regarde la doc de Scanner, et on voit qu'on peut en construire un qui analyse une String. Ne nous en privons pas

              var scannerLigne = new Scanner(ligne);
              

              et pour extraire

              int nbLignes   = scannerLigne.nextInt();
              int nbColonnes = scannerLigne.nextInt();
               

              Bien entendu, il va falloir prévoir de récupérer les exceptions si l'utilisateur ne tape pas des nombres convenables. Peut être dans une boucle

              int nbLignes, nbColonnes;
              
              while (true) {
                  System.out.println("Nombre de lignes et de colonnes?");
              
                  String ligne = clavier.nextLine();
                  try {
                  ....
                     nbColonnes = scannerLigne.nextInt();
                     break;                               // sortie boucle
                  } catch (....) {
                      System.out.println("Erreur, recommencez");
                  }
              }
              
               






              -
              Edité par michelbillaud 17 janvier 2022 à 20:39:50

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2022 à 0:06:43

                Bonjour,

                merci à vous deux pour vos réponses. Il y a encore beaucoup de boulot pour parler le Java un peu plus courament de mon coté :). J´ai un peu changé mon code et continué à mettre d´autre fonction et j´ai un autre problème.

                J´essaye de rechercher si un element et présent dans mon tableau en retrournant vrai ou faux:

                public static boolean rechercher(String[][]T, String truc)
                	{
                	boolean trouver = false;
                		
                	for (int i=0; i<T.length;i++)
                	{
                		for (int j=0; j<T[i].length;j++)
                		{
                			if (T[i][j]==truc)
                			{
                				trouver = true;
                				System.out.println("bravo!");
                				break;
                			}
                		}
                	}
                	return trouver;

                et ca pour pouvoir tester:

                public static void main(String[] args) 
                ...
                
                String truc;
                System.out.println("Entrez votre recherche: ");				
                sc.nextLine();
                truc=sc.nextLine();				
                	if(rechercher(T, truc));
                	{
                	System.out.println("Le tableau contient "+truc);
                	}


                Ici j´ai toujours un retour positif peut importe ce que je rentre. Pourtant mon message "bravo!" n´est jamais retourné dans ma fonction donc le boolean fonction n´est pas vrai. Je suppose qu´il y a un probleme avec mon if. Possiblement je ne suis jamais dans la boucle ou les types definis sont les mauvais.

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2022 à 4:58:27

                  Bonjour,

                  Pour comparer des strings, on utilise la méthode  equals, pas ==.

                  == compare si les références sont identiques.

                  equals compare si les caractères sont identiques.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 janvier 2022 à 7:36:28

                    koursk a écrit:

                    t j´ai un autre problème.

                    J´essaye de rechercher si un élément et présent dans mon tableau en retrournant vrai ou faux:

                    public static boolean rechercher(String[][]T, String truc)
                    	{
                    	boolean trouver = false;
                    		
                    	for (int i=0; i<T.length;i++)
                    	{
                    		for (int j=0; j<T[i].length;j++)
                    		{
                    			if (T[i][j]==truc)
                    			{
                    				trouver = true;
                    				System.out.println("bravo!");
                    				break;
                    			}
                    		}
                    	}
                    	return trouver;

                    Il est normal d'avoir des problèmes quand on programme et particulièrement quand on apprend. Mais il faut bien se dire que ces problèmes ne tombent pas du ciel au hasard, ils ont des causes, qui viennent de celui qui écrit le code. Et on peut les limiter en faisant attention.

                    1. Bien nommer les choses.

                    Si je demande "que fait la fonction rechercher ?" la réponse ça ne va pas être "une boucle sur i et j etc". elle indique si un tableau (à deux dimensions) contient une valeur. Et on va l'utiliser pour exprimer "si tel tableau contient telle valeur alors faire ceci".

                    Qui est facile à lire si on a bien choisi les mots

                    if (tableauContient(tab, truc)) {
                       ....
                    }

                    rechercher, c'est une action, mais ce qui nous intéresse c'est son résultat, le fait que le tableau contienne ou pas.

                    2. Ne pas s'occuper de ce qui ne nous regarde pas.

                    Cette fonction a pour rôle de retourner un booléan, pas d'afficher quoi que ce soit. println => poubelle.

                    3. Utiliser les techniques appropriées. Pour passer en revue les éléments d'un tableau, il y a une boucle for (range based for loop) qui évite de s'emmerder avec les indices. C'est plus clair, et plus efficace. [au passage, quand on manipule des tableaux avec lignes et colonnes, les indices il vaut mieux les appeler l et c que i et j, sauf si on est en train de traduire une expression mathématique connue avec des i et j].

                    4. respecter les conventions. En java, le nom d'une variable commence par une minuscule.

                    5. respecter la grammaire et l'orthographe.

                    6. Attention, si on a trouvé il faut sortir des deux boucles. Le plus simple est de sortir par return

                    boolean tableauContient(String[][] tableau,
                                            String chaine)
                    {
                        for (var ligne: tableau) {
                           for (var element: ligne) {
                               if (element.equals(chaine)) {
                                    return true;
                               }
                           }
                        }
                        return false;
                    }
                    

                    Si on tient  à sortir par break des deux boucles et donc trimballer  un boolean qu'on retourne à la fin, c'est possible, mais il faut définir une étiquette

                    boolean trouve = false;  // valeur par défaut
                    parcoursTableau:
                       for (....) {
                           for (....) {
                               if (....) {
                                   trouve = true;
                                   break parcoursTableau;
                               }
                           }
                       }
                    return trouve;
                    


                    en comparant, on ne peut pas dire que ça soit spécialement élégant, dans ce cas.

                    -
                    Edité par michelbillaud 19 janvier 2022 à 8:06:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 janvier 2022 à 23:12:12

                      Bonjour,

                      Merci encore pour l´astuce du .equals et les conseils :)

                      J´aurai une dernière question. Si je veux remplir un tableau à deux dimensions qui contiendra des caracteres (par exemple les noms de clients) et des nombres (par exemple des montants de factures que l´on aimerai comparer entre eux), comment peut on faire cela. Lorsque je declare mon tableau j´avais utilisé

                      String[][] nomTableau = new String [nbLigne][nbColonne]

                      J´ai essayer de seulement changer le type dans le tableau en utilisant: (je sais que "int" ne serait pas le bon type pour des valeurs mais c´est juste pour comprendre dans un premier temps).

                      nouvelleVariable=Integer.parsInt(nomTableau[i][i]));

                      Puis j´aimerai comparer cette valeur à une valeur donnée en parametre dans ma fonction puis supprimer toute les personnes qui ont fourmis des services superieurs à une telle somme.

                      Là encore j´ai essayé avec une boucle. Lorsque ma condition est rencontrée je compte le nombre de lignes qui devront être supprimer du tableau puis je recrée un nouveau tableau ayant le bon nombre de ligne et je recopie de l´ancien tableau dans le nouveau tableau (encore avec une boucle).

                      nouveauTableau[ligne][colonne]=nomTableau[ligne+1][colonne];

                      L´erreur qui m´est retournée: Comme j´aurai pu m´y attendre une erreur concernant le type de mes données.

                      Exception in thread "main" java.lang.NumberFormatException: For input string: "xyz"
                      


                      Encore merci pour votre temps.

                      -
                      Edité par koursk 21 janvier 2022 à 23:13:37

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 janvier 2022 à 8:41:25

                        Le nom du client, c'est une chaîne, pas un caractère.

                        C'est pas un tableau à deux dimensions qu'il faut, c'est un tableau d'objets contenant un nom et un montant.

                        En java moderne (depuis java 14, on en est a java 17) l'occasion de placer un record

                        record Facture(string nomClient, int montant) {}

                        Sinon, definir "a la main" une classe Facture

                        Et puis' utiliser un Arraylist de préférence à un tableau. Il y a ce qu'il faut pour enlever des élements

                        -
                        Edité par michelbillaud 22 janvier 2022 à 8:49:06

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Creation tableau

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown