summaryrefslogtreecommitdiff
path: root/doc/warenhaus/gs-Warenhaus-6
blob: 3edf3121304f1ad3cf3f63dee7124e0a2bf644dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
#limit (11.0)##pagelength (16.5)##block#                                   
#start (2.0,0.0)# 
#page (61)# 
#headodd# 
#center#gs-Warenhaus#right#% 
 
#end# 
#headeven# 
%#center#gs-Warenhaus
 
#end# 
#center#1 
 
#center##on("b")#6  Beschreibung der Programmierschnittstelle#off("b")# 
 
 
In allen GRIN-Projekten soll - zumindest als Erweiterung - der Aspekt des
"algorithmischen Problemlösens" mit in den Unterricht eingebracht werden. Deshalb
ist auch in dem Soester Programm zum Projekt WARENHAUS eine Programmier­
schnittstelle realisiert, die es erlaubt, mit Hilfe eines eng begrenzten Befehlssatzes
kleine Programme zur Steuerung der Abläufe im Modell-Warenhaus zu schreiben. 
 
Wir haben lange überlegt, ob wir diese Programmierschnittstelle überhaupt nach­
bilden sollten, weil wir der Meinung sind, daß beim Projekt WARENHAUS das
algorithmische Problemlösen, wenn überhaupt, nur eine sehr untergeordnete Rolle
spielt. Als Randproblematik kann man hier vielleicht untersuchen, wie die Menu-
Funktionen unter dem Oberbegriff 'Kommandos' (vgl. Kapitel 5.4) aufgebaut sind,
und man kann versuchen, diese in eigenen kleinen Programmen nach- oder umzu­
bilden. 
 
Unser zweites Problem war, ob wir uns bei einer eventuellen Nachbildung der
Programmierschnittstelle auch wirklich streng an die Soester Vorgaben halten sollten,
auch wenn sie unseren Vorstellungen und Konzepten teilweise zuwiderlaufen. Eigent­
lich sind wir der Meinung, daß uns mit der Programmiersprache ELAN bereits ein
ausgezeichnetes Hilfsmittel zur Verfügung steht, um auch in der Sekundarstufe I in
das algorithmische Problemlösen einzuführen. Gerade das Refinementkonzept - die
Methode der 'schrittweisen Verfeinerung' / der "Modularisierung im Kleinen" -
scheint uns besonders geeignet, typische Denkweisen des algorithmischen Problem­
lösens offenzulegen. Lediglich die Konstruktion einer Zählschleife und den Umgang
mit den Fehlermeldungen des ELAN-Compilers halten wir bei Anfängern für etwas
problematisch. 
 
Wir haben uns deshalb entschlossen, Ihnen die Programmierschnittstelle in zwei
Versionen zur Verfügung zu stellen: In der 'ELAN-Version' können Sie in der üblichen
#page# 
ELAN-Umgebung programmieren; das bietet sich z.B. an, wenn Sie #on("b")#gs-Warenhaus#off("b")#
im Wahlpflichtbereich bzw. im Differenzierungsbereich 9/10 einsetzen möchten. Es
ist dann dort nicht nötig, erst eine neue, weniger komfortable "Programmiersprache"
zu erlernen. 
 
Für den GRIN-Bereich enthält #on("b")#gs-Warenhaus#off("b")# eine weitere Programmierebene
('GRIN-Version'), die an die Soester Vorgaben angelehnt ist, und die es erlaubt, die
dort benutzten Schreibweisen von Befehlen und Kontrollstrukturen zu übernehmen.
Allerdings haben wir dabei eine grundsätzliche Änderung bezüglich der Modularisie­
rungsmöglichkeit von 'GRIN-Programmen' vorgenommen, auf die wir in Kapitel 6.1
näher eingehen werden. 
 
Ein 'GRIN-Programm' wird bei der Ausführung des Menupunktes 's Starten' (vgl.
Kapitel 5.5) zunächst in ein ELAN-Programm übersetzt und dabei auf formale
Korrektheit überprüft. Werden keine Fehler festgestellt, so wird nun seinerseits das
ELAN-Programm vom Compiler übersetzt und anschließend ausgeführt. Als Benutzer
werden Sie dabei nicht mit Fehlermeldungen des Compilers konfrontiert, da der
#on("b")#gs-Warenhaus#off("b")#-Übersetzer vorher alle formalen Fehler abfängt und zum Korrigieren
anbietet. 
 
