2013-02-28 61 views
8

我必須爲二次類編寫一個讀取方法,其中二進制以ax^2 + bx + c的形式輸入。該類的描述是這樣的:二次讀取方法

添加讀取方法,要求用戶輸入標準格式的公式並正確設置三個實例變量。 (因此,如果用戶鍵入3x^2 - x,則將實例變量設置爲3,-1和0)。這將需要您之前完成的字符串處理。顯示按原樣輸入的實際方程式,並將其正確標記爲預期輸出。

我能夠通過使用字符串操作和if語句來完成ax^2部分。但是我不知道如何做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); 
    } 
} 

隨意編寫任何代碼作爲例子。 任何幫助將不勝感激。

+4

如果您的二次方程是-2x^2 + 3x-1,或-2x^2或-x^2 + 3,該怎麼辦?你會如何考慮處理這些案件? – Makoto 2013-02-28 06:18:32

+0

這就是if else語句的要點,我的程序可以用於前2個方程式,但我只是做了一些進一步的測試,並且它不適用於最後的-x^2 + 3方程式,所以我有更多的編碼可以做對於這一部分我猜。 – user007 2013-02-28 06:36:57

+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%&%= 5E4-3x%5E2%2B17),你會看到你想要做的一般流程(在正則表達式中)。 – Makoto 2013-02-28 06:57:11

回答

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

嘿Orak感謝您的幫助。我測試了你的程序,當輸入二次方如x^2 + x - 3時,它似乎不起作用。當該類型的二次方出現時,該類必須將a和b設置爲1。 – user007 2013-02-28 21:42:43

+0

@ user2118379如果找不到,請在開始處添加一個顯式的+ ...謝謝糾正:) – orak 2013-03-01 02:16:34

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

對於字符串分析,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 test in ideone

它們以任何順序處理公式,在第一項中有或沒有初始符號,並正確處理缺失項。 Perl版本不會將'+'修復爲'+1'等,或者爲缺失的術語提供明確的'0',因爲我已經用完了。