Logische Operatoren

  • Themenstarter Themenstarter Tahomar
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

Tahomar

Gast
Hallo,

ich habe eine Frage, ich möchte, das der Eingabedialog solange wiederholt wird bis ein Operator eingebeben wird:

Code:
do
	{	
	s = JOptionPane.showInputDialog
	( "Bitte den Operator, also + , - , * oder : eingeben" );
	}
	while(s == null | s.length() > 0 | s != "+" | s != "-" | s != "*" | s != ":");

Irgendwie verzweifle ich noch mal daran... vielleicht kann mir jemand helfen?

Das wär Klasse!

Viele Grüße, Tahomar
 
Naja, mein Problem ist, dass es nicht so klappt wie ich es will. Der Dialog soll nur +,-,*,: annehmen als Eingabe. Bei allen anderen Eingaben, soll er den Dialog wiederholen, solange bis man einen dieser Operatoren eingegeben hat. Und das will einfach nicht funzen...
 
So, wie der Codeschnipsel jetzt da steht, lehnt er alles ab auch +, -, *, : er wiederholt trotzdem den Dialog.

Müsste er die nicht durchlassen?

Die while schleife sagt ja, wiederhole wenn nichts, mehr als 1 Zeichen oder nicht +,-,*,: eingeben wird.
 
Deutlich besser. Jetzt weiß ich auch wonach ich gucken muss. 🙂

Deine Bedingung ist falsch. Dein Dialog wird wiederholt, so bald nur eine deiner Bedingungen zutrifft (da du ja alles mit ||verknüpfst). Gibst du also ein + ein, dann trifft
Code:
s != "-"
zu. Der Dialog wird wiederholt.

Müsste eher so aussehen:
Code:
while(s == null || s.length() > 0 || (s != "+" && s != "-" && s != "*" && s != ":"));

BTW: Jetzt seh ich erst mal, du benutzt ja gar kein logisches ODER. Dann kann das sowieso nicht funktionieren.
 
Ja, das klingt logisch. Habe es ersetzt.

Leider lehnt er immer noch alle Operatoren ab und wiederholt den Dialog. Auch escape oder das rote Kreuz geht nicht mehr, man muss Terminate (Eclipse) drücken...

*ratlossei*

Übrigens, vielen Dank schon mal (zwischendurch) für Deine Mühe!
 
Seh jetzt eigentlich keinen weiteren Fehler. Dann mach halt mal diverse System.out.println() ans Ende der Schleife. Dann siehst du ja, welche Variablen welche Werte haben und zu was sich dein Ausdruck evaluiert.
 