Sollte das System nach erfolgreicher Übersetzung und/oder Compilation bei der
Ausführung des Programms einen Fehler "bemerken" (z.B. falscher Aufruf eines
Befehles), so wird das Programm automatisch abgebrochen und die entsprechende
Fehlermeldung mit der Nummer der Programmzeile, in der der Fehler bemerkt
wurde, im unteren Teil des Bildschirmes in einem 'notebook' gezeigt. Im oberen Teil
wird das Programm zum Verbessern angeboten, wobei der Cursor am Anfang der
fehlerhaften Zeile steht (gilt auch für die 'ELAN-Version'). 
 
In beiden Versionen der Programmierschnittstelle ist die Schreibweise der Befehle bis
auf die Groß- und Kleinschreibung identisch. Folgende Befehle stehen zu Verfügung: 
#page# 
      GRIN-Version      |       ELAN-Version 
------------------------+------------------------------
  Artikelnummer lesen   |   artikelnummer lesen 
  Artikeldaten eingeben |   artikeldaten eingeben 
  Kundennummer lesen    |   kundennummer lesen 
  Kundendaten eingeben  |   kundendaten eingeben 
  neues Blatt           |   neues blatt 
  Rechnungskopf         |   rechnungskopf 
  Artikel kaufen        |   artikel kaufen 
  Abrechnung            |   abrechnung 
  Auskunft              |   auskunft 
  Bildschirm neu        |   bildschirm neu 
                        |   nachbestellen 
                        |   dezimalwert lesen 
                        |   bitmuster lesen 
                        |
 
 
Die drei letzten Befehle der ELAN-Version haben wir in den GRIN-Befehlssatz nicht
mit aufgenommen, weil wir hier den Befehlssatz möglichst klein (und damit über­
sichtlich) halten wollten und diese Befehle bereits unter dem Oberbegriff
'Kommandos' als Menu-Funktionen zur Verfügung stehen. (Ebenso könnte man bei
dem Befehl 'Auskunft' argumentieren. Die entsprechende Menu-Funktion 'Auskunft
einholen' liefert bei jeder Anwahl jedoch immer nur #on("b")#eine#off("b")# Auskunft; in einem
Programm kann man nun die Ausgabe mehrerer Auskünfte hintereinander
realisieren.) 
 
Die genaue Wirkung der Befehle werden wir in Kapitel 6.3 noch detailliert
beschreiben. Sie entsprechen im wesentlichen den Soester Befehlen, die im
WARENHAUS-Begleitheft des LSW (siehe Anhang) auf den Seiten 99/100 aufgelistet
sind. (Die anderen dort zu findenden Befehle gehören eigentlich nicht in die Befehls­
liste der Programmierschnittstelle, weil sie nicht von Programmen aus sondern nur in
einem 'Direktbefehgs-Modus' als Kommando aufrufbar sind! Diese Befehle sind auch
#page# 
#on("b")#keine#off("b")# Programmierbefehle im eigentlichen Sinne, sondern entweder "Macros" zum
"Handling" des Warenhausmodells oder Systemkommandos. #on("b")#gs-Warenhaus#off("b")# stellt
diese Befehle unter ähnlichen Namen als Menu-Funktionen zur Verfügung.) 
 
 
 
#on("b")#6.1  Schreibweisen und Syntaxregeln in GRIN-Programmen#off("b")# 
 
Die Regeln, die beim Schreiben eines ELAN-Programms zu beachten sind, werden im
EUMEL/ELAN-Benutzerhandbuch beschrieben; wir werden uns daher hier auf die
GRIN-Version konzentrieren. 
 
Beginnen wir mit einem Beispiel aus dem WARENHAUS-Begleitheft des LSW. Dort
finden Sie auf Seite 70 (unten) das folgende Programm: 
 
#on("b")#
   PROGRAMM Rechnung schreiben 
     neues Blatt 
     Kundennummer lesen 
     WENN nicht Stoptaste gedrückt 
       Rechnungskopf 
       WIEDERHOLE 
         Artikelnummer lesen 
         WENN nicht Stoptaste gedrückt 
           Artikel kaufen 
         ENDE WENN 
       BIS Stoptaste gedrückt 
       Abrechnung 
     ENDE WENN 
   ENDE PROGRAMM #off("b")# 
 
