Lösungen zur 2. Übung
Bearbeitung vom 1.11.06 - 7.11.06
Aufgabe 2: Fehlersuche
Das Listing in celsiusCorr.cc zeigt das Original, der Unterschied ist in celsiusDiff.txt aufgelisted. Da auch in einer Formel eine Klammer vergessen wurde, läuft das fertig compilierte Programm immer noch fehlerhaft.
Aufgabe 3: Datentypen
Die Größe der Datentypen kann man mit der Methode sizeof( ) untersuchen (siehe Tutorial). Das Programm ist in datentypen.ccgelistet, der Output in datentypen.out. Zu meiner eigenen Überraschung sind int und long int gleich groß, nämlich 4 Bytes.
Aufgabe 4: Prioritäten
Diese Aufgabe soll darauf hinweisen, daß in C das logische true die 1 ist und das logische false die 0 ist. Dann ist also:
x&&y = 1 && 0 = 0
x||y = 1 || 0 = 1
!(x&&y) = !(0) = 1
!x&&y = (!x) && y = 0 && 0 = 0
x>y&&y==1 = (x>y) && (y==1) = 1 && 1 = 1
x<y||!y = (x<y) || (!y) = 0 || 1 = 1
Aufgabe 5: for und while Loops Man kann fast immer while Loops in for Loops umschreiben. Hier einfach
for (int i = 0: i < max_length; i++) {
   cin >> ch;
   if(ch == '?') quest_count++;
}
Aufgabe 6: Diskretisierungsalgorithmen
a) Mit $z = (1/2) g t^{2}$ und $t + z/v_{s} = T$ erhalten wir

\begin{displaymath}
z^{2} -2z \left( v_{s} T + \frac{v_{s}^{2}}{g} \right) + v_{s}^{2} T^{2} = 0
\end{displaymath}

Bei der Lösung dieser quadratischen Gleichung kann es dazu führen, daß man zwei große Zahlen subtrahiert und daraus die Wurzel zieht. Im allgemeinen ist es daher besser, zunächst die Gleichung für die skalierte Größe $z' = z/(v_{s} T)$ zu lösen:

\begin{displaymath}
z'^{2} - 2 z' \left( 1 + \frac{v_{s}}{g T} \right) + 1 = 0
\end{displaymath}

Mit $p = - 2 ( 1 + v_{s}/(g T) )$ und $q = 1$ erhalten wir

\begin{displaymath}
z' = - \frac{p}{2} \pm \sqrt{p^{2}/4 -q}
\end{displaymath}

und $z = v_{s} T z'$.
b) Die Diskretisierung realisieren wir mit einer do - while Schleife. Das Programm ist in well1.ccgelistet.
Aufgabe 7: Sortieren
Zunächst erweitern wir das Programm mit der Berechnung der Skewness:

\begin{displaymath}
\gamma = \frac{1}{\sigma^{3} (N-2)} \sum (x_{i} - \overline{x})^{3}
\end{displaymath}

Wir rechnen aus:

\begin{displaymath}
\frac{1}{N-2} \sum(x_{i} - \overline{x})^{3}
= \frac{1}{N-2}...
...line{x}^{2}}{N-2} \sum x_{i} - \frac{N}{N-2} \overline{x}^{3}.
\end{displaymath}

Das Programm ist in mean1.cc gelisted. Der hier gezeigte Sortieralgorithmus ist eine sehr einfache Version des QuickSort Verfahrens und daher relativ einfach kommentierbar. Der gleiche Algorithmus in einer komprimierten Form würde so aussehen:
void qintsort(int a[], int l, int r){
   if(r>l){
     int i=l-1, j=r, tmp;
     for(;;){
       while(a[++i]<a[r]);
       while(a[--j]>a[r]);
       if(i>=j) break;
       tmp=a[i]; a[i]=a[j]; a[j]=tmp;
     }
     tmp=a[i]; a[i]=a[r]; a[r]=tmp;
     qintsort(a, l, i-1);
     qintsort(a, i+1, r);
   }
}
Um mit dem vorhandenen Programm die Werte einer Tabelle einzulesen, benutzen wir den in der Vorlesung erwähnten Trick und ergänzen das Datenfile bernulli.txt am Anfang mit ./mean1.exe « ! und am Ende mit ! , nennen das neue file mean1.job und starten den Job mit ./mean1.job.



Harm Fesefeldt
2006-11-02