Präsenztestat Definition einer Funktion in C++
Bei dieser Aufgabe ist es wichtig, den Unterschied zwischen Rückgabe und Ausgabe zu verstehen und die Aufgabenstellung genau zu beachten. Es ist bei dieser Aufgabe genauso falsch, etwas zu machen, das so nicht verlangt war, wie etwas nicht zu machen, das verlangt war.
Der Dozent wird Ihnen jeweils eine individuelle Aufgabe zur Definition einer Funktion stellen.
Dabei kommen zwei Typen von Funktionen vor: reine Wertfunktionen und reine Wirkfunktionen.
Eine reine Wirkfunktion hat eine Wirkung und gibt keinen Wert zurück.
Eine reine Wertfunktion gibt einen Wert als Ergebnis zurück und hat keine Wirkung.
Ein Spezialfall einer reinen Wertfunktion ist eine reine Abbildungsfunktion, bei der der zurückgegebene Wert für die gleichen Argumentwerte immer wieder der gleiche ist.
In der Aufgabenstellung wird bei einer reinen Wertfunktion der Datentyp des Ergebnisses mitgeteilt. Gegebenenfalls wird der Typ der Parameter der Funktion mitgeteilt. Es wird geschildert, welches Verhalten die Funktion zeigen soll, also ob sie einen Wert oder eine Wirkung haben soll, und wovon der Wert bzw. die Wirkung abhängen soll.
Alle Parameter, für die dies nach der Aufgabenstellung möglich ist, müssen mit dem Schlüsselwort "const" gekennzeichnet werden.
Beispielsweise könnte der Dozent Ihnen folgende Aufgabe stellen:
Schreiben Sie eine Definition einer reinen Abbildungsfunktion, mit einem Ergebnis vom Datentyp "int" und einem Parameter vom Datentyp "int". Das Ergebnis soll für Parameterwerte zwischen 0 und 16383 das Doppelte des Parameters sein.
Eine mögliche richtige Lösung wäre die Definition der Funktion "doppel".
doppel [Funktionsdefinition]
int doppel( int const i ){ return i + i; }
(Für Parameterwerte, bei denen C++ nicht mehr die mathematisch richtigen Ergebnisse liefert, weil sie außerhalb des Bereichs liegen, für den die richtigen Ergebnisse mit C++ ohne weiteres (bei Verwendung der in den Aufgabenstellungen vorgegebenen Datentypen) berechnet werden können, brauchen keine besonderen Vorkehrungen getroffen werden. Die obigen Aufgabenstellung soll diesbezüglich also nur klarstellen, daß nicht verlangt wird, daß die Summe für andere Parameterwerte berechnet wird. Auch wenn dies in einer Aufgabe nicht so steht, gilt es sinngemäß immer. Ist also die Summe zweier Zahlen zu berechnen, so braucht diese nur für Zahlen hinreichend kleinen Betrags mit der normalen Summe übereinzustimmen, da C++ bei größeren Zahlen nicht mehr ohne weiteres die richtige Summe berechnen kann.)
Falls eine solche Aufgabenstellung vorgelegt wird, darf die Funktion keine Wirkung haben. Insbesondere darf sie nichts ausgeben, wohl aber soll sie etwas zurückgeben.
Der Dozent könnte Ihnen aber auch folgende Aufgabe stellen:
Schreiben Sie eine Definition einer reinen Wirkfunktion mit einem Parameter vom Typ "int", die für Parameterwerte zwischen 0 und 16383 eine dezimale Darstellung des Doppelten des Parameterwertes auf den Ausgabestrom "::std::cout" ausgibt.
Falls eine solche Aufgabenstellung vorgelegt wird, darf die Funktion keinen Wert zurückgeben.
Eine mögliche richtige Lösung wäre die Definition der Funktion "doppelausgabe".
doppelausgabe [Funktionsdefinition]
void doppelausgabe( int const i ){ ::std::cout << i + i; }
Vorkommen können der Datentyp "int", der Datentyp "double" und der Datentyp "bool".
Vorkommen können auch Aufgabenstellungen aus den folgenden Themenbereichen:
- Die Identität (identische Abbildung) verschiedener Datentypen;
- konstante Abbildungen (mit[!] und ohne Parameter);
- Einfache Abbildungen (z.B. Berechnung einer Summe von Parametern);
- Der Kehrwert;
- Berechnung des Mittelwerts mehrerer Parameter (z.B. von drei Parametern);
- Berechnung einer Mehrwertsteuer (von einem Nettobetrag);
- Prädikate (z.B. Berechnung des Wahrheitswerts der Aussage, daß ein Parameter positiv ist oder daß ein Parameter durch eine bestimmte Zahl teilbar ist),
- Umrechnen zwischen Grad und Radiant;
- Umwandlung des Typs eines numerischen Parameters;
- Treppenfunktionen (mit Fallunterscheidungen)
- Prozentrechnung (z.B. eine Funktion, die einen bestimmten prozentualen Anteil des Argumentwertes zurückgibt);
- Bruchrechnung (z.B. eine Funktion, die zwei Drittel ihres Argumentwertes zurückgibt);
- Adapterfunktionen/Hüllfunktionen (z.B. Berechnung des Sinus' einer Winkelangabe in Grad oder eine allgemeine Wurzelfunktion)
- Ausgabe von dezimalen Wertdarstellungen, von Texten und von Zeilenenden auf den Ausgabestrom "::std::cout".
- Runden auf eine bestimmte Zahl von Nachkommastellen
- Berechnung einer Kreisfläche oder eines Kreisumfangs anhand eines Kreisradius
Fragen zu diesen Themenbereichen können vor Beginn des Testats geklärt werden.
Als Ergebnis muß in einem Editorfenster oder auf einem Blatt Papier nur die Funktionsdefinition stehen (nichts anderes, insbesondere kein vollständiges Programm). Lesen Sie die Festlegung der Punktabzüge für häufig vorkommende Fehler sorgfältig vor Beginn des Testats und vermeiden Sie diese Punkteabzüge, besonders natürlich die hohen Punkteabzüge.
Bearbeitungszeit: maximal 6 Minuten.
Punkteabzüge
−0 P Wenn auf einem Blatt Papier oder in einem Editorfenster nichts anderes steht als die verlangte Funktionsdefinition (und eventuelle C++ -Kommentare).
−10 P Wenn die Funktionsdefinition unnötige Bestandteile enthält.
−10 P Falls ein Parameter, der mit dem Schlüsselwort "const" gekennzeichnet werden könnte, nicht damit gekennzeichnet wird.
−20 P Für jeden falschen Datentyp.
−20 P Für jedes ausgegebene Zeilenende, dessen Ausgabe nicht verlangt war.
−20 P Für jedes ausgegebene druckbare Zeichen, dessen Ausgabe nicht verlangt war. Für jedes nicht ausgegebene druckbare Zeichen, dessen Ausgabe verlangt war. Für jedes falsch ausgegebene Zeichen, das anstelle eines anderen auszugebenden Zeichens ausgegeben wird.
−30 P Wenn vor oder nach der Funktionsdefinition noch irgendetwas anderes steht (außer C++ -Kommentaren).
−30 P Wenn es nicht nur eine Rückgabeanweisung am Ende des Blocks (Rumpfes) der Funktion gibt. (Also bei mehreren Rückgabeanweisungen oder bei Rückgabeanweisungen, die nicht am Ende des Funktionsrumpfs stehen.
−40 P Falls ein Fehler in Zusammenhang damit auftritt, daß mehrere Parameter vorkommen sollen und diese nicht richtig notiert werden (beispielsweise, wenn die Parameter nicht richtig voneinander getrennt werden).
−40 P Wenn ein angegebener Rückgabetyp nicht mit einer verwendeten oder nicht verwendeten Rückgabeanweisung verträglich ist.
−50 P Wenn statt der Funktionsdefinition ein vollständiges Programm vorgelegt wird (also eine Übersetzungseinheit, in der auch eine Funktion "main" definiert wird).
−50 P Wenn das Funktionsergebnis falsch berechnet wird, aber der Aufbau (Kopf und Rumpf) der Funktion noch richtig ist.
−70 P Falls eine Funktion, die nur einen Wert zurückgeben soll, irgendetwas ausgibt (Ausgabeoperatoren oder Ausgabefunktionsaufrufe enthält) oder eine andere Wirkung hat (wenn dies nicht verlangt war).
−70 P Falls eine Funktion, die nur etwas ausgeben soll, einen Wert zurückgibt (wenn dies nicht verlangt war).
−100 P Wenn die Funktion nicht wie verlangt definiert wurde und das vorgelegte Ergebnis auch keine gute Annäherung an ein richtiges Ergebnis mehr darstellt, weil gleich mehrere Fehler darin vorkommen.
Falls ein Fehler gemacht wurde, der in der obenstehenden Liste nicht vorkommt, so legt der Dozent einen Punkteabzug nach billigem Ermessen fest. Derart festgelegte Punkteabzüge werden alsdann in die obige Liste eingetragen, damit andere Studenten im Wiederholungsfall den gleichen Punkteabzug erhalten.