Sie können dieses Programm ohne Änderungen übernehmen und starten,
#on("b")#gs-Warenhaus#off("b")# wird es ohne Beanstandungen ausführen. Bezüglich der Übersicht­
lichkeit und des Programmierstils kann man hier sicher geteilter Meinung sein,
darauf gehen wir später noch ein. 
#page# 
Wir möchten Ihnen zunächst einige Regeln zur Schreibweise und Syntax in 'GRIN-
Programmen' aufzeigen, die sich im obigen Beispiel-Programm beobachten lassen: 
 
-  In jeder Zeile darf nur #on("b")#ein#off("b")# Befehl stehen; Befehgs-Trennzeichen (wie etwa das
   Semikolon in ELAN) werden deshalb nicht verwendet. Leerzeichen können
   beliebig gesetzt werden, auch leere Zeilen sind zulässig, nicht jedoch
   Kommentare. 
 
-  Das Arbeiten mit Variablen (gleich welcher Art) ist #on("b")#nicht#off("b")# möglich; alle Befehle
   sind datentypfrei. 
 
-  Schlüsselworte für Kontrollstrukturen (wie z.B. WIEDERHOLE, WENN etc.)
   werden in GROSSBUCHSTABEN geschrieben, Ausführungsbefehle und
   Bedingungen hingegen klein und gemäß den Regeln der deutschen Sprache mit
   großem Anfangsbuchstaben bei Substantiven. Diese Festlegung bezüglich der
   Groß- und Kleinschreibung ist bei den von #on("b")#gs-Warenhaus#off("b")# zur Verfügung ge­
   stellten Befehlen #on("b")#verbindlich#off("b")#, d.h. alle Warenhaus-#on("b")#Grund#off("b")#befehle und Kontroll­
   strukturen müssen (bis auf Leerzeichen) genauso geschrieben werden, wie sie in
   den Kapiteln 6.2 und 6.3 vorgegeben werden! (In der Soester Software können
   dagegen Groß- und Kleinbuchstaben beliebig verwendet werden, sodaß dort z.B.
   neben 'neues Blatt' auch 'neues blatt', "NEueS BlaTT" u.ä. als identisch ange­
   sehen werden.) 
 
-  Jedes 'GRIN-Programm' beginnt mit dem 'Schlüsselwort' <PROGRAMM>,
   gefolgt von einem Programmnamen, der beliebig gewählt werden kann, jedoch
   noch in diese Zeile passen muß. Sinnvoll ist es, hier z.B. den Namen der
   Programmdatei einzutragen. 
 
-  Jedes 'GRIN-Programm' endet mit der Zeile <ENDE PROGRAMM>. Nach dieser
   Zeile dürfen nur noch leere Zeilen folgen, es sei denn zwischen <PROGRAMM
   Programmname> und <ENDE PROGRAMM> wurden Befehle benutzt, die
   nicht zum Warenhaus-Grundbefehlssatz gehören. Solche Befehle müssen in einer
   'Befehlserklärung' nach Programmende definiert werden. 
#page# 
Das obige Programm befriedigt vom äußeren Erscheinungbild her einen PASCAL-
Programmierer wahrscheinlich völlig, einen ELAN-Verwöhnten jedoch sicher nicht.
Die Soester WARENHAUS-Software bietet keinerlei Möglichkeit der Modularisierung
#on("b")#innerhalb#off("b")# eines Programms (Refinement-/Prozedurkonzept o.ä.). Es gibt dort nur die
Möglichkeit, fertiggestellte Programme unter dem Programmnamen dem Basis­
befehlssatz "hinzuzufügen" - ein Vorgang, der dem Insertieren unter EUMEL/ELAN
ähnelt. Obwohl es unter EUMEL/ELAN ein leichtes gewesen wäre, diese Möglichkeit
ebenfalls zu realisieren, haben wir davon Abstand genommen, weil auf diese Weise an
jedem Arbeitsplatz eine "eigene" Programmierumgebung entstehen würde. Wir sind
der Meinung, daß für Schüler der Sekundarstufe I eine #on("b")#feste Modellumgebung als
Basis#off("b")# vorhanden sein muß. Außerdem erscheint uns bei der Programmierung "im
Kleinen" die "Bottom-Up"-Technik  unangemessen und für den Anfänger viel zu
unübersichtlich zu sein; viel eher wäre hier die "Top-Down"-Methode angebracht. Wir
haben daher die Programmierumgebung in anderer Richtung erweitert und eine
Modularisierungsmöglichkeit realisiert, die dem Refinementkonzept nachempfunden
ist und damit unseren didaktisch-methodischen Vorstellungen viel eher entspricht. 
 
