Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Frage zu einer Brechnung (Noob Frage, C++)

Selecta / 17 Antworten / Baumansicht Nickles

Habe mit (Borland C++ Builder 5.0 prof.) folgenden Code geschrieben.
Die Aufgabe war: Ein Bus nimmt pro Person 0.10 Euro und pro gefahrenen Kilometer nochmals 0.10 Euro. Eine Person (Der Leiter) zahlt nur die Hälfte, jede 10. Person fährt Gratis.
Meine Hauptfrage: Wie berechne ich den Gratisbetrag ? Personen / 10 geht ja nicht, da da ein Rest uebrig bleibt, etwa (15/10 = 1.5) und das wäre mehr Freibetrag als es eigentlich sein soll.


#include <iostream>
#include <iomanip>
#include <conio.h>
#include <windows.h>


void main()
{


float person, cost = 0.10, distance, chief, free; // chief soll der Leiter sein, free der Freipreis
cout << "Geben sie die Anzahl der Personen ein: ";
cin >> person;


if (person < 10);   // Dachte ich mach mal mit if, hilft mir nicht, da ich die Berechnung nicht kann, außer person ist < als 10, da die Rechnung wegfiele...
{
cout << endl << "Geben (A) sie die Laenge der Strecke ein: ";
cin >> distance;
cout << endl << "Die Gesamtkosten belaufen sich auf: " <<
((person + distance) * cost) - (cost * 0.5) << " Euro" ;   // Personen und Entfernung * 0.10 und dann fuer eine Person (den leiter) die Haelfte des Peises abziehen
getch();
}


if (person > 10);
{
cout << "Geben (B) sie die Laenge der Strecke ein: ";
cin >> distance;
cout << setprecision(2);
cout << endl << "Die Gesamtkosten belaufen sich auf: " <<
((person * distance) * cost) - (cost * 0.5) - (           ) // so hier weiss ich nicht, was ich da jetzt abziehen soll ... 2 frage; wenn ich nun am anfang mehr als 10 eingebe, kommt trozdem der if < 10 Block ! Warum das?
getch();
}


getch();
}


 


Hoffe ihr versteht mein Problem ... Is bestimmt ganz simpel ... Aber halt schwer zu erklären

GreeTz Selecta

bei Antwort benachrichtigen
mr.escape Selecta „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Wenn es n personen gibt, dann können also n/10 personen gratis reisen. Da aber nichtganze personen zerstückelt und somit tot und damit nicht reisefähig sind darf nur das abgerundete ergebnis verwendet werden also floor(n/10). Bei 15 personen also 1.5 abgerundet und damit eben einer alleine.
Die formel lautet somit:
summe=(person-0.5-floor(n/10))*(1+distance)*cost;

In der ersten klammer ist die anzahl der zahlungspflichtigen personen und in der zweiten der fest- und der kilometeranteil.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Selecta mr.escape „Wenn es n personen gibt, dann können also n/10 personen gratis reisen. Da aber...“
Optionen

Die Stelle "person-0.5-floor" sieht für mich so aus, als hast du das extra nur für den Fall von 15 personen ausgelegt. Die personen erfoglen aber über eine Benutzerangabe ! Oder was hat das 0.5 zu bedeuten ? Falls ich recht habe, ich brauche:
Eine Lösung, die jede Zahl unter einer Ganzen abrundet (also 1.99 auf 1, 1.33 auf 1 usw.)
Falls nicht, erklär mir die verwendeten ausdrücke nochmal, denn das "0.5 von den Personen abziehen verstehe ich nicht so ganz.

bei Antwort benachrichtigen
mr.escape Selecta „Die Stelle person-0.5-floor sieht für mich so aus, als hast du das extra nur...“
Optionen
Eine Lösung, die jede Zahl unter einer Ganzen abrundet (also 1.99 auf 1, 1.33 auf 1 usw.)
double floor(double x); ist die funktion, die abrundet (double ceil(double x); rundet hingegen auf).
float floorf(float x); und float ceilf(float x); sind die varianten für float zahlen, gehören aber nicht zur norm und könnten daher fehlen.

Wenn der compiler nervt ("conversion from 'double' to 'float', possible loss of data") dann einfach ein (float) davor setzen "(float)floor(person/10.0)"
Die formel wird dann zu:
summe=(person-0.5-(float)floor(person/10.0))*(1+distance)*cost;

Wenn nur ganzzahlen im spiel sind geht auch die normale division, die betragsmässig abrundet (zur null hin). Die formel wird dann zu:
summe=(person-0.5-person/10)*(1+distance)*cost;
Wegen der 0.5 ist aber nicht glasklar (kann man bestimmt irgendwo nachlesen) wann der compiler das format ändert (die ganzzahlen zu float) und deshalb ist die klare anweisung mit klammern etc. sinnvoll.

Zur formel:
person ist die anzahl aller personen (inkl. leiter und "gratispersonen")

-0.5 ist der abzug für die 50% rabatt für den leiter (gilt als halbe person)

-floor(person/10) ist der abzug für die "gratispersonen" (muss natürlich person statt n heissen!)

Es gibt keine fallunterscheidung, die formel ist für person>0 gültig wobei eine person immer der leiter ist (d.h. bei person==1 leitet er sich selbst).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
BIMEX Selecta „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Hab´ keine Ahnung, ob es unter C++ eine Wenn/Dann Funktion gibt (wenn WERT > X dann Formel Y sont Formel Z) gibt, denke wohl ja, dann könnte man über komplexe Formelwerte an die Lösung kommen.

Ist aber vielleicht auch folgender Denkanstoss hilfreich ? Es handelt sich bei dem genannten Ansatz um ein Lösungergebnis aus gerundeter Multiplikation von Faktoren. Es müsste nun der sogenannte "kleinste gemeinsame ganzzahlige Nenner" herausgefunden werden.

Beispiel:

100 Plätze pro Bus
10 Euro cent pro Person
10 Euro cent pro km
5 Euro cent pro Leiter
5 Euro cent pro Leiter und km
0 Euro cent für jeden 10 Fahrgast
0 Euro cent für jeden km des 10 Fahrgasts

M.E. ist 5 der kleinste gemeinsame ganzzahlige Nenner, passt 1 mal in Bezug auf den Leiter und seine Leiter/km, passt 2 mal pro Person und Person/km, passt 50 mal in Bezug auf die zur Verfügung stehenden Busplätze und passt 0 mal in Bezug auf jeden 10 Fahrgast, passt 10 mal pro max. Busplätze usw.

Die Zahl 5 ist allen ganzzahlig gemeinsam und sollte in der Berechnungsformel als verbindendes Element zur Erreichung des Endergebnisses zugrunde liegen.

Nur so eine Idee für einen möglichen Formelansatzpunkt ...



bei Antwort benachrichtigen
mr.escape BIMEX „Hab keine Ahnung, ob es unter C eine Wenn/Dann Funktion gibt wenn WERT X dann...“
Optionen
Es handelt sich bei dem genannten Ansatz um ein Lösungergebnis aus gerundeter Multiplikation von Faktoren.
Aha.

Es müsste nun der sogenannte "kleinste gemeinsame ganzzahlige Nenner" herausgefunden werden.
Hmmm, ggT und kgV kenne ich, aber dieses monster ist mir neu!
Sorry, für solche gedankengänge ist mein gehirn wohl nicht komplex genug! ;)

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
BIMEX Selecta „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Mr. Escape - Esq.

Normalerweise denke ich nur rein digital, meine in O oder 1, Ja oder Nein, An oder Aus, komme daher gut mit Computern und Programmen zurecht, kenne mich aber mit Kürzeln wie ggT kgV gar nicht aus, übersteigt mein Fassungsvermögen.

Somit Versuch in Worten, mein Monster zu erklären:

Wenn 50 Fünftel pro Person und km zu zahlen sind, der Leiter für 25 Fünftel und pro km mitfährt, 0 Fünftel ab 50 Fünfteln Teilnehmern umsonst fahren, usw., dann sprechen wir über ganzzahlige gemeinsame Fünftel, mit denen man, so weiss ich noch aus der Schule, irgendwie rechnen kann.

GreeTx - Der Fünftel Monster Maker

bei Antwort benachrichtigen
mr.escape BIMEX „Mr. Escape - Esq. Normalerweise denke ich nur rein digital, meine in O oder 1,...“
Optionen
... kenne mich aber mit Kürzeln wie ggT kgV gar nicht aus, übersteigt mein Fassungsvermögen.
http://www.google.de/search?hl=de&ie=UTF-8&q=ggT+kgV&btnG=Google-Suche&meta=

Wenn 50 Fünftel pro Person und km zu zahlen sind, der Leiter für 25 Fünftel und pro km mitfährt, 0 Fünftel ab 50 Fünfteln Teilnehmern umsonst fahren, usw., dann sprechen wir über ganzzahlige gemeinsame Fünftel, mit denen man, so weiss ich noch aus der Schule, irgendwie rechnen kann.
Und wenn sich der fixpreis z.b. auf 0,69Euro und die km-pauschale auf 0,23Euro ändern? Dann ist nix mehr mit fünften o.ä.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
BIMEX Selecta „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Mr. Escape - Esq.

Normalerweise denke ich nur rein digital, meine in O oder 1, Ja oder Nein, An oder Aus, komme daher gut mit Computern und Programmen zurecht, kenne mich aber mit Kürzeln wie ggT kgV gar nicht aus, übersteigt mein Fassungsvermögen.

Somit Versuch in Worten, mein Monster zu erklären:

Wenn 50 Fünftel pro Person und km zu zahlen sind, der Leiter für 25 Fünftel und pro km mitfährt, 0 Fünftel ab 50 Fünfteln Teilnehmern umsonst fahren, usw., dann sprechen wir über ganzzahlige gemeinsame Fünftel, mit denen man, so weiss ich noch aus der Schule, irgendwie rechnen kann.

GreeTx - Der Fünftel Monster Maker

bei Antwort benachrichtigen
BIMEX Selecta „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Mr. Escape - Esq.

mal ´ne andere MONSTER Frage, die auch durch ein nicht so komplexes Gehirn zur Beantwortung kommen könnte:

Wenn ich ein BUY/SELL Advertising Programm habe, dass in exakt 5 Minuten in 66 namhafte Handelsportale um den Globus (habe dafür ´ne extra Webseite als Werbung laufen) Verkaufs-und Service-Anzeigen vollautomatisch in einem Stück absetzt und dem YOPER Guru in Neuseeland diesen Power Booster zwecks Vermarktung seines Systems samt installierten Gnucash auf Rechnersystem zwecks ROBOTED MARKETING PUSH auf "free of charge" and "just for fun" kollegial anbiete (wie geschehen, um die Bettelei um Hardware und Donations auf der YOPER Webseite zu elminieren, wirkt lächerlich, wenn einer mit dem schnellsten "out of the box" Linux System wirbt und dann Begriffsvermögen für Geschwindigkeit besitzt) und als Antwort nichts anderes als Blödsinn vom Guru höre, bin ich da etwa schon zu digital in meiner Denke (MONSTER???).

GreeTX - The Fünftel Monster Maker

bei Antwort benachrichtigen
mr.escape BIMEX „Mr. Escape - Esq. mal ne andere MONSTER Frage, die auch durch ein nicht so...“
Optionen

Was immer du damit sagen oder fragen willst, ich bin wohl erst in vielen jahren soweit, um zumindest die ansätze zu verstehen. Aber dann kann ich vielleicht ein wenig helfen! ;)

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Selecta Nachtrag zu: „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Danke an alle, das Problem hat sich mit floor geloest.
Allerdings verstehe ich folgenden nicht:

