Java Taschenrechner programmieren

Liebe/-r Experte/-in,
ich bin ein absoluter Java Anfänger und muss mich an dieser Aufgabe versuchen. Ich bin noch nicht sehr weit gekommen (siehe unten) und würde mich über jede Hilfe freuen, aber bitte kein Fachchinesisch, wie gesagt absoluter Anfänger :wink:.

Schreiben Sie ein Java-Programm, das einen einfachen Taschenrechner simuliert. Der Taschenrechner soll folgendes beherrschen:

  • Die 4 Grundrechenarten +,-,*,/
  • Die Standartfunktionen Sinus, Cosinus, Tangens, die Exponentialfunktion und den natürlichen Logarithmus
  • Abspeicherung eines Zwischenergebnisses
    Dabei soll zunächst ein Operand vom Typ double eingelesen werden. Danach soll die auszuführende Operation als Zeichen vom Typ char solange eingelesen werden, bis das Zeichen q für quit gelesen wurde. Verwenden Sie hierfür eine while-Schleife. Innerhalb der SChleife sollen dann verschiedene Fälle unterschieden und entsprechend vorgegangen werden. Verwenden Sie für die Fallunterscheidungen switch-Anweisungen. Dabei soll vor jedem erneuten abarbeiten der switch Anweisungen das Zwischenergebnis, das dem aktuellen Operanden zugewiesen wurde, mit erläuterndem Text ausgegeben werden.

a)Es wurde eines der Symbole der Grundrechenarten +,-,*,/ eingegeben. Es ist dann ein weiterer Operand vom Typ double einzulesen und die jeweilige Rechnung durchzuführen. Speichern Sie das Ergebnis im ersten Operand ab. Verwenden Sie für die Berechnung die Zuweisungsoperatoren +=,-=,*=,/=.

b)Es wurde einer der Buchstaben E,e,L,l,C,c,S,s,T,t,W,w eingelesen. Dabei bezeichnen die einzelnen Buchstaben jeweils den Anfangsbuchstaben der entsprechenden Standartfunktion. Wenden Sie die mathematischen Standartfunktionen Math.exp,Math.log,Math.cos,Math.sin,Math.tan, Math.sqrt(square root) auf den aktuellen Operanden an und weisen Sie diesem das Ergebnis der Rechnung zu.

c)Es wurden die Buchstaben M oder m eingelesen. Speichern Sie den aktuellen Operanden in einem internen Speicher (eine weitere Variable vom Typ double namens mem) ab.

d)Es wurden die Buchstaben R oder r eingelesen. Weisen Sie dem aktuellen Operanden den Wert von mem zu.

e)Es wurden die Buchstaben R oder r eingelesen. Weisen Sie dem aktuellen Operanden den Wert Null zu. Weisen Sie die Benutzer ihres Taschenrechners darauf hin, dass ihr aktuelles Zwischenergebnis Null ist.

f) Es wurden die Buchstaben Q oder q eingelesen. Geben Sie eine Abschiedsnachricht aus.

Soweit bin ich gekommen:
public class Taschenrechner{
public static void main (String[] args)
{

Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);

double o1, o2, e;
System.out.print("Bitte geben Sie den ersten Operand ein: ");
o1 = sc.nextDouble(); //ersten Operand einlesen
String str;
char zeichen;
str = sc.next();
zeichen = str.charAt(0);
System.out.print("Bitte geben Sie den zweiten Operand ein: ");
o2 = sc.nextDouble(); //zweiten Operand einlesen
while (zeichen!=‚q‘)
{
switch(zeichen)
{
case ‚+‘:

break;
case ‚-‘:
break;
case ‚*‘:
break;
case ‚/‘:

break;

case ‚E‘: case ‚e‘:

break;
case ‚L‘: case ‚l‘:

break;
case ‚C‘: case ‚c‘:
break;
case ‚S‘: case ‚s‘:
break;
case ‚T‘: case ‚t‘:
break;
case ‚W‘: case ‚w‘:

break;
default:
}
}
}
}

Hi larryhunter,

und was ist deine Frage ? Meinst du ich schreib dir das jetzt ?
Da sicher schon tausende TRs in Java programmiert wurden, findest du sich auch etwas über Google oder schau bei „Java ist auch ein Insel“ nach. Ohne das dort beschriebene Basiswissen ist die Aufgabe nicht zu bewälltigen. Wenn du konkrete Fragen hast kannst du gerne wieder an mich wenden.