Bei #on("b")#gs-Warenhaus#off("b")# werden etwa benutzte 'eigene' Befehle #on("b")#innerhalb derselben#off("b")#
Programmdatei 'erklärt' und zwar #on("b")#nach#off("b")# dem Ende des eigentlichen 'Haupt­
programms', d.h. also nach der Zeile <ENDE PROGRAMM>. Mit Hilfe dieser Mög­
lichkeit könnte das obige Programm besser strukturiert etwa so aussehen: 
 
#on("b")#
   PROGRAMM Rechnung schreiben 
     neues Blatt 
     Kundennummer lesen 
     WENN nicht Stoptaste gedrückt 
       einkaufen mit Rechnung 
     ENDE WENN 
   ENDE PROGRAMM 
 
   einkaufen mit Rechnung: 
     Rechnungskopf 
     WIEDERHOLE 
       Artikelnummer lesen 
       Artikel eventuell kaufen 
     BIS Stoptaste gedrückt 
     Abrechnung 
#page# 
   Artikel eventuell kaufen: 
     WENN nicht Stoptaste gedrückt 
       Artikel kaufen 
     ENDE WENN 
#off("b")# 
 
 
Sie sehen, das Programm ist so zwar etwas länger, aber erheblich übersichtlicher
geworden. Für 'neue Befehle' und die zugehörigen 'Befehlserklärungen' gelten
folgende Grundsätze: 
 
-  Die 'Befehlserklärungen' müssen #on("b")#nach#off("b")# <ENDE PROGRAMM> aufgelistet
   werden. Die Reihenfolge ist beliebig. 
 
-  Eine 'Befehlserklärung' besteht aus dem zu erklärenden Befehl in (bis auf Leer­
   zeichen) völlig identischer Schreibweise (!) und einem nachfolgenden Doppel­
   punkt (:). 
 
-  Ein 'neuer Befehl' darf alle möglichen Zeichen enthalten außer einem Doppel­
   punkt (:). Außerdem darf solch ein Befehl #on("b")#nicht#off("b")# mit einem 'Schlüsselwort'
   beginnen (vgl. Kapitel 6.2). 
 
-  In 'Befehlserklärungen' können neben den Grundbefehlen auch wieder 'neue
   Befehle' benutzt werden, die dann wiederum erklärt werden müssen. 
 
-  Befehle dürfen nur #on("b")#einmal#off("b")# erklärt werden, auch wenn sie mehrfach benutzt
   werden. 
 
-  Es dürfen nur Befehle erklärt werden, die irgendwo auch wirklich benutzt
   werden. 
 
-  Befehlserklärungen sind nur möglich für #on("b")#Ausführungs-Befehle#off("b")#. Es lassen sich
   also z.B. keine neuen Bedingungen oder Kontrollstrukturen erklären! 
 
-  Es dürfen innerhalb eines Programms maximal 20 verschiedene 'neue Befehle'
   verwendet werden. (Diese Grenze dürfte in Warenhaus-Programmen kaum ein­
   mal erreicht werden!) 
#page# 
Formale Verstöße gegen diese Regeln werden bei dem Übersetzungsvorgang sofort
beim Auftauchen des ersten Fehlers zur Korrektur angeboten. Dabei wird in der
oberen Bildschirmhälfte das Programm editiert, wobei der Cursor an den Anfang der
Zeile gesetzt wird, in der sich der (erste) Fehler befindet. In der unteren Bildschirm­
hälfte wird über den Paralleleditor in einem 'notebook' die Art des Fehlers mit An­
gabe der Zeilennummer genauer beschrieben. 
 
