Hallo liebes Forum,
ich bin mir sicher, es ist ein totaler Anfängerfehler, jedoch bin ich gerade nicht in der Lage ihn aus zu machen.
Ich habe 5 Klassen:
Und zuguter Letzt noch meine Mainklasse in der ich alle Methodenaufrufe tätigen möchte und auch ein kleines Menü erstellt habe.
In meiner Frage geht es hauptächlich um die Mainklasse. Ich benutze eine do while Schleife damit ich die Möglichkeit habe das Menü erneut anzuzeigen, wenn es der Menüpunkt verlangt.
Ich zeige euch im folgenden den Output der Console:
Meine Frage ist:
Warum wird der Println Befehl der DO-Anweisung doppelt ausgeführt, obwohl er nach einmaliger Außführung auf ein Input des Nutzers warten müsste? (choice = scan.nextLine()
Vielen lieben Dank für alle Ratschläge! Gerne auch betreffend des Programmierstils. Bin realtiv neu in der Java Welt.
PS:
Dieses Programm dient am Ende für einen Vortrag betreffend abstrakter Klassen. Dies ist ein Erweiterungsvorschlag, wesshalb die Klasse Mitarbeiter als abstrakt deklariert werden muss.
ich bin mir sicher, es ist ein totaler Anfängerfehler, jedoch bin ich gerade nicht in der Lage ihn aus zu machen.
Ich habe 5 Klassen:
Code:
abstract class Mitarbeiter {
protected String Name;
protected String Vorname;
protected String Taetigkeit;
protected int persAusweisNr;
protected int gehalt;
protected int Urlaubstage;
protected String EinstellungsDatum;
public Mitarbeiter(String Name, String Vorname,String Taetigkeit, int persAusweisNr, int gehalt, int Urlaubstage, String EinstellungsDatum){
this.Name = Name;
this.Vorname = Vorname;
this.Taetigkeit = Taetigkeit;
this.persAusweisNr = persAusweisNr;
this.gehalt = gehalt;
this.Urlaubstage = Urlaubstage;
this.EinstellungsDatum = EinstellungsDatum;
}
public abstract int gehalts_erhoehung(int x);
public abstract String whatif_mitarbeiter_feuern();
public abstract String printMitarbeiterinfo();
}
Code:
public class Koch extends Mitarbeiter{
protected String end = "___________________________________________";
public Koch(String Name, String Vorname, String Taetigkeit, int persAusweisNr, int gehalt, int Urlaubstage, String EinstellungsDatum){
super(Name, Vorname, Taetigkeit, persAusweisNr, gehalt, Urlaubstage, EinstellungsDatum);}
public String printMitarbeiterinfo(){
System.out.println(Name + ", " + Vorname);
System.out.println(Taetigkeit);
System.out.println("Personalausweisnummer: " + persAusweisNr);
System.out.println("Gehalt: " + gehalt + "€");
System.out.println("Urlaubstage: " + Urlaubstage);
System.out.println("Einstellungsdatum: " + EinstellungsDatum);
return end;}
public int gehalts_erhoehung(int x){
int gehalt_vorher = gehalt;
gehalt = gehalt + x;
System.out.println("Das Gehalt von " + Name + ", " + Vorname + " wurde von " + gehalt_vorher +"€ auf " + gehalt + "€ erhoeht!");
return gehalt;}
public String whatif_mitarbeiter_feuern(){
System.out.println("Wenn der Mitarbeiter mit der PersoNummer: " + persAusweisNr + " gefeuert wird, kann das Unternehmen " + (gehalt * 12) + "€ im Jahr sparen.");
return Name;
}
}
Code:
public class Kellner extends Koch{
public Kellner(String Name, String Vorname, String Taetigkeit, int persAusweisNr, int gehalt, int Urlaubstage, String EinstellungsDatum){
super(Name, Vorname, Taetigkeit, persAusweisNr, gehalt, Urlaubstage, EinstellungsDatum);}
}
Code:
public class Tellerwaescher extends Koch{
public Tellerwaescher(String Name, String Vorname, String Taetigkeit, int persAusweisNr, int gehalt, int Urlaubstage, String EinstellungsDatum){
super(Name, Vorname, Taetigkeit, persAusweisNr, gehalt, Urlaubstage, EinstellungsDatum);}
}
Code:
public class Barkeeper extends Koch{
public Barkeeper(String Name, String Vorname, String Taetigkeit, int persAusweisNr, int gehalt, int Urlaubstage, String EinstellungsDatum){
super(Name, Vorname, Taetigkeit, persAusweisNr, gehalt, Urlaubstage, EinstellungsDatum);}
}
Und zuguter Letzt noch meine Mainklasse in der ich alle Methodenaufrufe tätigen möchte und auch ein kleines Menü erstellt habe.
Code:
import java.util.ArrayList;
import java.util.Scanner;
public class abstract_main{
static Scanner scan = new Scanner(System.in);
static String choice = null;
static boolean weiter = true;
static ArrayList<Mitarbeiter> MitarbeiterList = new ArrayList<Mitarbeiter>();
public static void main(String[] args){
//Aussage belegen, dass von einer abstrakten Klasse keine Objekte erzeugt werden können
//Mitarbeiter m1 = new Mitarbeiter("Mueller", "Hans", "Koch", 123456, 1500, 28, "16.01.2018");
//Menu
do {
System.out.println("Choose an option: 1. Creat new employee; 2. Search employee; 3. Delete employee; 4. Exit");
choice = scan.nextLine();
switch (choice) {
case "1":
//Erstellen eines neuen Mitarbeiters
System.out.println("1. Koch; 2. Kellner; 3. Tellerwaescher; 4. Barkeeper");
choice = scan.nextLine();
switch (choice){
case "1":
System.out.println("Name eingeben:");
String name1 = scan.next();
System.out.println("Vorname eingeben:");
String vorname1 = scan.next();
System.out.println("Personal-Nummer eingeben:");
int persNr1 = scan.nextInt();
System.out.println("Gehalt eingeben:");
int gehalt1 = scan.nextInt();
System.out.println("Urlaubstage eingeben:");
int urlaub1 = scan.nextInt();
System.out.println("Einstellungsdatum eingeben: (xx.xx.xxxx)");
String datum1 = scan.next();
MitarbeiterList.add(new Koch(name1, vorname1, "Koch", persNr1, gehalt1, urlaub1, datum1));
System.out.println("Koch erstellt");
break;
case "2":
System.out.println("Name eingeben:");
String name2 = scan.next();
System.out.println("Vorname eingeben:");
String vorname2 = scan.next();
System.out.println("Personal-Nummer eingeben:");
int persNr2 = scan.nextInt();
System.out.println("Gehalt eingeben:");
int gehalt2 = scan.nextInt();
System.out.println("Urlaubstage eingeben:");
int urlaub2 = scan.nextInt();
System.out.println("Einstellungsdatum eingeben: (xx.xx.xxxx)");
String datum2 = scan.next();
MitarbeiterList.add(new Kellner(name2, vorname2, "Kellner", persNr2, gehalt2, urlaub2, datum2));
System.out.println("Kellner erstellt");
break;
case "3":
System.out.println("Name eingeben:");
String name3 = scan.next();
System.out.println("Vorname eingeben:");
String vorname3 = scan.next();
System.out.println("Personal-Nummer eingeben:");
int persNr3 = scan.nextInt();
System.out.println("Gehalt eingeben:");
int gehalt3 = scan.nextInt();
System.out.println("Urlaubstage eingeben:");
int urlaub3 = scan.nextInt();
System.out.println("Einstellungsdatum eingeben: (xx.xx.xxxx)");
String datum3 = scan.next();
MitarbeiterList.add(new Koch(name3, vorname3, "Tellerwaescher", persNr3, gehalt3, urlaub3, datum3));
System.out.println("Tellerwaescher erstellt");
break;
case "4":
System.out.println("Name eingeben:");
String name4 = scan.next();
System.out.println("Vorname eingeben:");
String vorname4 = scan.next();
System.out.println("Personal-Nummer eingeben:");
int persNr4 = scan.nextInt();
System.out.println("Gehalt eingeben:");
int gehalt4 = scan.nextInt();
System.out.println("Urlaubstage eingeben:");
int urlaub4 = scan.nextInt();
System.out.println("Einstellungsdatum eingeben: (xx.xx.xxxx)");
String datum4 = scan.next();
MitarbeiterList.add(new Koch(name4, vorname4, "Barkeeper", persNr4, gehalt4, urlaub4, datum4));
System.out.println("Barkeeper erstellt");
break;}
System.out.println("Zurueck zum Menu? (ja/nein)");
choice = scan.next();
if (choice.equals("nein")) {
System.out.println(MitarbeiterList.get(0).printMitarbeiterinfo());
scan.close();
System.exit(0);}
else if (choice.equals("ja")){
weiter = true;
break;}
else {
System.out.println("Ihre Eingabe war Fehlerhaft. Das Programm wird beendet.");
break;
}
System.out.println("Erstellen der Mitarbeiter abgeschlossen.");
case "2":
//Suchen eines Mitarbeiters
System.out.println("Mitarbeiter wird gesucht");
break;
case "3":
//Löschen eines Mitarbeiters
System.out.println("Mitarbeiter wird gelöscht");
break;
case "4":
//Vorgang beenden
System.out.println("Vorgang wird beendet");
weiter = false;
break;}
}while (weiter == true);}}
In meiner Frage geht es hauptächlich um die Mainklasse. Ich benutze eine do while Schleife damit ich die Möglichkeit habe das Menü erneut anzuzeigen, wenn es der Menüpunkt verlangt.
Ich zeige euch im folgenden den Output der Console:
Code:
Choose an option: 1. Creat new employee; 2. Search employee; 3. Delete employee; 4. Exit
1
1. Koch; 2. Kellner; 3. Tellerwaescher; 4. Barkeeper
1
Name eingeben:
test
Vorname eingeben:
test
Personal-Nummer eingeben:
123456
Gehalt eingeben:
1234
Urlaubstage eingeben:
12
Einstellungsdatum eingeben: (xx.xx.xxxx)
12.12.2012
Koch erstellt
Zurueck zum Menu? (ja/nein)
ja
Choose an option: 1. Creat new employee; 2. Search employee; 3. Delete employee; 4. Exit
Choose an option: 1. Creat new employee; 2. Search employee; 3. Delete employee; 4. Exit
4
Vorgang wird beendet
Meine Frage ist:
Warum wird der Println Befehl der DO-Anweisung doppelt ausgeführt, obwohl er nach einmaliger Außführung auf ein Input des Nutzers warten müsste? (choice = scan.nextLine()
Vielen lieben Dank für alle Ratschläge! Gerne auch betreffend des Programmierstils. Bin realtiv neu in der Java Welt.
PS:
Dieses Programm dient am Ende für einen Vortrag betreffend abstrakter Klassen. Dies ist ein Erweiterungsvorschlag, wesshalb die Klasse Mitarbeiter als abstrakt deklariert werden muss.