#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 Я улучшил ответ