Grundlagen der Progammierung
Variablentypen

Folgende grundlegende Datentypen gibt es in Visual Basic.

Datentyp Bedeutung Bereich Größe
Byte vorzeichenlose Ganzzahl 1 bis 255 1 Byte
Boolean Boolescher Datentyp TRUE oder FALSE 2 Bytes
Integer Vorzeichen behaftete Ganzzahlen (16-Bit) -32,768 bis 32,767 2 Bytes
Long Vorzeichen behaftete Ganzzahlen (32-Bit) -2,147,483,648 bis 2,147,483,647. 4 Bytes
Single Gleitpunkt- zahlen (einfache Genauigkeit) -3.402823E38 bis -1.401298E-45; 1.401298E-45 bis 3.402823E38 4 Bytes
Double Gleitpunkt- zahlen (doppelte Genauigkeit) -1.79769313486232E308 bis -4.94065645841247E-324; 4.94065645841247E-324 bis 1.79769313486232E308 8 Bytes
Currency Währung (geeignet für Berechnungen mit hoher Genauigkeit) -922,337,203,685,477.5808 bis 922,337,203,685,477.5807 8 Bytes
String Zeichenfolge 0 bis ca. 2 Milliarden (ca. 65,400 für Microsoft Windows 3.1 und früher) 10 Bytes + String länge
Date Datum 01.01.100 bis 31.12.9999 8 Bytes

Neben diesen Datentypen gibt es noch Strings fester Länge, sowie die Datentypen Object und Variant. Man kann ferner eigene zusammengesetzte Datentypen und Arrays definieren. Einen Record kann man mit Hilfe der TYPE-Anweisung vereinbaren.

Variablenvereinbarung

Die Variablen Deklaration hat die Aufgabe, dem Compiler/Interpreter mitzuteilen, dass man eine Variable mit dem angegebenen Namen und dem festgelegten Typ ab sofort im kommenden Code - Abschnitt benutzen will. Dieser kann nun entsprechend viel Platz im Speicher, d.h. im Allgemeinen auf dem Stack, anfordern.
In welchem Programmbereich die Variable nun gilt, ist verschieden. Theoretisch kann sie nur in der aktuellen Prozedur oder aktuellen Funktion, innerhalb des Moduls, der Klasse oder im gesamten Programm gelten.
Eigentlich muss man in Standard-Basic keine Variablen vereinbaren. Man sollte sich aber angewöhnen, alle Variablen zu vereinbaren. Mit OPTION EXPLICIT im Deklarationsabschnitt kann man die Variablen Deklaration erzwingen, d.h. nicht vereinbarte Variablen erzeugen einen Fehler. Der Vorteil bei der erzwungenen Deklaration ist, dass man bei einem Tippfehler in einem Variablennamen eine Fehlermeldung bekommt, und diese nicht - wie sonst - als neue Variable aufgefasst wird. Die Variablen Deklaration hat die folgende Syntax:

DIM Variablenname[([Index])][AS [New] Typ] [, Variablenname[([Index])][AS [New] Typ]]

Der Variablenname muss wieder ein gültiger Bezeichner, Typ ein gütiger Datentyp sein. Die Indizes werden zur Deklaration von Arrays verwendet (s.unten). Beispiel: Variablen Vereinbarung mit DIM
Um eine Variable x vom Typ Integer und s vom Typ String zu deklarieren nimmt man folgenden Code:

DIM x AS INTEGER DIM s AS STRING

Ausserdem gibt es noch die Möglichkeit Arrays zu vereinbaren. Arrays sind ein- oder mehrdimensionale Felder (Vektoren oder Matrizen) bestehend aus einer festen Zahl von Elementen gleichen Datentyps. Sie enthalten also homogene Daten, während Records ja aus vollkommen unterschiedlichen Datentypen zusammengesetzt sein können.
Zur Vereinbarung von Arrays wird zwischen dem Variablennamen und der AS Klausel in Klammern ein- oder mehrdimensionale Arraygrenzen festgelegt. Die Anzahl der Dimensionen eines Arrays kann theoretisch 60 betragen. Die Syntax für die Arraygrenzen ist:

