# Herr Tupid ist Kabelverleger...



## Mr.Pink! (27. Mrz 2011)

Hallo liebe Gemeinde,

ich sitze hier an folgender Aufgabe, wo ich ein kleines Problem habe (mathematisch und evtl. von der Umsetzbarkeit in Java her), aber vorerst die Aufgabenstellung:

Herr Tupid ist Kabelverleger. Am Ende jeder Woche muss er eine Abrechnung
durchführen. Dazu gibt er seiner Firma bekannt, wie viele Meter Kabel er verlegt
und wie viele Stunden er dafür benötigt hat. Die Firma errechnet daraus die
angefallenen Kosten wie folgt: Eine Kabeltrommel hat 500 Meter Kabel und kostet
2 € pro Meter. Angefangene Kabeltrommel kosten 3 € pro Meter. Herr Tupid hat
einen Stundensatz von 50 €. Hat Herr Tupid mehr als 40 Stunden gearbeitet, so
gebührt ihm für jede Überstunde der doppelte Stundensatz. Schreiben Sie das
JAVA-Programm.

Zu meinem Problem:
Die Lohnabrechnung habe ich bereits erfolgreich fertiggestellt, allerdings hapert es bei der Materialkosten, einen Lösungsansatz habe ich aber ebenfalls bereits:
1. haben wir weniger als 500m Kabel kostet der Meter 3 €
2. Haben wir mehr als 500, 1000, 1500 usw. m Kabel, kosten die 500, 1000, 1500 usw. 2€ pro Meter und der Rest darüber 3€ pro Meter.

Ich weiss leider nicht, wie ich die 2. Überlegung mathematisch/programmtechnisch gescheit umsetzen soll, könnt ihr mir da vielleicht einen Denkanstoß geben?

Hier noch mein bisheriger Quelltext:

```
import java.util.Scanner;

public class Nr6 {
	public static void Lohnabrechnung () {
		Scanner eingabe = new Scanner (System.in);
		
		System.out.println ("Guten Tag, Herr Tupid." + "\n" + "\n" + "Bitte geben Sie die Anzahl ihrer Arbeitsstunden ein.");
		int Stundenzahl = eingabe.nextInt();
		int Lohn;
		
		if (Stundenzahl <= 40) {
		Lohn = Stundenzahl * 50;
		} else { 
		Lohn = 40 * 50 + ((Stundenzahl - 40) * 100);
		}
		
		System.out.println ("Ihr Wochenlohn beträgt: " + Lohn + " €.");
	}
	
	public static void main (String args [] ) {
		Scanner eingabe = new Scanner (System.in);
		
		System.out.println ("Herr Tupid, " + "\n" + "bitte geben Sie die Anzahl der verlegten Kabel an (Meter).");
		int Kabelmeter = eingabe.nextInt();
		int Materialkosten;
	}
}
```

Ich bin schon sehr gespannt auf eure Ansätze.

Vielen Dank und noch einen sonnigen Tag.

lG




Mr.Pink!


----------



## Ein Keks (27. Mrz 2011)

Kennst du Modulo (in java: %)? Damit kannst du denn Rest einer Division berechen.
Dann kanst du einfach folgendes machen (pseudocode):

```
anzahlKabeltrommeln = meter / 500
restmeter = meter % 500
geldFuerKabel = //das kriegste ja wohl selber hin^^
```


----------



## Mr.Pink! (28. Mrz 2011)

Hallo,

zunächst vielen Dank für deine Antwort, aber das eigentliche Problem liegt bei der Preisberechnung (bei dir: Variable GeldfuerKabel).
Bei der Berechnung der Materialkosten kommt bei mir nicht das richtige Ergebnis heraus:

```
int Kabelmeter = eingabe.nextInt();
int Materialkosten = ((Kabelmeter * 2 / 500) * Kabelmeter) + ((Kabelmeter % 500) * 3);
```

Oder hattest du das anderst gemeint mit der Berechnung?

Über eine Rückmeldung würde ich mich sehr freuen.

Vielen Dank und lG


----------



## SlaterB (28. Mrz 2011)

rechne nicht 75.000 Variablen auf einmal zusammen und wundere dich über das unerwartete Ergebnis 
sondern führe immer nur einen Wert zu einem anderen und schaue dir das Ergebnis an,

dann bedenke noch:
150/160 = 0
150/160.0 = 0.9irgendwas


----------



## Mr.Pink! (28. Mrz 2011)

SlaterB hat gesagt.:


> rechne nicht 75.000 Variablen auf einmal zusammen und wundere dich über das unerwartete Ergebnis
> sondern führe immer nur einen Wert zu einem anderen und schaue dir das Ergebnis an,



