Default Parameter

Manchmal gibt es Situationen in denen man einer Funktion immer die gleichen Parameter übergibt. So zB könnte man eine Funktion runden() haben und in 90% der Fälle auf 2 Stellen runden wollen. Dann kann man dies mit default Parametern vereinfachen. Wenn ein Parameter einen default Wert hat, muss man ihn beim Funktionsaufruf nicht mitübergeben - dann wird der default Wert genommen.

    #include<iostream>
    using namespace std;

    double runden(double, int = 2);
    int potenzieren(int, int);

    int main()
    {
      double d;
      cout<<"Bitte eine Kommazahl eingeben: ";
      cin>>d;

      int stellen;
      cout<<"Bitte Anzahl der gewuenschten Stellen eingeben: ";
      cin>>stellen;

      cout<<"Das gewuenschte Ergebnis ist "<<runden(d,stellen)<<"\n";
      cout<<"Das standard Ergebnis ist "<<runden(d)<<"\n";
    }

    double runden(double zahl, int stellen)
    {
      int mul = potenzieren(10,stellen);
      zahl*=mul;
      if(zahl>0)
        zahl+=0.5;
      else
        zahl-=0.5;
      zahl=static_cast<int>(zahl);
      zahl/=mul;
      return zahl;
    }

    int potenzieren(int basis, int exponent)
    {
      int erg=1;
      for(int i=0; i<exponent; ++i)
      {
        erg*=basis;
      }
      return erg;
    }

Du hast dich vielleicht gefragt wie runden() funktioniert. Das ist recht simpel: Wir verschieben den Dezimalpunkt erstmal nach rechts. Dadurch haben wir statt 3.14159 die Zahl 3141.59. Nun addieren wir 0.5 dazu, das ergibt 3142.09, dann die Nachkommestellen abschneiden (da int keine Nachkommastellen hat, verlieren wir durch den statci_cast alle) und den Dezimalpunkt zurück schieben. Wir haben aus 3.14159 die Zahl 3.142 gemacht. Bei negativen Zahlen müssen wir natürlich 0.5 subtrahieren.

Durch das = 2 (welches immer in der Deklaration stehen muss) sagen wir dem Compiler: hier gibt es einen default Wert. Default Parameter müssen immer in der Deklaration stehen, denn der Compiler muss ja wissen ob es default Werte gibt, wenn man die Funktion aufruft (sonst kann er ja nicht wissen, dass runden(3.1414) legal ist - da er ja noch die Anzahl der Stellen erwartet).

Man kann einem Parameter nur einen Default-Wert zuweisen, wenn er entweder der am weiten Rechteste ist, oder sein rechter Nachbar auch einen Default-Wert hat. Beim Aufruf der Funktion darf natürlich auch kein Parameter ausgelassen werden.

Tip!!Bei default Parametern und Überladung kann es zu "Mehrdeutigkeiten" kommen. void f(int); void f(int,int=0); int main() { f(3); } - welches f wird aufgerufen? Der Compiler kann nicht entscheiden und meldet einen Fehler.

Deine Aufgabe ist es eine Funktion double divide(int, int, bool) zu schreiben, welche den ersten Parameter durch den zweiten dividiert - und je nachdem ob der dritte Parameter true oder false ist, eine Division durch 0 abfängt (und dann 0 zurückgibt). Der dritte Parameter soll defaultmäßig auf true sein (also auf Division durch 0 testen)

Hier ist die Lösung

top