QA@IT
«回答へ戻る

説明コードをミスっていたので修正

5599
               if (D > 0) {
                    // 省略
               } else if (D == 0) {
-                   // 省略
+                   re1 = -b / (2 * a);
+                   im1 = 0;
+                   D=1;
               } else {
-                   re1 = re2 = -b / (2*a);
-                   im1 = im2 = Math.sqrt(-D) / (2 * a);
-                   D=0;
+                   // 省略
               }
 
               if (D == 0) {
                   System.out.println("x = " + re1 + " + " + im1 + "i");
               } else {
-              System.out.println("x = " + re1 + " + " + im1 + "i, "
+                  System.out.println("x = " + re1 + " + " + im1 + "i, "
                                           + re2 + " + " + im2 + "i");
               }
 ```

上から4行目をre2=0,im2=0にしましたが、解決できませんでした。

これはどのようにしましたか?

以下の様であればコンパイルエラーは回避できますが、

double re1, re2 = 0, im1, im2 = 0, D;

re2とim2は隣同士ではないので

double re1, re2 = 0, im1 = 0, im2, D;

とか

double re1, re2 = 0, im2 = 0, D;

になっていませんか?
どんなエラーがでますか?

私の環境では最初に書いたやり方で

x = 2.0 + 0.0i, 0.5 + 0.0i

と出ます。

0を代入しているからエラーの意味はわかっているような気もしますが
修正前のプログラムでは、} else if (D == 0) { に入った場合に re2,im2に何も入らない状況が発生します。

すると、

System.out.println("x = " + re1 + " + " + im1 + "i, "
   + re2 + " + " + im2 + "i");

で何も入っていないre2を使おうとしているのでコンパイルエラーになります。

作り手としては D==0という予防線を張っているつもりですが、最初の ifブロックと次のifブロックは互いに独立してますので、その間に Dが0になる可能性が絶対無いとは言い切れないのでコンパイルエラーになっています。

例えば、以下の様なケースですね。

              D=b * b - 4 * a * c;
              if (D > 0) {
                   // 省略
              } else if (D == 0) {
                   re1 = -b / (2 * a);
                   im1 = 0;
                   D=1;
              } else {
                   // 省略
              }

              if (D == 0) {
                  System.out.println("x = " + re1 + " + " + im1 + "i");
              } else {
                  System.out.println("x = " + re1 + " + " + im1 + "i, "
                                          + re2 + " + " + im2 + "i");
              }

コンパイラは実行してみているわけではないので、その可能性があるルートを見つけるとコンパイルエラーとする場合があります。

逆に以下の様なコードであれば、使う前にre2が初期化されないことはないのでコンパイルエラーにはなりません。

public class Program {
    public void output() {
        int a,b,c;
        double re1, re2, im1, im2, D;

        a = 2;
        b = -5;
        c = 2;

        D=b * b - 4 * a * c;
        if(D==0){
            re1 = -b / (2 * a);
            im1 = 0;
            System.out.println("x = " + re1 + " + " + im1 + "i");
        }else{
            if(D > 0){
                re1 = (-b + Math.sqrt(D)) / (2 * a);
                re2 = (-b - Math.sqrt(D)) / (2 * a);
                im1 = 0;
                im2 = 0;
            } else {
                // D < 0
                re1 = re2 = -b / (2*a);
                im1 = im2 = Math.sqrt(-D) / (2 * a);
            }
            System.out.println("x = " + re1 + " + " + im1 + "i, "
                    + re2 + " + " + im2 + "i");
        }
    }
    public static void main(String[] args) {
        Program p = new Program();
        p.output();
    }
}
> 上から4行目をre2=0,im2=0にしましたが、解決できませんでした。

これはどのようにしましたか?

以下の様であればコンパイルエラーは回避できますが、
```
double re1, re2 = 0, im1, im2 = 0, D;
```
re2とim2は隣同士ではないので
```
double re1, re2 = 0, im1 = 0, im2, D;
```
とか
```
double re1, re2 = 0, im2 = 0, D;
```
になっていませんか?
どんなエラーがでますか?

私の環境では最初に書いたやり方で
```
x = 2.0 + 0.0i, 0.5 + 0.0i
```
と出ます。


0を代入しているからエラーの意味はわかっているような気もしますが
修正前のプログラムでは、`} else if (D == 0) {` に入った場合に re2,im2に何も入らない状況が発生します。

すると、
```
System.out.println("x = " + re1 + " + " + im1 + "i, "
   + re2 + " + " + im2 + "i");
```
で何も入っていないre2を使おうとしているのでコンパイルエラーになります。

作り手としては `D==0`という予防線を張っているつもりですが、最初の ifブロックと次のifブロックは互いに独立してますので、その間に Dが0になる可能性が絶対無いとは言い切れないのでコンパイルエラーになっています。

例えば、以下の様なケースですね。
```java
              D=b * b - 4 * a * c;
              if (D > 0) {
                   // 省略
              } else if (D == 0) {
                   re1 = -b / (2 * a);
                   im1 = 0;
                   D=1;
              } else {
                   // 省略
              }

              if (D == 0) {
                  System.out.println("x = " + re1 + " + " + im1 + "i");
              } else {
                  System.out.println("x = " + re1 + " + " + im1 + "i, "
                                          + re2 + " + " + im2 + "i");
              }
```

コンパイラは実行してみているわけではないので、その可能性があるルートを見つけるとコンパイルエラーとする場合があります。

逆に以下の様なコードであれば、使う前にre2が初期化されないことはないのでコンパイルエラーにはなりません。

```java
public class Program {
    public void output() {
        int a,b,c;
        double re1, re2, im1, im2, D;

        a = 2;
        b = -5;
        c = 2;

        D=b * b - 4 * a * c;
        if(D==0){
            re1 = -b / (2 * a);
            im1 = 0;
            System.out.println("x = " + re1 + " + " + im1 + "i");
        }else{
            if(D > 0){
                re1 = (-b + Math.sqrt(D)) / (2 * a);
                re2 = (-b - Math.sqrt(D)) / (2 * a);
                im1 = 0;
                im2 = 0;
            } else {
                // D < 0
                re1 = re2 = -b / (2*a);
                im1 = im2 = Math.sqrt(-D) / (2 * a);
            }
            System.out.println("x = " + re1 + " + " + im1 + "i, "
                    + re2 + " + " + im2 + "i");
        }
    }
    public static void main(String[] args) {
        Program p = new Program();
        p.output();
    }
}
```

回答を投稿

上から4行目をre2=0,im2=0にしましたが、解決できませんでした。

これはどのようにしましたか?

以下の様であればコンパイルエラーは回避できますが、

double re1, re2 = 0, im1, im2 = 0, D;

re2とim2は隣同士ではないので

double re1, re2 = 0, im1 = 0, im2, D;

とか

double re1, re2 = 0, im2 = 0, D;

になっていませんか?
どんなエラーがでますか?

私の環境では最初に書いたやり方で

x = 2.0 + 0.0i, 0.5 + 0.0i

と出ます。

0を代入しているからエラーの意味はわかっているような気もしますが
修正前のプログラムでは、} else if (D == 0) { に入った場合に re2,im2に何も入らない状況が発生します。

すると、

System.out.println("x = " + re1 + " + " + im1 + "i, "
   + re2 + " + " + im2 + "i");

で何も入っていないre2を使おうとしているのでコンパイルエラーになります。

作り手としては D==0という予防線を張っているつもりですが、最初の ifブロックと次のifブロックは互いに独立してますので、その間に Dが0になる可能性が絶対無いとは言い切れないのでコンパイルエラーになっています。

例えば、以下の様なケースですね。

              D=b * b - 4 * a * c;
              if (D > 0) {
                   // 省略
              } else if (D == 0) {
                   // 省略
              } else {
                   re1 = re2 = -b / (2*a);
                   im1 = im2 = Math.sqrt(-D) / (2 * a);
                   D=0;
              }

              if (D == 0) {
                  System.out.println("x = " + re1 + " + " + im1 + "i");
              } else {
              System.out.println("x = " + re1 + " + " + im1 + "i, "
                                          + re2 + " + " + im2 + "i");
              }

コンパイラは実行してみているわけではないので、その可能性があるルートを見つけるとコンパイルエラーとする場合があります。

逆に以下の様なコードであれば、使う前にre2が初期化されないことはないのでコンパイルエラーにはなりません。

public class Program {
    public void output() {
        int a,b,c;
        double re1, re2, im1, im2, D;

        a = 2;
        b = -5;
        c = 2;

        D=b * b - 4 * a * c;
        if(D==0){
            re1 = -b / (2 * a);
            im1 = 0;
            System.out.println("x = " + re1 + " + " + im1 + "i");
        }else{
            if(D > 0){
                re1 = (-b + Math.sqrt(D)) / (2 * a);
                re2 = (-b - Math.sqrt(D)) / (2 * a);
                im1 = 0;
                im2 = 0;
            } else {
                // D < 0
                re1 = re2 = -b / (2*a);
                im1 = im2 = Math.sqrt(-D) / (2 * a);
            }
            System.out.println("x = " + re1 + " + " + im1 + "i, "
                    + re2 + " + " + im2 + "i");
        }
    }
    public static void main(String[] args) {
        Program p = new Program();
        p.output();
    }
}
> 上から4行目をre2=0,im2=0にしましたが、解決できませんでした。

これはどのようにしましたか?

以下の様であればコンパイルエラーは回避できますが、
```
double re1, re2 = 0, im1, im2 = 0, D;
```
re2とim2は隣同士ではないので
```
double re1, re2 = 0, im1 = 0, im2, D;
```
とか
```
double re1, re2 = 0, im2 = 0, D;
```
になっていませんか?
どんなエラーがでますか?

私の環境では最初に書いたやり方で
```
x = 2.0 + 0.0i, 0.5 + 0.0i
```
と出ます。


0を代入しているからエラーの意味はわかっているような気もしますが
修正前のプログラムでは、`} else if (D == 0) {` に入った場合に re2,im2に何も入らない状況が発生します。

すると、
```
System.out.println("x = " + re1 + " + " + im1 + "i, "
   + re2 + " + " + im2 + "i");
```
で何も入っていないre2を使おうとしているのでコンパイルエラーになります。

作り手としては `D==0`という予防線を張っているつもりですが、最初の ifブロックと次のifブロックは互いに独立してますので、その間に Dが0になる可能性が絶対無いとは言い切れないのでコンパイルエラーになっています。

例えば、以下の様なケースですね。
```java
              D=b * b - 4 * a * c;
              if (D > 0) {
                   // 省略
              } else if (D == 0) {
                   // 省略
              } else {
                   re1 = re2 = -b / (2*a);
                   im1 = im2 = Math.sqrt(-D) / (2 * a);
                   D=0;
              }

              if (D == 0) {
                  System.out.println("x = " + re1 + " + " + im1 + "i");
              } else {
              System.out.println("x = " + re1 + " + " + im1 + "i, "
                                          + re2 + " + " + im2 + "i");
              }
```

コンパイラは実行してみているわけではないので、その可能性があるルートを見つけるとコンパイルエラーとする場合があります。

逆に以下の様なコードであれば、使う前にre2が初期化されないことはないのでコンパイルエラーにはなりません。

```java
public class Program {
    public void output() {
        int a,b,c;
        double re1, re2, im1, im2, D;

        a = 2;
        b = -5;
        c = 2;

        D=b * b - 4 * a * c;
        if(D==0){
            re1 = -b / (2 * a);
            im1 = 0;
            System.out.println("x = " + re1 + " + " + im1 + "i");
        }else{
            if(D > 0){
                re1 = (-b + Math.sqrt(D)) / (2 * a);
                re2 = (-b - Math.sqrt(D)) / (2 * a);
                im1 = 0;
                im2 = 0;
            } else {
                // D < 0
                re1 = re2 = -b / (2*a);
                im1 = im2 = Math.sqrt(-D) / (2 * a);
            }
            System.out.println("x = " + re1 + " + " + im1 + "i, "
                    + re2 + " + " + im2 + "i");
        }
    }
    public static void main(String[] args) {
        Program p = new Program();
        p.output();
    }
}
```