2017-03-16 3 views
0

J'essaye d'écrire un programme qui peut trouver les racines d'une équation quadratique en utilisant Scala. L'entrée doit être une équation quadratique sous la forme ax^2 + bx + c (par exemple: 5x^2 + 2x + 3) sous la forme d'une chaîne.Les coefficients d'extrait de l'expression binomiale entré comme une chaîne dans Scala

J'ai réussi à coder le calcul des racines mais j'ai du mal à extraire les coefficients de l'entrée. Voici le code que j'ai écrit pour extraire les coefficients jusqu'à présent:

def getCoef(poly: String) = { 
    var aT: String = "" 
    var bT: String = "" 
    var cT: String = "" 
    var x: Int = 2 
    for (i <- poly.length - 1 to 0) { 
    val t: String = poly(i).toString 
    if (x == 2) { 
     if (t forall Character.isDigit) aT = aT + t(i) 
     else if (t == "^") {i = i + 1; x = 1} 
    } 
    else if (x == 1) { 
     if (t forall Character.isDigit) bT = bT + t(i) 
     else if (t == "+" || t == "-") x = 0 
    } 
    else if (x == 0) { 
     if (t forall Character.isDigit) cT = cT + t(i) 
    } 
    val a: Int = aT.toInt 
    val b: Int = bT.toInt 
    val c: Int = cT.toInt 
    (a, b, c) 
    } 
} 
+0

Avez-vous pensé à utiliser regex? Vous ne savez pas à quel point vos chaînes d'entrée peuvent être complexes, mais votre problème est l'analyse syntaxique et il existe d'excellentes solutions, comme les combinateurs de regex ou peut-être les analyseurs Scala. – stholzm

+0

str.split ('x'). Map (v => v.replace ("^ 2", "")). Map (_. ToDouble) – FatTail

+0

si vous n'êtes pas si désireux de regex, et votre contribution est comme vous décrire. – FatTail

Répondre

0

solution simple avec regex:

def getCoef(poly: String) = { 
    val polyPattern = """(\d+)x\^2\+(\d+)x\+(\d+)""".r 
    val matcher = polyPattern.findFirstMatchIn(poly).get 
    (matcher.group(1).toInt, matcher.group(2).toInt, matcher.group(3).toInt) 
} 

ne gère pas tous les cas (par exemple: moins) et jette juste une erreur si l'entrée ne ne correspond pas au modèle, mais cela devrait vous aider à démarrer.