"Besonderes" Runden
-
Hallo Leute,
ich habe schon ein bisschen gesucht, hab aber nichts brauchbares gefunden.
Weiß von Euch jmd. ob es ein paar oder eine Standartfunktion gibt um folgendes zu runden? :Bei z.B.: 72,xx soll auf 75 Gerundet werden
Bei z.B.: 76, xx soll auf 80 Gerundet werdenGibts da was oder muss ich mir das selbst zusammenbasteln?
-
Musst du selber machen.
Du solltest dir die Regeln dazu überlegen und nicht nur Beispiele.
Dann klappt es auch mit der Umsetzung.
-
Nun gut, das ist jetzt dabei rausgekommen... (Nur zum testen).
Würde die Vorgehensweise passen?int main(int argc, char *argv[]) { char buffer[10]; float input; int i_inp, last_digit; i_inp=last_digit=0; puts("Input Number : "); fgets(buffer, 10, stdin); sscanf(buffer, "%f", &input); printf("Input was : %.2f\n", input); i_inp=(int)input; printf("Input as Int : %d\n", i_inp); last_digit=i_inp%10; printf("Last Digit : %d\n", last_digit); if(last_digit < 5){ i_inp+=(5-last_digit); printf("Now : %d\n", i_inp); } else{ i_inp+=(10-last_digit); printf("Here : %d\n", i_inp); } return 0; }
-
unsure123 schrieb:
Würde die Vorgehensweise passen?
Zu deinen Beispielen? Ja.
Zu den Regeln dahinter, die du uns nicht verraten hast: Keine Ahnung.
Wenn wir aus deinen Beispielen nicht erkennen können, was die Rundungsregeln sind, können wir auch nicht beurteilen, ob der Code diese Regeln korrekt umsetzt.
-
Ach so , ja die Regel ist einfach entweder auf die nächste 5er Stelle oder auf die nächste 10er stelle zu runden.
70-74 wird zu 75
76-79 wird zu 8060-64 wird zu 65
66-69 wird zu 70
-
i_inp =((int)(input)/5+1)*5;
-
So ist´s natürlich um ein Stück eleganter.
Blöde Frage, aber wie "kommt" man auf so ne elegante Lösung?
-
unsrue123 schrieb:
Blöde Frage, aber wie "kommt" man auf so ne elegante Lösung?
Das ma jetzt grob klingen, aber das ist bloss eine einfache Anwendung dessen, was man in der Grundschule ueber Ziffernsysteme und Runden gelernt hat. Man muss bloss den Zusammenhang herstellen, dass Runden was mit Ziffern zu tun hat (kein grosser Gedankensprung) und auf die Idee kommen, dass vielleicht auch noch andere Ziffernsysteme als solche mit Basis 10 vorstellbar sind.
Dummerweise* vergessen sehr viele Leute bald nach der Grundschule, was Ziffern bedeuten und fangen an, den Wert einer Zahl und ihre Darstellung gleich zu setzen. Denkbar unguenstige Voraussetzungen, wenn man einen Computer programmieren moechte.
*: Wortwoertlich!
-
Tja, so sieht´s wohl aus.
Vielen Dank für die Hilfe, hab meine Lösung mal als Kommentar gesetzt und arbeite jetzt mit der DirkB Special Edition
-
unsure123 schrieb:
Tja, so sieht´s wohl aus.
Vielen Dank für die Hilfe, hab meine Lösung mal als Kommentar gesetzt und arbeite jetzt mit der DirkB Special EditionVielleicht ist's noch gut, den Code zu erklaeren:
((int)(input)/5+1)*5;
Zuerst passiert:
(int)(input)/5
Das heisst, wir zaehlen, wie viele 5en in input passen. Und zwar nur ganze 5en, daher wird input vorher zu einem Integer gemacht, damit eine Ganzzahldivision durchgefuehrt wird (Division ohne Rest - wie in der Grundschule
). Man koennte natuerlich auch erst input durch 5 teilen und dann in einen int umwandeln (also Nachkommateil abschneiden), das kaeme auf das Gleiche raus.
Da du immer aufrunden moechtest, wird 1 addiert:
((int)(input)/5+1)
Jetzt hat man, wie oft 5 in input rein passt und noch eines mehr. Wenn man nun wieder mit 5 multipliziert, bekommt man logischerweise genau die Zahl, in die die 5 einmal mehr rein passt als in input:
((int)(input)/5+1)*5;
Sprich: Man hat zum naechsten 5er aufgerundet.
Was mir noch auffaellt ist, dass hierbei eine Zahl, die bereits genau durch 5 teilbar ist, auch auf den naechsten 5er gerundet wird. Also z.B. 75 wird zu 80. Diesen Fall hast du selber undefiniert gelassen:
unsure123 schrieb:
70-74 wird zu 75
76-79 wird zu 80Was passiert mit 75 und 80? DirkB hat sich da etwas ausgedacht, von dem er denkt, dass es dir passt. Aber ich erwaehne es trotzdem noch mal, da dir eventuell gar nicht aufgefallen ist, dass du da etwas vergessen hast.
-
Danke für die ausführliche Erklärung. Echt spitze.
Der "Sonderfall", also z.B.: 75 wird zu 80 ist so gewollt. War bei meinem Code auch schon.Das ganze ist ne Art Gewichtstrainer/ Log Anwendung. Wenn der Benutzer z.B.: 8*75 KG bewältigt hat, darf/sollte er nächstes mal mit 8*80 weitermachen