[Untergrenze TO] Obergrenze [,[Untergrenze TO] Obergrenze] . . . Die Angabe Untergrenze kann entfallen. Dann wird standardmäßig 0 als Untergrenze genommen. Mit der OPTION BASE Anweisung kann man diesen Standardwert auch auf 1 setzen. Beispiel: Deklaration eines Arrays
Im folgenden Beispiel definieren wir einen Vektor mit drei Komponenten (0 bis 2), eine 11x11 Matrix und ein 64x64 Felder großes Schachbrett.
DIM Werte (2) AS Integer DIM Matrix (0 TO 10, 0 TO 10) AS SINGLE DIM Schachmuster (1 TO 64, 1 TO 64) AS INTEGER

Zur Laufzeit kann man die Unter- und Obergrenze eines Arrays beliebiger Dimension durch die Funtkionen LBOUND und UBOUND bestimmen. Syntax von LBOUND und UBOUND

LBOUND (Array[, Dimension]) UBOUND (Array[, Dimension]) Dabei ist Array ein Variablename eines deklarierten Arrays und Dimension gibt die Nummer der fraglichen Dimension an. Für die erste Dimension muss 1, für die zweite 2, usw. angegeben werden. Wird die Dimension weggelassen, so wird standardmäßig die erste Dimension angenommen. Beispiel: Unter- und Obergrenze eines Arrays bestimmen
Es sei der folgende Array vereinbart:
DIM a (3 TO 7, 0 TO 4, 1 TO 10) AS INTEGER Die Funktionen ergeben dann:

Dimension Untergrenze LBOUND Obergrenze UBOUND
1 LBOUND (a, 1) = 3 UBOUND (a, 1) = 7
2 LBOUND (a, 2) = 0 UBOUND (a, 2) = 4
3 LBOUND (a, 3) = 1 UBOUND (a, 3) = 10

Variablenzuweisung

Im Gegensatz zu Variablen Deklaration ist die Variablen Zuweisung oder auch Variablen Definition dafür zuständig, Werte an bereits vereinbarte Variablen zuzuweisen. Der Zuweisungsoperator ist dabei das Istgleich -Zeichen '='. Wie schon erwähnt werden Elemente eines Records über den Selektor '.' angesprochen, einzelne Elemente eines Arrays werden durch Angabe eines ein- oder mehrdimensionalen Index angesprochen.
Die Syntax der Zuweisung ist:

[Variablenname] = [Wert] Beispiel: Variablenzuweisung DIM x AS INTEGER, s AS STRING, a (10,20) AS SINGLE x = 23 s = "HALLO, Welt!" a(0,0) = 2.0

Strings werden also auch mit Hilfe des Zuweisungsoperators definiert! (Insbesondere sind keine Verrenkungen wie in C oder C++ nötig.). Zu beachten ist, dass der Zuweisungsoperator identisch mit dem Vergleichsoperator ist! Vgl. dazu den nächsten Abschnitt.

Beispiel: Zugriff auf ein Array
In diesem Beispiel wird für einen Array v (mit den Grenzen 0 bis 2), der einen Vektor darstellt, die Länge berechnet. Sqr(x) ist dabei die Quadratwurzel der Zahl x und ^ ist der Operator für die Potenzierung (vgl. nächster Abschnitt). Auf die einzelnen Komponenten wird mit v(i) zugegriffen.

DIM v(2) AS SINGLE DIM length AS SINGLE length = sqr(v(0)^2 + v(1)^2 + v(2)^2)

Gütigkeitsbereich

Der Güigkeitsbereich einer Variablen ist davon abhängig, wo sie deklariert ist und ob sich irgendwelche Prädikate vor der Vereinbarung befinden.
Eine Variable, die in einer Prozedur oder einer Funktion deklariert sind, sind grundsätzlich lokal, also auch nur in dieser Funktion/Prozedur verwendbar. Deklarationen im Bereich 'declarations' eines Moduls sind modulspezifisch. Steht vor einer modulspezifischen Deklaration das Schlüsselwort GLOBAL kann die Variable überall im Programm angesprochen werden.

Beispiel: Globale und lokale Variablen
In einer Prozedur oder Funktion würde eine lokale Variable vereinbart, im Bereich "declarations" eines Moduls würde eine modulspezifische Variable vereinbart.

DIM x AS INTEGER

Folgende Anweisung (im Bereich "declarations" eines Moduls) vereinbart eine globale Variable.

GLOBAL x AS INTEGER

Operatoren

Visual Basic bietet eine Reihe von Operatoren, die sich folgendermaßen einteilen lassen:
Arithmetische Operatoren

- Addition
- Subtraktion
* Multiplikation
/ Division
\ Ganzzahldivision
MOD Modulo - Operator (Rest bei Ganzzahldivision)
^ Exponentiation (Potenzierung)
AND Bitweises Und
OR Bitweises Oder
XOR Bitweises exklusives Oder

Vergleichs-Operatoren

= Istgleich
< echt kleiner
> echt größer
<= kleiner gleich
>= größer gleich

Syntax

ergebnis = Ausdruck1 Vergleichsoperator Ausdruck2 ergebnis = objekt1 Is objekt2 ergebnis = string Like muster

es gilt:

ergebnis Eine numerische Variable. Sinnvollerweise eine boolesche Variable. Ausdruck Zwei beliebige Audruck gleichen Datentyps object Ein Objektname string Eine beliebige Zeichenfolge Muster Eine beliebige Zeichenfolge

Werden zwei Ausdrücke verschiedenen Typs verwendet, so wird - falls möglich - eine implizite Datentyp-Umwandlung vorgenommen.

String-Operatoren

= Zuweisung
= Vergleich
< kleiner
> größer
<= kleiner gleich
>= größer gleich
+ oder & Verkettung von Zeichenketten


Bei der Verkettung von Zeichenketten sollte der Operator '&' bevorzugt werden, da dieser nicht mit dem Additionsoperator verwechselt werden kann.

Logische Operatoren

Operator Bedeutung In Zeichen Ist TRUE genau dann, wenn
AND Und A AND B sowohl A und B TRUE sind.
OR Oder A OR B A oder B oder beide TRUE sind.
XOR Exklusives Oder A XOR B entweder A oder B, aber nicht beide TRUE sind.
NOT Logische Nicht NOT A A FALSE ist
IMP Implikation A IMP B A gilt, so ist auch B TRUE.
EQV Äquivalenz A EQV B A genau dann gilt, wenn B gilt.

Arithmetische Operatoren:

Potenzierung (^), Negation (-), Multiplikation und Division (* und /), Ganzzahl-Division (\), Modulo-Artihmetik (Mod), Addition (+ und -)

Vergleichs-Operatoren:

Gleichheit (=), Ungleich (< >), Kleiner (<), Größer (>), Kleiner gleich (=<), Größer gleich (>=)

Logische Operatoren:

Negation (NOT), Konjunktion (AND), Disjunktion (OR), Exklusives Oder (XOR)

Mathematische Funktionen

Visual Basic besitzt eine Reihe von mathematischen Funktionen. Die Syntax ist dabei stets die gleiche. Im Folgenden stehe F für den Funktionsnamen. x ist eine numerische Variable. Bei besonderen Voraussetzungen an x (z.B. x > 0) wird dies in der Einzelbesprechung separat behandelt.

F(x)

Beispiele sind zu jeder Funktion separat aufgeführt. Bei den trigonometrischen Funktionen ATN, COS, SIN und TAN werden Winkel stets im Bogenmaß angegeben. Dieser liegt dann im Bereich -2*PI und +2*PI, während ein Winkel in Grad zwischen 0° und 360° liegt.
Zur Umwandlung eines Winkels ALPHA im Gradmaß in einen Winkel X im Bogenmaß und umgekehrt gelten die folgenden Formeln, wobei PI die Kreiszahl ist (PI ist ungefähr 3.1415926535897932):

X = ALPHA * PI /180 ALPHA = X * 180 / PI

Absoultbetrag: ABS
ABS liefert den Absolutbetrag einer Zahl. Für positive x ist ABS(x) = x, für negative x ist ABS(x) = -x. Beispielsweise wird durch

x = ABS(-123.66) x = ABS(123.66)

in beiden Fällen x auf 123.66 gesetzt. Arcus Tangens: ATN
ATN berechnet den Arcus Tangens von x. Der Arcus Tangens ist die Umkehrfunktion zum Tangens. Das Ergebnis ist dabei ein Winkel im Bogenmaß.

PI = 4*ATN(1)

Mit Hilfe von ATN wurde hier PI ausgerechnet, denn ATN(1) liefert PI/4 zurück. Siehe dazu auch das Beispiel zu TAN. Cosinus: COS
COS liefert den Cosinus von x, wobei x im Bogenmaß gegeben sein muss. Der Cosinus berechnet dabei das Verhältnis zwischen Ankathete und Hypothenuse in einem rechtwinkligen Dreieck. Das Ergebnis liegt stets zwischen -1 und 1.

