2016-07-04 2 views
0

Ich bin neu in Java und Android Entwicklung, und ich entschied mich zu versuchen, eine App, die Trinome löst. Bis jetzt funktioniert es nur für einige Trinome, aber nicht für alle, und ich kann nicht herausfinden warum.Java Trinomial Solver/Factorer gibt manchmal falsche Antworten

Zum Beispiel, wenn ich 1x^2 + 5x + 6 eingeben bekomme ich die richtigen Antworten (-3 und -2).

Aber wenn ich 1x^2 - 1x - 6 eingeben, bekomme ich zwei lange Dezimalantworten, wenn ich 3 und -2 bekommen sollte.

Es löst 1x^2 - 21a + 104 zwar richtig, was mich denken lässt, dass das Problem nicht mit der Handhabung von Negativen ist.

Ich habe versucht, den Code nach C++ zu übersetzen (da ich damit besser vertraut bin) und dieses Programm gab die richtigen Antworten für alle Trinome. Ich denke, das Problem ist, dass ich nur schlecht in Java bin.

Mein Code:

package com.example.todd.factortrinomials; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void onButtonClick(View v) { 

     // declare variables 
     EditText aNum = (EditText)findViewById(R.id.aBox); 
     EditText bNum = (EditText)findViewById(R.id.bBox); 
     EditText cNum = (EditText)findViewById(R.id.cBox); 
     EditText aSign = (EditText)findViewById(R.id.box1); 
     EditText bSign = (EditText)findViewById(R.id.box2); 
     EditText cSign = (EditText)findViewById(R.id.box3); 

     TextView ans1 = (TextView)findViewById(R.id.x1Box); 
     TextView ans2 = (TextView)findViewById(R.id.x2Box); 

     // input 
     int a = Integer.parseInt(aNum.getText().toString()); 
     int b = Integer.parseInt(bNum.getText().toString()); 
     int c = Integer.parseInt(cNum.getText().toString()); 
     String a1 = (aSign.getText().toString()); 
     String b1 = (bSign.getText().toString()); 
     String c1 = (cSign.getText().toString()); 


     // process solution 
     if (a1 == "-") a = -1 * a; 
     if (b1 == "-") b = -1 * b; 
     if (c1 == "-") c = -1 * c; 

     double temp1 = (b * b) - (4 * a * c); 
     if (temp1 >= 0) temp1 = Math.sqrt(temp1); 
     else {temp1 = Math.sqrt(-1*temp1); temp1 = -1 * temp1;} 
     double x1 = (-b + temp1)/(2*a); 
     double x2 = (-b - temp1)/(2*a); 


     //output 
     ans1.setText(Double.toString(x1)); 
     ans2.setText(Double.toString(x2)); 
    } 
} 

Weitere Informationen: Die Vorzeichen (plus oder minus) für A, B und C werden separat als Strings, weil die Textfelder für A, B und C nicht gelesen haben Ich möchte aus irgendeinem Grund negative Zahlen akzeptieren. Es klingt schlampig, aber es funktioniert. Ich bin 90% sicher, dass der Fehler in der Logik ist. Vielleicht, wenn ich die drei String-Variablen zugewiesen habe?

Ich kann den Code activity_main.xml geben, wenn jemand es selbst testen möchte. Jede Hilfe wird geschätzt.

Edit: Ich habe ein paar mehr Gleichungen versucht und es sieht wie ich bekomme nur die falsche Antwort, wenn temp1 negativ ist. Die Art, wie ich damit umgehe, wenn ich die Quadratwurzel von temp1 finde, könnte die Antwort verzerren. Ich bin mir nicht sicher, wie ich es beheben soll, wenn das das Problem ist.

+0

"Ich bekomme zwei lange Dezimal-Antworten" Was genau bekommen Sie? –

+0

"Was genau bekommst du?" Ich habe x1 = -2,8979157616 und x2 = 1,8979157616 – Todd

+0

Seltsam, wie diese beiden Zahlen in den gleichen Ziffern enden. – Todd

Antwort

0

Ich habe es behoben. Ich machte aBox, bBox und cBox jede Zahl akzeptieren, Vorzeichen und Dezimalzahlen. Das hat mein Bedürfnis nach den +/- Saiten beseitigt. Es funktioniert jetzt für alle Trinome, die keine imaginären Antworten haben. Ich entfernte auch diesen Teil:

if (temp1 >= 0) temp1 = Math.sqrt(temp1); 
else {temp1 = Math.sqrt(-1*temp1); temp1 = -1 * temp1;} 

und ersetzte sie durch temp1 = Math.sqrt(temp1);, wie das, was ich hatte absolut nichts tat außer eine falsche Antwort geben, wenn die Trinomialprozess kehrt eine imaginäre Antwort eingegeben, die es zur Zeit sowieso tut.

Verwandte Themen