Code:
do {    
   s = JOptionPane.showInputDialog( "Bitte den Operator, also + , - , * oder : eingeben" ); 
} while(s == null || s.length() != 1 || ! (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")));

Negationstest nach deMorgan:

Die Schleife wird beendet sobald der bool'sche Ausdruck falsch wird:

! [s == null || s.length() != 1 || ! (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"))]
<==> s != null && s.length() == 1 && (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"))

In Worten: Die Schleife wird beendet sobald:

1. s != null ist und
2. Die Länge von s gleich 1 ist und
3. s gleich einem der Zeichen +,-,* oder / ist.

Nicht getestet, aber ich vertraue meiner Umformung! 😎
 
Aha, System.out.println(s) zeigt mir zumindest, warum er nicht mehr abbricht, er interpretiert das rote Kreuz und die Schaltfläche Abbrechen als null und wiederholt deswegen. Aber das bringt mich jetzt auch leider nicht weiter.

Der Code jetzt:

Code:
do
	{	
	s = JOptionPane.showInputDialog
	( "Bitte den Operator, also + , - , * oder : eingeben" );
	System.out.println(s);
	}
	while(s == null || s.length() > 0 || (s != "+" && s != "-" && s != "*" && s != ":"));

:bahnhof:
 
:applaus: Der Meister! :applaus:

Viiielen Dank! Es klappt, jetzt werde ich mir das erstmal genauer reinziehen, schließlich will ich das auch begreifen. :lol:
 
Die Bedingung

Code:
while(s == null || s.length() > 0 || (s != "+" && s != "-" && s != "*" && s != ":"))

war schon richtig gedacht; es ist aber so, daß
Stringvergleiche nur mit equals immer(*) korrekt funktionieren.


(*) Warum ich jetzt mit dem Wörtchen immer eine Einschränkung mache,
würde hier zuweit führen. ==> Lies den letzten Satz am besten ohne Einschränkung. :shock: :### :bae:
 
Habe da noch eine Zusatzfrage, was wäre wenn ich jetzt prüfen wollen würde:

do
...
while(keine Zahl eingegeben)

Also, dass er solange wiederholen soll, bis eine Zahl eingegeben bekommt. In meinen Büchern kann ich sowas nicht finden...
 
Da der Rückgabewert immer ein String ist, musst du diesen prüfen, ob er eine Zahl darstellt. Die schickste Lösung dafür ist ein Test mit einem regulären Ausdruck.

Code:
while (Pattern.matches("^\\d+$", s))

Aber hier wird Leroy42 nach seiner 4. Tasse sicher noch was besseres zu sagen können. ;-)
 
Jetzt ist es dadurch leider so, dass er alle Zahlen ablehnt und den Dialog wiederholt. Bei Buchstaben bricht er das Programm ganz ab... bzw. geht zur catch Anweisung. Bei Buchstaben soll er aber den Dialog wiederholen.

Ich werde mir die Klasse Pattern mal in der API genau angucken, bin aber für jede Hilfe dankbar.
 
Ja, negieren, ok, hab jetzt \\ davor gesetzt, er nimmt jetzt die Zahlen und die Buchstaben lehnt er ab, so weit so gut, aber der Dialog beginnt nicht von neuem sondern er löst eine Exception aus...
🙁
 
Halt, nein, falsch, die exception kam erst später.
Es ist so, dass er jetzt beides, Zahlen und Buchstaben annimmt. Verflucht. Hab ich nicht richtig negiert?
 
Du hast \\ davor gesetzt? Wovor hast du es gesetzt?

Was du machen musst ist:

Code:
while (!Pattern.matches("^\\d+$", s))

Damit wird der Dialog wiederholt, solange der eingebene Wert keine Zahl darstellt.

BTW: Wenn der Code eine Exception auslöst, wäre es hilfreich, wenn du uns die Exception mitteilst...
 
😳 Jetzt klappts! Danke!

Lieber nicht drüber reden was ich falsch gemacht hab. 😳
 
Ich will Dich (Euch) ja jetzt nicht über Gebühr beanspruchen, aber ginge auch das alle double-Zahlen durchgehen? Also auch z.B. 45.147 oder so?
 
Ja, musst halt den regulären Ausdruck anpassen. ;-)
Zu deiner Übung werd ich es dir aber nicht verraten.
In http://java.sun.com/j2se/1.4.2/docs/api/ stehen die möglichen Pattern-Konstrukte. Notfalls noch ein Tutorial zu regulären Ausdrücken dazu und du solltest weiter kommen. Wenn nicht, kannst du ja noch mal fragen, aber versuchs erst mal selbst.
 
In die Api gucke ich natürlich schon die ganze Zeit, ohne Erfolg. Habe jetzt noch mal 8 verschiedene Tutorials, meine Bücher und Google bis zum Abwinken bemüht ohne, dass ich auch nur den kleinsten Hinweis erhalten habe... 🙁
 
Ja, da habe ich auch schon geguckt und jetzt halt noch mal... also ich nehme an das man nicht einfach mitteilen kann, dass er nur double Datentyp annehmen soll sondern man muss die Charakteristik von double genau darstellen, Anzahl der Stellen, usw? Und für alle Indizies irgendwie einzeln einlesen... es ist hoffungslos... 🙁 🙁
 
Anonymous hat gesagt.:
also ich nehme an das man nicht einfach mitteilen kann, dass er nur double Datentyp annehmen soll sondern man muss die Charakteristik von double genau darstellen
Korrekt. Ein regulärer Ausdruck testet Strings. Jede beliebige Form von Strings. Welche Strings matchen, definierst du.

Anzahl der Stellen, usw?
Nur wenn es nötig ist. Wenn die Anzahl beliebig ist, dann brauchst du auch keine Anzahl vorgeben.
Und für alle Indizies irgendwie einzeln einlesen...
Das hab ich nicht verstanden. Was meinst du damit?
es ist hoffungslos... 🙁 🙁
Na das würd ich nun mal ganz und gar nicht so sehen.

Ein Double-Wert hat eine recht einfache Charakteristik.

* Er beginnt immer mit mindestens einer Ziffer
* Anschließend darf ein einzelner Punkt kommen
* war ein Punkt vorhanden, so muss der Rest des Strings aus mindestens einer Ziffer bestehen

Diese Anforderungen musst du nun noch in einem regulären Ausdruck umsetzen. Ist wirklich nicht schwer.
Versuch es mal und poste deinen erstellten Ausdruck mal hier. Mit welchem Teil kommst du dabei nicht klar?
 
hupfdule hat gesagt.:
Ein Double-Wert hat eine recht einfache Charakteristik.

* Er beginnt immer mit mindestens einer Ziffer
* Anschließend darf ein einzelner Punkt kommen
* war ein Punkt vorhanden, so muss der Rest des Strings aus mindestens einer Ziffer bestehen
Setzen, 6!
Alle Punkte falsch :shock:
 
Code:
double d;
d = 0E04;
d = 1.;
d = .1;
d = 1.2E2;
Gibt noch einige andere Variationen.
 
Ich nehme doch mal stark an, dass er seine Benutzer nicht derartige Werte eingeben lassen möchte. Falls doch, muss er halt seinen regulären Ausdruck entsprechend schreiben.

Da ihm schon der einfache Fall Schwierigkeiten macht, würde ich ihm nicht den komplizierten empfehlen.

In der Regel ist das von mir beschriebene Format exakt richtig und ausreichend. Hinweis: Er will keinen Parser für Double-Werte in Java-Code schreiben, sondern Benutzereingaben parsen...
 
'Ne RegExp für positive, natürliche Zahlen zu empfehlen,
finde ich ja noch gut und sogar elegant; bei doubles hört's,
meines Erachtens nach, aber auf: Warum sich den Kopf zerbrechen,
wenn es andere schon gemacht haben.

Code:
String binIchNeZahl;
boolean istZahl = false;
do {
  // Einlesen der potentiellen Zahl in binIchNeZahl
  try {
    Double.parseDouble(binIchNeZahl);
    istZahl = true;
  } catch (NumberFormatException e) {}
} while (!istZahl);

double zahl = Double.parseDouble(binIchNeZahl);

Der Mehraufwand durch das Exception-Auffangen spielt
bei Benutzereingaben nun wirklich keine Rolle.
 
Leroy<---- :!: :applaus: :applaus: :applaus: :!: 😀

Ich kann zwar nicht wirklich beurteilen ob RegExp besser sind in dem Fall (weil ich damit eh auf Kriegsfuß bin) aber diesen Codeschnipsel kann ich gut nachvollziehen, danke!
 
Tahomar hat gesagt.:
Ich kann zwar nicht wirklich beurteilen ob RegExp besser sind in dem Fall (weil ich damit eh auf Kriegsfuß bin) aber diesen Codeschnipsel kann ich gut nachvollziehen, danke!
Den RegEx brauchst du nur wenn du ein double aus einem String der noch andere Dinge enthält rausparsen willst.
Wenn du die Zahl alleine bekommst ist Double.parseDouble ganz klar Mittel der Wahl :wink:
 
Das war auch meine urprüngliche Wahl (auch nicht auf meinem Mist gewachsen 🙂 ) aber ich bin nicht auf die Idee gekommen den catch in die do while Schleife zu ziehen... Naja, danke auch Dir jedenfalls...
 
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Double.html#valueOf(java.lang.String)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben