Herstellungskosten, Umsatz, Reingewinn

bsargl7.

Mitglied
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

Bekanntes Mitglied
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.

Mitglied
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.
 

bsargl7.

Mitglied
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

Top Contributor
Ä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?
 

mihe7

Top Contributor
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.

Mitglied
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 :)
Bin was Mathe angeht immer kompliziert :D,

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

mihe7

Top Contributor
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:
Code:
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:
Code:
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.

Mitglied
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:
Code:
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:
Code:
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
}
[/cod
[/QUOTE]

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:
Code:
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:
Code:
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.
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

Top Contributor
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.
 
K

kneitzel

Gast
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.

Mitglied
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.

Mitglied
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, ...
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.
 
K

kneitzel

Gast
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

Top Contributor
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:
Java:
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:
Java:
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.
 
K

kneitzel

Gast
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.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben