Taschenrechner in java mit mehreren Ordnern?
Hallo, ich hab die Aufgabe einen einfachen Taschenrechner in python zu programmieren, was ich auch hinbekommen hab. Jedoch ist die Aufgabenstellung wie folgt, an der ich verzweifle:
Ein- und Ausgabe sollen unabhängig der eigentlichen Berechnung in der Quelldatei src\app\App.java erfolgen.
Die Berechnung ist in der Quelldadei src\calc\Calculator.java zu implementieren.
Zusätzlich ist die korrekte Berechnung aller Grundrechenarten über Unit-Tests in der Quelldatai src\test\CalculatorTests.java zu gewährleisten.
Ich kann den Taschenrechner als eine datei programmieren, aber wie kann ich das in diese drei unterschiedlichen Dateien/Ordner packen kann, so dass z.B Calculator.java auf die Ein- und Ausgabe in App.java zugreifen kann?
Da habe ich schon probiert in calculator.java etwas wie
App myObject = new App();
einzubauen, aber ohne Erfolg.
Vielen dank schonmal, bin noch blutiger Anfänger
2 Antworten
Du packst beides in denselben Ordner bzw. in dasselbe Package.
Du machst die entsprechenden Klassen und Methoden packetsichtbar (also alles außer "private" dürfte gehen).
Du Importierst die Klasse in deinem anderem File.
Und alles weitere ist dann trivial möglich.
Hi, in Java spricht man dabei von sogenannten packages. Ein package organisiert zusammengehörigen Code in einem gleichen Namespace und muss dabei der Ordnerstruktur entsprechen.
In deinem Beispiel haben wir folgende Ordnerstruktur:
src/
├── app/
│ └── App.java
├── calc/
│ └── Calculator.java
└── test/
└── CalculatorTest.java
Für Java heißt das, dass du die drei packages app, calc und test hast.
In den java Dateien muss dann jeweils das zugehörige package angegeben werden, sonst gibt es Fehler:
package app;
public class App { }
Du siehst die erste Zeile? Damit zeigen wir, dass diese Klasse zum package app gehört.
Wenn wir jetzt das woanders nutzen möchten, dann müssen wir das importieren. Dabei geben wir an, welche Klasse wir importieren möchten und in welchem package diese zu finden ist:
package calc;
import app.App; // importiere Klasse App aus package app
public class Calculator {
public void method() {
App a = new App();
}
}
Und schon kannst du drauf zugreifen :)
In Java steht Programmcode immer innerhalb einer Methode und die immer innerhalb einer Klasse. Bis auf package und import steht also nie etwas außerhalb einer Klasse! und bis auf gewisse Variablen steht auch nie etwas außerhalb einer Methode!
Deine zweite Zeile darf so also nicht stehen.
Nach deinem import kommen auch keine "{", sondern ein ";".
Deine switch muss innerhalb einer Methode stehen. Aber ganz allgemein sieht es (entsprechend deiner eigenen Einschätzung :D) so aus, als hast du keine Ahnung, was du da tust.
geschweifte Klammern kommen (erstmal) immer nur nach Klassendefinition, nach Methodendefinition und nach Kontrollstrukturen. Statements sind immer mit einem ";" abzuschließen.
package calc;
import app.App;
public class Calculator {
public void calculate() {
switch() { ... };
}
}
Aber so macht das Beispiel eigentlich gar keinen Sinn. Auf System hast du immer und überall Zugriff, auch ohne import. Das heißt Ausgabe kannst du auchg so verwenden. Eingabe hast du in App gemacht sagst du? Ich kenne jetzt nicht den gewünschten Workflow, aber folgendes wäre eigentlich sinniger zu tun:
App.java:
package App;
import calc.Calculator;
public class App {
public static void main(String[] args) {
// Eingabe musst du entsprechend wie auch immer du
// das jetzt hast ersetzen
int nummer1 = eingabe();
char opeator = eingabe();
int nummer2 = eingabe();
// Wir erstellen neues Objekt von Calculator
Calculator calculator = new Calculator();
// Nehmen jetzt das Objekt calculator und
// führen die calculate() Methode aus
// übergeben dabei die nötigen Informationen
// Sodass die switch das da drin abarbeiten kann
calculator.calculate(nummer1, operator, nummer2);
}
}
Calculator.java:
package calc;
public class Calculator {
public void calculate(int nummer1, char operator, int nummer2) {
switch (operator) {
// die Berechnungen
}
}
}
So wäre es glaub ich ein sinnigerer Workflow, keine Ahnung, was du mit App in Calculator machen willst. Wenn das eine Aufgabe ist, die du machen sollst, dann musst du doch irgendwie unterlagen oder so haben, wo du die Grundlagen von Java lernen könntest oder nicht?
Danke erstmal.
Habe mir ein grundlegendes Tutorial angeguckt, damit auch folgendes programmieren können, was funktioniert:
package calc;
import java.util.Scanner;
public class calculator {
public static void main(String[] args) {
double zahl1, zahl2;
char operator;
Scanner input = new Scanner(System.in);
System.out.println("Gib eine Zahl ein");
zahl1 = input.nextDouble();
System.out.println("Gib eine zweite Zahl ein");
zahl2 = input.nextDouble();
System.out.println("Gib einen Rechenoperator ein (+, -, *, /)");
operator = input.next().charAt(0);
input.close();
switch(operator) {
case '+':
System.out.printf("%.2f + %.2f = %.2f", zahl1, zahl2,(zahl1 + zahl2));
break;
case '-':
System.out.printf("%.2f - %.2f = %.2f", zahl1, zahl2,(zahl1 - zahl2));
break;
case '*':
System.out.printf("%.2f * %.2f = %.2f", zahl1, zahl2,(zahl1 * zahl2));
break;
case '/':
if(zahl2 !=0)
System.out.printf("%.2f / %.2f = %.2f", zahl1, zahl2,(zahl1 / zahl2));
else
System.out.println("Durch 0 kann nicht geteilt werden!");
break;
default:
System.out.printf("%c ist ungültig", operator);
}
}
}
aber das in drei verschiedene packages reinzupacken versteh ich nicht.
Er sagt mir dann immer "cannot find symbol", z.b bei "nummer1".
Und ja hab keine Ahnung was ich mache
Ja genau. Die Aufgabe sieht halt vor, dass das was du da jetzt in einem gemacht hast eben aufgeteilt wird. Deine Methode macht halt jetzt ziemlich viel auf einmal: Einlesen, Verarbeitung und Ausgabe. Normalerweise tendiert man dazu, das in möglichst kleine Teile aufzuteilen, die Sinn ergeben. Sowas wie Ein- und Ausgabe hat ja schon vom Namen her nichts mit Calculater zu tun, verstehst du? Sondern der Calculater soll eben nur das tun, was der Name schon sagt und das möglichst gut.
Variablen müssen natürlich definiert werden, damit der Compiler die kennt. cannot find symbol heißt, dass du die nirgends oder zumindest nicht in dem Scope (in Java meistens alles was zwischen { und } ist) definiert hast.
So? Wo brauch ich die Klammern? Verstehe die nicht, bin nur python gewohnt