# Herstellungskosten, Umsatz, Reingewinn



## bsargl7. (15. Nov 2021)

Hallo,
ich habe eine Aufgabe, die ich nicht verstehe.

Ein Autokonzern investiert in die Entwicklung eines neuen Modells einen bestimmten Investitionsbetrag, hier z. B. 100 000 000 €. Für die Produktion eines Autos fallen Kosten in der Herstellung an, beispielsweise 23 500 €. Am Markt ist ein bestimmter Preis für das fertige Auto erzielbar, z. B. 24 950 €. Am Markt sind eine bestimmte Anzahl an Autos absetzbar, z. B. 10000 im ersten Jahr und in jedem Folgejahr 5 % mehr. Programmieren Sie eine Klasse Investition mit einem Konstruktor bei dem folgende Werte gesetzt sind (invest=100000000., kosten=23500., preis=24950., absatz=10000, steigerung=5.) und einem, bei dem alle Werte als Übergabeparameter übergeben werden können.

Das ist die Aufgabe. Den Konstruktor habe ich erstellt. 
Die Aufgabe in der ich Probleme habe ist: 
Schreiben Sie ein Methode void bilanzier(), die für jedes Jahr ausgeben soll wie viele Autos voraussichtlich gebaut werden, wie hoch die Herstellungskosten für alle sind, mit welchem Umsatz gerechnet wird und wie hoch der Reingewinn (Umsatz minus Herstellungskosten) in diesem Jahr und über alle Produktionsjahre ist. Die Methode soll stoppen, sobald die Gewinnzone erreicht worden ist.

Bei der Aufgabe bin ich erstmal handschriftlich vorgegangen. 
Für die gebauten Autos , habe ich so gerechnet : *Schritt 1*: absatz*kosten = Kosten für Jahr 1; *Schritt 2*: (Kosten für Jahr 1 / 100*105 ) / preis = gebaute Autos im 2 Jahr  usw.
Für die Herstellungskosten  bin ich so vorgegangen: gebaute Autos * kosten = herstellungskosten
Für den Umsatz = absatz* preis / 100*105 ( und dann für das nächste Jahr das Ergebnis /100 *105) 
reingewinn= umsatz-herstellungskosten
Die Methode habe ich bereits schon gestellt und auch daran gearbeitet, jedoch bin ich nicht weiter gekommen. (siehe Code). 

 Ist für diese Art Aufgabe eine Array notwendig?

Im code sind zwei Stellen fett makiert. 
für */preis* ist die Fehlermeldung : incompatible types: possible lossy conversation from double to int
für *+1 *lautet die Fehlermeldung: ncompatible types unexpected return value

[CODE lang="java" title="Investiton"]public class Investition
{

    private double kosten = 23500;
    private double invest = 100000000;
    private double absatz = 10000;
    private double steigerung = 5;
    private double preis = 24950;
    private int jahr;
    private double umsatz;
    private double herstellungskosten;

public void bilanzier () // gebe aus, wie viele Autos gebaut werden , Herstellungskosten, Umsatz, Reingewinn.
    {       
        int gebauteAutos =0;
        double umsatzSum =0;
        double reingewinn= 0;
        gebauteAutos= (absatz*kosten) /(100*105)*/ preis*;
        herstellungskosten=  gebauteAutos*kosten; //Materialkosten+Fertigungkosten
        umsatz= absatz*preis/ 100 *105;
        do{
            double umsatz = getUmsatzImJahr(jahr);
            System.out.println("Umsatz im Jahr " + (jahr+1) + "Jahren" + (int) umsatzSum);

        }while (umsatzSum<umsatz);
        System.out.println("Umsatz nach " + (jahr+1) + "Jahren " + (int) umsatzSum);
        return jahr *+ 1*;

        reingewinn= umsatz - herstellungskosten;

        System.out.println("AutobauAnzahl beträgt:"  +gebauteAutos   +  "Höhe der Herstellungskosten:" +herstellungskosten    + "Umsatz : " +umsatz  + "Reingewinn : " + reingewinn);
    }

    public double getUmsatzImJahr (int Jahr) {
        return umsatz*Math.pow(( absatz*preis /100 +1), jahr) ;
    }
}   // // stoppe sobald gewinnzone erreicht. ?? [/CODE]

Ich benötige aber noch Hilfe, da ich weiß, dass mein Code nicht korrekt ist.


----------



## DrPils (15. Nov 2021)

