"Fossies" - the Fresh Open Source Software Archive 
Member "statist-1.4.2/doc/programm.tex" (31 May 2003, 12496 Bytes) of package /linux/privat/old/statist-1.4.2.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) TeX and LaTeX source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
1 \documentstyle[german,11pt,mydefs]{article}
2 %\documentstyle[german,11pt,mydefs]{script_s}
3
4 \voffset 1cm
5 \newcommand{\st}{\tt sta"-tist \rm}
6 % \addtolength{\textwidth}{-2.5cm}
7 % \raggedright
8
9 \begin{document}
10
11 \begin{center}
12 {\Large\bf Dokumentation f"ur Programmierer zum Statistikprogramm \st \\ }
13 \el
14 {\small Dirk Melcher, Institut f"ur Umweltsystemforschung , Uni
15 Osnabr"uck\\ Artilleriestr.\ 34, 49069 Osnabr"uck\\
16 email: dmelcher@ramses.usf.uni-osnabrueck.de}
17 \el
18 \el
19 Version vom 25.5.95\\
20 {\bf Achtung! Diese Dokumentation enth"alt
21 veraltete Informationen!}
22 \end{center}
23
24 \section{Einleitung}
25
26 Das Programm \st\ besteht aus den Modulen {\tt statist.c, menue.c, da"-ta.c,
27 funcs.c, procs.c} und {\tt plot.c}. Zu jeder C-Datei geh"ort
28 au"serdem eine entsprechende Headerdatei.
29
30 Wie in der Einleitung bereits verk"undet, hat das Programm den Anspruch,
31 einigerma"sen leicht erweiterbar zu sein. Hierzu sei zun"achst die
32 Philosophie des Programmes geschildert:
33
34 Im Programm wird streng zwischen den eigentlichen Rechenprozeduren und
35 den Routinen, welche Datenmanagement, Men"uf"uhrung und Dialog
36 durchf"uhren, unterschieden. Deswegen sollten {\em alle\/} Variablen
37 in den Rechenprozeduren lokal sein! Das Programm mu"s die
38 Rechenroutienen also mit den fertig zusammengestellten Daten
39 versorgen. Die Rechenprozeduren "ubernehmen die eigentliche
40 Rechenarbeit und schreiben das Ergebnis auf den Bildschirm.
41
42 \section{Kompilieren}
43 \st\ kann sowohl f"ur {\sc Unix} als auch {\sc Dos} kompiliert werden.
44
45 % Es existieren Makefiles f"ur {\tt gcc} unter {\sc Unix} und dem {\sc
46 % Borland} C-Compiler {\tt bcc} bzw.\ der {\tt gcc}-Portierung {\tt
47 % djgpp} f"ur {\sc Dos}.
48
49 %Falls \st noch kompiliert werden mu"s: Unter {\sc Unix}:
50
51 % {\tt \ \ \ gcc -o statist statist.c -lm }
52 % {\tt \ \ \ make -f makefile.unx statist }
53
54 F"ur {\sc Unix} wird der gcc-Compiler vorrausgesetzt, der K\&R cc-Compiler
55 tut's nicht, da das Programm in Ansi-C geschrieben ist. Das Makefile
56 f"ur {\tt gcc} hei"st {\tt makefile.unx}.
57
58 Unter {\sc Dos} kann das Programm z.B. mit dem Kommandozeilen-Compiler
59 {\tt bcc} von {\sc Borland} (Makefile {\tt makefile.bcc}) oder mit der
60 Portierung des gcc-Compilers {\tt djgpp} (Makefile {\tt makefile.djg})
61 kompiliert werden. ({\tt djgpp} erstellt 32-Bit-Code f"ur 386'er. Mit
62 einer 386'er Version von \st lassen sich wesentlich gr"o"sere
63 Datenmengen bearbeiten.) Das Programm wird dann jeweils mit
64
65 % In diesem Fall bitte das
66 % Speichermodell `Large' w"ah"-len. Au"serdem sollte {\tt MSDOS}
67 % definiert sein (als Kommandozeilenparameter {\tt -DMSDOS}, s.u.).
68 % Falls man das Gl"uck hat, vor einem 286'er aufw"arts zu sitzen, kann
69 % man \st z.B. folgenderma"sen kompilieren:
70 % { \tt \ \ \ bcc -2 -H -d -DMSDOS -ll statist.c }
71
72 {\tt \ \ \ make -f<Makefile>} \ \ bzw. \par
73 % {\tt \ \ \ make -f makefile.djg } \ \ erstellt \par
74
75 Das utility {\tt make}, welche das Makefile abarbeitet, ist sowohl im
76 {\sc Borland}-Paket als auch als gnu-utility erh"altlich.
77
78
79
80 \section{Ausgabeprozeduren}
81 Um die Ausgabe von beliebeigen Meldungen \st flexibel handhaben zu
82 k"onnen (Mitschreiben von Protokolldateien usw.), gibt es drei
83 verschiedene Ausgabefunktionen, die im Stil von {\tt printf} aufgerufen
84 werden:
85
86
87 \begin{enumerate}
88 \item {\tt out\_d}: Ausgabe von Dialogtexten, da"s hei"st also, die
89 Men"utexte, Eingabeaufforderungen und alles andere, was nicht mit
90 den eigentlichen Berechnungen zu tun hat.
91 \item {\tt out\_r}: Ausgabe aller Ergebnistexte, also alles, was mit
92 den eigentlichen Berechnungen zu tun hat und in dem Modul {\tt
93 procs.c} steht.
94 \item {\tt out\_err}: Ausgabe aller Fehlermeldungen. Im Gegensatz zu
95 den beiden anderen Routinen wird au"ser den `normalen' {\tt
96 printf}-Argumenten zus"atzlich als erstes Argument eine
97 Fehlerkonstante "ubergeben, die die Art des Fehlers charakterisiert:
98 {\tt WAR} wird als Warnung ausgegeben, {\tt ERR} ist ein `normaler'
99 Fehler, {\tt MAT} ist ein Fehler und {\tt MWA} eine Warnung
100 innerhalb einer Rechenprozedur (werden mit ins Protokoll geschrieben)
101 und {\tt FAT} ist ein `fataler' Fehler, der einen sofortigen Abbruch
102 des Programmes bewirkt. Danach folgen wie "ublich der Formatstring
103 und die restlichen Argumente.
104 \end{enumerate}
105
106
107 \section{Men"u}
108
109 Will man eine Statistikprozedur hinzuf"ugen, so schaut man zuerst, in
110 welches Untermen"u (Datei {\tt menue.c}) sie am besten hineinpa"st.
111 Momentan gibt es lediglich die Men"uprozeduren {\tt data\_menu(),
112 re"-gress"-\_menu(), test"-\_menu()} und {\tt misc"-\_menu()}. Will
113 man z.B.\ eine Testprozedur hinzuf"ugen, so sucht man die Prozedur
114 {\tt test\_menu()} und f"ugt mit einer fortlaufenden Nummer den Namen
115 der neuen Prozedur zum Men"utext hinzu, also z.B. \\ \verb| out_d(" 5
116 = U-Test von Mann und Whitney\n");| \\ Sodann geht man in die {\tt
117 switch} Anweisung der Men"uprozedur und f"ugt die entsprechende {\tt
118 case}-Marke f"ur die hinzugef"ugte Nummer an (in unserem Beispiel
119 also {\tt case 5}). Hier werden dann die Dialoge gef"uhrt und die
120 eigentliche Rechenprozedur aufgerufen.
121
122 \section{Dialoge}
123 Die Dialoge befinden sich ebenfalls in der Datei {\tt menue.c}.
124 Wie man wahrscheinlich gesehen hat, sind die Dialoge sehr primitiv. Es
125 gibt allerdings ein Feature des Programmes, welches die Dialoge leicht
126 verkompliziert: die M"oglichkeit, da"s der Benutzer jederzeit durch
127 dr"ucken der Returntaste einen Dialog abbricht und wieder ins Men"u
128 zur"uckkehrt.
129
130 Oft beschr"ankt sich der Dialog darauf, den Benutzer zu fragen, welche
131 Spalten er welchen Variablen zuordnen m"ochte. Dabei kann man zwei
132 F"alle unterscheiden:
133
134 \begin{enumerate}
135 \item Die Anzahl der Variablen (und damit der Spalten) ist festgelegt,
136 z.B.\ 2 Spalten bei dem einfachen t-Test.
137 \item Die Anzahl der Spalten ist variabel, wie dies z.B.\ bei der
138 Erstellung der Korrelationsmatrix der Fall ist.
139 \end{enumerate}
140
141 Meistens tritt Fall 1 ein. Will man also f"ur den U-Test zwei Spalten
142 einlesen, dann wird einfach die Prozedur {\tt getcols(2)}
143 aufgerufen.
144
145 Bei jedem Einlesevorgang wird die globale bool'sche Variable {\tt empty}
146 neu gesetzt. Wird bei einer Eingabe nur die Entertaste gedr"uckt, dem
147 Programm also eine Leerzeile "ubergeben, dann wird {\tt empty} auf
148 {\em true\/} gesetzt, sonst auf {\em false\/}. Deswegen sollte immer,
149 wenn direkt oder "uber eine Prozdeur (wie bei {\tt getcols}) eine
150 Eingabeaufforderung stattgefunden hat, "uberpr"uft werden, ob die Eingabe
151 `leer' war oder nicht, um dem Benutzer die M"oglichkeit zu geben, den
152 Dialog jederzeit abzubrechen. Daher w"urde in unserem Beispiel der Aufruf
153 einer Prozedur {\tt u\_test} folgenderma"sen aussehen:
154
155 \begin{verbatim}
156 case 5: {
157 getcols(2);
158 if (!empty) {
159 u_test(xx[acol[0]],nn[acol[0]], xx[acol[1]],nn[acol[1]]);
160 }
161 }
162 break;
163 \end{verbatim}
164
165 Die Namen der Variablen, die {\tt u\_test} "ubergeben werden m"ussen,
166 werden im folgenden Abschnitt besprochen.
167
168 Bei vielen Statistikprozeduren ist es notwendig, da"s die Spalten alle gleich
169 viele Werte haben m"ussen. Dies kann mit der Funktion {\tt equal\_rows}
170 getested werden. In diesem Fall kann man also die Zeile \\
171 \verb| if (!empty) { | \\
172 aus dem letzten Beispiel durch die Bedingung \\
173 \verb| if ((!empty) && (equal_rows(2))) { | \\
174 ersetzen (wenn z.B.\ 2 Spalten auf gleiche Anzahl "uberpr"uft werden
175 sollen).
176
177 Falls die Anzahl der Spalten, die von einer Rechenprozedur ben"otigt
178 werden, variabel ist, gestaltet sich der Dialog komplizierter. In diesem
179 Falle kann man z.B.\ den Dialog f"ur den Aufruf der Funktion
180 {\tt correl\_matrix()} im Regre"s-Men"u "ubernehmen.
181
182 Mu"s man irgendwelche Parameter direkt vom Benutzer erfragen, so sollte
183 man dies in einer bestimmten Form tun: Es gibt eine globale
184 String-Variable {\tt line}, in der prinzipiell alle Benutzereingaben
185 abgespeichert werden. Dies sollte immer mit Hilfe einiger Makros
186 erfolgen, die am Anfang des Programmes definiert sind. In der Regel
187 wird eine Abfrage innerhalb eines {\tt switch}-Statements erfolgen.
188 Dann verwende man das Makro {\tt GETBLINE}. Dieses Makro lie"st die
189 Benutzereingabe in {\tt line} ein und bricht den Dialog ab, falls die
190 Eingabe leer war. Will man eine Zahl vom Benutzer eingeben lassen, so
191 verwende man nach Aufruf des Makros {\tt GETBLINE} die Funktion {\tt
192 getint()} bzw.\ {\tt getreal()} (letztere f"ur {\tt double} Zahlen). Diese
193 Funktionen "uberpr"ufen, ob eine g"ultige Zahl eingegeben wurde. Sollen
194 einzelne Zeichen eingelesen werden (z.B.\ `j' oder `n' bei ja/nein
195 Verzeigungen), so tue man dies nach Aufruf des Makros {\tt GETBLINE} mit
196 {\tt sscanf(line, \dq \%c\dq, \&antwort)} oder sowas.
197
198 Die eigentliche Rechenprozedur sollte in die Datei {\tt procs.c}
199 eingef"ugt werden. Der Funktionsprototyp sollte als {\tt extern}
200 deklariert in die Headerdatei {\tt procs.h} geschrieben werden. {\tt
201 funcs.h} gibt einen "Uberblick "uber bereits vorhandenen Funktionen,
202 die mit benutzt werden k"onnen.
203
204 \section{Variablen und Parameter}
205 Alle globalen Variablen befinden sich als {\tt extern} deklariet in
206 {\tt statist.h}. Au"serdem befinden sich hier auch die
207 Typ-Definitionen.
208
209 Die Spalten werden in den Array-Variablen {\tt xx} gespeichert. Die
210 Gr"o"se jeder Spalte wird in dem Array {\tt nn} gespeichert. Die
211 Spalte {\tt xx[0]} enth"alt also {\tt nn[0]} Werte. Durch den Aufruf
212 von {\tt getcols} werden lediglich den Spalten Variablen zugeordnet. Es
213 soll ja z.B.\ dem Benutzer m"oglich sein, die Spalte 2 der Variable 1
214 einer Prozedur zuzuordnen. In der Array-Variablen {\tt acol} wird
215 diese Zuordnung gespeichert. Nehmen wir als Beispiel die Prozedur {\tt
216 u\_test}: Diese Prozedur w"urde vier Parameter ben"otigen,
217 n"amlich zwei Feldvariablen {\tt x} und {\tt y}, welche die
218 eigentlichen Beobachtungswerte enthalten, und {\tt nx} und {\tt ny},
219 die angeben, wie gro"s diese beiden Felder sind. Zun"achst wird also
220 {\tt getcols(2)} aufgerufen, um den Dialog auszuf"uhren, welcher die
221 Zuordnung der Spalten zu den Variablen "ubernimmt. Daher lautet der
222 Aufruf also \\ \verb| u_test(xx[acol[0]],nn[acol[0]],
223 xx[acol[1]],nn[acol[1]]); | \\ Es werden also {\em nicht\/} die
224 Spalten 0 und 1 "ubergeben, sondern die, welche der Benutzer vorher
225 der ersten und zweiten Variable zugeordnet hat!
226
227 Um die Datentypen etwas flexibler zu halten, wurde f"ur Gleitkommazahlen
228 (also f"ur "`normale"' Werte) der Typ {\tt REAL} eingef"uhrt, der momentan
229 auf den Standardtyp {\tt double} gesetzt ist. Aus Konsistenzgr"unden
230 sollte man also immer den Typ {\tt REAL} verwenden. Die Deklaration
231 f"ur die Funktion {\tt u\_test} sollte also etwa folgenderma"sen
232 aussehen: \\
233 \verb| void u_test(REAL x[], int nx, REAL y[], int ny);|
234
235 Ist die Anzahl der Variablen, die einer Prozedur "ubergeben werden
236 sollen, nicht festgelegt, so wird die Sache komplizierter. In diesem
237 Falle gibt es einen Typ {\tt PREAL}, der einen Pointer auf ein {\tt
238 REAL}-Array, also im Prinzip eine Spalte darstellt.
239 {\tt PREAL} ist folgenderma"sen definiert:
240
241 \begin{verbatim}
242 typedef double REAL;
243 typedef REAL* PREAL;
244 \end{verbatim}
245
246 Deklariert man nun ein Feld vom Typ {\tt PREAL}, so hat man eine
247 zweiminensionale Matrix:
248
249 \begin{verbatim}
250 PREAL xx[MCOL];
251 \end{verbatim}
252
253 Also mu"s eine zweidimensiomale Matrix immer als {\tt PREAL x[]} einer
254 Prozedur "ubergeben werden. Zus"atzlich sollte dann noch die Anzahl
255 der Spalten und Spalten angegeben werden. Der ganze Hokuspokus mit
256 {\tt PREAL} wird "ubrigens deswegen gemacht, um einer Prozedur eine
257 Matrix als Parameter "ubergeben zu k"onnen, deren Spaltengr"o"se
258 vollkommen variabel ist. Wie in so einem Fall die Spalten den
259 Variablen zugeordnet werden, schaue man sich anhand des Aufrufes der
260 Prozedur {\tt correl\_matrix} an.
261
262
263 \section{Fazit}
264 \label{sec:fazit}
265
266 Hier noch mal eine kurze Zusammenfasung, was zu tun ist, um \st um
267 eine Prozedur zu erweitern:
268
269 \begin{enumerate}
270 \item In {\tt procs.h} die Prozedur {\tt extern}
271 deklarieren (hierbei die Typen {\tt REAL} bzw.\ {\tt PREAL} verwenden).
272 \item In {\tt procs.c} neue Prozedur definieren.
273 \item In {\tt menue.c} das Men"u suchen, in welches die neue Prozedur
274 am besten hineinpa"st und den Men"utext f"ur die neue Funktion
275 hineinschreiben
276 \item Im selben Men"u die entsprechende {\tt switch}-Anweisung
277 suchen, die neue {\tt case}-Marke eintragen und dort den Dialog
278 und den Aufruf f"ur die neue Prozedur hineinschreiben.
279 \end{enumerate}
280
281 \el
282 Noch eine Bitte am Schlu"s: Wenn jemand das Programm erweitert hat,
283 w"are es {\em sehr\/} nett, wenn er mir die neue Version auch
284 zukommen lassen w"urde!
285
286 \end{document}