Visual Basic 6: Operatoren

Mit Variablen umgehen

Bearbeiten

Wie oben schon angeklungen, muss man mit den Variablen irgendwas machen können. Stellen wir uns die Konstante PI vor (wie gesagt: eine Variable, die nicht geändert werden kann). Was bringt mir jetzt PI?

Grundrechenarten

Bearbeiten

In Vertrauen darauf, dass die folgenden Formeln richtig sind werde ich die ganze Sache mal demonstrieren

Flächeninhalt = pi * Radius^2
Umfang = 2 * pi * Radius
Durchmesser = 2 * Radius

Das folgende Beispiel gibt den Umfang eines Kreises aus, wenn der Radius 55 ist:

Private Const PI As Double = 3.14159 ' nur eine Näherung, reelle Zahlen lassen sich nicht darstellen

Private Sub Command1_Click
    MsgBox PI * 2 * 55
End Sub

Hier gilt exakt das gleiche wie bei Taschenrechnern mit zweizeiligem Display oder in einer Tabellenkalkulation. Daher ist die nachfolgende Tabelle einfach zu verstehen:

+ Addition 9 + 4 = 13
- Subtraktion 9 - 4 = 5
* Multiplikation 9 * 4 = 36
/ Division 9 / 4 = 2.25
\ ganzzahlige Division 9 \ 4 = 2
mod Restoperator 9 mod 4 = 1
^ Potenzieren 9 ^ 4 = 6561

Das ganze wird natürlich höchst mathematisch von VB verarbeitet - es gilt Punkt vor Strich. Ist eine andere Regelung gewünscht, müssen Sie entsprechend Klammern setzen. Als Klammern kommen nur die ganz normalen runden Klammern in Frage: ( und ). Alle anderen Spielereien mit irgendwelchen eckigen und geschweiften Klammern {} [], wie bei manchen Mathelehrern zu Schulzeiten gesehen,werden von VB nicht akzeptiert. Diese haben in anderen Sprachen wie C++ oder PHP ganz andere Bedeutungen und: ab und zu kommt es mal vor, dass man mehr als 3 Schachtelungen braucht. Dann hätte dieses System sowieso ein ganz anderes Problem.

1 + 2 * 3 + 4 = 11
(1 + 2) * 3 + 4 = 13
1 + 2 * (3 + 4) = 15
(1 + 2) * (3 + 4) = 21

Achtung: Das folgende Beispiel demonstriert den Unterschied zwischen dem echten mathematischen Modulo und dem, der in Visual Basic implementiert ist:

MsgBox 1 Mod 4 & vbCrLf & 0 Mod 4 & vbCrLf & "Falsch: " & -1 Mod 4

Nicht ideal, aber mathematisch korrekt ist die folgende Funktion zur Moduloberechnung:

Function Modulo(Zahl As Long, Modul As Long) As Long
If Zahl > 0 Then
    Modulo = Zahl Mod Modul
ElseIf Zahl = 0 Then
    Modulo = 0
Else
    Modulo = (Modul - (Abs(Zahl - Modul) Mod Modul)) Mod Modul
End If
End Function

Anmerkung zum Rechnen mit Restklassen: Beispiel m = 5, dann ist [3] = ...-7, -2, 3, 8, 13... -7 mod 5 ist mit -2 zwar Bestandteil der Restklasse. Ihr Standardrepräsentant 3 müsste dann durch Addieren von 5 ermittelt werden.

Texte verknüpfen

Bearbeiten

Das kaufmännische Und-Symbol kann Texte, Zahlen usw. direkt hintereinanderhängen. Werden Texte verarbeitet, dann wird dieser Operator recht häufig eingesetzt. Bis jetzt hatten wir immer nur Zahlen ausgegeben, wie bei der obigen Berechnung des Umfangs. Um eine sinnvolle Darstellung der Berechnung zu erreichen, kann mit Hilfe des &-Operators die Einheit angehängt oder gar eine Beschreibung des Ergebnisses voran gestellt werden. Passen Sie den obigen Code bitte an:

Private Const PI As Double = 3.14159

Private Sub Command1_Click()
    MsgBox "Der Umfang eines Kreises mit dem Radius=55 beträgt: " & (PI * 2 * 55)  & " cm" 
End Sub

Binäre Operatoren

Bearbeiten

Ein Programmieranfänger wird zwar in den seltensten Fällen wissen müssen, wie die binären Operatoren funktionieren - aber erwähnen möchte ich deren Funktionsweise dennoch.