PI = 3.1415926535897932 a = COS(0) b = COS(PI/4)

In diesem Beispiel ist a = 1 und b = 0. Vgl. dazu auch den Sinus. Exponentialfunktion: EXP
Die Exponentialfunktion EXP berechnet ex, wobei e die Eulersche Zahl ist (e ist ungefähr 2.718282). Das Ergebnis ist stets positiv. Die Umkehrfunktion zu EXP ist der Logarithmus LOG

a = EXP(0) e = EXP(1)

In diesem Beispiel ist a = 1 und e ist die Eulersche Zahl. Floor -Funktion: FIX
Die FIX Funktion liefert die größte ganze Zahl z mit z < x. In der Mathematik ist das die so genannte Floor- Funktion oder auch manchmal Gaußsche Klammer.

z1 = FIX(12.5) z2 = FIX(-12.5)

In diesem Beispiel setzt z1 = 12 und z2 = -12. Man beachte den Unterschied zur INT Funktion! Ganzzahlanteil: INT
Die INT Funktion schneidet von einer reellen Zahl die Nachkommastellen ab und liefert diese Zahl zurück.

z1 = INT(12.5) z2 = INT(-12.5)

In diesem Beispiel setzt z1 = 12 und z2 = -13. Zu beachten ist der Unterschied zur FIX Funktion!

Natürlicher Logarithmus: LOG
LOG berechnet den Logarithmus zur Basis e (die Eulersche Zahl, e ist ungefähr 2.718282). Dies ist der so genannte natürliche Logarithmus. Es sind nur positive Argumente erlaubt.

a = LOG(EXP(x))

Durch diese Anweisung ist a = x gesetzt worden, da LOG die Umkehrfunktion von EXP ist. Wird ein Logarithmus zu einer anderen Basis n benötigt, so wird dieser durch folgende Funktion berechnet:

FUNCTION Logn(x) Logn = LOG(x) / LOG(n) EXIT FUNCTION

Zufallszahl: RND
RND liefert eine (Pseudo-)Zufallszahl zurück, die größer oder gleich 0 und echt kleiner als 1 ist. Das Argument x hat dabei eine besondere Bedeutung. Ist x < 0, so liefert RND stets die gleiche Zufallszahl.
Ist x = 0, so liefert RND die letzte Zufallszahl.
Ist x > 0 oder wird x weggelassen, so wird die nächste Zufallszahl in der Folge von Zahlen zurückgegeben. Um "zufällige" Werte zu erhalten, sollte man den Zufallszahlengenerator zu Beginn mit RANDOMIZE TIMER mit einem zufälligen Startwert (nämlich mit Hilfe der aktuellen Zeit) initialisieren.

Int((Obergrenze - Untergrenze + 1) * RND + Untergrenze)

Diese Anweisung liefert eine Ganzzahl zwischen den angegebenen Grenzen. Vorzeichenfunktion (Signum): SGN
SGN liefert je nach Vorzeichen des Arguments x die Werte -1 (für x < 0), 0 (für x = 0) oder +1 (für x > 0).

a = x * SGN(x)

Diese Anweisung hat die gleiche Wirkung wie a = ABS(x).

Sinus: SIN
SIN liefert den Sinus von x, wobei x im Bogenmaß gegeben sein muss. Der Sinus berechnet dabei das Verhältnis zwischen Gegenkathete und Hypothenuse in einem rechtwinkligen Dreieck. Das Ergebnis liegt stets zwischen -1 und +1.

PI = 3.1415926535897932 a = SIN(0) b = SIN(PI/4)

In diesem Beispiel ist a = 0 und b = 1. Vgl. dazu auch den Kosinus

Quadratwurzel: SQR
Die Funktion SQR berechnet die positive Quadratwurzel einer nicht-negativen Zahl x. Für negative Argumente wird ein Fehler ausgelöst. Es gilt: SQR(x)^2 = x.

a = SQR(x) b = a ^ 2

Die Variable b enthält den gleichen Wert wie x. Tangens: TAN
Diese Funktion liefert den Tangens des Winkels x. Dabei muss x im Bogenmaß angegeben werden. Das Ergebnis ist das Verhältnis Gegenkathete durch Ankathete in einem rechtwinkligen Dreieck, wobei der von Hypothenuse und Ankathete eingeschlossene Winkel x ist.

