Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

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

Selecta / 17 Antworten / Flachansicht 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 „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