Die ganzen Berechnungen und Verarbeitungen eines Computers basieren darauf, dass der Computer nur zwischen Zuständen (meist als 0 und 1 betrachtet) unterscheiden kann. Wir denken uns jetzt einfach mal zwei zufällige Zahlen, und schreiben diese in binärer Form auf. Ich werde die beiden Binärwerte auf 8 Bit (= 1 Byte) bringen und der Übersichtlichkeit halber gliedern:

24: 00 011 000
42: 00 101 010

Die ganzen Operationen lassen sich übrigens mit jedem handelsüblichen Taschenrechner mit OR/AND/XOR-Tasten nachvollziehen.

Erst mal: Warum ist 00011000 = 24? Ganz einfach: Jedes Bit steht für eine Zweier-Potenz, womit auch erklärt wäre, warum bei 8 Bit 256 verschiedene Werte existieren können (vergleiche mit den Datentyp Byte und dessen Wertebereich):

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128

Die Zählung beginnt von hinten. Es werden alle Bits, die gesetzt (= 1) sind (also das 3. und 4. Bit von rechts (Zählung beginnt bei 0)) zusammengezählt.

Position: 76543210
    Bits: 00011000

Bit 3 = 2^3 = 8, Bit 4 = 2^4 = 16. 16 + 8 entspricht 24, und das Geheimnis wäre gelüftet.

Streng genommen müsste man das Ergebnis der Potenz mit dem Wert an der betroffenen Stelle multiplizieren:

0 *   1 =  0
0 *   2 =  0
0 *   4 =  0
1 *   8 =  8
1 *  16 = 16
0 *  32 =  0
0 *  64 =  0
0 * 128 =  0

Wären alle Stellen Einsen, käme man auf 255, und nicht auf 256.

Zum Vergleich lässt sich die Sache natürlich auch auf unser Dezimalsystem übertragen:

10^0 = 1
10^1 = 10
10^2 = 100

Die Zahl 283 (auch hier ist der kleinste Wert ganz hinten!) würde so aufgebaut sein:

3 *   1 =   3
8 *  10 =  80
2 * 100 = 200

Im Grunde ließe sich so auch das Hexadezimalsystem erklären, das Octalsystem und vieles mehr.

Und noch was: Wer die Polynomdivision kann, kann das auch mit x^0, x^1, x^2 (wenn x = 10) für jede Dezimalzahl durchführen, da gibt's dann nicht nur +, sondern auch -... Hier ein Beispiel: (2x^2 + 8x + 3) : (2x + 4) wäre soviel wie 283 / 24.

AND, deutsch UND, ist ein recht netter Operator, den man in den meisten Fällen dazu verwendet, zu prüfen, ob ein bestimmtes Bit gesetzt ist.

Ich werde Ihnen die Binären Operatoren mittels der beiden folgenden Zahlen erklären:

053: 00110101
150: 10010110

Beginnen wir also mit einem AND. AND bedeutet, dass ein Bit übernommen wird, wenn es in beiden Zahlen vorkommt:

053: 00110101
150: 10010110
 --> 00010100 --> = 20 (Dezimal)

Der Bitweise Vergleich bei AND:

 0 AND 0 = 0
 0 AND 1 = 0
 1 AND 0 = 0
 1 AND 1 = 1

Häufige Anwendungen in Visual Basic:
1.Testen ob ein Bit gesetzt (=1) ist

'Hinweis: Ein eingeklammerter Vergleich 
'         gibt einen Wahrheitswert zurück 
Function IstBitGesetzt(Wert,Bit)as Boolean
 IstBitGesetzt = ((Wert AND (2^Bit))<>0)
End Function

Oder direkt in einer IF-Anweisung

'Jeder Wert der nicht 0 ist wird bei IF als TRUE interpretiert
If Wert AND (2^Bit) Then
  ...

Als praktische Anwedung:

'Verwendet man einen Booleanwert in einer Berechnung
'wird FALSE als 0 und TRUE als -1 interpretiert
Function HatMonat31tage(Monat) as Boolean
 If (Monat<1) or (Monat>12) Then Exit Function
 Dim Test as Byte
 'Wenn Monat < 8 ist 1 abziehen
 Test = Monat + (Monat<8)
 'in Test ist jede gerade Zahl (Bit0=0)
 'ein Monat mit 31 Tagen
 HatMonat31tage = ((Test AND 1) = 0)
End Function

2.Löschen eines Bit in einem Wert

Function LöscheBitInWert(Wert,Bit) as Byte
 LöscheBitInWert = Wert AND (255-(2^Bit))
End Function

3.Schnelles Überprüfen der Teilbarkeit durch 2 oder 4 ...

Function IstGerade(Wert) as Boolean
 IstGerade = ((Wert AND 1) = 0)
End Function

Als praktische Anwendung:

'Hinweis: Der Vorgabewert einer Variablen (oder 
'         Funktion) vom Typ Boolean ist FALSE
Function IstSchaltjahr(Jahr) as Boolean
 'Wenn Jahr nicht durch 4 teilbar Function mit FALSE beenden
 If (Jahr AND 3)>0 Then Exit Function
 'Wenn Jahr nicht durch 100 teilbar Function mit TRUE beenden
 if (Jahr Mod 100)>0 then IstSchaltjahr=True: Exit Function
 Dim Jahrhundert
 Jahrhundert=Int(Jahr/100)
 IstSchaltjahr=((Jahrhundert AND 3)=0)
End Function

OR ist das ODER im Sinne ENTWEDER x ODER y ODER BEIDES:

053: 00110101
150: 10010110
 --> 10110111 --> = 183 (Dezimal)

Hier wird das Bit jeweils gesetzt (=1), wenn mindestens eines aus den beiden Zahlen 1 ist (Ich komme morgen nicht, wenn es regnet oder gewittert --> Es kann natürlich auch regnen UND gewittern).

Und noch was wichtiges: Auch wenn es manchmal vorkommt, dass anstelle von OR einfach ein + verwendet wird - das klappt nur unter bestimmten Voraussetzungen, ist also falsch - bitte gewöhnen Sie sich das NICHT an!

XOR ist das ODER im Sinne von ENTWEDER x ODER y:

053: 00110101
150: 10010110
 --> 10101011 --> = 163 (Dezimal)

Hier wird das Bit nur übernommen, wenn das Bit in einer Zahl gesetzt und in der anderen nicht gesetzt ist. Eben Entweder/Oder (Sprachgebrauch: Entweder du räumst jetzt dein Zimmer auf oder du bekommst heute nichts zu Essen --> beide Aussagen zusammen gehen nicht (Aufräumen und nix Essbares))

Für NOT benötigt man nur eine Zahl. Im Grunde ist NOT einfach folgende Rechnung:

NeueZahl = -(AlteZahl) - 1

Zusammenfassung Binäre Operatoren

Bearbeiten

Was müssen Sie davon jetzt vorerst behalten? Eigentlich nur, dass bei AND beides sein muss, und bei OR nur eines der beiden. Sie benötigen diese zwei Dinge später bei den Bedingungen. Bis dahin können Sie beispielsweise bei Google Ihre neu erworbenen Fähigkeiten ausprobieren:

Rezept AND (Apfelkuchen OR Pflaumenkuchen): Sie suchen ein Rezept für eine Apfel- oder Pflaumenkuchen

Rezept AND (Apfel OR Pflaumen) AND (Kuchen OR Torte): Wie oben, aber es kann auch eine Torte sein

Rezept AND Kuchen AND Apfel AND Pflaumen: Ein Kuchen, der Äpfel und Pflaumen enthalten soll.

Google wird Sie übrigens darauf aufmerksam machen, dass Sie AND nicht explizit angeben müssen - allerdings ist das recht praktisch, um das Prinzip zu verdeutlichen.

Ein Array ist eine Art Sammlung mehrerer Variablen des gleichen Typs. Man kann es als Setzkasten mit begrenzter Anzahl an freien Plätzen betrachten, welcher eine endliche und genau abzählbare Menge an Elementen enthält... Nehmen wir einfach mal an, wir möchten unsere Lieblingsfarben irgendwie speichern... Der Einfachkeit halber sind dies Rot, Grün, Blau und Gelb, da VB dafür bereits Konstanten (hatten wir schon, ich hoffe Sie haben das noch nicht vergessen) definiert hat.

Ein Array wird meistens wie folgt definiert:

Gültigkeitsbereich VarName([Untergrenze,]Obergrenze) [As Typ]

Konkrete Beispiele:

Dim TemperaturenInDeutschland(400) As Single
Dim GestoppteZeiten(400) As Date
Dim OffeneRechnungen(1000) As Long

Zu beachten ist hierbei, dass die Zählung bei 0 beginnt, (400) legt also fest, dass das Array exakt 401 Elemente enthält. Ist etwas anderes gewünscht, muss der Beginn per Hand festgelegt werden:

Dim ArrayMit50Elementen(100 To 149)

Das Array enthält exakt 50 Elemente.

Der Zugriff auf Arrays erfolgt ähnlich der Deklaration (Buxtehude ist eine Konstante, deren Deklaration ich weggelassen habe):

ArrayName(Index) = NeuerWert
Temperaturen(Buxtehude) = 12.3

Sinnvoll sind Arrays meistens nur im Zusammenhang mit Schleifen zu gebrauchen, die ich später erklären werde.