2013-02-28 2 views
8

2 차 클래스가 ax^2 + bx + c 형식으로 입력되는 2 차 클래스의 읽기 방법을 작성해야합니다. 이 클래스에 대한 설명은 다음과 같습니다.2 차 읽기 방법

사용자에게 표준 형식의 수식을 요청하고 세 개의 인스턴스 변수를 올바르게 설정하는 읽기 메서드를 추가합니다. (따라서 사용자가 3x^2 - x를 입력하면 인스턴스 변수를 3, -1 및 0으로 설정합니다. 이전에 수행 한 문자열 처리가 필요합니다. 입력 된 실제 방정식을 그대로 표시하고 예상 출력으로 적절히 표시합니다.

문자열 조작과 else 문을 사용하여 ax^2 부분을 수행 할 수있었습니다. 그러나 나는 bx와 c 앞에있을 수있는 기호 때문에 방정식의 bx와 c 부분을 어떻게 처리해야할지 모르겠다. 여기 방법의 도끼^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); 
    } 
} 

예제로 코드를 자유롭게 작성하십시오. 도움을 주시면 대단히 감사하겠습니다.

+4

-2x^2 + 3x-1 또는 -2x^2 또는 -x^2 + 3 인 2 차 방정식을 가지고 있다면 어떻게 될까요? 그 사건을 어떻게 처리 할 생각입니까? – Makoto

+0

thats if else 문의 요점은 내 프로그램이 처음 2 개의 방정식에 대해 작동하지만 방금 추가 테스트를 수행하고 마지막 -x^2 + 3 방정식에 대해 작동하지 않았으므로 코딩을 더해야합니다. 그건 내가 생각하기에. – user007

+4

내 주장은 가장자리의 경우가 더 많았습니다. 당신은 그것들에 대해 매우 신중해야하며 그것들을 설명해야합니다. 궁극적으로 연산자로 구분 된 문자열의 각 부분에서 동일한 소비 작업을 수행합니다. 그것은 힌트입니다. 또 다른 힌트는 [이 Debuggex 링크] (http://www.debuggex.com/?re=%28%28%28-%7C%2B%29%3F%29%28%5Cd%2Bx%)를 방문하면 3F % 7C % 28X % 7B1 % 7D % 5C % 5E % 5Cd % 2B % 29 % 29 % 29 % 2B & str = x % 5E4-3x % 5E2 % 2B17) (정규 표현식에서). – Makoto

답변

1

다음은 정규식을 사용하여 수행 할 수있는 방법의 예입니다. 지금까지 방정식이 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")); 
    } 
} 
2
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class Mini { 

    public static void main(String[] args) { 
     int a = 0; 
     int b = 0; 
     int c = 0; 

    String formula = " -x^2 + 6x - 5"; 
    formula = formula.replaceAll(" ", ""); 

    if (!formula.startsWith("+") && !formula.startsWith("-")) 
     formula = "+" + formula; 

     String exp = "^((.*)x\\^2)?((.*)x)?([\\+\\s\\-\\d]*)?$"; 
     Pattern p = Pattern.compile(exp); 
     Matcher m = p.matcher(formula); 

     System.out.println("Formula is " + formula); 
     System.out.println("Pattern is " + m.pattern()); 

     while (m.find()) { 
      a = getDigit(m.group(2)); 
      b = getDigit(m.group(4)); 
      c = getDigit(m.group(5)); 
     } 

     System.out.println("a: " + a + " b: " + b + " c: " + c); 

    } 

    private static int getDigit(String data) { 
     if (data == null) { 
      return 0; 
     } 
     else 
     { 

      if (data.equals("+")) 
      { 
       return 1; 
      } 
      else if (data.equals("-")) 
      { 
       return -1; 
      } 
      else 
      { 
       try 
       { 
        int num = (int) Float.parseFloat(data); 
        return num; 
       } 
       catch (NumberFormatException ex) 
       { 
        return 0; 
       } 
      } 
     } 
    } 
} 
+0

안녕하세요, 당신의 도움에 감사드립니다. 나는 당신의 프로그램을 테스트했고 x^2 + x - 3와 같은 이차가 입력되었을 때 작동하지 않는 것 같다. 그 클래스는 이차 유형이 발생할 때 a와 b를 1로 설정해야합니다. – user007

+0

@ user2118379 발견되지 않으면 처음에 명시 적 + 추가 ... 수정 주셔서 감사합니다 :) – orak

1

을 정규 표현식을 통해 :

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}"; 
} 

을 문자열 구문 분석, 펄하십시오.

아, 다음에 이동 :

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 test in ideone합니다.

첫 번째 용어에 초기 부호가 있거나없는 순서로 수식을 처리하고 누락 된 용어를 올바르게 처리합니다. Perl 버전은 '+'를 '+1'등으로 수정하지 않거나 누락 된 용어를 명시 적으로 '0'으로 제공하지 않습니다. 시간이 부족했기 때문입니다.