Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Java Tschenrechner Punkt vor Strichregel beibringen

Frage Entwicklung Java

Mitglied: himmelph

himmelph (Level 1) - Jetzt verbinden

29.07.2010 um 01:39 Uhr, 5672 Aufrufe, 6 Kommentare

Hallo Zusammen,

Ich könnte mal wieder euro Hilfe gebrauchen, diesmal im Bereich Java Programmierung. Und zwar sollen wir für die Schule einen kleinen Taschenrechner in Java programmieren mit dem man zum einen die Grundrechenarten verwenden kann und eventuell später noch Klammern oder änliches verwenden kann. Nun habe Ich bereits 2 Klassen geschrieben in der einen wird die graphische Oberfläche und die verschiedenen Datentypen (Strings, Int, Double, Boolean) des Rechners festgelegt wird und in der anderen werden dann, je nachdem welche Taste gedrückt wird verschiedene Aktionen ausgeführt.
Soweit funktioniert so ziemlich alles, außer, dass der Rechner die Punkt vor Strich Regel beherrscht. Jetzt zu meiner eigenlichen Frage: Wie kann ich am besten dem Rechner beibringen, dass er zuerst * und / rechnet und dann erst + und -.
Hier ein kleiner Ausschnitts des Codes indem die Buttons Plus, Minus, Mal, Geteilt und Gleich aufgerufen werden.