Beste Grüße
xrax

ok,konkrete Frage:
wie genau gebe ich bei Punkt a) eine der GRundrechenarten an und vor allem wie funktioniert das mit den Zuweisungsoperatoren?

Larry,

ich kann dir leider keinen Java-Unterricht geben, sondern nur hoffen, dass du ein gutes Programmier-Lehrbuch hast. (Ich habe zuerst C gelernt mit sehr guten Lehrbüchern. Für Java brauchte ich dann kein Programmier-Lehrbuch mehr, darum kann ich dir keins empfehlen.)

Aber diesen Hinweis kann ich dir geben: Ich glaube, die Anleitung ist brauchbar. Richte dich auch danach. Sie besagt in etwa:

1. Zahl einlesen
2. Zeichen einlesen
3. Wiederholen:
4. Zeichen auswerten
5. Zeichen einlesen
6. Solange Zeichen nicht 'q' ist

Du hast jedoch programmiert:

1. Zahl-1 einlesen
2. Zeichen einlesen
3. Zahl-2 einlesen
4. Solange Zeichen nicht 'q' ist
5. Zeichen auswerten

Abgesehen von der Endlos-Schleife* solltest du den zweiten Operanden erst lesen, wenn der Operator (das Zeichen) ihn verlangt. Also noch mal: programmier genau so, wie die Anleitung vorschlägt.

Schönen Gruß,

Tosta

* Die Endlos-Schleife kommt daher, dass du kein neues Zeichen einliest, es sich dadurch auch nicht ändern kann und so nie zu ‚q‘ wird, damit die Schleife abbricht.

Hallo ich bin leider kein Mann großer Worte. Nachfolgend der von mir „verbesserte“ Quellcode. Er ist jedoch noch nicht fertig. Grundlegend habe ich einmal geändert, dass nun unendlich lange gerechnet werden kann (einfach mal plus und minus testen).
Die Variablen habe ich mal lesbarer gestaltet:wink:

Implementierte Funktionen

  • Plus und Minus-Rechnen
  • Sinus-Rechnen, sowie die Funktion „R“.
    Alles weitere sollte kein Problem mehr sein (evtl. noch die M-Funktion.

Falls noch Fragen vorhanden sind einfach nachfragen.

import java.util.Locale;
import java.util.Scanner;

public class Taschenrechner {
public static void main(String[] args) {

Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);

double oldOperand;
double currentOperand;
// double o1, o2, e;
System.out.print("Bitte geben Sie den aller ersten Operand ein: ");
currentOperand = sc.nextDouble(); // ersten Operand einlesen
String str;
char zeichen = ‚q‘;// Zeichen muss initial vorbelegt werden.

// System.out.print("Bitte geben Sie den zweiten Operand ein: ");
do {
//Leerzeile, damits übersichtlich wird.
System.out.println();

//Ausgeben welchen Wert gerade im Speicher liegt…
System.out.println("Aktueller Wert = "+currentOperand);
System.out.print("Bitte geben Sie den Operator ein: ");
str = sc.next();
if (str.length() > 1) {
System.out.println("Unültiger Operator: " + str);
// ungültige Eingabe. Überspringen und Schleife nochmal von
// vorne beginnen.
continue;
}

zeichen = str.charAt(0);

// Alten Wert ablegen, damit er später ausgegeben werden kann.
oldOperand = currentOperand;
switch (zeichen) {
case ‚+‘: {
// Zum Plus-Rechnen wird noch ein zweiter Operand benötigt…
// Einlesen!
System.out.print("Bitte geben Sie den zweiten Operand ein: ");
double tmpOperand = sc.nextDouble();
currentOperand += tmpOperand;// Hier wird gerechnet
System.out.println("Neuer Wert: " + oldOperand + " " + zeichen

  • " " + tmpOperand + " = " + currentOperand);
    break;
    }
    case ‚-‘: {
    // Zum Minus-Rechnen wird noch ein zweiter Operand benötigt…
    // Einlesen!
    System.out.print("Bitte geben Sie den zweiten Operand ein: ");
    double tmpOperand = sc.nextDouble();
    currentOperand -= tmpOperand;// Hier wird gerechnet
    System.out.println("Neuer Wert: " + oldOperand + " " + zeichen
  • " " + tmpOperand + " = " + currentOperand);
    break;
    }
    case ‚*‘:
    break;
    case ‚/‘:

break;

case ‚E‘:
case ‚e‘:

break;
case ‚L‘:
case ‚l‘:

break;
case ‚C‘:
case ‚c‘:
break;
case ‚S‘:
case ‚s‘: {
// Zum Sinus-Rechnen brauchen wir keinen weiteren Operanden.
// Gleich rechnen.
currentOperand = Math.sin(currentOperand);
System.out.println(„Neuer Wert: sin(“ + oldOperand + ") = "+ currentOperand);
break;
}
case ‚r‘:
case ‚R‘:
{
currentOperand=0;
System.out.println(„Wert wurde auf 0 zurückgesetzt.“);
break;
}
case ‚T‘:
case ‚t‘:
break;
case ‚W‘:
case ‚w‘:

break;
default: {
// NOch eine Fehlerausgabe
System.out.println("Unültiger Operator: " + zeichen);
}
}
} while (zeichen != ‚q‘);
}
}

Hallo larryhunter,

ich hoffe du erwartest jetzt nicht, dass ich deine Aufgabe für dich programmiere. Aber ich kann dir gerne dabei helfen den nächsten Schritt zu machen.

Schau dir mal Aufgabe a) an.
Da steht, du sollst den 2. Operanden nur einlesen, wenn z.B. ein „+“ eingegeben wurde. Also würde ich die beiden Zeilen:

