Präsenztestat C++ -Funktionsterme
Zu einem vom Dozenten auf einem Zettel vorgelegten mathematischen Term mit Funktionen (Wurzeln, Potenzen, trigonometrischen Funktionen) ist ein entsprechender C++ -Ausdruck zu schreiben.
Zahlen, die sich auf dem Zettel ganz links oben und ganz rechts oben befinden, sind Ordnungsmerkmale und können ignoriert werden.
Bei der Übersetzung sollen keine Terme im Kopf oder anders ausgerechnet werden. Es soll zu jedem Numeral eines Terms möglichst ein entsprechendes C++ -Numeral geben und zu jeder Funktion und zu jedem Operator des Terms möglichst eine entsprechende C++ -Funktion oder einen entsprechenden C++ -Operator. Manchmal müssen bei der Übersetzung Operatoren oder Klammern hinzugefügt oder bestimmte Konstanten oder Funktionen durch andere ersetzt werden.
Der Wert des C++ -Terms darf sich vom Wert des mathematischen Terms um nicht mehr als ein Milliardstel unterscheiden.
Folgende mathematische Funktionen und Operationen können vorkommen:
- Potenzen von Funktionswerten in mathematischer Schreibweise, wie "log² x",
- Wurzeln von Termen,
- Trigonometrische Funktionen mit Argumenten in Radiant oder in Grad (wenn keine Einheit angegeben wird, dann darf die Einheit Radiant angenommen werden),
- Die Umkehrfunktionen trigonometrischer Funktionen,
- Logarithmen zu beliebigen nichtverschwindenden reellen Basen, dabei ist "ld" der Logarithmus dualis (Logarithmus zur Basis 2) und "ln" der Logarithmus naturalis (Logarithmus zur Basis e),
- Die Exponentialfunktion "eª",
- Brüche, Grundrechenarten, Vorzeichen,
- Die Modulo-Operation "mod", Die ganzzahllige Division "div" und die Boden-Operation "⌊x⌋", welche den größten ganzzahligen Wert angibt, der kleinergleich einer reellen Zahl ist. (Hierfür kann nach "#include <cmath>" die Funktion "::std::floor" mit der Synopsis "::std::double floor( double )" verwendet werden.)
- Für die Kreiszahl π soll der Ausdruck "4. * ::std::atan2( 1., 1. )" verwendet werden.
Anleitungen zur Übersetzung dieser mathematischen Operationen in C++ -Ausdrücke werden vor der Bearbeitung der Aufgabe gegeben, auch alle Fragen dazu werden vor Beginn der Bearbeitung beantwortet.
Der Dozent zeigt vor Beginn des Testats anhand des Beispiels, wie ein mathematischer Term in einen Ausdruck umgewandelt werden kann, indem dieser hierarchisch „von oben nach unten“ oder „von unten nach oben“ übertragen wird.
Beispiel [Term]
----------------
-- / ln sin² 24
\ / ------------
\/ cos 2Beispiel [C++-Ausdruck]
sqrt
( log( sin( 24. )* sin( 24. ))
/
cos( 2. )
)Beispiel [C++-Ausdruck]
sqrt
( log( pow( sin( 24. ), 2. ))
/
cos( 2. )
)Beispiel [C++-Ausdruck]
sqrt( log( pow( sin( 24. ), 2. ))/ cos( 2. ))
Beachten Sie, daß der C++ -Ausdruck durch die Aufteilung auf mehrere Zeilen, die Einrückung und die Imitation der Bruchschreibweise durch Untereinanderschreibung von Zähler und Nenner übersichtlicher ist, als die Variante, bei der alles in eine Zeile geschrieben wurde. Solch eine übersichtliche Formatierung wird aber nicht verlangt.
Die Verwendung von unnötigen Klammerpaaren sollte vermieden werden, weil sie einen Ausdruck unübersichtlicher machen.
Zur Vereinfachung der Bearbeitung ist es bei dieser Aufgabe gestattet, die Angabe des Namensraums "::std::" wegzulassen. Das folgende Beispiel zeigt eine Schreibweise mit Angabe des Namensraums "::std::".
Beispiel [C++-Ausdruck]
::std::sqrt( ::std::log( ::std::pow( ::std::sin( 24. ), 2. ))/ ::std::cos( 2. ))
Beispiel 1 [Term]
cos 2 -------------------
-- / sin 2º
\ / -----------------
\/ ld arcsin 0,9
Der Wert des Terms von Beispiel 1 liegt bei ca. 40,7176.
Beispiel 2 [Term]
| ( 24 mod 5 )/ 3 |
'- -'
e
−15 P Für kleinere Flüchtigkeitsfehler bei der Umsetzung des Ausdrucks (Vergessen des Zeichens ".").
−15 P Falls für die Kreiszahl π nicht der oben angegebene Ausdruck sondern ein Numeral verwendet wurde.
−20 P Falls vor dem Bezeichner "main" nicht der Datentyp "int" steht.
−30 P Für Fehler bei der Umsetzung des Ausdrucks.