Logische Operatoren

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
 
G

Guest

Gast
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...
 
T

Tahomar

Gast
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.
 

hupfdule

Top Contributor
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.
 
T

Tahomar

Gast
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!
 

hupfdule

Top Contributor
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.
 

Leroy42

Top Contributor
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! :cool:
 
T

Tahomar

Gast
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:
 
T

Tahomar

Gast
:applaus: Der Meister! :applaus:

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

Leroy42

Top Contributor
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:
 
T

Tahomar

Gast
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...
 

hupfdule

Top Contributor
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. ;-)
 
T

Tahomar

Gast
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.
 
T

Tahomar

Gast
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...
:(
 
T

Tahomar

Gast
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?
 

hupfdule

Top Contributor
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...
 
T

Tahomar

Gast
:oops: Jetzt klappts! Danke!

Lieber nicht drüber reden was ich falsch gemacht hab. :oops:
 
T

Tahomar

Gast
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?
 

hupfdule

Top Contributor
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.
 
T

Tahomar

Gast
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... :(
 
T

Tahomar

Gast
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... :( :(
 

hupfdule

Top Contributor
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?
 

Wildcard

Top Contributor
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:
 

Wildcard

Top Contributor
Code:
double d;
d = 0E04;
d = 1.;
d = .1;
d = 1.2E2;
Gibt noch einige andere Variationen.
 

hupfdule

Top Contributor
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...
 

Leroy42

Top Contributor
'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.
 
T

Tahomar

Gast
Leroy<---- :!: :applaus: :applaus: :applaus: :!: :D

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!
 

Wildcard

Top Contributor
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:
 
G

Guest

Gast
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...
 

Ark

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Operatoren Was will mir die Tabelle in meinem Lehrbuch sagen? (logische Operatoren) Java Basics - Anfänger-Themen 4
lulas[]args Fehler - Logische Operatoren Java Basics - Anfänger-Themen 9
L [Logische Operatoren] referenzierbar? Java Basics - Anfänger-Themen 3
G Logische und Bitweise Operatoren Java Basics - Anfänger-Themen 2
E Logische Operatoren && und & Java Basics - Anfänger-Themen 14
D Logische Operatoren Java Basics - Anfänger-Themen 6
M logische operatoren Java Basics - Anfänger-Themen 2
R Binäre logische Operatoren Java Basics - Anfänger-Themen 21
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
D Logische Frage zu Settern und Gettern Java Basics - Anfänger-Themen 4
G Logische Verknüpfungen Java Basics - Anfänger-Themen 10
B Methoden Logische Reihenfolge in Programmen? Java Basics - Anfänger-Themen 4
L Logische Kerne auslesen Java Basics - Anfänger-Themen 6
M Logische Schaltungen nachbauen. Java Basics - Anfänger-Themen 19
sqsh logische verknüpfung Java Basics - Anfänger-Themen 3
J Logische Verknüpfungen mit JAI Java Basics - Anfänger-Themen 2
M Logische Verneinung Java Basics - Anfänger-Themen 13
B Spielereien mit bit wise Operatoren und langen Binärzahlen Java Basics - Anfänger-Themen 3
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
Kleinerals2 NaN Operatoren Java Basics - Anfänger-Themen 3
S Und-Abfrage mit mehreren Ungleich-Operatoren Java Basics - Anfänger-Themen 17
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
D Erste Schritte Operatoren zur Manipulation von Bits "~" Java Basics - Anfänger-Themen 5
M Operatoren Umwandlung div. Operatoren Java Basics - Anfänger-Themen 7
S Bitweise Operatoren" >>>",">>","<<" erklärung Java Basics - Anfänger-Themen 5
G operatoren Java Basics - Anfänger-Themen 3
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
X Shift-Operatoren Java Basics - Anfänger-Themen 1
P Bitweise Operatoren Java Basics - Anfänger-Themen 2
Phillip Bitweise Operatoren Java Basics - Anfänger-Themen 11
C Operatoren Java Basics - Anfänger-Themen 6
P Taschenrechner, operatoren Java Basics - Anfänger-Themen 4
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
S Operatoren & Terminierung Java Basics - Anfänger-Themen 1
A Bitweise Operatoren Java Basics - Anfänger-Themen 1
O Priorität bei Operatoren Java Basics - Anfänger-Themen 4
N Potenzierung durch einfache Operatoren Java Basics - Anfänger-Themen 13
B Geschwindigkeitsabhängigkeit von Anz. d. Operatoren pro Zeile Java Basics - Anfänger-Themen 12
M hexadezimal in binär mit Hilfe von Shift-Operatoren Java Basics - Anfänger-Themen 6
S Arithmetische Operatoren Java Basics - Anfänger-Themen 7
L Erste Schritte Fragen zu Arrays, Inkrement Operatoren, Dekrement Operatoren ? Java Basics - Anfänger-Themen 9
H Nur Zahlen, Klammern und Operatoren Java Basics - Anfänger-Themen 3
D Frage zu Bit Operatoren in der Programmierung Java Basics - Anfänger-Themen 9
P Anzahl der else if Operatoren begrenzt?? Java Basics - Anfänger-Themen 7
W Was tun die Operatoren ? und : (Bedingungen) Java Basics - Anfänger-Themen 15
W Datentypen Operatoren für eigenen Datentyp nutzen Java Basics - Anfänger-Themen 2
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
? Operatoren && || Java Basics - Anfänger-Themen 10
M Aufgabe Arithmetische Operatoren Java Basics - Anfänger-Themen 12
H While Schleife mit Operatoren Java Basics - Anfänger-Themen 14
T Rechnen mit Operatoren Java Basics - Anfänger-Themen 2
M Arithmetische Operatoren Java Basics - Anfänger-Themen 40
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
M Sind ternäre Operatoren für einen guten Programmierstil wichtig ? Java Basics - Anfänger-Themen 10
E IF Anweisung mit logischen Operatoren Java Basics - Anfänger-Themen 18
JStickman Was bringen Bit-Operatoren? Java Basics - Anfänger-Themen 14
J Matheaufgabe aus String mit mehreren Operatoren Java Basics - Anfänger-Themen 16
D Grundlagen - Operatoren Java Basics - Anfänger-Themen 5
1 Datentypen Rückgabetyp von Java-Operatoren Java Basics - Anfänger-Themen 2
V Bitweise Operatoren in der Grafikprogrammierung Java Basics - Anfänger-Themen 2
SebSnake Operatoren für eigene Datentypen Java Basics - Anfänger-Themen 3
C Variablen für Operatoren Java Basics - Anfänger-Themen 3
W Rangfolge von Operatoren Java Basics - Anfänger-Themen 16
N zahlen und operatoren gemischt in einem Feld Java Basics - Anfänger-Themen 9
C Dynamische Operatoren! Java Basics - Anfänger-Themen 5
G Shift Operatoren Java Basics - Anfänger-Themen 4
R Bedingte Opeatoren / Verschachtelte Operatoren Java Basics - Anfänger-Themen 4
7 Operatoren in der While Schleife Java Basics - Anfänger-Themen 5
H Postfix Operatoren Java Basics - Anfänger-Themen 2
S Variablen + Operatoren "mixen" Java Basics - Anfänger-Themen 5
F Experimente mit Bit-Operatoren Java Basics - Anfänger-Themen 7
G Nutzen von bitweisen Operatoren Java Basics - Anfänger-Themen 8
J Operatoren in Java Java Basics - Anfänger-Themen 2
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben