Timing passt nicht

  • 7 Antworten
  • Letztes Antwortdatum
ui_3k1

ui_3k1

Gesperrt
197
Hey Leute,

ich bin seit kurzem dran einen "Bruchtrainings-Rechner" zu programmieren.

Eigentlich funktioniert alles prima, (das Kürzen werde ich später noch einfügen - kenne da ein gutes Verfahren mit dem Gauss-Alg.).

Allerdings gibt es ein RIESEN-MEGA Problem:
Ich lasse über einen Zufallsgenerator zahlen und auch den Rechenoperator (also +,-,*,/) "ziehen".
Wenn ich mir die ausgerechneten Werte anzeigen lasse, stimmt alles. Wenn ich aber in einer Nutzerabfrage die Eingabe tätige, stimmt es nie.
Die Nutzereingaben waren aber defintiv richtig (und auch in dem Format, in dem mein Programm die Eingabe haben will).

Ich denke es liegt am Timing zwischen der Abfrage und dem drücken des Buttons. Durch das Drücken werden ja schon wieder neue Werte generiert.

Hat jemand eine Idee wie ich das Problem in den Griff bekomme - ich bin doch ziemlich überfragt.


Hier mein Code (er sieht schlimm aus -.-):
Code:
package com.mpfeffer.nize;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class FractionCoach extends Activity implements View.OnClickListener {

    Button checkIt;
    EditText z_, n_;
    TextView z1_, z2_, n1_, n2_, op_, res, res2;
    Random lou = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fraction);

        fractionMethod();
        checkIt.setOnClickListener(this);
    }

    private void fractionMethod() {                        //VARIABLEN FÜR DIE XML
        // TODO Auto-generated method stub
        checkIt = (Button) findViewById(R.id.cheFra);
        z_ = (EditText) findViewById(R.id.inZ);            //Nutzer-Eingabe 
        n_ = (EditText) findViewById(R.id.inN);            //des Zählers und des Nenners
        z1_ = (TextView) findViewById(R.id.z1);            //generierter     Zähler
        z2_ = (TextView) findViewById(R.id.z2);            //g.            Zähler2
        n1_ = (TextView) findViewById(R.id.n1);            //g.            Nenner1
        n2_ = (TextView) findViewById(R.id.n2);            //g.            Nenner2
        op_ = (TextView) findViewById(R.id.op);            //generierter     Operator (+, -, x, /)
        res = (TextView) findViewById(R.id.tvRes);        //zeigt         Ergebnis
        res2 = (TextView) findViewById(R.id.tvRes2);    //noch ein         Ergebnisfeld
    }

    
    @Override
    public void onClick(View view) {
        // TODO Auto-generated method stub

        int opg = lou.nextInt(4);                        //lou         =>     Zufallsgenerator
        int zg1 = 2 + lou.nextInt(8);
        int zg2 = 2 + lou.nextInt(8);
        int ng1 = 2 + lou.nextInt(8);
        int ng2 = 2 + lou.nextInt(8);

        z1_.setText(Integer.toString(zg1));                //Zeigt die Werte der beiden Brüche an
        z2_.setText(Integer.toString(zg2));
        n1_.setText(Integer.toString(ng1));
        n2_.setText(Integer.toString(ng2));

        int numkor = 1;                                //Erstellung der korrekten
        int denkor = 1;                                //Zähler und Nennervariablen
        
        String num = z_.getText().toString();        //liest Zähler von Nutzer-Eingabe ein
        String den = n_.getText().toString();        //        Nenner

        int numint = Integer.parseInt(num);            //Umwandlung des Strings
        int denint = Integer.parseInt(den);
        

        switch (opg) {                                //Switch für Auswahl der Operation
            case 0 :
                op_.setText("+");
                numkor = (zg1 * ng2) + (ng1 * zg2);    //Berechnung der Brüche
                denkor = ng1 * ng2;
                res.setText(numkor + " / " + denkor);

                break;
            case 1 :
                op_.setText("-");
                numkor = (zg1 * ng2) - (ng1 * zg2);    //Berechnung der Brüche
                denkor = ng1 * ng2;
                res.setText(numkor + " / " + denkor);//Ausgabe der Brüche

                break;
            case 2 :
                op_.setText("x");
                numkor = zg1 * zg2;                    //Berechnung der Brüche
                denkor = ng1 * ng2;
                res.setText(numkor + " / " + denkor);

                break;
            case 3 :
                op_.setText("/");
                numkor = zg1 * ng2;                    //Berechnung der Brüche
                denkor = ng1 * zg2;
                res.setText(numkor + " / " + denkor);

                break;
        }                                            //if-Anweisung prüft
        if (numint == numkor) {                        //Übereinstimmung des Zählers
            res2.setText("okay!");                    //(Nenner erstmal nicht wichtig)
        } else {
            res2.setText("nicht okay");
        }
    }
}
Danke vorab!
Martin
 
