zurück weiter

C++

G.Eichelsdörfer - Staatliche Technikerschule Weilburg

Lösungsteile zu zü.4 Telefon-Gebührenzähler (1)

Funktion runden3()

Diese Funktion rundet eine importierte Fließkommazahl auf drei Stellen hinter dem Dezimalpunkt. Damit kann hier die berechnete Gesprächsgebühr auf Zehntel Cent gerundet werden. 1/10 Cent = 1/1000 Euro

Eine Implementation dieser Funktion kann mit unterschiedlichen Verfahren erfolgen. Es folgt nur eines dieser möglichen Verfahren.

double runden3(double Val)
{
  bool negativ = Val<0.0L;                   // 1
  if(negativ) Val = -Val;                    // 2
  Val = floor(Val*1000.0L + 0.5L)/1000.0L;   // 3
  return negativ ? -Val : Val;               // 4
}

Beschreibung der Anweisungszeilen

  1. Es wird festgestellt, ob Val (von value) negativ ist. In diesem Fall erhält die boolesche Variable negativ den Wert true, andernfalls false.

  2. Falls Val negativ ist, wird sein Vorzeichen umgekehrt. Nach dieser Anweisung ist Val immer positiv (oder Null).

  3. Hier findet die Rundung auf drei Stellen hinter dem Dezimalpunkt statt.

    1. Multiplikation mit 1000 rückt den Dezimalpunkt um 3 Stellen nach rechts.
    2. Addition von 0.5 erhöht die Einerstelle (vor dem Punkt) um 1, wenn die erste Stelle hinter dem Punkt mindestens eine 5 enthält.
    3. Die mathematische Funktion floor() (von floor=Raumboden) liefert die nächstkleinere ganze Zahl des Arguments oder den Argumentwert selbst, wenn dieser bereits ganzzahlig ist.
      floor(12.8) = 12.0 , floor(-12.8) = -13.0
      Weil hier das Argument positiv ist, bewirkt floor() das "Abschneiden" der Stellen hinter dem Punkt.
    4. Die abschließende Division durch 1000 rückt den Punkt an die alte Stelle zurück.

  4. Der gerundete Wert wird der Aufruferin als Resultat zur Verfügung gestellt.
    Hier wird ein bedingter Ausdruck verwendet. Ein bedingter Ausdruck besitzt die Struktur
    boolescher Ausdruck ? Wahrwert : Falschwert
    Wenn der boolesche Ausdruck wahr ist, wird der Wahrwert zum Wert des Ausdrucks, andernfalls wird es der Falschwert.

    Der obige bedingte Ausdruck ergibt somit -Val, wenn der Parameter ursprünglich negativ war. War der Parameter ürsprünglich positiv, ist negativ falsch. Dann ergibt der bedingte Ausdruck den Wert von Val.
    kurz: Vor der Rückkehr wird das ursprüngliche Vorzeichen des Parameters wiederhergestellt.

Anregungen

Versuchen Sie einmal, diese Funktion ohne den bedingten Ausdruck zu implementieren!

Ein anderes Verfahren wechselt nicht das Vorzeichen des Parameters. Stattdessen können die mathematischen Funktionen floor() (s.o.) und ceil() verwendet werden.
ceil() (von ceiling=Raumdecke) liefert die nächstgrößere ganze Zahl des Arguments oder den Argumentwert selbst, wenn dieser bereits ganzzahlig ist. ceil(-12.2)liefert den Wert -12.0.