二次方程式の問題集を解くプログラムの解説 - 萌えJava超入門
第二十三章 多次元配列

二次方程式の問題集を解く
プログラムの解説


一度紹介させていただいた
二次方程式の問題集を解くプログラムを見てみましょう。


二次方程式の問題集を解くプログラムの解説


「続・二次方程式の解を求めるサンプルコード」 で紹介したサンプルを
もう一度読み返してみましょう。

あ~!
思い出しました。
前に会長が暴走して
二次元配列を使ったやつっすね?
暴走とは心外な!
みんなノリノリだったじゃないか。
確かに。




あっ。
設問は第十二章の時と違っている。
気を付けてほしい。
  次の2次方程式を解きなさい

   1.   x2 - 8x +  9 =0
   2.   x2 +16x + 58 =0
   3.   x2 -10x +  1 =0
   4    x2 +28x +142 =0
   5.  3x2 -30x + 51 =0
   6.  4x2 +24x + 28 =0
   7.   x2 - 1x -  1 =0
   8.  9x2 +18x +  2 =0
   9.  2x2 - 8x +  5 =0
  10.  4x2 +12x +  7 =0
  11. 12x2 -48x + 39 =0
  12.  9x2 +24x + 10 =0
  13.  6x2 -24x + 21 =0
  14.  8x2 +20x -  1 =0
  15.  9x2 - 4x -  1 =0
  16. 12x2 + 2x -  7 =0
  

13までの約分をする
reduceメソッドを
つけてみた。
あんまり気にしなくていい。
//Sample23_10.java
class Sample23_10 {

  /*素数*/
  static int[] primeNums = {2, 3, 5, 7, 11, 13};

  static double[] method_04(double a, double b, double c){
      /*各パートの計算*/
      double[] ans = {(2*a) , -b ,  (b*b-4*a*c)};
      return ans;
  }
  static double[] reduce(double[] ans){
      /*約分*/
      for(int i=0; i< primeNums.length; i++){
          if(ans[0] >= primeNums[i]){
            while(
              ans[0]%primeNums[i] == 0 &&
              ans[1]%primeNums[i] == 0 &&
              ans[2]%(primeNums[i]*primeNums[i]) == 0
              ){
                ans[0]/=primeNums[i];
                ans[1]/=primeNums[i];
                ans[2]/=(primeNums[i]*primeNums[i]);
            }
          }
      }
      return ans;
  }
  static void printAnswer(double[] ans){
      /*答えの表示*/
      double partA = ans[0];
      double partB = ans[1];
      double partC = ans[2];

      System.out.println("          " + partB + "  ±√( "+ partC +" )");
      System.out.println("    x = -------------------------");
      System.out.println("                " + partA);
  }
    public static void main(String[] args){
      /*設問の係数を二次元配列で準備*/
      int[][] coefficient ={
          {1,-8,9},
          {1,16,58},
          {1,-10,1},
          {1,28,142},
          {3,-30,51},
          {4,24,28},
          {1,-1,-1},
          {9,18,2},
          {2,-8,5},
          {4,12,7},
          {12,-48,39},
          {9,24,10},
          {6,-24,21},
          {8,20,-1},
          {9,-4,-1},
          {12,2,-7}
        };

        for(int i=0; i<coefficient.length; i++){

            /*一問ずつ抽出*/
            int[] line = coefficient[i]; //coefficient[i]は一次元配列
            int a = line[0];
            int b = line[1];
            int c = line[2];

            /*設問の表示*/
            System.out.println(
                (i+1) + ". " + (int)a + "xx+" + (int)b +"x+" +(int)c +"=0"
            );

            /*計算*/
            double[] ans = method_04(a, b, c);

            /*13までの約分*/
            ans = reduce(ans);

            /*答えの表示*/
            printAnswer(ans);
       }
    }
}

サンプルは、二次方程式の解を求める複数問題を、
for文を使って一度に解くプログラムです。

method_04メソッドは、設問の各項の係数3つを引数に与えると、
解の各パート(partA, partB, partC) の値を配列で返します。

method_04メソッドに与える3つの係数は、一次元配列に収められています。

この一次元配列16問分を配列にしたのが、coefficientです。
coefficient は、二次元配列ですね。
coefficient は、new int[16][3]; ということです。

配列を引数にするメソッドに、
繰り返し引数を与えるような場合には
二次元配列が便利だな。
表を一行ずつ処理していく
感じですね。
そうそう!
それだ。
コマンドライン
>javac -encoding UTF-8 Sample23_10.java
>java Sample23_10
1. 1xx+-8x+9=0
          4.0  ±√( 7.0 )
    x = -------------------------
                1.0
2. 1xx+16x+58=0
          -8.0  ±√( 6.0 )
    x = -------------------------
                1.0
3. 1xx+-10x+1=0
          5.0  ±√( 24.0 )
    x = -------------------------
                1.0
4. 1xx+28x+142=0
          -14.0  ±√( 54.0 )
    x = -------------------------
                1.0
5. 3xx+-30x+51=0
          5.0  ±√( 8.0 )
    x = -------------------------
                1.0
6. 4xx+24x+28=0
          -3.0  ±√( 2.0 )
    x = -------------------------
                1.0
7. 1xx+-1x+-1=0
          1.0  ±√( 5.0 )
    x = -------------------------
                2.0
8. 9xx+18x+2=0
          -3.0  ±√( 7.0 )
    x = -------------------------
                3.0
9. 2xx+-8x+5=0
          4.0  ±√( 6.0 )
    x = -------------------------
                2.0
10. 4xx+12x+7=0
          -3.0  ±√( 2.0 )
    x = -------------------------
                2.0
11. 12xx+-48x+39=0
          4.0  ±√( 3.0 )
    x = -------------------------
                2.0
12. 9xx+24x+10=0
          -4.0  ±√( 6.0 )
    x = -------------------------
                3.0
13. 6xx+-24x+21=0
          4.0  ±√( 2.0 )
    x = -------------------------
                2.0
14. 8xx+20x+-1=0
          -5.0  ±√( 27.0 )
    x = -------------------------
                4.0
15. 9xx+-4x+-1=0
          2.0  ±√( 13.0 )
    x = -------------------------
                9.0
16. 12xx+2x+-7=0
          -1.0  ±√( 85.0 )
    x = -------------------------
                12.0


これ爽快よね~。
あとはノートに写すだけ。


お疲れ様でした。




© 2019 awasekagami