Die Formel lautet: (((distance + person) * cost) - (floor(person/10) - 0.05)

Nach der Ausgabe der gesamtkosten sollen wir aber noch die mittleren Durchschnittskosten ausgeben.

Wenn ich aber mache:

float durchschnitt;
durchschnitt = (((distance + person) * cost) - (floor(person/10) - 0.05)
cout
Eigentlich sollte da doch logischerweise der Gesamtpreis durch die Anzahl der Personen geteilt werden, aber ich bekomme immer mehr raus, als die Gesamtkosten ! Warum ? Wie kann ich das noch machen ?

GreeTz Selecta

bei Antwort benachrichtigen
mr.escape Selecta „Danke an alle, das Problem hat sich mit floor geloest. Allerdings verstehe ich...“
Optionen
Die Formel lautet: (((distance + person) * cost) - (floor(person/10) - 0.05)
????
Die umstellungen in dieser formel machen aber das verstehen relativ kompliziert. Speziell die 0.05 scheinen kaum erklärbar. Da die ursprüngliche aufgabenstellung wohl aus irgend einem lehrbetrieb kommt sollte auf klarheit geachtet werden. Später macht man ja noch genug falsch! ;)

Nachvollziehbarer und auch flexibler ist doch dieser ansatz:
float summe, fixcost=0.1, distance, kmcost=0.1, durchschnitt;
int person;
//hier eingabe der werte person, distance und evtl. auch fixcost und kmcost
summe=(person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost);
durchschnitt=summe/person;

In der ersten klammer befindet sich die netto-anzahl der personen (brutto-anzahl minus 50% rabatt für den leiter minus freifahrerrabatt) und in der zweiten die kosten pro vollperson. Der durchschnittspreis erklärt sich dann selbst.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Selecta Nachtrag zu: „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Wie berechne ich nun den Gesampreis ???
So kommt seltsamerweise was falsches raus:

((person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost) / person)

Und so auch nicht:

gesamt = =(person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost)
cout
Warum funktioniert das nicht ? Diese Rechnung ist doch der Gesamtpreis geteilt die Anzahl der Personen ... Und die " / person" ist soch so ausgeklammert, das der ganze Term dadurch geteilt wird. Hilfe!

GreeTz Selecta

bei Antwort benachrichtigen
mr.escape Selecta „Wie berechne ich nun den Gesampreis ??? So kommt seltsamerweise was falsches...“
Optionen
((person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost) / person)
Diese formel sieht korrekt aus, die äußere klammer ist aber überflüssig. Ggf. könnte man, um sicher zu gehen, den preis klammern und die personen explizit als float ausweisen:
durchschnitt =((person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost)) / (float)person;

gesamt = =(person-0.5-(float)floor(person/10.0))*(fixcost+distance*kmcost)
Dieser ausdruck ist ein vergleich und somit überhaupt nicht das gewünschte.

Wenn in einem programm nicht das raus kommt, was raus kommen soll, bemüht man den debugger. Selbst ohne debugger helfen einfache testausgabe von zwischenergebnissen um die fehlfunktion einzugrenzen. Man gibt sich bestimmte testgrößen vor (besonders an interessanten stellen), rechnet die sollwerte manuell aus und vergleicht die testausgaben.
Z.b. (nach der abfrage der daten):
cout cout cout
Man kann teilergebnisse auch in eigene variablen reinpacken, das macht die berechnung übersichtlicher und das debuggen einfacher.
Also z.b.:
nettopersonen=(person-0.5-(float)floor(person/10.0));
gesamt=nettopersonen*(fixcost+distance*kmcost);
durchschnitt =gesamt/(float)person;

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Selecta Nachtrag zu: „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Das mit " = = " war nur ein Schreibfehler. Aber an sich war es doch nicht falsch, wa sich vorhatte ? Der Gesamtpreis war auch Korrekt und durch die Anzahl der Personen müsste doch was gescheites rauskommen. Durch die Klammern ist sichergestellt das Person als letztes geteilt wird, bzw. durch die Zuweisung. Werde deinen Tip mal probieren.

Aber was zum Teufel bedeutet diese (float) denn genau ? Bin Anfänger und das sagt mir nix.

GreeTz Selecta

bei Antwort benachrichtigen
mr.escape Selecta „Das mit war nur ein Schreibfehler. Aber an sich war es doch nicht falsch, wa...“
Optionen
Aber was zum Teufel bedeutet diese (float) denn genau ?
Das nennt sich "type casting" und sorgt dafür dass der kompiler ganz sicher die richtigen befehle verwendet bzw. lästige warnungen unterlässt (z.b. warnung vor datenverlust bei gewollter verwendung des ganzzahligen teils einer float-variablen in einer int-variablen).
In diesem fall soll es dafür sorgen, dass die ganzzahlvariable (int) in eine fließkommavariable (float) umgewandelt und z.b. die anschliessende division in der FPU stattfindet. Diese art der umwandlung führt der kompiler normaler weise recht zuverlässig selbst durch, wenn man aber ganz sicher gehen will kann man damit für klarheit sorgen.
Das gleiche gilt auch für das setzen der klammern. Punkt vor strich ist relativ klar, aber es gibt noch eine reihe anderer operatoren, deren priorität irgendwo dokumentiert, aber nicht unbedingt jedem geläufig ist. Ist man sich nicht sicher, klammern hilft!

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Selecta Nachtrag zu: „Frage zu einer Brechnung (Noob Frage, C++)“
Optionen

Ok danke euch, die Aufabe wurde erfolgreich ausgeführt.

GreeTz Selecta

bei Antwort benachrichtigen