Wenn du mit double rechnest kommt als ergebniss auch ein double raus. Diesen kannst du nicht einem int zuweisen.
Deine Methode ist void, da kannst du keinen Wert returnen


----------



## bsargl7. (15. Nov 2021)

DrPils hat gesagt.:


> Wenn du mit double rechnest kommt als ergebniss auch ein double raus. Diesen kannst du nicht einem int zuweisen.
> Deine Methode ist void, da kannst du keinen Wert returnen


Ok, danke habe ich geändert.


----------



## bsargl7. (15. Nov 2021)

Wie kriege ich hin das es für jedes Jahr ausgeben soll? Zuvor sollte ich die  Gewinnschelle rechnen, das habe ich getan (ist aber nicht im obigen code dabei), deshalb denke ich, dass es 1-8 Jahre ausgeben soll.


----------



## mihe7 (15. Nov 2021)

bsargl7. hat gesagt.:


> Für die gebauten Autos , habe ich so gerechnet : *Schritt 1*: absatz*kosten = Kosten für Jahr 1; *Schritt 2*: (Kosten für Jahr 1 / 100*105 ) / preis = gebaute Autos im 2 Jahr usw.


Kannst Du mir das mal erklären?


----------



## bsargl7. (15. Nov 2021)

mihe7 hat gesagt.:


> Kannst Du mir das mal erklären?


Ich habe erstmal 10000*24950 gerechnet , das sind 249500000.(der Teil den ich im ersten Jahr erzielt habe). Dann habe ich den "Gewinn" für dieses Jahr /100 * 105 gerechnet, damit ich den "Gewinn" für das zweite Jahr habe und das habe ich dann nochmal mit dem preis geteilt, um zu schauen wie viele Autos entwickelt worden sind.


----------



## mihe7 (15. Nov 2021)

Äh, nein, Du hast erstmal absatz * kosten = 10.000 * 23.500 gerechnet, also was Du an Herstellungskosten für alle gebauten Autos im 1. Jahr hast. Dann teilst Du das durch (100*105) (BTW: was soll das sein?) und dann durch den Preis von 24.950. Wenn ich das ausrechne komme ich auf 0,89703. 

Wenn ich die Klammern bei (100*105) weglasse (also eine Steigerung von 5 % rechne), dann komme ich noch auf etwa 9889. 

Warum sollte ich im 2. Jahr weniger absetzen als im 1., wo doch der Absatz um 5 % steigen soll?


----------



## bsargl7. (15. Nov 2021)

Achso , nein ich habe mich vertan, es sollte absatz * preis sein.  Bei mir kommt dann 10500 raus. 

btw, -> beziehungsweise


----------



## mihe7 (15. Nov 2021)

Findest Du das nicht etwas kompliziert?

Ich würde folgendes rechnen:

1. Jahr: gebaute Autos = absatz
jedes weitere Jahr: gebaute Autos = gebaute Autos * 1.05 (Achtung: es gibt keine halben Autos)

Herstellkosten = gebaute Autos * kosten
Umsatz = gebaute Autos * preis
Reingewinn = Herstellkosten - Umsatz

Und dann natürlich die Summen.

EDIT: Korrektur, hatte versehentlich in den Formeln absatz statt gebaute Autos verwendet


----------



## bsargl7. (15. Nov 2021)

mihe7 hat gesagt.:


> Findest Du das nicht etwas kompliziert?
> 
> Ich würde folgendes rechnen:
> 
> ...


Bin was Mathe angeht immer kompliziert ,

Aber wie kann ich es dann für jedes Jahr ausgeben ? und es soll ja sobald es die Gewinnzone erreicht hat stoppen.?


----------



## mihe7 (15. Nov 2021)

bsargl7. hat gesagt.:


> Aber wie kann ich es dann für jedes Jahr ausgeben ?


In einer Schleife.



bsargl7. hat gesagt.:


> und es soll ja sobald es die Gewinnzone erreicht hat stoppen.?


Ja. Das wäre das Abbruchkriterium der Schleife (wiederhole, so lange Gewinnzone noch nicht erreicht...)


----------



## bsargl7. (15. Nov 2021)

mihe7 hat gesagt.:


> In einer Schleife.
> 
> 
> Ja. Das wäre das Abbruchkriterium der Schleife (wiederhole, so lange Gewinnzone noch nicht erreicht...)


Okey, danke ich versuche es mal umzusetzen.


----------



## mihe7 (15. Nov 2021)

bsargl7. hat gesagt.:


