PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Problem mit Lohnberechnung


redfalcon
2005-06-12, 12:34:15
Moin,
ich hab hier ein kleines Problemchen mit einem Programm, wass den Bruttolohn aus Arbeitsstunden und Stundenlohn von Mitarbeitern berechnen soll (Hausaufgabe). Programm funzt soweit. Wenn ich aber nur einen Mitarbeiter eingebe, und die Berechungen für die durchführe, werden die Lohnkosten insgesamt, die Durchschnittsarbeitszeit und der Durchschnitsslohn verdoppelt.
Die Durchschnittswerte werden in der Methode verarbeitung() berechnet.
Der Code:

public class brutto {
public String[] persNr = new String[10]; //Array für Personalnummern
public String[] name = new String[10]; //Array für Namen
public int[] stdlohn =new int[10]; //Array für Stundenlohn
public int[] arbstd =new int[10]; //Array für Arbeitsstunden
public int[] brutto =new int[10]; //Array für Bruttolohnsumme
public double summe; //Gesamtlohnsumme
public int pers=0; //Anzahl Personen
public double durchstd; //Durchschnittliche Arbeitsstunden
public double durchlohn; //Durchschnittlicher Lohn
public int p=0; //Hilfsvariable für While-Schleife
boolean run = true; //Boolean zum beenden der While-Schleife

//Eingabe

public void eingabe() {
while(run == true && pers < 10) {
System.out.println("Geben sie die Personalnummer ein." );
persNr[p]=StdIn.stringInput();

if(persNr[p].equals("0")){
run = false;
this.verarbeitung();
}

else{
System.out.println("Geben sie den Namen des Mitarbeiters ein." );
name[p]=StdIn.stringInput();
System.out.println("Geben sie die Arbeitsstunden des Mitarbeiters ein." );
arbstd[p]=StdIn.intInput();
System.out.println("Geben sie den Stundenlohn des Mitarbeiters ein." );
stdlohn[p]=StdIn.intInput();
brutto[p]=brutto[p]+(stdlohn[p]*arbstd[p]);
p++;
pers++;
StdIn.cls();
}
}
}

//Verarbeitung

public void verarbeitung() {
for(int durch=0;durch<pers;durch++){
durchstd=durchstd+arbstd[durch]/pers;
durchlohn=durchlohn+stdlohn[durch]/pers;
}

for(int durch=0;durch<pers;durch++){
summe=summe+brutto[durch];
}
}


//Ausgabe

public void ausgabe() {
System.out.println("PersNr.\t Name\t\t Stunden Std.Lohn Brutto");
for(int aus=0;aus<pers;aus++){
System.out.println(persNr[aus]+"\t"+name[aus]+"\t "+arbstd[aus]+"\t "+stdlohn[aus]+"\t "+brutto[aus]+"\n" );
}
System.out.println("Lohnsumme: "+summe);
System.out.println("Durchscnittslohn: " +durchlohn );
System.out.println("Durchschnittliche Arbeitsstunden: "+durchstd);
}

//Main

public static void main (String[]args) {
brutto pro = new brutto();
pro.eingabe();
pro.verarbeitung();
pro.ausgabe();

}

}

Imo liegen bei der Berechnung der Durchschnittswerte keine Fehler vor, warum werden die Durchschnittswerte bei einer Eingabe verdoppelt? Sobald ich zwei oder mehr Personen eingebe, stimmen die Durchschnittswerte wieder.

Gast
2005-06-12, 13:06:05
Warum wird Methode 'verarbeitung' zweimal aufgerufen? Einmal in 'main' und einmal in Methode 'eingabe'?

Und ein 'else' fehlt da doch auch, oder nicht?

