Logo: Geos Online Print Archiv
G.O.P.A. - Geos Online Print Archiv
28.03.2024 Archiv  #  Recherche  #  Links  #  Kontakt  #  Gästebuch  #  Impressum

Index
Register
Login

Die Anzeige des Archivs erfolgt grafisch. Ändern

GeoCom Workshop #4

Autor: Olaf Dzwiza; Autoreninfo anzeigen

Eine Würfelsimulation

Endlich ist es soweit, wir fangen mit unserem Programmprojekt (Details: GUP 35) an. In dieser Folge soll eine Reihe von Zufallszahlen erstellt und eine Auswertungsgrafik aufgebaut werden.

Im Hauptprogramm sind zunächst die Variablen zu initialisieren, dann wird von hier aus der restliche Ablauf gesteuert. Eine Datenreihe 'würfelzahl' speichert die Verteilung der Zahlen, eine Integervariable und eine Realzahl werden zur Berechnung des Durchschnitts gebraucht. Außerdem sind nötig: Ein Zähler, ein Puffer für die erzeugte Zahl und einer für die umgerechnete Würfelzahl und schließlich die Zufallszahlenfunktion. Die Adresse $850a wird bei jedem Interrupt mit einem Integerwert neu beschrieben, kann also als "random"-Funktion eingesetzt werden. Definitions-und Hauptteil sehen also so aus:

   NAME"Würlelstat.1.0a"
   CLASS"WStat    V1.0a"
   AUTHOR "Olaf Dzwiza"
   BYTEVAR zähler, würfelwert, zufallszahl
   INTVAR gesamtwert
   INTVAR AT $850a; random
   REALVAR durchschnitt
   ROW 6 BYTEVAR würfelzahl
   LABEL hauptprogramm
   LABEL zahlenreihe_erzeugen, grafik_aufbauen
   @hauptprogramm
   (würfelzahl<0>)=0
   (würfelzahl<1>)=0
   (würfelzahl<2>)=0
   (würfelzahl<3>)=0
   (würfelzahl<4>)=0
   (würfelzahl<5>)=0
   gesamtwert=0
   zahlenreihe_erzeugen
   grafik_aufbauen
   WAIT 255 : WAIT 255
   END

Bevor Ihr ans Compilieren geht, sollten noch die Label zahlenreihe_erzeugen und grafik_aufbauen in den Programmtext aufgenommen werden.

zahlenreihe_erzeugen soll 200 Zufallszahlen erzeugen und für jede Zahl einen entsprechenden Zähler (BYTEROW würfelzahl) hochzählen. Dabei verwenden wir nur das niederwertige Byte der "random"-Funktion und ordnen folgende Würfelzahlen zu:

   0 - 41:      1
   42 - 82:     2
   83 - 123:    3
   124 - 164:   4
   165 - 205:   5
   206 - 246:   6

   @zahlenreihe_erzeugen
   zähler=0:zufallszahl=255
   REPEAT
    WHILE (zufallszahl>246)DO zufallszahl=(LOW random)
    LOOP
    würfelwert=1
    IF (zufallszahl>41)THEN : würfelwert=2 : ENDIF
    IF (zufallszahl>82)THEN : würfelwert=3 : ENDIF
    IF (zufallszahl>123)THEN : würfelwert=4 : ENDIF
    IF (zufallszahl>164)THEN : würfelwert=5 : ENDIF
    IF (zufallszahl>205)THEN : würfelwert=6 : ENDIF
    würfel_darstellen
    INC (würfelzahl<(würfelwert=1)>)
    INC zähler
    zufallszahl=255
   UNTIL (zähler==200)
   RETURN

Das Label Würfel_darstellen ist noch im Deklarationsteil einzubinden, im Programmcode reicht hier vorübergehend aus:

   @würfel_darstellen
   RETURN

Jetzt ist ein Balkendiagramm mit den Ergebnissen zu zeichnen. Die Grafikbefehle müssen wohl nicht groß erläutert werden, etwas verwirrend sind hier höchstens die vielen berechneten Koordinaten. Im Zweifelsfall helfen aber Tabellen und ein Blatt Karopapier. Für die genaue Auflistung fehlt leider der Platz. Viele Sachen in diesem Programmabschnitt (Zahlenbereiche, Klammerregeln) wurden bereits in den vorhergehenden Workshopteilen erläutert.