PI = 3.1415926535897932 result = TAN(PI/4)

In diesem Beispiel wird 1 zurückgegeben, da die beiden Katheten bei x = PI/4 gleich lang sind.

String-Operationen

Visual Basic bietet eine Reihe von Funktionen auf Strings an, die im Folgenden besprochen werden. Abschließend werden dazu noch ein paar Beispiele gegeben.
In diesem Abschnitt sei s stets eine Variable vom Typ String, a, p und l seien vom Typ Integer oder Long.

Länge eines Strings: LEN
Um die Länge eines Strings zu ermitteln, verwendet man die Funktion LEN. Die Syntax lautet folgendermaßen:

LEN(s)

ASCII-Code eines Zeichens: ASC
Um den ASCII-Code eines Zeichens zu erhalten, verwendet man die ASC Funktion. (ASCII ist eine Abkürzung für American Standard Code for Information Interchange).

ASC(s)

Dabei wird stets der ASCII-Code des ersten Zeichens zurückgegeben. Ist s leer, so wird ein Fehler ausgelöst. Der Rückgabewert liegt zwischen 0 und 255. (Eigentlich ist der ASCII-Code nur 7 Bit lang, liegt also zwischen 0 und 127. Von der Funktion wird der in Windows übliche ANSI-Code zurückgegeben. ASCII und ANSI stimmen zwischen 0 und 127 überein. ANSI ist also eine Erweiterung von ASCII.)

Zeichen mit bestimmten ASCII-Code: CHR
Ist a eine Zahl zwischen 0 und 255 kann mit Hilfe der CHR Funktion ein Zeichen mit dem ASCII-Code a erzeugt werden.

CHR(a)

Anfang eines Strings: LEFT
Die Funktion LEFT gibt das Anfangsstück eines Strings s zurück, wobei das Resultat die Länge l hat.

LEFT(s, l)

Ist l größer als die Länge von s, wird ganz s zurückgegeben.

Mittelteil eines Strings: MID
Die Funktion MID gibt das Mittelstück eines Strings s, das an Position p beginnt und die Länge l hat, zurück.

MID(s, p, l)

Ist p größer als die Länge von s, so ist das Ergebnis leer, überschreitet p+l die Stringlänge, so ist das Ergebnis ein entsprechend kürzeres Stück.

Ende eines String: RIGHT
Mit der Funktion RIGHT wird das Endstück eines Strings s zurückgegeben, das die Länge l hat.

RIGHT(s, l)

Ist p größer als die Länge von s, so ist das Ergebnis ein entsprechend kürzeres Stück.

Erzeugen von Leerstrings: SPACE
Mit Hilfe der SPACE Funktion kann man einen String der Länge l erzeugen, der nur aus Leerzeichen besteht.

SPACE(l)

Eine Verallgemeinerung dieser Funktion ist die nun folgende STRING Funktion. Erzeugen eines Strings eines festen Zeichens: STRING
Um einen String der Länge l, der nur aus einem festen Zeichen besteht (das nicht notwendigerweise das Leerzeichen ist), benutzt man die STRING Funktion.

STRING(l, a) STRING(l, s)

Im ersten Fall wird der ASCII-Code des Zeichens übergeben. Im zweiten Fall ist das letzte Argument ein String. Das Ergebnis ist dann ein String der Länge l, der nur aus dem ersten Zeichen des Strings s besteht. Trimmen eines Strings: TRIM, LTRIM, RTRIM
Das Entfernen von führenden und/oder abschließenden Leerzeichen und Tabulatoren nennt man (links-, rechts-, beidseitiges) Trimmen. Für das Trimmen von Strings verwendet man die Funktionen TRIM (beidseitig), LTRIM (linksseitig) und RTRIM (rechtsseitig).

TRIM(s) LTRIM(s) RTRIM(s)

Beispiele: String-Operationen
Die folgenden Beispiele demonstrieren den Umgang mit den String-Operationen LEN, LEFT, MID und RIGHT.

DIM s1 AS STRING, s2 AS STRING, s3 AS STRING, s4 AS STING DIM l AS INTEGER s1 = "1234567890" ' Die Länge l ist 10 l = LEN(s1) ' s2 wird zu "123" s2 = LEFT(s1, 3) ' s3 wird zu "456" s3 = MID(s1, 4, 3) ' s4 wird zu "890" s4 = RIGHT(s1, 3)