In der Regel wird hier nur auf #on("b")#einen#off("b")# (nämlich den ersten auftauchenden) Fehler
hingewiesen, so daß Sie das Programm evtl. mehrfach starten müssen, bis alle Fehler
erkannt und beseitigt sind. Manchmal tauchen im Fehler-'notebook' aber auch
mehrere Fehlermeldungen auf (z.B. wenn 'neue Befehle' nicht erklärt oder erklärte
Befehle nicht benutzt wurden). In Extremfällen kann es dabei dazu kommen, daß
nicht mehr das ganze Fehler-'notebook' auf dem Bildschirm sichtbar ist. In diesem
Fall können Sie mit der Tastenfolge <ESC><w> den Cursor zwischen den beiden
Bildschirmhälften hin- und herschalten und mit den Pfeiltasten evtl. nicht-sichtbare
Teile des 'notebooks' oder der Programmdatei auf den Bildschirm holen. (Für
genauere Informationen über den Umgang mit dem EUMEL-Editor lesen Sie bitte im
EUMEL-Benutzerhandbuch nach.) 
 
 
#on("b")#6.2  Kontrollstrukturen#off("b")# 
 
Sowohl in ELAN-Programmen, als auch in GRIN-Programmen werden Kontroll­
strukturen durch 'Schlüsselworte' gekennzeichnet, die grundsätzlich in
GROSSBUCHSTABEN geschrieben werden müssen, um sie deutlich gegenüber Aus­
führungsbefehlen und Bedingungen abzuheben. In GRIN-Programmen gibt es
Schlüsselworte für den Anfang und das Ende eines Programms sowie für Schleifen
und einseitige Abfragen. Wir notieren hier nur die in GRIN-Programmen möglichen
Kontrollstrukturen und geben, wenn vorhanden, die zugehörige ELAN-Übersetzung in
Klammern an. 
 
 
#on("b")#Programm-Anfang/Ende:#off("b")# 
 
   #on("b")#PROGRAMM#off("b")# <Programmname> 
     <Anweisung 1> 
     <Anweisung 2> 
          . 
          . 
   #on("b")#ENDE PROGRAMM#off("b")# 
 
 
Jedes GRIN-(Haupt-)Programm beginnt mit dem Schlüsselwort 'PROGRAMM', gefolgt
von einem frei wählbaren Programmnamen, der jedoch in dieselbe Zeile passen
muß. Die Zeile 'ENDE PROGRAMM' zeigt das Ende eines GRIN-(Haupt-)Programms
an. Sowohl 'PROGRAMM', als auch 'ENDE PROGRAMM' dürfen in einer Programm­
datei nur #on("b")#einmal#off("b")# verwendet werden. Entsprechende Schlüsselworte in ELAN-
Programmen gibt es nicht. 
 
 
#on("b")#Schleifen:#off("b")# 
 
Schleifen müssen innerhalb des Hauptprogramms oder der Befehlserklärung, in der
sie geöffnet werden, auch wieder geschlossen werden. Schachtelungen sind zwar
zulässig, sollten aber aus Gründen der Übersichtlichkeit vermieden werden. Soll
dennoch innerhalb einer Schleife eine weitere Schleife verwendet werden, so sollte die
innere Schleife über einen 'neuen Befehl' in eine Befehlserklärung 'ausgelagert'
werden. Folgende Schleifenarten sind möglich: 
 
a) Zählschleife: 
 
   #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")#    (ELAN: INT VAR i; 
     <Anweisung 1>              FOR i FROM 1 UPTO n REPEAT 
     <Anweisung 2>                . 
          .                       . 
          .                       . 
   #on("b")#ENDE WIEDERHOLE#off("b")#              END REPEAT) 
 
 
Die Anweisungen innerhalb der Schleife werden <n> - mal ausgeführt. 
 
 
b) Schleife mit Ausgangsbedingung: 
 
 
   #on("b")#WIEDERHOLE#off("b")#            (ELAN: REPEAT 
     <Anweisung 1>                . 
     <Anweisung 2>                . 
          .                       . 
          .                       . 
   #on("b")#BIS#off("b")# <Bedingung>              UNTIL bedingung END REPEAT) 
 
 