> Okey, danke ich versuche es mal umzusetzen.


Formulier es erstmal als Algorithmus. Da bist Du freier in den Formulierungen, kannst die Gedanken sortieren, die Schritte verfeinern und am Ende in Code gießen.


Als Ausgangspunkt kannst Du einfach den Aufgabentext nehmen:

```
Gib aus:
- wie viele Autos voraussichtlich gebaut werden
- wie hoch die Herstellungskosten für alle sind
- mit welchem Umsatz gerechnet wird
- wie hoch der Reingewinn (Umsatz minus Herstellungskosten) in diesem Jahr und über alle Produktionsjahre ist
- bis die Gewinnzone erreicht wurde.
```

Hinten steht "in diesem Jahr und über alle Produktionsjahre", also sollen die Werte für mehrere Jahre ausgegeben werden. Das schreit nach einer Schleife. Und die soll offensichtlich enden, wenn die Gewinnzone erreicht wurde.

Also, mal etwas umschreiben:

```
wiederhole, so lange Gewinnzone noch nicht erreicht {
    gib aus:
        - wie viele Autos voraussichtlich gebaut werden
        - wie hoch die Herstellungskosten für alle sind
        - mit welchem Umsatz gerechnet wird
        - wie hoch der Reingewinn in diesem Jahr und über alle bisher betrachteten Produktionsjahre ist
}
```
Usw.


----------



## bsargl7. (15. Nov 2021)

mihe7 hat gesagt.:


> Formulier es erstmal als Algorithmus. Da bist Du freier in den Formulierungen, kannst die Gedanken sortieren, die Schritte verfeinern und am Ende in Code gießen.
> 
> 
> Als Ausgangspunkt kannst Du einfach den Aufgabentext nehmen:
> ...





mihe7 hat gesagt.:


> Formulier es erstmal als Algorithmus. Da bist Du freier in den Formulierungen, kannst die Gedanken sortieren, die Schritte verfeinern und am Ende in Code gießen.
> 
> 
> Als Ausgangspunkt kannst Du einfach den Aufgabentext nehmen:
> ...


Ich habe es jetzt alles umgesetzt , es passt auch alles soweit so gut, danke erstmal. 

Jedoch habe ich ein Problem bei den gebautenAutos. Bei der Ausgabe kommt für jedes Jahr 
10000 raus. Es muss ja aber immer mehr werden. Wo liegt der Fehler ? 

[CODE lang="java" title="Investiton"]public void bilanzier(){ 
        gebauteAutos= absatz;
     while ( investGeld>reingewinn){

            for (int i = 0; i <absatz; i++){
                gebauteAutos +=  steigerung/100;   
            }
            jahr++;


            System.out.println("Anzahl der gebauten Autos : " +gebauteAutos);
     }
}[/CODE]


----------



## mihe7 (15. Nov 2021)

Naja, was soll denn steigerung/100 sein? Das wäre eine Angabe, die kleiner 1 wäre. Vermutlich ist steigerung ein int und damit steigerung/100 eine ganzzahlige Division und damit 0. Abgesehen davon ist natürlich die Frage, warum Du eine Zahl kleiner 1 zu den gebauten Autos addieren willst.


----------



## kneitzel (15. Nov 2021)

mihe7 hat gesagt.:


> jedes weitere Jahr: gebaute Autos = gebaute Autos * 1.05 (Achtung: es gibt keine halben Autos)


Da ist es ja schon gesagt.

Und wenn Du gebauteAutos += ... schreiben willst, dann kann man das auch umschreiben:
gebauteAutos * 1.05 = gebauteAutos + gebauteAutos * 0.05

Und dann kann man da schreiben: gebauteAutos += gebauteAutos * steigung / 100;

Das ist einfachste Mathematik - solltest Du evtl. auch noch einmal etwas aufarbeiten, denn sowas wirst Du bestimmt nicht zum letzten Mal gebraucht haben. Also so einfache Mathematische Dinge wie Dreisatz, Prozentrechnung, ...


----------



## bsargl7. (15. Nov 2021)

mihe7 hat gesagt.:


> Naja, was soll denn steigerung/100 sein? Das wäre eine Angabe, die kleiner 1 wäre. Vermutlich ist steigerung ein int und damit steigerung/100 eine ganzzahlige Division und damit 0. Abgesehen davon ist natürlich die Frage, warum Du eine Zahl kleiner 1 zu den gebauten Autos addieren willst.


