# Hilfe bei der Lösung dieser Aufgabe



## JavaNoob93 (20. Okt 2016)

Eine kleines Unternehmen zahlt den mitarbeitern eine Provision auf ihre Verkäufe zusätzlich zum gehalt. Sie erhalten 1000€/Monat plus 8% Provision auf die verkauften Artikel. Schreiben Sie ein Programm, das das Gehalt eines Monats berechnet. Die Anzahl der verkauften Artikel soll eingelesen werden

Hat jemand ne idee dazu  wäre lieb


----------



## looparda (20. Okt 2016)

Wie weit bist du gekommen? Zeige deine Ansätze.


----------



## Cromewell (20. Okt 2016)

Scheitert es jetzt am mathematischen oder an der Implementierung ?


----------



## JavaNoob93 (21. Okt 2016)

Es scheitert an der Implementierung
Mein Gedanke wäre da er eh 1000 Grundgehalt bekommt
und die Anzahl der verkauften Artikel nicht bekannt ist das ich die Anzahl der verkauften Artikel auf x setze und dann ganz einfach 9 * x +1000 davor noch 1000/100*1 um das 1% herauszufninden wie gebe ich das gescheit aus in einer Art Provisionsrechner?
Sprich Verkaufte Stückzahl ist 2   9 % Provision 2*90 Euro =180+1000 Grundgehalt = 1180 also eine simple Grundrechnung wie setze ich das jetzt in einen code um 

Vielen Dank schonmal im Vorraus


----------



## JavaNoob93 (21. Okt 2016)

```
import java.util.Scanner;

public class Main {
  
    public static void main (String[] args) {
        Scanner sc= new Scanner(System.in);
        float grundgehalt;
        float artikel;
        float gesamtgehalt;
      
        System.out.println("Was ist dein Grundgehalt? (in Euro)");
        grundgehalt = sc.nextFloat();
      
        System.out.println("Anzahl der verkauften Artikel? (in Stück)");
        artikel= sc.nextFloat();
      
        // article have position x and 180 came from 2000/100*9 provision
        gesamtgehalt = grundgehalt+ ( artikel* 180);
      
        System.out.println("Dein Gesamtgehalt beträgt"+ gesamtgehalt);
      
          
        }
          
        }
```
 
kann ich das so machen?


----------



## Cromewell (21. Okt 2016)

Ich würde es wie folgt machen:
x steht für die verkauften Artikel.
(Oben hattest du 8% Provision stehen, unten jedoch 9%?)
0.09*x*price+1000 = y = "Gesamtgehalt"
Du liest im Code nur noch die verkauften Artikel ein (und Preis, sofern du den nicht weißt) und setzt es in die Rechnung.


----------



## Dompteur (21. Okt 2016)

In der Angabe steht kaum etwas über die Artikel. Außer, dass Artikel, da in der Mehrzahl steht.
Ich würde also eine Datenstruktur anlegen, wo ich mehrere Artikel halten kann. Dort sollte jedem Artikel sein Preis zugeordnet sein.
Abhängig davon, was bereits im Unterricht besprochen worden ist, kann man das mit einem Array, einer ArrayList oder mit einer HashMap lösen.
Die Daten können fix im Programm stehen oder aus einer Datei / Datenbank ausgelesen werden.
Diesen Teil würde ich als Initialisierung bezeichnen.

Danach kommt das Einlesen der Produkte und deren verkaufte Anzahl.
Diese Einleseroutine prüft einerseits, ob das Produkt vorhanden ist und schreibt dann die Information (Produkt, Anzahl) in eine List (zB ArrayList).

Als nächstes erfolgt die Berechung.
Zuerst wird in einer Schleife über die verkauften Produkte (die Liste aus Schritt 2) der Gesamtpreis ermittelt.
Also etwa :

```
summe = 0
für i von 0 bis Anzahl Verkäufe  // hier bitte beachten, dass Java-Array-Index von 0 bis anz-1 gehr
    summe = verkauf[i].anzahl * preis(verkauf[i].produktname)
```
 
Danach berechnet man noch das Gehalt :
gehalt = summe * 0.09 + 1000


----------



## Jardcore (21. Okt 2016)

Um hier mal mit Kanonen auf Spatzen zu schießen. Und da mir irgendwie die Aufgabenstellung ziemlich wage erscheint... woher bekommt man den Artikelpreis?

Nachfolgend für Advanced User. Es wird anhand einer Liste von Artikeln die Provision berechnet. Das ganze mit modernen Java.

```
public class Gehaltsrechner {
    private static final float GRUNDGEHALT = 1000f;

    public static void main(String[] args) { 
        final Scanner scanner = new Scanner(System.in);
        final List<Artikel> listeDerArtikel = new ArrayList<>();
     
        System.out.println("Wie viele Artikel wurden verkauft?");
        int anzahlderArtikel = scanner.nextInt();
     
        for(int i = 0; i < anzahlderArtikel; i++) {
            System.out.println(String.format("Wie viel Euro hat Artikel %d gekostet?", i+1));
            listeDerArtikel.add(new Artikel(scanner.nextFloat()));
        }
     
        System.out.println(GRUNDGEHALT + new Provisionsrechner().berechne(listeDerArtikel));
     
        scanner.close();
    }
}
```


```
public class Provisionsrechner {
    private static final float PROVISION_PRO_ARTIKEL = 0.08f;

    public float berechne(List<Artikel> listeDerArtikel) {
        return listeDerArtikel.stream()
                .map(artikel -> artikel.getPreis() * PROVISION_PRO_ARTIKEL)
                .reduce((a,b) -> a + b)
                .orElse(0f);
    }
}
```


```
public class Artikel {
    private float preis;

    public Artikel(float preis) {
        this.preis = preis;
    }

    public final float getPreis() {
        return preis;
    }
}
```

Nachtrag:
Ich erkläre lieber fix noch was der komplizierte stream() Teil macht.

```
listeDerArtikel.stream() // hier wird auf der Liste ein Stream erzeugt.
                .map(artikel -> artikel.getPreis()* PROVISION_PRO_ARTIKEL) //Durch die map() Methode führt eine Operation aus und macht aus dem Artikel Stream einen Stream der ausschließlich floats enthält. 
                .reduce((a,b)-> a + b) // reduce() geht den Stream druch und in diesem Fall addiert sie alle Werte miteinander.
                .orElse(0f); // Falls kein richtiges Ergebnis rauskommt, wird stattdessen 0 zurückgegeben
```


----------



## Cromewell (21. Okt 2016)

Jardcore hat gesagt.:


> *private* *static* *final* *float* PROVISION_PRO_ARTIKEL = 0.8f;


Sollte 0.08f heißen, oder?


----------



## Jardcore (21. Okt 2016)

Cromewell hat gesagt.:


> Sollte 0.08f heißen, oder?


Danke für den Hinweis, konnte es noch korrigieren


----------