Interessant ist höchstens noch die INT-Funktion:
Der LINE-Befehl erwartet das Zahlenformat LINE int,byte,int,byte. Da "zähler" aber als Byte deklariert ist und mit einem anderen konstanten Bytewert multipliziert ist, was wieder ein Byte ergibt, müssen wir diesen Wert in eine Integerzahl wandelt. INT byte1,byte2 macht aus byte1 (low) und byte2 (high) eine Integerzahl.
Anschließend wird noch der Durchschnitt berechnet und ausgegeben.

   @grafik_aufbauen
   PATTERN 0
   RECT 45,40,275,175 : FRAME 45,40,275,175
   LINE 60,55,60,145 : LINE 60,145,260,145
   LINE 258,143,260,145: LINE 258,147,260,145
   zähler=0
   REPEAT
    LINE
        58,((zähler*15)+62),60,((zähler*15)+62)
    SETPOS 50,((zähler*15)+65)
    PRINT(STR(zähler+1))
    INC zähler
   UNTIL (zähler==6)
   zähler=0
   REPEAT
    LINE(INT((zähler*20)+60),0),145,(INT((zähler*20)+60),0),147
    SETPOS (INT((zähler*20)+58),0),157
    PRINT(STR(zähler*20))
    INC zähler
   UNTIL (zähler==10)
   zähler=0
   PATTERN 1
   WHILE (((würfelzahl<zähler>)<>0) AND (zähler<6))DO
    RECT
       60,((zähler*15)+60),(INT(60+(würfelzahl<zähler>)),0),
       ((zähler*15)+64)
    SETPOS
       (INT(64+(würfelzahl<zähler>)),0),((zähler*15)+65)
    PRINT(STR(würfelzahl<zähler>))
    INC zähler
   LOOP
   zähler=0
   REPEAT
    gesamtwert=(gesamtwert+((INT(würlelzahl<zähler>),0)*(INT(zähler+1),0)))
    INC Zähler
   UNTIL(zähler==6)
   durchschnitt=((REALgesamtwert)/200)
   SETPOS 65,170: PRINT "/BDurchschnitt:";:PRINT (STR durchschnitt)
   RETURN

Und nun noch eine kleine Aufgabe: Ergänzt den Programmpunkt @würfel_darstellen wie folgt:

   @würfel_darstellen
   INCLUDE "Wüdarst_mod"
   RETURN

"Wüdarst_mod" sollte ein Modul sein, daß zu jeder erzeugten Zahl eine Würfelanzeige simuliert.

Eine mögliche Lösung findet Ihr auf der Diskette zum Workshop, die es ab sofort bei mir gibt (Unkostenerstattung 5 DM oder entsprechen eine Disk (1541!) mit frankiertem Rückumschlag; Adresse am Ende des Textes).
Auf der Diskette, die ich zu jedem weiteren Workshop-Teil ergänzen werde, findet Ihr alle bisher erstellten Quellcodes und kompilierten Programme.
Im nächsten Teil geht es um Menü-und Tastaturabfragen.

 

Olaf Dzwiza
(siehe Autoreninfo)

Abschließend einige allgemeinige Infos
Aktuelles von der GUSS (Gerüchte und Spekulationen aus Datex-J, keine Garantie auf Richtigkeit)

  • Falk Rehwagen arbeitet an einer Übersetzung von GeoCom ins englische, womit dieser Compiler dann eines der ersten deutschen Programme wäre, das mal den anderen Weg als gewöhnlich geht.
  • Eventuell ist mit einer Erweiterung des Arbeitsspeichers unter GeoCom zu rechnen (bis $8000, statt wie bisher bis $6000), vorausgesetzt der Hintergrundspeicher wird nicht verwendet und eine REU ist vorhanden.
  • Erste Schritte zu einem GEOS 3.0 sollen erfolgt sein. Eine noch nicht offizielle Version des TopDesk soll bereits farbfähig sein. Bis zur endgültigen Fertigstellung wird aber noch einige Zeit vergehen, da zunächst die Übersetzung und Erweiterung von GeoCom anstehen.

 

Olaf Dzwiza

 

 

 




Dieser Artikel ist Bestandteil von:

Ausgabe 36

! - - - - - M I C R O F I L M - - - - - ! | Wo bleiben die Druckertreiber ? | Geoworks & Betriebssysteme ? | Editorial | Zur Geos User Post ... | Reisebericht USA | News Regio Baden | Das JHT | 64'er ohne GEOS Teil | Testbericht zur Flash 8 | Testbericht BBG | Testbericht: Collection GEOS Disk #1 | RamProcess 2.0 | GeoCom Workshop #4 | GeoCom: Tips & Tricks 1 | Neues von der GeoThek (Teil 5) | GEOS Abenteuerspiel: Escape | Data-Switchbox für Userport, Floppy und Monitor | Neu: GeoShell -deutsch- | PD Disk für GWE2 | US-GWE v2.01 beim GUC ! | Geoworks in den USA | GeoFile-Praxis | Logikfehler beim Speichern von Dokumenten (GWE 2.01) | Verschlungene Buchstaben mit GeoDraw | Faxen mit Geoworks 2.0 | Wasserzeichen | Neue DOS-Spezial PD Disketten | FilePeeper | GEOS.INI editieren | GEOS.INI beschädigt? | GeoCon, DOS-Editor für GEOS.INI | Nützliche Helfer - die GeoTools 2 für GWE 2 | NewIcon - DOS Hilfe für Icons | FM Radio | Quintessence ? | Geoworks CD?


GeoCom Workshop

GeoCom Workshop #1 | GeoCom Workshop #2 | GeoCom Workshop #3 | GeoCom Workshop #4 | GeoCom Workshop #5 | GeoCom Workshop #6 - Etwas über Hilfsmittel und Drucker | GeoCom Workshop #7


Kurzlink hierhin: http://geos-printarchiv.de/1951


Letzte Änderung am 01.11.2019