System.out.print("Bitte geben Sie den zweiten Operand ein: ");
o2 = sc.nextDouble(); //zweiten Operand einlesen

unterhalb der Zeile

case ‚+‘:

verschieben.

Danach einfach

„o1 += o2;“

und dein Rechenergebnis steht in „o1“. Mit

"System.out.println(„Ergebnis: " + o1);“

kannst du das Rechenergebnis ausgeben.

Eigentlich bist du schon recht weit, du musst nur noch die Rechenoperationen richtig einsetzen. Bei den komplexeren Funktionen lautet der Aufruf eben:

o1 = Math.cos(o1);

Nicht vergessen das Package java.lang.Math zu importieren.

Außerdem hast du die double-Variable mem vergessen, dafür darfst du die Variable „e“ wegwerfen.

Viel Spass beim programmieren.

Bei weiteren Fragen einfach melden.

Gruß
Jürgen

Vielen Dank, das war echt ne große Hilfe. Ich hab jetzt alles hinbekommen, nur das mit dem mem fehlt mir noch.
Habe es so versucht, aber es klappt nicht:

case ‚M‘: case ‚m‘:
{
double mem;
mem = currentOperand;
System.out.print("Speicher: " +mem);
break;
}
case ‚Z‘: case ‚z‘:
{
currentOperand = mem;
System.out.print("Speicher betraegt: " +mem);
break;
}

Die „mem“-Variable hast du an der falschen Stelle deklariert, das ist alles. Schau dir mal das mit den „Sichtbarkeitsbereichen“ lokaler variablen nochmal an!

So wie in deinem Code ist die „double mem“ ja nur innerhalb der geschweiften Klammern gültig. Danach eben nicht mehr.
Du könntest Sie also ganz oben wo auch currentOperand definiert ist definieren.
Dann muss die Variable aber gleich noch initialisiert werden, ich würde 0 nehmen…

Gut klappt alles.
Danke nochmal.

Hi Larryhunter,

jetzt wäre es wohl nicht sinnvoll, wenn ich einfach alles vorsage … aber vielleicht ain paar kleine Tips :
In der Aufgabe steht, dass man erstmal eine Zahl einlesen soll, dann den Operator einlesen, dann ggf. nochmals eine Zahl. Aktuell sehe ich nur den Teil für’s ‚Operator einlesen‘.

Z.B. beim Sinus kann man auch nach einem Eingangswert und der Operation schon mal etwas ausgeben. Das motiviert bestimmt, wenn schon mal was blinkt :wink:

Hey Larryhunter

Habe deine Anfrage erst jetzt bekommen, ist sie noch aktuell?

Gruss
Mark