public class Engine {
//Attribute
String op;
Ratio ratioZahl;
static int berechnungen = 0;
/** Der Speicher (4 dimensionales Array) speichert in jeder Zeile die eingegebenen
* rationalen Zahlen, den Operator und das Ergebnis - somit sind 1500 Berechnungen
* möglich, eine Array-Liste wäre hierfür variabler, aber nicht in der Aufgabenstellung
* vorgesehen
*/
String[][] speicher = new String[1500][4];
//Initialisierung des Scanners zur Benutzereingabe
Scanner scan = new Scanner(System.in);
/**Eingabemethode für eine rationale Zahl in Form z/n - Eingabe wird anschließend am
* Bruchstrich gesplitted
* Dies wird so lange wiederholt, bis der Benutzer eine sinnvolle Eingabe gemacht hat
* Exception fängt dabei fehlerhafte Eingaben des Benutzers ab
*/
public void eingabeRatioZahl(){
String eingabe;
int[] zahl;
do{
System.out.println("Bitte rationale Zahl eingeben in der Form z/n");
eingabe = scan.nextLine();
String [] splitted = eingabe.split("/");
zahl = new int[2];
try{
zahl[0] = Integer.parseInt(splitted[0]);
zahl[1] = Integer.parseInt(splitted[1]);
if(Integer.parseInt(splitted[1]) == 0){
System.out.println("Fehler: Die 0 im Nenner ist nicht erlaubt!\n");
}
else{
ratioZahl = new Ratio(zahl[0],zahl[1]);
break;
}
}
catch(Exception ex){
System.out.print("Fehler: Ungültige Eingabe!\n");
}
}while(true);
} //End of eingabeRatioZahl()
/** Sichert die rationale Zahl in Stringform in den Speicher (Array), sofern an
* dieser Stelle des Arrays nicht schon eine Zahl im Speicher ist.
*/
public void saveRatioZahl(Ratio r){
for(int speicherIndex = 0; speicherIndex < 1500; speicherIndex++){
if(speicher[speicherIndex][0] == null){
speicher[speicherIndex][0] = r.toString();
break;
}
if(speicher[speicherIndex][2] == null){
speicher[speicherIndex][2] = r.toString();
break;
}
if(speicher[speicherIndex][3] == null){
speicher[speicherIndex][3] = r.toString();
break;
}
if (speicherIndex==1500) {
System.out.println("Kein Speicherplatz mehr verfügbar.");
}
}
} //End of saveRatioZahl()
/**Eingabemethode für einen Opperator
* wird wiederholt bis vom Benutzer eine übereinstimmende Eingabe getätigt wurde
* sollte dies nicht der Fall sein, wird der Nutzer auf die falsche Eingabe hingewiesen
*/
public void eingabeOperator(){
do {
System.out.println("Bitte Operator eingeben [+-*/]");
op = scan.nextLine();
if (op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/")) {
break;
}
else {
System.out.print("Ungültige Eingabe!\n\n");
}
}while (true);
}
/** sichert den Operator als String in den Speicher (Array),
* sofern an der zu speichernden Stelle nicht bereits ein Operator gespeichert wurde
*/
public void saveOperator(String op){
for(int speicherIndex = 0; speicherIndex < 1500; speicherIndex++){
if(speicher[speicherIndex][1] == null){
speicher[speicherIndex][1] = op.toString();
break;
}
if (speicherIndex==1500) {
System.out.println("Kein Speicherplatz mehr verfügbar.");
}
}
}
/**
* gibt einen String aus dem Speicher zurück
* @param zeilenIndex - die Position (Zeile) des String im Speicher (Array)
* @param spaltenIndex - die Position (Spalte) des Strings im Speicher (Array)
* @return String - Der Ausgabestring gibt den Zeilenindex und Spaltenindex der
* gespeicherten Zahl zurück
*/
public String restore(int zeilenIndex, int spaltenIndex){
String ausgabeString;
ausgabeString = speicher[zeilenIndex][spaltenIndex];
return ausgabeString;
}
/**
* Konvertiert einen String in eine rationale Zahl
* @param str - enthält die rationale Zahl in Stringform z.B "2/3"
* @return neueRatioZahl - gibt die Zahl als rationale Zahl zurück
*/
private Ratio string2ratio(String str){
int zaehler;
int nenner;
String[] split = new String[2];
split = str.split("/");
zaehler=Integer.parseInt(split[0]);
nenner=Integer.parseInt(split[1]);
Ratio neueRatio = new Ratio(zaehler, nenner);
neueRatio.setZaehler(zaehler);
neueRatio.setNenner(nenner);
return neueRatio;
} //Ende string2ratio()
/**
* Methode die abfragt, ob das Programm beendet werden oder
* eine erneute Eingabe/Berechnung stattfindet soll
* @return
*/
private boolean weiter() {
System.out.println("weiter? (j/n)");
String eingabe = scan.nextLine();
if (eingabe.equals("n")) {
return true;
}
else {
return false;
}
} //Ende weiter()
/**
* Die Ausgabe-Methode stellt nach Beendigung des Programmes alles ausgeführten
* Berechnungen des Nutzers in sortierter und übersichtlicher Form dar,
* hierfür werden die gespeicherten Arrays wieder hergestellt
*/
public void ausgabe () {
System.out.println("\n-------------- berechnet wurde: -----------------\n");
for(int i=0; i<berechnungen;i++){
System.out.println("\t" + restore(i,0) + " " + restore(i,1) + " " + restore(i,2)
+ " = " + restore(i,3));
}
} //Ende ausgabe()
//Die Methode logehts()
public void losgehts(){
Ratio zahl1;
Ratio zahl2;
Ratio ergebnis = new Ratio();
do{
eingabeRatioZahl();
saveRatioZahl(ratioZahl);
eingabeRatioZahl();
saveRatioZahl(ratioZahl);
eingabeOperator();
saveOperator(op);
zahl1 = string2ratio(restore(berechnungen, 0));
zahl2 = string2ratio(restore(berechnungen, 2));
try {
switch(op){
case "+":
ergebnis = zahl1.addiere(zahl2);
System.out.println(ergebnis.toString());
break;
case "-":
ergebnis = zahl1.subtrahiere(zahl2);
System.out.println(ergebnis.toString());
break;
case "*":
ergebnis = zahl1.multipliziere(zahl2);
System.out.println(ergebnis.toString());
break;
case "/":
ergebnis = zahl1.dividiere(zahl2);
System.out.println(ergebnis.toString());
break;
default:
System.out.println("Fehlerhafte Eingabe\n");
}
}
catch(ArithmeticException ex){
System.out.println("Fehler: Division durch 0 ist nicht erlaubt!\n");
}
saveRatioZahl(ergebnis);
berechnungen++;
if (weiter()) {
break;
}
}while(true);
ausgabe();
scan.close();
} //Ende losgehts()
} //End of Class