28 o++oPS-Beispiele

o++oPS ist eine Endnutzerprogrammiersprache, die Wiederholgruppen einfach verwalten kann. Sie erlaubt es, Anfragen an Tabellen und Dokumente besonders einfach zu formulieren. Da die Sprache nicht nur das Ziel hat Anfragen zu formulieren, wird sie nicht mehr ottoQueryLanguage sondern ottoProgrammierSprache (ottoProgrammingSkript) genannt. Das Projekt wurde beeinflusst von CONVERT, SQL, XML und XQuery. o++oPS unterscheidet sich von "ottoQL" nicht nur durch eine Reihe von syntaktischen Veränderungen sondern auch durch semantische.

1. Eine Wiederholgruppe

Einige der grundlegenden Befehle und Begriffe werden anhand der folgenden Tabelle ottos.tab geklärt. Die Beispiele können unter http://ottops.eu getestet werden.
NAME,                  GEBORENIN,    (TAT,                                   JAHR l)m
Otto der Grosse        Altsachsen(De) Zum König von Deutschland gewählt       936
                                      Die Ungarn auf dem Lechfeld geschlagen  955
                                      Erster Kaiser des Heil. Röm. Reichs     962
Otto von Mähren        Mähren         heiratete Euphemia von Ungarn          1086
Otto von Bismarck      Preußen(De)    mit Zuckerbrot und Peitsche-Politik    1871
                                      Emser Depesche                         1870
                                      Erster Reichskanzler von Deutschlands  1871
Nikolaus Otto          Taunus (De)    Miterfinder des Ottomotors             1876
Otto von Guericke      MD (De)        Erfinder der Luftpumpe                 1649
                                      Halbkugelversuch vor dem Kaiser        1654
Otto Normalverbraucher De             erlernt Autofahren                     1960
                                      erlernt eine Programmiersprache        2020
Diese Tabelle enthält eine Menge (m) von 6 Personen und für jede Person eine Wiederholgruppe (TAT, JAHR l)-eine Liste von (TAT, JAHR)-Paaren.

2. Metadaten

Programm 1: Gib mir die Metadaten der Tabelle ottos.tab.
aus ottos.tab
("both" und "tab" clicken)
Das Ergebnis ist eine vollständige TTD:
TABMENT! OTTOS
OTTOS! NAME,GEBORENIN,(TAT,JAHR l)m
NAME GEBORENIN TAT! TEXT
JAHR! ZAHL
TABMENT ist ein Kunstwort aus TABelle und dokuMENT. Es beschreibt den Typ der aktuellen Tabelle. TTD kürzt „Tabment Typ Definition“ ab. Wenn im Folgenden die Ergebnisse als TAB-Datei angesehen werden sollen, ist "meta" auszuschalten. Alle folgenden Beispiele bestehen aus sequentiellen Programmen. Sie beginnen mit einer Tabelle (des aus-Teils) und die Operation jeder neuen Zeile wird auf das Ergebnis der vorangehenden Zeile angewandt.

3. Beispielprogramme

3.1 „Hallo Welt“- Spielerei

Programm 2: Gib zwei Worte aus.
Hallo Welt
Das Ergebnis ist eine Liste von Wörtern (WORTl).
Programm 3: Gib ein Paar von zwei Worten aus.
Hallo, Welt

Das Komma trennt Komponenten von Tupeln. Ein Tupel (das Paar ist ein 2-Tupel) wird in der Regel horizontal ausgegeben und Elemente von Kollektionen (Listen, Mengen, Multimengen) in der Regel vertikal. Um Platz zu sparen werden in einfachen Situationen Kollektionen auch horizontal ausgegeben.
Programm 4: Gib einen Text mit Leerzeichen aus.
"Hallo Welt"

Programm 5: Verbinde zwei Wörter.

Hallo +text Welt # +text: Verbindung (Konkatenation) von Texten
# leitet den Zeilenkommentar ein.
Programm 6: Gib einen Gruß mit einer Liste von Worten aus.
GRUSS:=[Hallo Welt]
:= = Extension; Erweiterung der leeren Tabelle um eine Spalte. Das Ergebnis sind zwei Worte.
Programm 7: Gib zwei Worte mit zwei Spaltennamen aus.
LIEBER:=Hallo
GRUSS:=Welt

Das Ergebnis ist ein Paar (2-Tupel) von einspaltigen Tabellen.
Programm 8: Gib einen Text mit einem Tag (Spaltennamen) aus.
GRUSS:=“Hallo Welt“
Programm 9: Sortiere eine Menge von Wörtern.
GRUSS:={Welt Hallo}
Mengen und Multimengen werden stets sortiert; die Reihenfolge der Elemente bleibt bei Listen bestehen.

