Bonjour tout le monde,
Pouvez svp voir mon modeste code ci-après et me dire où ça cloche ? je n’arrive pas à le compiler… Merci d’avance
public class Matrice{
int M[][]=null;
Matrice(int n) // constructeur a un seul argument pour declarer la matrice
{
M = new int[n][n];
}
/* Methode multiplie(int k) */
public int [] [] multiplie(int k)
{
int i,j;
for(i=0;i<M.length;i++){
for(j=0;j<M.length;j++) {M[i][j] = k*M[i][j];}
}
return M;
}
/* Methode somme(int N[][]) */
public int [] [] somme(int N[][])
{
int i,j;
int somme[][]=null;
if(N.length!= M.length) { System.out.println("Cette matrice doit avoir la meme taille que la premiere..");
somme = null;
}
else
for(i=0;i<M.length;i++){
for(j=0;j<M.length;j++) {somme[i][j] = M[i][j]+N[i][j];}
}
return somme;
}
/* Methode affiche() */
public void affiche()
{
int i,j;
for(i=0;i<M.length;i++){
for(j=0;j<M.length;j++) {System.out.print("-"+M[i][j]);} // impression du tableau
}
}
/* Methode main() */
public static void main(String [] args)
{
int i,j,n,p; // Declaration et initialisation des tailles des tableaux
n=args.length; // Nombre d'argument
p=(int) Math.sqrt(n);
Matrice M = new Matrice(p);
for(i=0;i<p;i++){
for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}
System.out.println("\n La matrice est : ");
M.affiche();
M.multiplie(2); // appel de la methode multiplie(); */
System.out.println("\n La matrice multipliee par 2 est : ");
M.affiche();
}
}
tu as certaimenemt un conflit entre tes deux M… Celui declare comme membre de ta classe, et ta variable dans main… Peut-etre que tu n’en as pas… mais cest tres risque.
Ensuite pour pouvoir faire M[i][j] sur un objet de type Matrice, il faut surcharger l’operateur []. (n’etant pas expert en Java… je ne sais pas si ca peut se faire…). La pratique voudrais que tu fasse deux methodes du genre :
public int GetElement(int i, int j) { return M[i][j]; }
public void SetElement(int i, int j, int val) { M[i][j] = val; }
La non compatibilite est donc normale. Tu es en train de sous-entendre que parceque tu as un membre int[][] dans ta classe Matrice alors forcement un objet de type Matrice est directement un tableau. Ce n’est biensur pas le cas. Java n’a aucun moyen de savoir que quand tu fais M[i][j] tu veux en fait acceder a l’element i,j du tableau a l’interieur de l’objet M de type Matrice (encore une fois les noms sont conflictuels et ne t’aident pas). Donc il faut lui dire explicitement, soit en surchargant l’operateur [] (si cest faisable) soit en ajoutant les deux petits methodes que je t’ai mis au-dessus.
Enfin, comme tu es en train de faire de la programmation objet… autant te servir des classes que tu defini. Par exemple ta methode somme devrait prendre une Matrice en parametre et non pas un int[][]. Si ton objet est bien implemente tu ne devrais pas avoir a acceder au tableau d’int a l’interieur directement.
J’espere t’avoir aide. Si t’as besoin de clarifications n’hesite pas.
Re Les pro-mecs
Vous avez tous les deux raison, effectivement je croyais qu’un objet matrice est automatiquement un tableau à 2 dimensions, alors il a fallu l’expliciter par :
Matrice Mat = new Matrice(p);
for(i=0;i<p;i++){
for(j=0;j<p;j++) {Mat.M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}
et puis manipuler le tableau (matrice) en l’affichant
System.out.println("\n La matrice est : ");
Mat.affiche();
et le multipliant etc…
Mat.multiplie(2); // appel de la methode multiplie();
System.out.println("\n La matrice multipliee par 2 est : ");
Mat.affiche();
et voici un exemple d’éxecution :
C:\codesjava>java Matrice 10 11 12 13 14 15 16 17 18 19
La matrice est :
10 11 12
13 14 15
16 17 18
La matrice multipliee par 2 est :
20 22 24
26 28 30
32 34 36
Re
Autre question SVP…
Comment est ce que je peux utiliser une classe que j’ai crée au préalable (ces méthodes) dans une nouvelle classe.
Exemple :
supposons que j’ai une classe Util.java dans un repertoire C:\codesjava (Util contient la methode lire())
et je veux créer une classe Test.java :
public class Test {
int n,..;
Util.lire();
....
....
}
J’ai des problèmes de genre :
Test.java:12: cannot find symbol
symbol : method lire()(java.lang.String)
location: class Test
…
Comment est ce que je dois procéder, j’ai ajouter un : import codesjava*.java ----> sans résultats
J’ai même indiqué le chemin de (Util.java) à la compilation :
javac -classpath c:\codesjava\Util.java Test.java ----> également sans résultats…
Merci d’avance pour vos réponses.
En quelque sorte oui, je poursuis une formation à distance, et donc je suis obligé de résoudre plein de trucs seul quand il n y a pas de réactivité vis à vis de mes collègues…
Dans ton classpath, tu ne dois pas fournir le fichier source, mais un dossier contenant des fichiers *.class.
Informe toi sur Eclipse, ou Ant pour te faciliter la tâche
Pour mon problème, c’est bon c’est résolu grace à vous (merci bcp…), j’ai tout mis dans le même repertoire et j’ai crée le fichier .class de la 1ère classe (et non pas le fichier source que vous l’avez mentionnée), donc la compilation a reussi sans pour autant dicter tout le path.
Mercii
Re salut les amis,
J’ai un autre de souci de formulation d’une méthode java, la méthode sert pour remplir aleatoirement un tableau de byte (0 ou 1) mais avec un nombre de (1) précisé.
la taille du tableau est connu (n)
le nombre de (1) dans le tableau est connu aussi §
J’ai procédé ainsi :
/* public void affecteTableau() */
{
int i, position;
for(i=0;i<p;i++)
{
position=(int) (Math.random()*n);
tabBateau[position]=1;
}
le problème est que si jamais une position a été retire plus qu’une seule fois, j’aurais moins de (1) que demandé.
Merciii