Java — комплексные числа — проблема с мнимой единицей

#java #complex-numbers

#java #комплексные числа

Вопрос:

У меня возникли некоторые проблемы с «i» в мнимой единице измерения. Когда у меня есть «я» с номером, моя программа работает. 4 4i все в порядке. Но когда у меня есть только «я», не хочет работать. 4 i не работает.

Я понятия не имею, как изменить код, чтобы устранить эту ошибку. Я знаю, что приведенные ниже строки создают эту проблему.

         String x[] = str1.split("\ |i|-");
        String y[] = str2.split("\ |i|-");
 

Это программа для вычисления умножения (*), деления (/), сложения ( ) и вычитания (-) комплексных чисел, набранных в виде строки.

 import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    private static DecimalFormat df = new DecimalFormat("0.0");
    public static String Addition(double a_r, double a_i, double b_r, double b_i)
    {
        double x = a_r   b_r;
        double y = a_i   b_i;
        return df.format(x)   " "   df.format(y)   "i";
    }
    public static String Subtraction(double a_r, double a_i, double b_r, double b_i)
    {
        double x = a_r - b_r;
        double y = a_i - b_i;
        return df.format(x)   "-"   df.format(y)   "i";
    }
    public static String Multiplication(double a_r, double a_i, double b_r, double b_i)
    {
        double x = a_r * b_r - a_i * b_i;
        double y = a_r * b_i   a_i * b_r;
        return df.format(x)   " "   df.format(y)   "i";
    }
    public static String Division(double a_r, double a_i, double b_r, double b_i)
    {
        double x = a_r*b_r   a_i*b_i / b_r   b_i;
        double y = a_r*b_i - a_i*b_r / b_r   b_i;
        return df.format(x)   " "   df.format(y)   "i";
    }

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Num1");
        String str1 = scan.nextLine();

        System.out.println("Num2");
        String str2 = scan.nextLine();

        String x[] = str1.split("\ |i|-");
        String y[] = str2.split("\ |i|-");

        double a_real = Double.parseDouble(x[0]);
        double a_img = Double.parseDouble(x[1]);
        double b_real = Double.parseDouble(y[0]);
        double b_img = Double.parseDouble(y[1]);

        System.out.println(a_real);
        System.out.println(a_img);
        System.out.println(b_real);
        System.out.println(b_img);


       System.out.println(Addition(a_real, a_img, b_real, b_img));
       System.out.println(Subtraction(a_real, a_img, b_real, b_img));
       System.out.println(Multiplication(a_real, a_img, b_real, b_img));
       System.out.println(Division(a_real, a_img, b_real, b_img));
    }
}
 

Комментарии:

1. Существует ошибка в вычислении деления

2. теперь я вижу, но на данный момент я понятия не имею, как быстро решить

3. Независимо от вопроса: пожалуйста, ознакомьтесь с руководством о том, как писать имена методов в Java. Подсказка: они должны начинаться со строчной буквы.

4. Способ исправить это — заключить знаменатель в круглые скобки.

Ответ №1:

Исправить

Вы используете длину массива в качестве условия

 double a_img = x.length > 1 ? Double.parseDouble(x[1]) : 1;
double b_img = y.length > 1 ? Double.parseDouble(y[1]) : 1;
 

Улучшить

На данный момент ваш код не обрабатывает отрицательные числа, так как тире находится в шаблоне разделения. Вы можете использовать регулярное выражение для сопоставления нужных вам частей : (-?\d )\ ?(-?\d*)\ ?i

Синтаксический анализ real части прост, так img как вы можете проверить, является ли часть пустой (регистр i ) и является ли часть просто тире (регистр -i ).

 Matcher m = Pattern.compile("(-?\d )\ ?(-?\d*)\ ?i").matcher(value);
if (m.find()) {
    System.out.println(m.group(1)   "<>"   m.group(2)   " ==>"   m.groupCount());
    real = Double.parseDouble(m.group(1));
    img = m.group(2).isEmpty() ? 1 : m.group(2).equals("-") ? -1 : Double.parseDouble(m.group(2));
} else {
   throw new InvalidParameterException(value);
}
 

Объектно-ориентированное программирование

Разрабатывая небольшой класс, использование может быть похоже

 class Complex {

    private static final DecimalFormat df = new DecimalFormat("0.0");
    private final double real, img;

    public Complex(String value) {
        Matcher m = Pattern.compile("(-?\d )\ ?(-?\d*)\ ?i").matcher(value);
        if (m.find()) {
            System.out.println(m.group(1)   "<>"   m.group(2)   " ==>"   m.groupCount());
            real = Double.parseDouble(m.group(1));
            img = m.group(2).isEmpty() ? 1 : m.group(2).equals("-") ? -1 : Double.parseDouble(m.group(2));
        } else {
            throw new InvalidParameterException(value);
        }
    }

    public Complex(double r, double i) {
        real = r;
        img = i;
    }    
    public Complex add(Complex other) {
        return new Complex(real   other.real, img   other.img);
    }    
    public Complex substract(Complex other) {
        return new Complex(real - other.real, img - other.img);
    }    
    public Complex multiply(Complex other) {
        return new Complex(real * other.real - img * other.img, real * other.img   img * other.real);
    }

    public Complex divide(Complex other) {
        double denominator = Math.pow(other.real, 2)   Math.pow(other.img, 2);
        return new Complex((real * other.real   img * other.img) / denominator,
            (real * other.img - img * other.real) / denominator);
    }    
    @Override
    public String toString() { return df.format(real)   " "   df.format(img)   "i";}
}
 

использование

 public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.println("Input num1: ");
    String str1 = scan.nextLine();

    System.out.println("Input num2: ");
    String str2 = scan.nextLine();

    Complex c1 = new Complex(str1);
    Complex c2 = new Complex(str2);
    System.out.println(c1.add(c2));
    System.out.println(c1.substract(c2));
    System.out.println(c1.multiply(c2));
    System.out.println(c1.divide(c2));
}
 

Комментарии:

1. @kamilkaz6 обратите внимание, что вы можете использовать только положительные числа, так как вы убираете тире

2. У вас есть какие-либо идеи, как это исправить?

3. @kamilkaz6 Я улучшил ответ