Квадратичный метод чтения

Мне нужно написать метод чтения для квадратичного класса, где квадратное число вводится в виде ax^2 + bx + c. Описание класса такое:

Добавьте метод чтения, который запрашивает у пользователя уравнение в стандартном формате и правильно устанавливает три переменные экземпляра. (Поэтому, если пользователь вводит 3x^2 - x, вы устанавливаете переменные экземпляра на 3, -1 и 0). Это потребует обработки строк, которую вы делали ранее. Отобразите фактическое уравнение, введенное как есть, и правильно помеченное как ожидаемый результат.

Я смог выполнить часть ax^2, используя манипуляции со строками и операторы if else. Но я не уверен, как выполнить части уравнения bx и c из-за знака, который может стоять перед bx и c. Вот как я выполнил часть метода ax^2.

public void read()
{
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Please enter a quadratic equation in standard format.");
    String formula = keyboard.next();
    String a = formula.substring(0, formula.indexOf("x^2"));
    int a2 = Integer.parseInt(a);
    if (a2 == 0)
    {
        System.out.println("a = 0");
    }
    else if (a2 == 1)
    {
        System.out.println("a = 1");
    }
    else
    {
        System.out.println("a = " + a2);
    }
 }

Не стесняйтесь писать любой код в качестве примера. Любая помощь будет принята с благодарностью.


person user007    schedule 28.02.2013    source источник
comment
Что, если бы у вас было квадратное выражение, равное -2x^2+3x-1, или -2x^2, или -x^2+3? Как бы вы рассмотрели рассмотрение этих случаев?   -  person Makoto    schedule 28.02.2013
comment
в этом смысл операторов if else, моя программа будет работать для первых двух уравнений, но я только что провел дополнительное тестирование, и оно не сработало для последнего уравнения -x ^ 2 + 3, поэтому мне нужно еще немного кодировать для эта часть, я думаю.   -  person user007    schedule 28.02.2013
comment
Моя точка зрения была больше связана с крайними случаями. Вы должны быть очень осторожны с ними и учитывать их. В конечном счете, вы выполняете одни и те же операции потребления для каждой части строки, разделенной оператором. Это намек. Еще один совет: если вы посетите эта ссылка Debuggex, вы увидите общий поток того, что вы хотите сделать (в регулярном выражении).   -  person Makoto    schedule 28.02.2013
comment
Возможно, используя Регулярное выражение, чтобы извлечь 3 компонента уравнения, а затем обработать их по отдельности было бы лучше, но не настолько эксперт в RegExp, чтобы привести пример...   -  person araknoid    schedule 28.02.2013
comment
@Makoto: вам не хватает двух '\' в первой группе перед знаками минус и плюс. правильное регулярное выражение.   -  person harpun    schedule 28.02.2013
comment
@harpun: я никогда не говорил, что регулярное выражение было правильным... просто оно обрисовывало в общих чертах то, чего вы хотите достичь.   -  person Makoto    schedule 28.02.2013
comment
Будет ли этот класс работать, если, скажем, 13x^2? И как тогда будут работать подтермины?   -  person user007    schedule 28.02.2013


Ответы (3)


Вот пример того, как это можно сделать с помощью регулярного выражения. Пока это правильно работает только в том случае, если уравнение задано в формате ax^2 + bx + c. Его можно было бы дополнительно настроить, чтобы разрешить изменение порядка подтерминов, отсутствующих терминов и т. д. Для этого я, вероятно, попытался бы придумать регулярные выражения для каждого подтермина. В любом случае, это должно дать вам общее представление:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class ParseEquation {
    static Pattern match = Pattern.compile("([\\+\\-]?[0-9]*)x\\^2([\\+\\-]?[0-9]*)x([\\+\\-]?[0-9]*)");

    static String parseEquation(String formula) {
        // remove all whitespace
        formula = formula.replaceAll(" ", "");
        String a = "1";
        String b = "1";
        String c = "0";
        Matcher m = match.matcher(formula);
        if (!m.matches()) return "syntax error";
        a = m.group(1);
        if (a.length() == 0) a = "1";
        if (a.length() == 1 && (a.charAt(0) == '+' || a.charAt(0) == '-')) a += "1";
        b = m.group(2);
        if (b.length() == 0) b = "1";
        if (b.length() == 1 && (b.charAt(0) == '+' || b.charAt(0) == '-')) b += "1";
        c = m.group(3);
        return a + "x^2" + b + "x" + c;
    }

    public static void main(String[] args) {
        System.out.println(parseEquation("2x^2 + 3x - 25"));
        System.out.println(parseEquation("-2x^2 + 3x + 25"));
        System.out.println(parseEquation("+2x^2 + 3x + 25"));
        System.out.println(parseEquation("x^2 + 3x + 25"));
        System.out.println(parseEquation("2x^2 + x + 25"));
    }
}
person ahans    schedule 28.02.2013

Через регулярные выражения:

sub quadParse {
    my ($inputStr) = @_;
    my $str = "+".$inputStr;        # as the first needn't have a sign
    $str =~ s/\s+//g;               # normalise
    my $squared = $1 if ($str =~ m/([+-][0-9])*x\^2/);
    my $ex = $1 if ($str =~ m/([+-][0-9]*)x(?!\^)/);
    my $const = $1 if ($str =~ m/([+-][0-9]+)(?!x)/);
    return "${squared}, ${ex}, ${const}";
}

Для синтаксического анализа строк Perl.

О, тогда давай:

public static String coeff(String str, String regex) {
    Pattern patt = Pattern.compile(regex);
    Matcher match = patt.matcher(str);
    // missing coefficient default
    String coeff = "+0"; 
    if(match.find()) 
        coeff = match.group(1);
    // always have sign, handle implicit 1
    return (coeff.length() == 1) ? coeff + "1" 
        : coeff;
}
public static String[] quadParse(String arg) {
    String str = ("+" + arg).replaceAll("\\s", "");
    String quad = coeff(str, "([+-][0-9]*)x\\^2" );
    String ex = coeff(str, "([+-][0-9]*)x(?!\\^)");
    String cnst = coeff(str, "([+-][0-9]+)(?!x)" );
    return new String[] {quad, ex, cnst};
}

Тест Java в ideone.

Они обрабатывают формулу в любом порядке, с начальным знаком перед первым членом или без него, и правильно обрабатывают отсутствующие члены. Версия Perl не исправляет «+» на «+1» и т. д. и не предоставляет явный «0» для отсутствующих терминов, потому что у меня не хватило времени.

person Phil H    schedule 15.05.2013

person    schedule
comment
Привет, Орак, спасибо за помощь. Я протестировал вашу программу, и она не работает, когда вводится квадратное число, такое как x^2 + x - 3. Класс должен установить a и b равными 1, когда происходит этот тип квадратичного уравнения. - person user007; 01.03.2013
comment
@user2118379 user2118379 добавьте явный + в начале, если он не найден ... спасибо за исправление :) - person orak; 01.03.2013