Die Anweisungen innerhalb der Schleife werden mindestens einmal ausgeführt und
dann solange wiederholt, bis die Bedingung erfüllt ist. Bei der Programmierung ist
darauf zu achten, daß durch die Anweisungen die Bedingung erfüllt werden kann,
denn sonst ist das Resultat eine 'Endlosschleife', deren Ausführung nur durch einen
totalen Programmabbruch (<ESC><h>) beendet werden kann. 
 
 
c) Zählschleife mit Ausgangsbedingung: 
 
 
   #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")#    (ELAN: INT VAR i; 
     <Anweisung 1>              FOR i FROM 1 UPTO n REPEAT 
     <Anweisung 2>                . 
          .                       . 
          .                       . 
   #on("b")#BIS#off("b")# <Bedingung>              UNTIL bedingung END REPEAT) 
 
 
Die Anweisungen innerhalb der Schleife werden <n>-mal ausgeführt. Im Gegensatz
zur reinen Zählschleife können die Wiederholungen jedoch vorzeitig abgebrochen
werden, nämlich dann, wenn nach irgendeinem Schleifendurchlauf die Bedingung
erfüllt ist. 
 
 
d) Endlosschleife: 
 
 
   #on("b")#WIEDERHOLE#off("b")#            (ELAN: REPEAT 
     <Anweisung 1>                . 
     <Anweisung 2>                . 
          .                       . 
          .                       . 
   #on("b")#ENDE WIEDERHOLE#off("b")#              END REPEAT) 
 
 
Die Anweisungen innerhalb der Schleife werden immer wieder ausgeführt. Da keine
begrenzte Anzahl von Durchläufen und auch keine Abbruchbedingung angegeben ist,
kann diese Schleife nur durch einen totalen Programmabbruch (<ESC><h>)
beendet werden. 
 
(Die Schleifenarten c) und d) sind in der Soester WARENHAUS-Software nicht vor­
 handen, ergaben sich bei der Konstruktion des #on("b")#gs-Warenhaus#off("b")#-Übersetzers wegen
 der analogen Strukturen in ELAN jedoch quasi "von selbst", so daß wir sie auch
 zugelassen haben. Schleifen mit Eingangsbedingung (ELAN: WHILE bedingung
 REPEAT ... END REPEAT) sind für GRIN-Programme jedoch nicht realisiert.) 
 
 
#on("b")#Einseitige Abfragen:#off("b")# 
 
 
   #on("b")#WENN#off("b")# <Bedingung>      (ELAN: IF bedingung 
     <Anweisung 1>                 THEN anweisung 1; 
     <Anweisung 2>                      anweisung 2; 
          .                                 . 
          .                                 . 
   #on("b")#ENDE WENN#off("b")#                    END IF) 
 
 
Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. (Eine Ent­
sprechung zu der in ELAN möglichen 'zweiseitigen Abfrage' (IF ... THEN ... ELSE ...
END IF) gibt es in der GRIN-Version nicht!) 
 
