2015-04-18 3 views
7

Проблемы: программа Java для разделения коэффициентов из квадратного уравнения, например , если входная строка:программы Java для извлечения коэффициентов из квадратного уравнения

String str1; 
str1 = "4x2-4x-42=0" 

Так что нужно разделить коэффициенты из данной строки ввода и чтобы получить выход в

a = 4 b = -4 c = -42 

Я попытался это:

String equation = "ax2+bx-c=0"; 
String[] parts = equation.split("\\+|-|="); 
for (int i = 0; i < parts.length - 2; i++) { 
    String part = parts[i].toLowerCase(); 
    System.out.println(part.substring(0, part.indexOf("x"))); 
} 
System.out.println(parts[2]); 

Но я получил выход как 23x2 и 4x и 4. Фактический выходной сигнал - 23 ,- 4 , 4.

+0

Таким образом, вход всегда имеет формат '+/- aX2 +/- bX +/- c'? Звучит как работа для ... regex. –

+0

есть. всегда в этом формате –

+0

Вам нужны только коэффициенты? Если вы намереваетесь позже получить экспонентов, я бы рекомендовал создать небольшой парсер для ваших выражений. – Turing85

ответ

3

Используйте Regex, следующий шаблон будет работать:

([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0 

Это будет соответствовать квадратное и извлеките параметры, давайте выясним, как это работает:

  • (...) это захват группы
  • [+-]?\d+ это соответствует количеству цифр, которому предшествует, необязательно с помощью + или -
  • [Xx] это соответствует «X» или «х»
  • \s* это соответствует нулю или более пробелов

Так

  • ([+-]?\d+) соответствует «A» аргумент
  • [Xx]2 матчи «X2» или «x2»
  • \s* спички необязательные пробелы
  • ([+-]?\d+) совпадает с «Ъ» аргумент
  • [Xx] матчи «Х» или «х»
  • \s* матчи необязательно пробельные
  • ([+-]?\d+) совпадает «с» аргумент
  • \s*=\s*0 матчи "= 0" с некоторыми дополнительными пространствами

Позволяет обернуть это в class:

private static final class QuadraticEq { 
    private static final Pattern EQN = Pattern.compile("([+-]?\\d+)[Xx]2\\s*([+-]?\\d+)[Xx]\\s*([+-]?\\d+)\\s*=\\s*0"); 
    private final int a; 
    private final int b; 
    private final int c; 

    private QuadraticEq(int a, int b, int c) { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

    public static QuadraticEq parseString(final String eq) { 
     final Matcher matcher = EQN.matcher(eq); 
     if (!matcher.matches()) { 
      throw new IllegalArgumentException("Not a valid pattern " + eq); 
     } 
     final int a = Integer.parseInt(matcher.group(1)); 
     final int b = Integer.parseInt(matcher.group(2)); 
     final int c = Integer.parseInt(matcher.group(3)); 
     return new QuadraticEq(a, b, c); 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder("QuadraticEq{"); 
     sb.append("a=").append(a); 
     sb.append(", b=").append(b); 
     sb.append(", c=").append(c); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

Примечание к \\, это требуется Java.

Быстрый тест:

System.out.println(QuadraticEq.parseString("4x2-4x-42=0")); 

Выход:

QuadraticEq{a=4, b=-4, c=-42} 
+0

Ошибка: группа методов (int) в типе Matcher не применима для аргументов (String) –

+0

final int a = Integer.parseInt (matcher.group ("a")); final int b = Integer.parseInt (matcher.group ("b")); final int c = Integer.parseInt (matcher.group ("c")); –

+0

@JoeMathew вы говорите мне, что вы используете Java 6 ?? Прошло более десяти лет, достигнув EOL два года назад. Зачем?? –

0

Если вы только с помощью квадратичных:

int xsqrd = equation.indexOf("x2"); 
int x = equation.indexOf("x", xsqrd); 
int equ = equation.indexOf("="); 
String a = equation.subString(0,xsqrd); 
String b = equation.subString(xsqrd+1,x); 
String c = equation.subString(x,equ); 

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

+0

, если этот код получит этот вывод, если входная строка «4x2-4x-42 = 0 "и" a = 4 b = -4 c = -42 "это должен быть выход –

1

Вы можете использовать регулярное выражение следующим образом:

final String regex = "([+-]?\\d+)x2([+-]\\d+)x([+-]\\d+)=0"; 
Pattern pattern = Pattern.compile(regex); 

final String equation = "4x2-4x-42=0"; 
Matcher matcher = pattern.matcher(equation); 

if (matcher.matches()) { 
    int a = Integer.parseInt(matcher.group(1)); 
    int b = Integer.parseInt(matcher.group(2)); 
    int c = Integer.parseInt(matcher.group(3)); 
    System.out.println("a=" + a + " b=" + b + " c=" + c); 
} 

Выход:

a=4 b=-4 c=-42 
+0

Я получаю ответ как 0 0 0 –

+0

спасибо за помощь, он отлично работает –

+0

@JoeMathew, пожалуйста. –

0

Первое замечание: если вы используете символ в качестве разделителя в регулярном выражении, то вы потеряете его в slpitted элементов. Я предлагаю вам использовать следующее регулярное выражение:

"x2|x|=" 

Тогда вы можете получить только цифры. Полный фрагмент кода:

public class Main { 
    private static final char[] varNames = {'a', 'b', 'c'}; 

    public static void main(String[] args) { 
     String equation = "4x2-4x-42=0"; 
     String[] parts = equation.split("x2|x|="); 
// you will get 4 elements, but the last element is always 0 
     for(int i=0; i<parts.length - 1; i++){ 
      System.out.println(varNames[i] + " = " + Integer.parseInt(parts[i])); 
     } 
    } 
} 

Но в этом случае вы будете иметь символы «+» в выходе. Чтобы этого избежать, вы можете использовать Integer.parseInt(parts[i]) вместо parts[i].

0
for (int i = 0 ; i < str.length ; ++i){ 
    if(asciiOf(str.charAt(i)) == asciiOfIntegerValue){ 
    addCharInArrayList(str.charAt(i)); 
    }else{ 
     addInFuncList(); 
     addCharInArrayList("_"); 
    } 


    // join numbers which are not separated by _ and apply BODMAS rule and solve it 
    // fyi : apologies - very inefficient pseudocode, wrote in a haste 
Смежные вопросы