Zuletzt bearbeitet:
Glaube du wirst bei deinem sehr intelligentem Code keine antwort erhalten.
Mit z1,z2,op usw kann kein Mensch was anfangen, ohne erklaerung...

Gesendet von meinem Nexus 10 mit der Android-Hilfe.de App
 
Hmm, ich vermute der Fehler ist so offensichtlich, dass man wahrscheinlich direkt drauf kommt. Ich bin erst seit 2 Tagen mit Java unterwegs..

Und ist es normal, dass man so viele Variablen und Unterschritte hat wie ich? Mir kommt das alles etwas chaotisch vor. In C erscheint mir vieles eindeutiger und leichter trennbar.


Der ursprüngliche Beitrag von 23:04 Uhr wurde um 23:09 Uhr ergänzt:


Ich beschrifte mal meinen Code^^


danke schonmal :)

PS:
Wie gesagt eigentlich funktioniert alles, ich suche nur was, was das Programm für die Überprüfung der Werte anhält. :confused:
 
Zuletzt bearbeitet:
Ohne jedes Detail in deinem Code gelesen zu haben.
Du holst die Nutzer eingabe ab und danach generierst du erst die aufgabe?

Entweder du baust einen 2. Button der quasi dei Lösung erst abschickt wenn die Aufgabe angezeigt wird.

Auf jedenfall musst du das irgendwie trennen.
 
  • Danke
Reaktionen: ui_3k1
Hehe, das habe ich mir dann auch irgendwann gedacht.

Habe das auch schon soweit fertig, aber irgendwie will es noch nicht ganz so wie es soll..
Aber ich habe das Gefühl, dass es bald klappt.

Nachtrag:
Habs! Der zweite Button war unter anderem der Schlüssel zum Erfolg. Habe bei der Verarbeitung der Eingabewerte unsauber gearbeitet.

Danke für eure Hilfe.

Wenn jemand Interesse an der App hat -> melden ;)
 
Zuletzt bearbeitet:
Habe doch noch eine Frage...

Jetzt bekomme ich wenn ich eine leere Eingabe (im Textfeld) habe einen Fehler, da ja keine Werte geprüft werden können.

Wie lässt sich das beheben?
 
Try catch oder eben vorher pruefen if(eingabe.equals("")) bitte ins feld was eingeben; rechnung durchfueren

Gesendet von meinem Nexus 10 mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: ui_3k1
IceClaw schrieb:
Try catch oder eben vorher pruefen if(eingabe.equals("")) bitte ins feld was eingeben; rechnung durchfueren

Gesendet von meinem Nexus 10 mit der Android-Hilfe.de App


Mit try - catch hat es wunderbar geklappt. Vielen Dank für den Tipp.
Wenn ich erstmal weiß "wie" es gemacht wird und mir die passenden Codeelemente raussuchen kann, finde ich Java gar nicht mal mehr sooo schwierig.
Vielleicht sollte ich mal ein Buch lesen. Kann mir jemand eins empfehlen?
Ich habe hier das "Android App Spiele-Entwicklung" von Galileo-Computing. Hab das Buch nur überflogen und fand es etwas "kindlich" - bzw. nicht wirklich für meine Zwecke zielorientiert genug.

Und für die Nachwelt lasse ich hier mal mein Codebeispiel mit der try-catch stehen:

Code:
bShow.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                try {

                    String num = z_.getText().toString(); // Auslesen d. Zählers
                    String den = n_.getText().toString(); // Auslesen d. Nenners

                    numint = Integer.parseInt(num);        //String to Int
                    denint = Integer.parseInt(den);        //nochmal 

                    Euklid var1 = new Euklid();            //Euklid-Klasse kürzt die Brüche

                    int k = var1.cancelDown(numkor, denkor);    //k = ggT

                    numkor /= k;        //korrekten Zähler kürzen (durch ggT)
                    denkor /= k;        //korrekten Nenner kürzen

                    if (numint == numkor && denint == denkor) {
                        res1.setText("STIMMT!");
                        res2.setText("Ergebnis: " + numkor + " / " + denkor);
                    } else {
                        res1.setText("FALSCH!");
                        res2.setText("Ergebnis: " + numkor + " / " + denkor);
                    }
                } catch (Exception e) {
                    res1.setText("HINWEIS:");        // Bei fehlender Eingabe wird der Nutzer 
                    res2.setText("Gib' Zähler und Nenner an."); //an dieser Stelle informiert
                }
            }

        });
 
Zurück
Oben Unten