Eine im Hauptprogramm oder in einer Befehlserklärung begonnene Abfrage ('WENN
...') muß auch im selben Programmteil wieder beendet werden. Ähnlich wie bei
Schleifen ist die Schachtelung von Abfragen innerhalb des Hauptprogramms oder
einer Befehlserklärung zwar zulässig, führt aber zu unübersichtlichen Programmen.
Auch hier sollte man innerhalb einer Abfrage eventuell notwendige weitere Abfragen
durch 'neue Befehle' in Befehlserklärungen auslagern. 
 
 
#on("b")#Zulässige Bedingungen:#off("b")# 
 
#on("b")#Stoptaste gedrückt#off("b")#    (ELAN: stoptaste gedrückt) 
 
   Die Bedingung ist erfüllt (d.h. liefert den Wert 'wahr'), wenn während des bis­
   herigen Programmablaufs die Tastenfolge <ESC><q> getippt worden ist;
   sonst ist sie nicht erfüllt (Wahrheitswert 'falsch'). (Das Tippen von <ESC><q>
   beim Verlassen einer Datei hat jedoch #on("b")#keinen#off("b")# Einfluß auf den Wahrheitswert der
   Bedingung!) 
 
   Bei jeder Ausführung der Befehle 'Artikelnummer lesen', 'Kundennummer lesen'
   und 'Auskunft' wird der Wahrheitswert der Bedingung zunächst immer auf
   'falsch' gesetzt (siehe 6.3), so daß die Abfrage der Bedingung nach einem dieser
   Befehle nur dann 'wahr' liefert, wenn #on("b")#während#off("b")# oder #on("b")#nach#off("b")# der letztmaligen Aus­
   führung eines der drei Befehle <ESC><q> getippt wurde; ein etwa vorher
   erfolgtes Tippen dieser Tastenfolge ist somit wirkungslos! 
 
 
#on("b")#nicht Stoptaste gedrückt#off("b")#    (ELAN: NOT stoptaste gedrückt) 
 
   Dieses ist das logische Gegenteil von 'Stoptaste gedrückt': 'nicht Stoptaste ge­
   drückt' ist erfüllt, wenn 'Stoptaste gedrückt' #on("b")#nicht#off("b")# erfüllt ist und umgekehrt. 
 
Um Probleme bei der Arbeit mit Terminals zu vermeiden, die nicht über den
deutschen Zeichensatz verfügen (Umlaute!), ist bei beiden Bedingungen auch die
Schreibweise 'gedrueckt' erlaubt. 
 
 
 
#on("b")#6.3  Detailbeschreibung der Warenhaus-Grundbefehle#off("b")# 
 
Wie bereits in 6.1 erwähnt, ist die im folgenden vorgegebene Schreibweise der Grund­
befehle bezüglich Groß- und Kleinschreibung verbindlich; Leerzeichen dagegen
können beliebig eingefügt oder auch weggelassen werden. Fett gedruckt steht immer
der GRIN-Befehl, in Klammern dahinter der zugehörige ELAN-Befehl. 
 
 
#on("b")#Artikelnummer lesen#off("b")#  (ELAN: artikelnummer lesen) 
 
  -  Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
     'falsch' gesetzt. 
  -  Der Benutzer wird aufgefordert, eine Artikelnummer einzugeben. Je nach
     Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
     tippen einer Zahl über die Tastatur oder durch Einschieben einer Warenkarte
     in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
     schließen. Akzeptiert werden nur Werte von 1 bis 15, ansonsten erfolgt eine
     Warnung, und die Eingabe wird wiederholt. 
  -  Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
     werden, ohne daß eine Artikelnummer eingelesen wird. In diesem Falle wird
     der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
     bleibt der Wert auf 'falsch'. 
  -  Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
     gesamten Programms abgebrochen. 
 
 
#on("b")#Artikeldaten eingeben#off("b")#  (ELAN: artikeldaten eingeben) 
 
  -  Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen wurde,
     ansonsten erfolgt eine entsprechende Fehlermeldung. 
  -  Die Angaben zu einem Artikel (Name, Preis, Mindestbestand, Bestand) können
     eingegeben bzw. verändert werden. 
  -  Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
     abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
     'Stoptaste gedrückt' auf 'wahr' gesetzt. 
  -  Nach Abschluß der Eingaben werden die Artikeldaten in der Filial-Verwaltung
     gespeichert, worauf auch kurz hingewiesen wird. 
  -  Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
     Ausführung des gesamten Programms abgebrochen. 
 
 
#on("b")#Kundennummer lesen#off("b")#  (ELAN: kundennummer lesen) 
 
  -  Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
     'falsch' gesetzt. 
  -  Der Benutzer wird aufgefordert, eine Kundennummer einzugeben. Je nach
     Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
     tippen einer Zahl über die Tastatur oder durch Einschieben einer Kundenkarte
     in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
     schließen. Akzeptiert werden nur Werte von 129 bis 159, ansonsten erfolgt eine
     Warnung, und die Eingabe wird wiederholt. 
  -  Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
     werden, ohne daß eine Kundennummer eingelesen wird. In diesem Falle wird
     der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
     bleibt der Wert auf 'falsch'. 
  -  Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
     gesamten Programms abgebrochen. 
 
 
#on("b")#Kundendaten eingeben#off("b")#  (ELAN: kundendaten eingeben) 
 
  -  Der Befehl setzt voraus, daß zuvor eine Kundennummer eingelesen wurde,
     ansonsten erfolgt eine entsprechende Fehlermeldung. 
  -  Die Angaben zu einem Kunden (Name, Vorname, Geschlecht) können einge­
     geben bzw. verändert werden. 
  -  Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
     abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
     'Stoptaste gedrückt' auf 'wahr' gesetzt. 
  -  Nach Abschluß der Eingaben werden die Kundendaten sowohl in der Filial-
     Verwaltung als auch in der Zentrale gespeichert, worauf auch kurz hingewiesen
     wird. 
  -  Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
     Ausführung des gesamten Programms abgebrochen. 
 
 
#on("b")#neues Blatt#off("b")#  (ELAN: neues blatt) 
 
  -  Das Rechnungsfenster auf dem Bildschirm wird gelöscht. 
  -  Für die Ausgabe der nächsten Rechnung auf dem Drucker wird eine neue
     Rechnungsdatei bereitgestellt. 
 
 
#on("b")#Rechnungskopf#off("b")#  (ELAN: rechnungskopf) 
 
  -  Ein Rechnungskopf wird auf dem Bildschirm ausgegeben. Falls zuvor eine
     Kundenummer eingelesen worden ist, unter der bereits Kundendaten einge­
     geben wurden, erscheint der Name des betreffenden Kunden im Rechnungs­
     kopf. 
  -  Der Rechnungskopf wird für einen eventuellen späteren Ausdruck in die
     Rechnungsdatei geschrieben. 
 
 
#on("b")#Artikel kaufen#off("b")#  (ELAN: artikel kaufen) 
 
  -  Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen worden ist,
     ansonsten erfolgt eine entsprechende Fehlermeldung. 
  -  Artikelname und -preis werden auf den Bildschirm und in die Rechnungsdatei
     geschrieben. 
  -  Der Kauf wird intern in den entsprechenden Filial-Dateien registriert. 
 
 
#on("b")#Abrechnung#off("b")#  (ELAN: abrechnung) 
 
  -  Die Preise der gekauften Artikel werden addiert. 
  -  Die Summe wird auf dem Bildschirm angezeigt und in die Rechnungsdatei
     geschrieben. 
  -  Der Benutzer wird gefragt, ob die Rechnung ausgedruckt werden soll. 
 
 
#on("b")#Auskunft#off("b")#  (ELAN: auskunft) 
 
  -  Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
     'falsch' gesetzt. 
  -  Der Benutzer wird aufgefordert, eine Codenummer einzugeben. Je nach Ein­
     stellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Eintippen
     einer Zahl über die Tastatur oder durch Einschieben einer Codekarte in das
     Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzuschließen.
     Akzeptiert werden nur zulässige Werte, ansonsten erfolgt eine Warnung, und
     die Eingabe wird wiederholt. Die Bedeutungen der einzelnen Auskunftscodes
     sind in Kapitel 5.4 unter der Menufunktion 'Auskunft einholen' beschrieben. 
  -  Durch Tippen der Tastenfolge <ESC><q> kann der Befehl abgebrochen
     werden, ohne daß eine Codenummer eingelesen wird. In diesem Falle wird der
     Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
     bleibt der Wert auf 'falsch'. 
  -  Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
     gesamten Programms abgebrochen. 
 
 
#on("b")#Bildschirm neu#off("b")#  (ELAN: bildschirm neu) 
 
  -  Der Programm-Eingangsbildschirm wird neu aufgebaut. Der Befehl wird
     benötigt, wenn die Fenstereinteilung auf dem Bildschirm wiederhergestellt
     werden soll (z.B. nach Ausgabe einer Liste bei dem Befehl 'Auskunft'). 
  -  Der Befehl wird beim Starten eines GRIN-Programms automatisch ausgeführt;
     bei ELAN-Programmen wird er automatisch am Anfang eines jeden Programms
     eingefügt, wenn das Programm nicht mit diesem Befehl beginnt. 
 
 
Neben diesen Befehlen stehen für ELAN-Programme noch drei weitere zur Verfügung,
die nicht zum GRIN-Befehlssatz gehören: 
 
        nachbestellen, 
        dezimalwert lesen, 
        bitmuster lesen. 
 
Diese Befehle entsprechen in ihrer Wirkung den gleichnamigen Menufunktionen
unter dem Oberbegriff 'Kommandos', die in Kapitel 5.4 beschrieben sind.