3.2 Selektion a la Google

Programm 10: Gib alle Personen, die das Wort Lechfeld enthalten.
ottos.tab
avec Lechfeld

3.3 Präzisierte Selektion

Programm 11: Gib mir alle Daten über die Person(en) Guericke.
ottos.tab
avec Guericke in NAME

Spaltennamen enthalten in o++oPS-Programmen keine Kleinbuchstaben. Enthält ein Wort einen Kleinbuchstaben so wird es als Text (String) gewertet. Soll der Text Leerzeichen enthalten, so muss er in Hochkomma geschrieben werden z.B. “Otto von Guericke“. "in": jedes Wort der linken Seite kommt in der Menge der Worte der rechten Seite vor. Klein und Großschreibung findet hierbei keine Berücksichtigung.
Programm 12: Gesucht sind alle in Deutschland Geborenen.
ottos.tab
avec De in GEBORENIN
Programm 13: Gesucht sind alle Nichtadligen.
ottos.tab
sans Von in NAME

3.4 Umstrukturierung

Programm 14: Gesucht sind alle Taten von Otto dem Großen.
aus ottos.tab
avec “otto der Grosse“ in NAME
gib TATl
Programm 15: Gib zu jedem Jahr alle Taten mit Namen.
ottos.tab
gib JAHR,(TAT, NAME l)m

Mit "gib" kann beliebig umstrukturiert werden. Der Nutzer kann ein beliebiges Schema oder eine ganze TTD angeben. Die Daten werden nach Jahr sortiert. Neben Mengen (m), werden auch Multimengen (b=bag) sortiert. Durch "A1,A2,...m-" und "A1,A2,...b-" wird nach A1,A2,.. abfallend sortiert. Bei Listen (l) verbleibt die Inputreihenfolge und mit l- wird die Reihenfolge umgekehrt.

3.5 Spalten vergessen (wegnehmen)

Programm 16: Gib alle Daten vom 19.ten Jahrhundert ohne die Spalte Jahr.
ottos.tab
avec JAHR >= 1800 & JAHR < 1900
weg JAHR

3.6 Aggregationen in verschiedenen Quellebenen

Programm 17: Wie viele Personen und wie viele Taten enthält die Datei ottos.tab.
aus ottos.tab
gib ANZPERS, ANZTAT
    ANZPERS:=NAME! ++1
    ANZTAT:=TAT! ++1

3.7 Aggregationen ohne GroupBy in mehreren Zielebenen

Programm 18: Gesucht sind die Anzahl der Personen und für jedes Jahrhundert und die Anzahl der Taten.
ottos.tab
JAHRH:=JAHR : 100 zahl +1
gib ANZ_PERS,(JAHRH,ANZ_TAT m) ANZ_PERS:= NAME! ++1
    ANZ_TAT:= TAT! ++1
Durch vier Leerzeichen am Anfang einer Zeile wird diese mit der vorangehenden Zeile zu einer logischen Einheit (eine Zeile) verbunden.

3.8 Selektion ohne Having

Programm 19: Gesucht sind alle Personen mit mehr als 2 Taten.
ottos.tab
avec TATl ++1 > 2
Programm 20: Gesucht sind zu jedem Jahrhundert die 2 letzten Taten.
ottos.tab
JAHRH:=JAHR : 100 zahl +1
gib JAHRH,(JAHR,TAT b) m
avec JAHR! JAHR pos- < 3

3.9 Vorwärtsrekursion

Programm 21: In wie vielen Jahren verdoppelt sich die Wirtschaftskraft bei einem Wachstum von einem Prozent.
[JAHR! 0 .. 100]
BETRAG:= first 1. next BETRAG pred *1.01 at JAHR
avec BETRAG <= 2
"pred"=predecessor=Vorgänger.
Der erste Ausdruck (1.) ist der Wert des ersten Jahres (0). Der zweite Ausdruck (BETRAG pred*1.01) berechnet die restlichen Werte jeweils aus den Vorgängerwerten.

3.10 Unäre Zahlen

Programm 22: Vier Enkel bekommen je drei Äpfel. Wie viele Äpfel benötigt man?
[KIND! Ernst Clara Ulrike Sophia]
:= [APFEL! 3 mal |] at KIND # Erweiterung ohne Namen
++1 APFEL

Neben den grundlegenden elementaren Datentypen TEXT, WORT, BOOL (2 Wahrheitswerte si und no), ZAHL (ganze Zahlen) PZAHL (Kommazahlen aber mit Punkt (.) geschrieben) gibt es noch den Datentyp BAR, der nur ein Element-den Strich (|)- enthält.
Programm 23: (3+4)*5
aus [X! 3 mal |] , [X! 4 mal |]
:= [Y! 5 mal |] at X
++1 Y

