2017-10-21 16 views
0

私はJavaにとって非常に新しいので、関数に引数として渡されたときに変数 "A"の値が変化する理由はわかりません。私は関数の値を変更しますが、関数は引数の独自の "コピー"を作成するので、これは問題ではないはずです。 私のプロジェクトはメイン関数と、以下に示すように関数が宣言され実装されているクラスで構成されています。変数は関数に渡されるとその値を変更します

package NewtonRapson; 

    public class Main { 

     public static void main(String[] args) { 


      division2 d2 = new division2(); 


      double A[] = {1, -2, 0, 7}; 
      double B[] = {0,1,1}; 
      double D[]; 
      double res = 0; 

      d2.imprimir(A); 
      res = d2.p_eval (A, 0.707); 
      System.out.println(); 
      System.out.println(res); 


      d2.p_div(A,B); 

      d2.imprimir(A); 
      res = d2.p_eval (A, 0.707); 
      System.out.println(); 
      System.out.println(res); 


     } 

    } 
` 

    package NewtonRapson; 
    public class division2 { 
     int grado(double A[]){ 
     int grado = A.length -1; 
     int cont = 0; 

     for (int i = (A.length - 1); i>= 0; i--){ 
      if (A[i] != 0){break;} 
      if (A[i] == 0){ cont++; } 



     } 
     return grado - cont; 
     } 

     double [] incrementar_grado(double A[], int k){ 
      double r[] = new double[A.length]; 
      for (int i = 0; i < A.length; i++){ 
       r[i] = 0;  
      } 

      for (int i = 0; i < A.length; i++){ 
       if (i+k < A.length){ 
        r[i+k] = A[i]; 
       }  
      } 
     return r; 
    } 

     double [] p_div(double A[], double B[]){ 
      double cte; 
      double C[] = new double[A.length]; 

      while (grado(A) >= grado(B)){ 

       for(int i = 0; i < C.length; i++){ 
        C[i] = 0; 

       } 
       cte = A[grado(A)]/B[grado(B)]; 

        for(int i = 0; i < C.length; i++){ 
         if(i >= B.length) break; 
         C[i] = -cte*B[i]; 


        } 
        for(int i = 0; i < C.length; i++){ 
          if (grado (A) > grado (C)){ 
          C = incrementar_grado(C, grado(A)-grado(C)); 
          } 


         A[i] = A[i]+C[i]; 
        } 
      } 
      double res[] = new double[grado(A) + 1]; 
      for (int i =0; i< res.length; i++){ 
       res [i] = A[i]; 

      } 
      return res; 

     } 

     double p_eval(double A[], double x) { 
      double res = 0; 
      for (int i = 0; i < A.length; i++) { 
       res = res + A[i] * Math.pow(x, i); 

      } 

      return res; 
     } 

     void imprimir(double A[]){ 
      System.out.println(); 

      for(int i=0;i<A.length;i++){ 
       //System.out.println(dividir(polinomio,d)[i]); 
       System.out.print( A[i]); 
       System.out.print(" | "); 

      } 
     } 

     double [] p_derivar(double A[]) { 

      double d[] = new double [grado(A)]; 
      for(int i=0;i< d.length; i++){ 
       d[i]= A[i+1] * (i+1); 
      } 

     return d; 


     } 

    } 

なぜ、Aがその価値を変えるのかは分かりません。

+1

「A」が値を変更すると言うとき、私はあなたが 'A'の内容を意味すると仮定しています、それは正しいですか?この質問の最初の答え、https://stackoverflow.com/questions/12757841/are-arrays-passed-by-value-or-passed-by-reference-in-javaと私が提案した質問を参照してください重複 – pstrjds

+0

@pstrjds 2番目の回答が役に立ちました。 –

答えて

1

double A[]は、単純型変数ではなくテーブル(オブジェクト)です。関数p_div(double A[], double B[])に対しては、main関数からテーブルAとBへの参照のみを渡しています。 p_divのA(A[i] = A[i]+C[i];)を変更するときは、同じものを指す(main)のでAを変更しています。

関連する問題