Ich habe doch lediglich zwei Variablen in der Rechnung benutzt;-)
Ich lasse mir ja auch immer wieder einen Teil der Rechnung ausgeben, damit ich Fehler nachvollziehen kann. Nur leider fehlt mir gerade der fortführende Denkansatz zu dem Ansatz mit %, weil ein Teil der Rechnung ja immer Null sein muss, wenn man entweder mehr oder weniger als eine Kabeltrommel hat...

Bitte um Hilfe.

Danke und lG


----------



## SlaterB (28. Mrz 2011)

was ist denn überhaupt deine Frage?
int Kabelmeter = irgendwas, was eingetippt wird weißt du sicherlich, hier verrätst du es nicht, Variablen übrigens besser klein schreiben,

danach rechne Kabelmeter * 2 aus, logge da, wird sicher deiner Papierrechnung nebenher entsprechen usw.

zu welcher Eingabe erwartest du welches Ergebnis, was kommt stattdessen raus, welche Zwischenschritte hast du dabei angeschaut,
was ist die Frage?


----------



## Mr.Pink! (28. Mrz 2011)

Also folgendes:

wenn ich in der oben aufgeführten Rechnung (Materialkosten = ...), 500 Kabelmeter eingebe, kommt zunächst das richtige Ergebnis heraus, nämlich 1000€.
Gebe ich 400 Meter ein, kommt man auch auf das richtige Ergebnis (1200€).
Allerdings kommt, wenn es 600 Meter sind, 1500€ statt 1300€ heraus. Dies hat etwas damit zu tun, dass ich in beiden Teilen der Rechnung nun etwas rausbekomme und eigentlich zwei verschiedene Variablen festlegen müsste, um dies zu beheben. Dies geht aber nicht, da der Benutzer ja nur einmal die verlegten Meter eingeben soll.

Deswegen meine Frage: wie kann ich dieses Problem auf eine andere Weise beheben?

Vielen Dank und lG


----------



## SlaterB (28. Mrz 2011)

die erste Hälfte lautet nicht
((Kabelmeter * 2 / 500) * Kabelmeter)

da würde Kabelmeter ja quadratisch eingehen, 10 Rollen zählen 100fach, 100 Rollen zählen 10.000fach, 
durch keinen konstanten Faktor kann das gesenkt werden,
um nicht nur zu nerven aber auch konkrete Hilfe:

stattdessen eher
((Kabelmeter * 2 / 500) * 500)
oder kürzer
(Kabelmeter / 500 * 1000) [1000 = Gesamt-Kosten für eine Rolle]
nicht die Reihenfolge umstellen, du nutzt schon den Effekt, dass / 500 auf ganze Rollen abrundet 
bzw. ((Kabelmeter * 2 / 500) * 500) wäre dann sogar noch falsch, ab 750 aufwärts ein Unterschied


----------



## Andi_CH (29. Mrz 2011)

Mr.Pink! hat gesagt.:


> Ich habe doch lediglich zwei Variablen in der Rechnung benutzt;-)



Ein kleiner Tipp:

Du hast zwar nur zwei Variablen benutzt, aber die mehrfach verwendet.

Verwende lieber mehr Variablen und rechne Zwischenresultate - es ist so wesentlich einfacher Fehler zu finden.
Du kannst mit dem Debugger oder mit Hilfe von system.output sehr schnell sehen wo Probleme sind.

z.B. so (Achtung Pseudocode!)

```
int anzahlRollen = ......;
int restMeter = .....;
int kostenRollen= anzahlRollen * rollenpreis;
int kostenRestmeter = restMeter * meterpreis;
int Materialpreis = kostenrollen + kostenRestmeter;
```

natürlich kann man das dann, wenn es dann läuft, wieder zusammenfassen, aber soooo wichtig ist das bei der Programmgrösse auch wieder nicht


----------



## Mr.Pink! (29. Mrz 2011)

SlaterB hat gesagt.:


> stattdessen eher
> ((Kabelmeter * 2 / 500) * 500)
> oder kürzer
> (Kabelmeter / 500 * 1000) [1000 = Gesamt-Kosten für eine Rolle]



Genauso habe ich am Anfang auch gedacht, nur habe ich den Gedanken verworfen, weil ich fälschlicherweise angenommen habe, dass das * 500 die /500 wieder aufhebt, aber ich profitiere trotzdem immer noch von der ganzzahligen Divison (int)...-->da lag mein Fehler;-)


----------



## Mr.Pink! (29. Mrz 2011)

Andi_CH hat gesagt.:


> Ein kleiner Tipp:
> 
> Verwende lieber mehr Variablen und rechne Zwischenresultate - es ist so wesentlich einfacher Fehler zu finden.
> Du kannst mit dem Debugger oder mit Hilfe von system.output sehr schnell sehen wo Probleme sind.
> ...



Du hast da auf jeden Fall Recht, habe das auch am Anfang so gemacht und die eine Zeile war jetzt halt die Zusammenfassung...

Danke und lG


----------