zuvor hatte ich gebauteAutos= absatz/100*105; (in der Schleife ) 
und somit stand für jedes Jahr die Ausgabe 10500. 

Aber ich muss ja damit es nicht so ist, immer drauf addieren? oder nicht ? 
Deshalb habe ich in der Schleife 

gebauteAutos += steigerung/100;
ich habe es auch so versucht : gebauteAutos / 100*steigerung (da kam für den mal Zeichen eine Fehlermeldung:"not a Statement")

Und jetzt weiß ich nicht mehr weiter und weiß den richtig Ansatz nicht.


----------



## bsargl7. (15. Nov 2021)

kneitzel hat gesagt.:


> Da ist es ja schon gesagt.
> 
> Und wenn Du gebauteAutos += ... schreiben willst, dann kann man das auch umschreiben:
> gebauteAutos * 1.05 = gebauteAutos + gebauteAutos * 0.05
> ...


So hatte ich es auch in der Schleife gemacht.
jedoch kommt da eine Fehlermeldung :  incompatible types: possible lossy conversation from double to int, weil eben gebauteAutos int ist und 1.05 ein double.

Ich versuche es nochmal, aber trotzdem Danke.


----------



## kneitzel (15. Nov 2021)

Das ist eine Java Grundlage. Implicit und explicit Conversions

Wenn eine Umwandlung mit Verlusten behaftet ist, dann muss die explizit angeordnet werden. Da steigung eine Gleitkommazahl ist, ist die ganze Berechnung eine Gleitkommazahl Berechnung. Beim Umwandeln in einen int gehen die Nachkommastellen verloren. Das ist aber doch auch das, was Du willst. Also ist hier eine Umwandlung in einen int das, was Du explizit angeben musst.


----------



## mihe7 (15. Nov 2021)

Also, nochmal zur Erklärung: wenn Du zwei Ganzzahlen dividierst, führst Du eine ganzzahlige Division durch, das Ergebnis wird also wieder eine Ganzzahl sein. 5/2 ergibt nicht 2,5 sondern 2. Daher ergibt 5/100 auch 0.

Wenn Du gebauteAutos * 5 / 100 rechnest, wird das von links nach rechts ausgewertet, z. B. 10000 * 5 / 100 = 50000 / 100 = 500. Das addierst Du zu deinen gebauten Autos:

```
gebauteAutos = gebauteAutos + gebauteAutos * steigerung / 100;
// oder
gebauteAutos += gebauteAutos * steigerung / 100;
```

Durch Ausklammern in der ersten "Formel" erhält man für die rechte Seite `gebauteAutos * ( 1 + steigerung / 100)`. Das würde jetzt aber aus o. g. Gründen nicht funktionieren, da steigerung/100 zu 0 würde. 

Stattdessen muss Du mit Gleitkommazahlen rechnen: `gebauteAutos * (1+steigerung / 100.0)`. Beachte das `.0` bei 100.0, das macht aus der ganzzahligen 100 eine Gleitkommazahl 100.0 und dadurch die Division zu einer Gleitkommadivision, die als Ergebnis eine Gleitkommazahl liefert. 

Wenn steigerung == 5 gilt, stünde da letztlich `gebauteAutos * (1 + 5 / 100.0)`, was zu `gebauteAutos * 1.05` ausgewertet wird. Multiplikation mit Gleitkommazahl liefert eine ebensolche. Da der Spaß einer int-Variablen zugewiesen werden soll, musst Du casten:

```
gebauteAutos = (int)(gebauteAutos * (1 + steigerung / 100.0));
```

Nächster Punkt: die for-Schleife kannst Du Dir sparen und durch Multiplikationen ersetzen.

Nächster Punkt: das Berechnen der gebauten Autos muss am Ende der while-Schleife passieren, da die Steigerung ja erst im Folgejahr gilt.


----------



## kneitzel (15. Nov 2021)

mihe7 hat gesagt.:


> Das würde jetzt aber aus o. g. Gründen nicht funktionieren, da steigerung/100 zu 0 würde.


Nein, das ist nicht korrekt. steigerung ist schließlich:
`private double steigerung = 5;`

Dadurch wird die Berechnung eben nicht als integer Berechnung durchgeführt sondern als double.

Daher auch die Probleme mit der notwendigen expliziten Umwandlung aus #18.


----------



## mihe7 (15. Nov 2021)

kneitzel hat gesagt.:


> Nein, das ist nicht korrekt. steigerung ist schließlich:
> `private double steigerung = 5;`


Oh, übersehen.


----------

