4. Übung für Programmierpraktikum


Abgabetermin: 16. Dezember 2003



Name:

Matrikelnummer: Punkte:

Die Übungen sind grundsätzlich allein zu machen. Gruppenarbeit ist nicht erlaubt. Abzugeben sind jeweils das sinnvoll dokumentierte Programmlisting mit Original-inputs und Original-outputs, falls angebracht für mehrere Testläufe mit unterschiedlichen Eingabedaten. Das Abgabeformat ist DIN A4. Heften Sie alle Unterlagen gemeinsam mit dem Übungsblatt zusammen !

Genereller Hinweis: Die Funktion pow wird in dieser Übung nicht benötigt und darf auch nicht benutzt werden.

  1. (8 P) Aus den Vektoren $\displaystyle \underline{{u}}$ : = $\displaystyle \left\{\vphantom{ \frac{1}{(i+1)^2} }\right.$$\displaystyle {\frac{{1}}{{(i+1)^2}}}$$\displaystyle \left.\vphantom{ \frac{1}{(i+1)^2} }\right\}_{{i=0}}^{{n-1}}$    und    $\displaystyle \underline{{w}}$ : = $\displaystyle \left\{\vphantom{ \sin\left(\frac{4\pi\cdot(i-1)}{n-1}\right) }\right.$sin$\displaystyle \left(\vphantom{\frac{4\pi\cdot(i-1)}{n-1}}\right.$$\displaystyle {\frac{{4\pi\cdot(i-1)}}{{n-1}}}$$\displaystyle \left.\vphantom{\frac{4\pi\cdot(i-1)}{n-1}}\right)$$\displaystyle \left.\vphantom{ \sin\left(\frac{4\pi\cdot(i-1)}{n-1}\right) }\right\}_{{i=0}}^{{n-1}}$ soll der Vektor $\displaystyle \underline{{z}}$ = $\displaystyle \left\{\vphantom{z_i}\right.$zi$\displaystyle \left.\vphantom{z_i}\right\}_{{i=0}}^{{2n-1}}$ nach der Vorschrift

    $\displaystyle \left\{\vphantom{z_i}\right.$zi$\displaystyle \left.\vphantom{z_i}\right\}_{{i \text{ ungerade}}}^{}$ : = $\displaystyle \alpha$ . $\displaystyle \underline{{u}}$ + $\displaystyle \underline{{w}}$        und        $\displaystyle \left\{\vphantom{z_i}\right.$zi$\displaystyle \left.\vphantom{z_i}\right\}_{{i \text{ gerade}}}^{}$ : = $\displaystyle \underline{{u}}$ + $\displaystyle \beta$ . $\displaystyle \underline{{w}}$

    berechnet werden. Die Berechnungen der skalaren Größen $\displaystyle \alpha$ : = $\displaystyle {\frac{{\langle \underline{u},\underline{w} \rangle}}{{\parallel \underline{u} \parallel}}}$ und $\displaystyle \beta$ : = $\displaystyle {\frac{{\langle \underline{u},\underline{w} \rangle}}{{\parallel \underline{w} \parallel}}}$ enthalten inneres Produkt $ \langle$$ \underline{{u}}$,$ \underline{{w}}$$ \rangle$ : = $ \sum\limits_{{i=0}}^{{n-1}}$ui . wi und Euklidische Norm || $ \underline{{u}}$ || : = $ \sqrt{{ \sum\limits_{i=0}^{n-1} u_i^2 }}$ . Der benötigte Speicherplatz ist dynamisch anzufordern (und zum Programmende explizit freizugeben). Greifen Sie auf die Komponenten von $ \underline{{w}}$ in der Pointernotation zu. Gestalten Sie die Berechnungen nach der Datengenerierung so, daß möglichst wenige Zählzyklen nötig sind. Geben Sie, neben $ \alpha$ und $ \beta$, für n $ \leq$ 20 alle Komponenten von $ \underline{{z}}$ aus und ansonsten die ersten und die letzten beiden Komponenten von $ \underline{{z}}$.

    Eingabedaten (n): (4), (20), (31553)
  2. (8 P) Es sind n Richtungsvektoren einzulesen, wobei deren jeweilige Komponenten (xi, yi, zi) ( i = 0,..., n) gemeinsam gespeichert werden sollen. Der Speicherplatz für das Feld soll dynamisch angefordert werden (freigeben nicht vergessen!).

    Bestimmen Sie den maximalen Winkel zwischen all diesen Richtungsvektoren ($ \neq$ 0) über

    cos$\displaystyle \measuredangle$($\displaystyle \underline{{a}}$,$\displaystyle \underline{{b}}$) : = $\displaystyle {\frac{{\langle \underline{a}, \underline{b} \rangle}}{{\parallel\underline{a}\parallel\cdot\parallel\underline{b}\parallel}}}$    mit   || $\displaystyle \underline{{a}}$ || : = $\displaystyle \sqrt{{a_x^2+a_y^2+a_z^2}}$    und  $\displaystyle \langle$$\displaystyle \underline{{a}}$,$\displaystyle \underline{{b}}$$\displaystyle \rangle$ : = axbx + ayby + azbz

    und geben Sie diesen im Gradmaß ( $ \in$ [0, 180o]) zusammen mit den entsprechenden beiden Richtungsvektoren aus. Vermeiden Sie redundante Berechnungen!

    Die Richtungsvektoren sind in den Files input.4B_1.txt und input.4B_2.txt als $ \left(\vphantom{\;n, (x,y,z)_0 , (x,y,z)_1, \ldots, (x,y,z)_{n-1} \;}\right.$  n,(x, y, z)0,(x, y, z)1,...,(x, y, z)n-1  $ \left.\vphantom{\;n, (x,y,z)_0 , (x,y,z)_1, \ldots, (x,y,z)_{n-1} \;}\right)$ gespeichert.

  3. (8 P) Deklarieren Sie eine Struktur, welche bei Kontoumsätzen die Bankleitzahl, die Kontonummer, den Zweck und den geldmäßigen Umsatz (Zahlungsverpflichtung ist eine negative Zahl) speichert. Der Zweck ist eine Zeichenkette, welche dynamisch allokiert werden soll. Diese Kontoumsätze sollen wiederum in einem dynamischen Feld zusammengefaßt werden.

    Allokieren Sie den dynamischen Speicher entsprechend der gegebenen Datensätze und deallokieren Sie diesen zum Schluß explizit. Bestimmen Sie den Kontoumsatz (einer reicht) mit der kleinsten Zahlungsverpflichtung und geben Sie diesen Datensatz aus. Geben Sie ebenfalls alle Datensätze aus, in denen die Zeichenkette ,,USI`` vorkommt. Hierzu können Sie die Funktion strstr(s,s_usi) aus strings.h nutzen, welche eine Nullpointer liefert falls der 2.String nicht im ersten enthalten ist.

    Die Eingabedaten sind in den beiden Files input.4C_1.txt, input.4C_2.txt zu finden
    (Aufruf: ./a.out < input.4C_1.txt ).
    Die Anordnung der Daten ist:
    (Anzahl Umsätze, BLZ0, Konto0, Zweck0, Umsatz0, ..., BLZn-1, ..., Umsatzn-1)



Gundolf Haase : Wed Dec 3 14:49:45 CET 2003