2013-02-28 16 views
8

Devo scrivere un metodo di lettura per una classe quadratica in cui viene inserito un quadratico nella forma ax^2 + bx + c. La descrizione della classe è la seguente:Metodo di lettura quadratica

Aggiungere un metodo di lettura che richiede all'utente un'equazione in formato standard e imposta correttamente le tre variabili di istanza. Quindi, se l'utente digita 3x^2 - x, si impostano le variabili di istanza su 3, -1 e 0. Ciò richiederà l'elaborazione della stringa eseguita in precedenza. Mostra l'equazione effettiva immessa così com'è e correttamente etichettata come uscita prevista.

Sono stato in grado di eseguire la parte ax^2 utilizzando la manipolazione delle stringhe e le istruzioni if ​​else. Ma non sono sicuro di come fare le parti bx ec dell'equazione a causa del segno che potrebbe essere di fronte a bx ec. Ecco come ho fatto l'ascia^2 parte del metodo.

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

Sentitevi liberi di scrivere qualsiasi codice come esempio. Qualsiasi aiuto sarebbe molto apprezzato.

+4

E se avessi un quadratico che era -2x^2 + 3x-1, o -2x^2, o -x^2 + 3? Come valuteresti la gestione di questi casi? – Makoto

+0

questo è il punto delle istruzioni if ​​else, il mio programma avrebbe funzionato per le prime 2 equazioni ma ho appena fatto qualche ulteriore test e non ha funzionato per l'ultima equazione -x^2 + 3 quindi ho ancora un po 'di codifica da fare per quella parte credo. – user007

+4

Il mio punto era più verso i casi limite. Devi essere molto cauto con quelli e renderli conto di loro. In definitiva, stai facendo le stesse operazioni di consumo su ogni parte della stringa separata da un operatore. Questo è un suggerimento. Un altro suggerimento è, se si visita [questo collegamento 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), vedrai un flusso generale di ciò che vuoi fare (in regex). – Makoto

risposta

1

Ecco un esempio di come è possibile farlo utilizzando un'espressione regolare. Finora questo funziona correttamente solo se l'equazione è data nel formato ax^2 + bx + c. Potrebbe essere ulteriormente modificato per consentire di modificare l'ordine dei sottotitoli, i termini mancanti, ecc. Per fare ciò, probabilmente proverei a creare espressioni regolari per ogni sottotitolo. In ogni caso, questo dovrebbe servire per darvi l'idea generale:

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

Hey Orak grazie per il vostro aiuto. Ho testato il tuo programma e non sembra funzionare quando viene inserito un quadratico come x^2 + x - 3. La classe deve impostare a e b uguale a 1 quando si verifica quel tipo di quadratica. – user007

+0

@ user2118379 aggiungi un + esplicito all'inizio se non trovato ... grazie per la correzione :) – orak

1

Via espressioni regolari:

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

Per il parsing della stringa, Perl.

Oh, andare avanti allora:

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.

Questi gestiscono la formula in qualsiasi ordine, con o senza segno iniziale sul primo termine, e gestiscono correttamente i termini mancanti. La versione Perl non corregge '+' a '+1' ecc, o fornisce un '0' esplicito per i termini mancanti, perché ho esaurito il tempo.

Problemi correlati