01.
public static void IstgleichListener(ActionEvent e) { 
02.
    	        
03.
    	if (boolplus == true)  
04.
05.
 
06.
    		if (i == 1){ 
07.
    			Faktoreins = Double.valueOf(Eins); 
08.
    			Zwei = Display.getText(); 
09.
    			Faktorzwei = Double.valueOf(Zwei); 
10.
    			Ergebnis = Faktoreins + Faktorzwei; 
11.
    			Eins = String.valueOf(Ergebnis); 
12.
13.
    		Display.setText(Eins); 
14.
    		boolplus = false; 
15.
16.
    	 
17.
    	 
18.
    	if (boolminus == true) 
19.
20.
    		 
21.
 
22.
    		if (i == 1){ 
23.
    			Faktoreins = Double.valueOf(Eins); 
24.
    			Zwei = Display.getText(); 
25.
    			Faktorzwei = Double.valueOf(Zwei); 
26.
    			Ergebnis = Faktoreins - Faktorzwei; 
27.
    			Eins = String.valueOf(Ergebnis); 
28.
29.
    		Display.setText(Eins); 
30.
    		boolminus = false; 
31.
32.
    	 
33.
    	if (booldiv == true) 
34.
35.
    		 
36.
    		if (i == 1){ 
37.
    			Faktoreins = Double.valueOf(Eins); 
38.
    			Zwei = Display.getText(); 
39.
    			Faktorzwei = Double.valueOf(Zwei); 
40.
    			Ergebnis = Faktoreins / Faktorzwei; 
41.
    			Eins = String.valueOf(Ergebnis); 
42.
43.
    		Display.setText(Eins); 
44.
    		booldiv = false; 
45.
46.
    	 
47.
    	if (boolmult == true) 
48.
49.
    		 
50.
    		if (i == 1){ 
51.
    			Faktoreins = Double.valueOf(Eins); 
52.
    			Zwei = Display.getText(); 
53.
    			Faktorzwei = Double.valueOf(Zwei); 
54.
    			Ergebnis = Faktoreins * Faktorzwei; 
55.
    			Eins = String.valueOf(Ergebnis); 
56.
57.
    		Display.setText(Eins); 
58.
    		boolmult = false; 
59.
    		 
60.
61.
    	 
62.
     if (boolquad == true){ 
63.
    	 Zwei 			= Display.getText(); 
64.
    	 double i 		= Double.valueOf(Zwei); 
65.
    	 Sechs 			= Double.valueOf(Eins); 
66.
    	 for(int p = 1; p<i; p++){ 
67.
    		 Sechs 	= Sechs*Sechs; 
68.
69.
    		 Vier 	= String.valueOf(Sechs); 
70.
    		 Display.setText(Vier); 
71.
    	  
72.
73.
74.
 
75.
	public static void PlusListener(ActionEvent e){ 
76.
 
77.
 
78.
		switch (i){ 
79.
		 
80.
		case 0 : 
81.
		 
82.
		Eins = Display.getText(); 
83.
		Display.setText(""); 
84.
		i = 1; 
85.
		boolplus = true; 
86.
		break; 
87.
		case 1 : 
88.
			Faktoreins = Double.valueOf(Eins); 
89.
			Zwei = Display.getText(); 
90.
			Faktorzwei = Double.valueOf(Zwei); 
91.
			Ergebnis = Faktoreins + Faktorzwei; 
92.
			Eins = String.valueOf(Ergebnis); 
93.
			boolplus = true; 
94.
			Display.setText(""); 
95.
			break; 
96.
	}} 
97.
 
98.
	public static void MinusListener(ActionEvent e){ 
99.
 
100.
	 
101.
		switch (i){ 
102.
		 
103.
		case 0 : 
104.
		 
105.
		Eins = Display.getText(); 
106.
		Display.setText(""); 
107.
		i = 1; 
108.
		boolminus = true; 
109.
		break; 
110.
		case 1 : 
111.
			Faktoreins = Double.valueOf(Eins); 
112.
			Zwei = Display.getText(); 
113.
			Faktorzwei = Double.valueOf(Zwei); 
114.
			Ergebnis = Faktoreins - Faktorzwei; 
115.
			Eins = String.valueOf(Ergebnis); 
116.
			boolminus = true; 
117.
			Display.setText(""); 
118.
			break; 
119.
			 
120.
121.
122.
 
123.
	public static void MalListener(ActionEvent e){ 
124.
switch (i){ 
125.
		 
126.
		case 0 : 
127.
		 
128.
		Eins = Display.getText(); 
129.
		Display.setText(""); 
130.
		i = 1; 
131.
		boolmult = true; 
132.
		break; 
133.
		case 1 : 
134.
			Faktoreins = Double.valueOf(Eins); 
135.
			Zwei = Display.getText(); 
136.
			Faktorzwei = Double.valueOf(Zwei); 
137.
			Ergebnis = Faktoreins * Faktorzwei; 
138.
			Eins = String.valueOf(Ergebnis); 
139.
			boolmult = true; 
140.
			Display.setText(""); 
141.
			break; 
142.
143.
144.
 
145.
	public static void GeteiltListener(ActionEvent e){ 
146.
switch (i){ 
147.
		 
148.
		case 0 : 
149.
		 
150.
		Eins = Display.getText(); 
151.
		Display.setText(""); 
152.
		i = 1; 
153.
		booldiv = true; 
154.
		break; 
155.
		case 1 : 
156.
			Faktoreins = Double.valueOf(Eins); 
157.
			Zwei = Display.getText(); 
158.
			Faktorzwei = Double.valueOf(Zwei); 
159.
			Ergebnis = Faktoreins / Faktorzwei; 
160.
			Eins = String.valueOf(Ergebnis); 
161.
			booldiv = true; 
162.
			Display.setText(""); 
163.
			break; 
164.
	}   
165.
	}
Ich hoffe, dass ich euch ein bisschen näherbringen konnte was ich vor habe und würde mich über eine Antwort freuen.
Danke schonmal im Vorraus
lG himmelph
Mitglied: Friemler
29.07.2010 um 03:57 Uhr
Hallo himmelph,

mit einem Java-Codeschnipsel kann ich nicht dienen, da ich diese Sprache nicht beherrsche. Grundsätzlich löst man so etwas aber mit Stacks. Die kann man mit einfach verketteten Listen oder mit Arrays darstellen.

Dazu müsstest Du Dir erstmal eine Klasse für Stacks schreiben, mit den grundlegenden Operationen push (Element auf den Stack legen) und pop (oberstes Element vom Stack nehmen). Füge auch noch einen Zähler für die Anzahl der Elemente im Stack hinzu. Dann definierst Du ein Array aus solchen Objekten und ein einzelnes Objekt. Auf die Stacks im Array legst Du die Operatoren (Codes für die Rechenzeichen +, -, * und /) ab, auf den einzelnen Stack die Operanden (die Zahlen).

Wenn ein Rechenzeichen eingegeben wird, legst Du die Zahl aus der Anzeige auf den Operanden-Stack. Wenn der Operatoren-Stack leer ist, legst Du den Code für das Rechenzeichen (den kannst Du über einen Aufzählungstypen definieren) auf den Operatoren-Stack. Wenn der Operatoren-Stack nicht leer ist, führst Du folgende Prüfungen durch:

  • Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, rechnest Du nicht.
  • Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
  • Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
  • Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.

Das Ergebnis der Berechnung legst Du wieder auf den Operanden-Stack.

Wenn eine öffnende Klammer eingegeben wird, zählst Du den Index für das Operatoren-Stack-Array um eins hoch, bei einer schließenden Klammer führst Du alle noch ausstehenden Rechenoperationen aus und zählst den Index um eins nach unten.

Das ganze lässt sich ziemlich einfach um Funktionen der höheren Mathematik erweitern, z.B. x hoch 2, Wurzel aus x, e hoch x, ln x, 10 hoch x, log x, sin, con, tan (und deren Umkehrfunktionen). Das wären Operatoren mit einem Operanden. Operatoren mit zwei Operanden wären +, - , *, /, x hoch y, x-te Wurzel aus y, Logarithmus von x zur Basis y. Für Operatoren mit zwei Operanden musst Du Dir Codes definieren, die Du auf dem Stack ablegen kannst. Alle diese Operatoren haben die gleiche Priorität wie * und /.

Ist schon länger her, daß ich sowas mal in Delphi (auch eine Übungsaufgabe) geschrieben habe. Es gibt dabei noch ein paar Ausnahmen zu behandeln, aber das siehst Du dann schon.

Zuerst habe ich mir eine Basisklasse für Stacks geschrieben von denen ich die Operatoren- und Operanden-Stacks abgeleitet habe, so war das ganze Datentyp-unabhängig.

Gruß
Friemler
Bitte warten ..
Mitglied: himmelph
29.07.2010 um 10:06 Uhr
Hallo Friemler

Erst einmal vilen Dank für deine super Antwort.
Stacks haben wir leider bisher noch nicht behandelt, jedoch werde ich versuchen mich in den nächsten Tagen darin einmal einzulesen.
Naja zumindest weiß ich jetzt wie sowas gehen könnte und kann mir ein genaueres Bild davon machn

Danke
Gruß himmelph
Bitte warten ..
Mitglied: TsukiSan
29.07.2010 um 11:39 Uhr
Hallo himmelph,

vielleicht wäre auch diese Seite etwas für dich.
Ist etwas hochgegriffen, aber eventuell kannst du etwas davon in Java umsetzen.
Ich kenne mich mit Java leider auch nicht aus und schließe mich Friemler von daher an.
Diese Stacks funktionieren recht gut.

Gruss
Tsuki
Bitte warten ..
Mitglied: dog
30.07.2010 um 03:51 Uhr
Ein Stack ist in einer hohen Sprache ist idR einfach ein Array - die beherrschen von Haus aus push und pop.
Bitte warten ..
Mitglied: himmelph
30.07.2010 um 22:48 Uhr
Hallo ich bins nochmal,
Erstmal nochmal danke für die ganzen Kommentare...

Ich habe mir überlegt das ganze viel einfacher zu machen. Ich möchte einfach alles was ich vor dem = in einen String schreiben. Diesen möchte ich dann in einen Double geben der mir dann das Ergebnis ausrechnent. Da Java ja schon mit Punkt vor Strich rechnen kann wäre das Problem dann denke ich gelöst. Jedoch triit jetzt ein neues Problem auf:
Wenn ich zum Test eingebe;

01.
	neuerDouble = 1+1+2*3; 
02.
	neuerString = String.valueOf(neuerDouble); 
03.
	Display.setText(neuerString);
erhalte ich wie gedacht als Ergebnis 8.

Dies bweist, dass Java in Doubles nicht nur Rechnen kann sondern auch die Punkt vor Strich Regel beherrscht.

Nun habe ich mir gedacht, dass ich einfach alles was ich eingebe in einen String schreibe, danach in einen Double gebe und dieser dann alles für mich ausrechnet:

01.
     neuerString = Display.getText(); 
02.
     neuerDouble = Double.valueOf(neuerString); 
03.
     neuerString = String.valueOf(neuerDouble); 
04.
     Display.setText(neuerString);
Jedoch erhalte ich wenn ich den obenstehenden Code ausführen lasse eine Fehlermeldung

Kann mir vielleicht jemand helfen, was mein Fehler ist oder mir eventuell sagen wie ich es besser machen könnte.

Gruß
himmelph
Bitte warten ..
Mitglied: Friemler
30.07.2010 um 23:27 Uhr
Hallo himmelph,

Du verwechselst da was. Wenn Du schreibst

01.
neuerDouble = 1+1+2*3;
rechnet Java den Ausdruck rechts vom Gleichheitszeichen aus und weist das Ergebnis der Variablen neuerDouble zu. Die kannst Du natürlich in einen String wandeln und wird dann auch korrekt angezeigt. Wenn Du aber einen String "1+1+2*3" in einen Double wandeln willst, findet Java die Pluszeichen und die Konvertierungsmethode Double.valueOf bricht mit einem Fehler ab. Die Konvertierungsmethode rechnet nämlich NICHT. Du musst Dir schon etwas mehr Arbeit machen.

Wie User dog schon sagte, hat Java wahrscheinlich Stacks schon eingebaut (Delphi übrigens auch, eine eigene Klasse zu schreiben war für mich nur eine zusätzliche Herausforderung, war mein erstes OOP-Programm). Du musst nur lernen, sie zu benutzen.

Wenn Dir der Lösungsweg, den ich beschrieben habe, zu kompliziert ist (Du scheinst Anfänger zu sein), bemühe mal Tante Google. Taschenrechner sind beliebte Übungsprojekte, da findest Du jede Menge Anregungen, aber wahrscheinlich meistens nicht in Java. Mit ein bisschen Überlegung kannst Du aber auch Code aus Delphi oder Visual Basic in Java übertragen. Meistens sind diese Lösungen auch einfacher gehalten als mein Vorschlag, haben dann aber gewisse Nachteile, die vielleicht aber auch für Dich nicht so wichtig sind. Ich habe mir damals bei meiner Übung auch Anregungen aus dem Netz geholt. Aber nur selbst denken macht schlau, Dein Lehrer hat sich ja was dabei gedacht, als er die Aufgabe stellte.

Gruß
Friemler
Bitte warten ..
Ähnliche Inhalte
Netzwerkprotokolle
SMTP und der Punkt
Frage von StefanKittelNetzwerkprotokolle5 Kommentare

Hallo zusammen, ich beschäftige mich gerade mal wieder mit dem SMTP-Protokoll und bin dabei auf ein Prinzip-Problem gestoßen. Ich ...

Netzwerkgrundlagen
Frage zu Punkt-zu-Punkt Verbindung und Broadcast-Netz
gelöst Frage von ichigo77Netzwerkgrundlagen3 Kommentare

Hallo, Es geht um die Schicht 2 (Sicherung) im OSI-Model : Bei Punkt-zu-Punkt Verbindungen (z.B. zwischen Telefonanschluss und ISP ...

Batch & Shell
Punkt durch Komma ersetzen
Frage von TingelTangelbatchBatch & Shell9 Kommentare

Hallo, für eine batch Datei suche ich folgende Hilfe / Code: Ich habe monatlich ca. 10 Textdatein welche Werte ...

Exchange Server
Exchange das Senden über dem Smarthost per TLS, SSL beibringen
Anleitung von minimalwerkExchange Server1 Kommentar

Hallo liebe Community, da ja die Umstellung bei einigen großen Providern vor der Tür steht hier mal eine kleine ...

Neue Wissensbeiträge
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 6 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 10 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware8 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...