-1

Ceci est mon premier message de dépassement de pile, et je suis relativement nouveau à java, donc je ne comprends peut-être pas certains des commentaires que vous me fournissez.ArrayIndexOutOfBoundsException lorsque j'essaie de trouver le déterminant d'une matrice/matrice 2D

Avec ce programme, je suis supposé trouver le déterminant d'une matrice récursivement avec une taille déterminée par l'utilisateur. Quand je le fais, mais je reçois cette erreur:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

at Determinant.Copy<Determinant.java:55> 
at Determinant.det<Determinant.java:31> 
at Determinant.main<Determinant.java:15> 

Je comprends ce que cela signifie erreur, mais je ne comprends pas pourquoi ça se passe.

Voici les classes que je utilise (les deux printmatrix et la principale méthode ont été écrits par mon professeur, je devais terminer la copie et les méthodes DET):

import javax.swing.JOptionPane; 

public class Determinant 
{ 
    public static void main(String args[]) 
    { 
    String sizeStr = JOptionPane.showInputDialog("What size?"); 
    int size = Integer.parseInt(sizeStr); 
    int[][] matrix = new int[size][size]; 
    for(int i=0; i<size; i++) 
     for(int j=0; j<size; j++) 
      matrix[i][j] = (int)(Math.random()*40)-20; 

    printArray(matrix); 
    System.out.println("\nThe determinant = "+det(matrix)); 

    } 


public static int det(int[][] A) 
{ 
    int answer = 0; 
    int place = 0; 
    int[][] temp; 
    int[][] temp1; 
    if(A.length==1){ 
     return(A[0][0]); 
    } 
    for(int i = 0; i<A.length; i++){ 
     temp = new int[A.length-1][A[0].length-1]; 
     temp1 = Copy(temp, i); 
     if(i%2==0){ 
      place = 1; 
     } 
     else{ 
      place = -1; 
     } 
     answer = answer + place * A[0][i] * det(temp1); 
    } 
    return answer; 
} 



public static int[][] Copy(int[][] B, int i) 
{ 
    int[][] C = new int[B.length-1][B.length-1]; 

    for(int j = 1; j<B.length; j++){ 
     for(int k = 0; k<B[0].length; k++){ 
      if(k>i){ 
       C[j-1][k-1]=B[j][k]; 
      } 
      else{ 
       C[j-1][k]=B[j][k]; 
      } 
     } 
    } 
    return C; 
} 


public static void printArray(int[][] A) 
{ 
    for(int i=0; i<A.length; i++) 
    { 
     for(int j=0; j<A.length; j++) 
     { 
      int num = A[i][j]; 
      if(num<-9) 
       System.out.print(" "); 
      else if(num<0||num>9) 
       System.out.print(" "); 
      else 
       System.out.print(" "); 
      System.out.print(A[i][j]); 
     } 
     System.out.println(); 
    } 
} 


} 

L'erreur se produit à l'instruction else dans Copier et temp1 = Copy(temp, i).

Je suis confus, comme si j ou k = 1, ne devrait pas être une position dans le tableau? Qu'est-ce que je rate?

+0

http://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – Tunaki

+0

Première ligne de copie, vous avez créé le nouvel élément de tableau plus petit que l'ancien (pas le seul problème) –

+1

Je crois que vous essayez de copier le tableau 2D 'B', si vous définissez les limites de' C' de façon équivalente vous devriez corriger votre ligne 'int [] [] C = nouveau int [B.length-1] [B.length-1]; 'à int [] [] C = nouveau int [B.length] [B [0] .length];' –

Répondre

0

La taille du tableau C dans la copie de méthode doit être identique à celle du tableau B. Raison: Vous copiez le tableau B dans le tableau C, ils doivent avoir la même taille. Effectuez les actions suivantes:

import javax.swing.JOptionPane; 

public class Determinant 
{ 
    public static void main(String args[]) 
    { 
    String sizeStr = JOptionPane.showInputDialog("What size?"); 
    int size = Integer.parseInt(sizeStr); 
    int[][] matrix = new int[size][size]; 

    for(int i=0; i<size; i++) { 
     for(int j=0; j<size; j++) { 
      matrix[i][j] = (int) (Math.random() * 40) - 20; 
     } 
    } 

    printArray(matrix); 
    System.out.println("\nThe determinant = "+det(matrix)); 

    } 


public static int det(int[][] A) 
{ 
    int answer = 0; 
    int place = 0; 
    int[][] temp; 
    int[][] temp1; 
    if(A.length==1){ 
     return(A[0][0]); 
    } 
    for(int i = 0; i<A.length; i++){ 
     temp = new int[A.length-1][A[0].length-1]; 
     temp1 = Copy(temp, i); 
     if(i%2==0){ 
      place = 1; 
     } 
     else{ 
      place = -1; 
     } 
     answer = answer + place * A[0][i] * det(temp1); 
    } 
    return answer; 
    } 



public static int[][] Copy(int[][] B, int i) 
{ 
    //The C array size should be same as B 
    int[][] C = new int[B.length][B[0].length]; 

    for(int j = 1; j<B.length; j++){ 
     for(int k = 0; k<B[0].length; k++){ 
      if(k>i){ 
       C[j-1][k-1]=B[j][k]; 
      } 
      else{ 
       C[j-1][k]=B[j][k]; 
      } 
     } 
    } 
    return C; 
} 


public static void printArray(int[][] A) 
{ 
    for(int i=0; i<A.length; i++) 
    { 
     for(int j=0; j<A.length; j++) 
     { 
      int num = A[i][j]; 
      if(num<-9) 
       System.out.print(" "); 
      else if(num<0||num>9) 
       System.out.print(" "); 
      else 
       System.out.print(" "); 
      System.out.print(A[i][j]); 
     } 
     System.out.println(); 
    } 
} 

}

Hope this explique, profitez-en!

+1

Seulement si le la matrice B est carrée Si ce n'est pas le cas, cela devrait être 'int [] [] C = nouvel int [B.length] [B [0] .length];' Ou vous pouvez utiliser le '.clone intégré() 'méthode. –

+0

@MadMatts, Merci de le signaler. On dirait que la matrice est carrée, car le programme accepte une entrée nommée "taille" et effectue 'new int [taille] [taille]'. Je n'en ai pas moins édité le post car il supporte les matrices non carrées. – MSameer

+0

Oui, ça a l'air de marcher. Merci pour votre retour! – rospendan

0

Vous devez déclarer votre matrice en fonction de copie de cette façon:

int[][] C = new int[B.length][B[0].length]; 

Sinon, vous déclarez une matrice sans ligne et colonne. Le fait que vous commenciez à utiliser à partir de 0 ne signifie pas que vous devriez déclarer une rangée en moins!