3.11 Gewichteter Durchschnitt

Programm 24: Gesucht ist der Durchschnitt der Noten und ein gewichteter Durchschnitt aller Noten (einschließlich Klausurnoten K1 und K2) sowie der gewichtete Durchschnitt pro Fach.
NAME, (FACH,    KlAUl,  NOTEl l)m
Paul   Mathe    1 3     1 4
       Kunst    2 2     1 3 2 1 1
                        1 4 4 1
Emma   Mathe    1 4     3 2 4 2
# DUR:= KLAUl,NOTEl ++:
# GEWICHTETER_DUR := KLAUl ++:*0.6 + (NOTEl ++: *0.4)
gib FACH,GDUR m
    GDUR:= KLAUl ++:*0.6 + (NOTEl ++: *0.4)! ++:
rnd 2 # alle Zahlen werden 2 Stellen nach dem Komma gerundet

Es ist klar, dass der gewichtete Durchschnitt nur korrekt ist, wenn beide Klausurnoten vorhanden sind. Solange das nicht erfüllt ist, muss sich der Nutzer mit dem einfachen Durchschnitt oder einem Durchschnitt mit einer Klausurnote zufrieden geben. Letzterer erfordert auch mindestens eine Note sowie die erste Klausurnote.

3.12 Auswertung von Bankkonten

Programm 25: Wie viel habe ich 2013 und wie viel 2014 für Elektrizität bezahlt.
aus umsatz2013.csv, XX:=umsatz2014.csv
avec Strom
gib KOSTEN13,KOSTEN14
    KOSTEN13:=UMSATZ2013/BETRAG ! ++
    KOSTEN14:= XX/BETRAG ! ++

Durch das Komma im aus-Teil werden die beiden Tabellen nicht verbunden sondern nebeneinander gestellt, so dass bei Sparkassendateien folgende TTD entsteht:
TABMENT: UMSATZ2013,XX
UMSATZ2013, XX: (....,VERWENDUNGSZWECK,..., BETRAG,...l)
VERWENDUNGSZWECK,...: TEXT
BETRAG: PZAHL

3.13 Verbinden von Tabellen

Die beiden folgenden Programme beziehen sich auf 2 flache (relationale) Studententabellen der folgenden Typen:
students1.tab: STID, NAME, LOC?, SAL, DEPT m
exams1.tab: STID, COURSE, MARK l
Programm 26:Gesucht sind alle Studenten, die das Wort Algebra enthalten, mit allen ihren Prüfungen.
students1.tab
:= exams1.tab at DEPT
avec STUDENTS1/STID=EXAMS1/STID
weg EXAMS1/STID
avec Algebra in EXAMS1

Nach dem Entfernen der redundanten Spalte STID (weg) hat das aktuelle Tabment folgende TTD:
TABMENT: STUDENTS1
STUDENTS1: STID,NAME,LOC?,SAL,DEPT,EXAMS1 m
EXAMS1: COURSE,MARK l
MARK,STID: ZAHL
COURSE,DEPT,NAME,LOCATION,SEX: TEXT
Programm 27: Gesucht sind alle Studenten, die Algebra mit 1 belegt haben, mit allen Kursen, die sie belegt haben.
students1.tab
:= begin exams1.tab;; avec STID=STID';; weg STID end at DEPT
avec STID! (Algebra,1) inm EXAMS1
Nach der Erweiterung „:=“ hat das aktuelle Tabment die gleiche TTD wie die oben angegebene. Innerhalb von Unterprogrammen, die durch die Klammern „ begin end“ angezeigt werden, kann man sich durch „'“ auf die äußeren Spaltennamen beziehen. „inm“ (inmathematisch") ist insbesondere die Elementrelation und mengentheoretische Inklusion (Teilmengen- bzw. Teilkollektionsrelation).

3.14 Generierung eines kleinen Bildes

Programm 28: Generiere Punkte der Sinusfunktion und der Ableitung im Intervall [-4,4]. Füge die X-Achse mit 7 ganzzahligen Strichen ein.
[-4 ... 4!0.01]
SINE:= X sin
ABLEITUNG:=X+0.001 sin- (X sin) : 0.001
Y:=0 at X
:= [X2! -3 .. 3]
:= [Y2! -0.05 ... 0.05!0.01] at X2

Das ":=", das X2l einführt, kann auch durch ein Komma ersetzt werden. Damit die Punkte gesetzt werden, muss man "bild" anklicken.

4. Literatur