if(persNr[p].equals("0")){
run = false;
this.verarbeitung();
} **else** {
System.out.println("Geben sie den Namen des Mitarbeiters ein." );
name[p]=StdIn.stringInput();
...


Ansonsten wird man nach der Eingabe von 0 für die Personalnummer (=Abbruch der weiteren Eingabe von Personen) nochmal aufgefordert Arbeitsstunde & -lohn einzugeben für eine zweite nicht existierende Person.

1. Eingabe
Personalnummer 4711 mit Lohn und Arbeitsstunde
2. Eingabe
Personalnummer 0 (--> Abbruch)
Lohn und Arbeitsstunden muss man aber dennoch eingeben

p und pers ist dann gleich 2 obwohl sie nur gleich 1 sein sollten.

Was mich aber wundert, ist, dass es bei mehr als einer Person funktioniert...
Naja, bin noch sehr müde - sorry, falls ich Müll schreibe.

ScottManDeath
2005-06-12, 13:12:44
public class brutto {
public String[] persNr = new String[10]; //Array für Personalnummern
public String[] name = new String[10]; //Array für Namen
public int[] stdlohn =new int[10]; //Array für Stundenlohn
public int[] arbstd =new int[10]; //Array für Arbeitsstunden
public int[] brutto =new int[10]; //Array für Bruttolohnsumme
public double summe = 0.0; //Gesamtlohnsumme
public int pers=0; //Anzahl Personen

public double durchstd = 0.0; //Durchschnittliche Arbeitsstunden
public double durchlohn = 0.0; //Durchschnittlicher Lohn


public int p=0; //Hilfsvariable für While-Schleife
boolean run = true; //Boolean zum beenden der While-Schleife

//Eingabe

public void eingabe() {
while(/*run == true && kann weg, siehe weiter unten*/pers < 10) {
System.out.println("Geben sie die Personalnummer ein." );
persNr[p]=StdIn.stringInput();

if(persNr[p].equals("0")){
run = false;
this.verarbeitung(); // verarbeitung wird doch in der main Methode aufgerufen ??
}
// Am bestene du machst das so, anstelle von deinem if(...)
if(persNr[p].equals("0"))
{
break; // bricht sie schleife ab, dadurch wir der rest nicht mehr ausgeführt, wenn du das nicht machen würdest, würde nachdem run = false der rest trotzdem noch einmal ausgeführt, du würdest immer noch einmal eingeben müssen, ist das so geplant?
// jetzt brauchst du boolean run auch nicht mehr :)
}





System.out.println("Geben sie den Namen des Mitarbeiters ein." );
name[p]=StdIn.stringInput();
System.out.println("Geben sie die Arbeitsstunden des Mitarbeiters ein." );
arbstd[p]=StdIn.intInput();
System.out.println("Geben sie den Stundenlohn des Mitarbeiters ein." );
stdlohn[p]=StdIn.intInput();
brutto[p]=brutto[p]+(stdlohn[p]*arbstd[p]);
p++;
pers++;
StdIn.cls();

}
}

//Verarbeitung

public void verarbeitung() {
for(int durch=0;durch<pers;durch++){
durchstd=durchstd+arbstd[durch]/pers;
durchlohn=durchlohn+stdlohn[durch]/pers;
}

// Diese schleife kann man auch mit der oberen verschmelzen
for(int durch=0;durch<pers;durch++){
summe=summe+brutto[durch];
}
}


//Ausgabe

public void ausgabe() {
System.out.println("PersNr.\t Name\t\t Stunden Std.Lohn Brutto");
for(int aus=0;aus<pers;aus++){
System.out.println(persNr[aus]+"\t"+name[aus]+"\t "+arbstd[aus]+"\t "+stdlohn[aus]+"\t "+brutto[aus]+"\n" );
}
System.out.println("Lohnsumme: "+summe);
System.out.println("Durchscnittslohn: " +durchlohn );
System.out.println("Durchschnittliche Arbeitsstunden: "+durchstd);
}

//Main

public static void main (String[]args) {
brutto pro = new brutto();
pro.eingabe();
pro.verarbeitung();
pro.ausgabe();

}

}


So wie ich das sehe nutzt Du die rot markierten Variablen ohne sie zu initialisieren. Dadurch stehen da zufällige Werte drinne. Du solltest sie auf 0.0 setzen.

Ach ja, ich habe nicht geprüft ob die durchschnittberechnung ok ist ;)

HellHorse
2005-06-12, 13:19:02
Imho müssen Durchshnitt und Brutto vor Neuberechnung auf 0 gesetzt werden. Zudem wäre es einfacher (und effizienter), wenn du den Durchschnitt berchnest, indem du zuerst die Summe Bildest und dann durch die Anzahl Personen teilst.

Der Code ist übrigens ein tolles Beispiel für, `C mit C++ Compiler kompilieren und schon ist es objektorientiert'.

Schon mal an eine Klasse für Personen gedacht? Schon mal daran gedacht, Arrays in die Wüste zu schicken und das Collections Framework zu nehmen (Listen und so)?.

Oder will es der Prof so?

So wie ich das sehe nutzt Du die rot markierten Variablen ohne sie zu initialisieren. Dadurch stehen da zufällige Werte drinne.
Nein, Java initialisiert das schon, machen sollte man es trotzdem.

ScottManDeath
2005-06-12, 13:24:11
Imho müssen Durchshnitt und Brutto vor Neuberechnung auf 0 gesetzt werden. Zudem wäre es einfacher (und effizienter), wenn du den Durchschnitt berchnest, indem du zuerst die Summe Bildest und dann durch die Anzahl Personen teilst.

Der Code ist übrigens ein tolles Beispiel für, `C mit C++ Compiler kompilieren und schon ist es objektorientiert'.

Schon mal an eine Klasse für Personen gedacht? Schon mal daran gedacht, Arrays in die Wüste zu schicken und das Collections Framework zu nehmen (Listen und so)?.

Oder will es der Prof so?


Nein, Java initialisiert das schon, machen sollte man es trotzdem.

Oh, interessant. Je mehr man explizit schreibt, um so weniger muss man die Details kennen und man muss anderen die die Sprache nicht fließend sprechen nicht immer alles nebenbei erzählen ;)

An Collections hatte ich auch gedacht, wollte ich nicht gleich in die Diskussion werfen.

Hehe, irgendwie hab ich schon gedacht, dass Du nach dem C-Schleifen Thread hier zu finden bist ;D

redfalcon
2005-06-12, 13:52:05
@ScottManDeath: das this.verarbeitung() ruft die andere Methode nur auf, in initialisiert wird sie in der main.


wenn du das nicht machen würdest, würde nachdem run = false der rest trotzdem noch einmal ausgeführt, du würdest immer noch einmal eingeben müssen, ist das so geplant?
Habs getestet, wenn man 0 eingibt, springt der direkt in verarbeitung(). Den Kram muss ich dann nicht mochmal eingeben.


@HellHorse:
Ne, dass soll schon mit Arrays gemacht werden, ist ja ne Übungsaufgabe dazu ;)


Imho müssen Durchshnitt und Brutto vor Neuberechnung auf 0 gesetzt werden. Zudem wäre es einfacher (und effizienter), wenn du den Durchschnitt berchnest, indem du zuerst die Summe Bildest und dann durch die Anzahl Personen teilst.

Werde ich gleich mal machen.

/edit: Geändert, aber immer noch der Fehler.

ScottManDeath
2005-06-12, 13:54:19
Was passiert dann, wenn er nach Eingabe von "0" aus verarbteitung wieder zurückehrt?

redfalcon
2005-06-12, 13:56:34
Ja, habs auch grad gemerkt, hatte irgendwie das else vergessen.