Zum Inhalt springen

Gambas: Rechnen

Aus Wikibooks


Zurück zum Gambas-Inhaltsverzeichnis.


Einleitung

[Bearbeiten]

Wenn man ein bisschen mathematisch interessiert ist, kann man eine Programmiersprache wie Gambas sehr gut nutzen, um die Mathematik noch besser zu verstehen.

Umgekehrt kann man durch die Programmierung kleiner mathematischer Programme sehr viel über eine Programmiersprache lernen. Der Vorteil mathematischer Programme ist, dass sie meistens gut überschaubar sind und die Fehlerbeseitigung in kurzer Zeit vollzogen ist.

Außerdem kann man anfangs auch völlig auf eine Grafik verzichten und nur mit dem Direktfenster arbeiten, auch wenn die Grafik ja gerade den Reiz von KDE Programmen ausmacht.

Rechenausdrücke

[Bearbeiten]

Um längere Rechenausdrücke in Gambas korrekt zu berechnen, sollte man einige Vereinbarungen für mathematische Zeichen kennen, die in fast allen Basicdialekten gültig sind. Für die Multiplikation, die Division und die Potenzierung werden dabei andere Zeichen gebraucht, als die im Deutschen üblichen.

  • Die Addition (Zusammenzählen) erfolgt mit +
    • z.B. Print 8 + 8
  • Die Subtraktion (Abziehen) erfolgt mit -
    • z.B. Print 9 - 5
  • Die Multiplikation (Malnehmen) erfolgt mit dem Sternchen *
    • z.B. Print 5 * 5
  • Die Division (Teilen) erfolgt mit dem Schrägstrich /
    • z.B. Print 10 / 5
    • ergibt 2
    • Vorsicht bei Teilung mit oder ohne Rest
  • Die Potenzierung (Hochzahlen) berechnet man mit dem ^ Zeichen.
    • z.B. Print 8 ^ 2
    • ergibt 64
  • Die Klammern legen den Vorrang beim Rechnen fest 5 * (5 + 5)
    • Falsch ist 5(5+5), Richtig ist 5 * (5 + 5)

Für die Berechnung gelten folgende Regeln der Vorrangigkeit:

  • Zuerst werden die Klammern berechnet. Die innersten Klammern zuerst.
  • Bei den Operationen gilt die Rangfolge: Erst Potenzieren, dann multiplizieren oder dividieren, dann addieren oder subtrahieren.
  • Gleichrangige Ausdrücke werden von links nach rechts abgearbeitet.

Es gibt in Gambas nur ein Rechenzeichen für die Quadratwurzel SQR. Die höheren Wurzeln muss man anders berechnen: Hier gilt x-te Wurzel aus a ist gleich a^(1/x) (a hoch 1 durch x) Beispielsweise wird die 3-te Wurzel aus 27 so berechnet: 27^(1/3) = 3

Statt

schreibt man in Gambas: 36/2/3/6 oder 36/(2*3*6) = 1

Beachten Sie, dass das Minuszeichen einmal als Vorzeichen und einmal als Subtraktionszeichen gebraucht wird. Folgende Rechnungen sind gültig:

5 + -2 = 3
-5 * 3 = -15
5*-3 = -15
5/4 = 1,25 oder 1.25 je nach Ländereinstellung
20/2*5 = 50
20/2/5 = 2
20/(2*5)= 2
5*(2+3) = 25
2*(2+3)/(4+6) = 1
((2+3)*2)^2 = 100

Addy der Summierer

[Bearbeiten]

Wenn man eine Kolonne von Zahlen zusammenzählen will, verliert man schnell den Überblick, welche Zahl man schon eingegeben hat und welche nicht. Man kann dazu natürlich eine große Tabellenkalkulation anwerfen. Diese ist aber etwas kompliziert zu bedienen.

Einfacher soll diese Aufgabe Addy, ein kleines Summierprogramm erledigen. Auch eine nachträgliche Korrektur der Eingabe soll möglich sein.

Die Eingabe der Zahlen soll schnell erfolgen, am besten durch ein Return ohne Mausaktion.

Bei dem Programm können auch negative Zahlen summiert werden. Sie werden dann korrekt abgezogen. Auch das Zusammenzählen von Kommazahlen ist möglich.

Außerdem kann man Zahlenkolonnen via Zwischenspeicher übertragen.

Sehr hilfreich bei der Erstellung dieses Programms ist der Splitbefehl. CHR(10) als Trennzeichen ist in diesem Fall der Zeilenwechsel.

Was brauchen Sie? Holen Sie sich eine neue Form und nennen Sie diese wie Sie wollen. Holen Sie sich eine TextArea, eine TextBox und einen Commandbutton aus der Werkzeugkiste. Löschen Sie den Text aus den Textboxen bei den Eigenschaften (= Properties) Text.

So schaut das Ganze aus:

Der Programmcode dazu. Er steht hinter dem Befehlsbutton Summe:

PUBLIC SUB Button1_Click()
  DIM text AS String
  DIM summe AS Float
  DIM Elt AS String[]
  DIM Sb AS String

  text = TextArea1.Text
  Elt = Split(text, Chr(10))
  FOR EACH Sb IN Elt
    summe = summe + Val(sb)
  NEXT
  TextBox1.Text = summe
END

Das Programm ist doch ganz praktisch, oder was meinen Sie? Bei Kommazahlen erfolgt die Ergebnisausgabe noch inkorrekt mit dem englischen Punkt als Komma. Versuchen Sie diesen Fehler zu beheben.

In dem Programm bekommt man eine Fehlermeldung Type mismatch: Wanted Number, got Null instead wenn Sie z.B. versuchen Buchstaben statt Zahlen einzugeben.

Der Computer kann hier nur etwas mit Zahlen anfangen, nicht mit Buchstaben. Sie können den Fehler vermeiden, wenn Sie die Eingabe auf Ziffern, Kommas und Minuszeichen begrenzen. Auch ein Abfangen des Fehlers mit Catch ist sicher möglich.

Wollen Sie die Eingaben in Addy speichern. Dann schauen Sie sich doch folgende Erweiterung an: Gambas: Dateien#Datei laden und speichern mit Addyplus

Das Programm Addy regt an, um über einen kleinen Mittelwert- und Standardabweichungsrechner nachzudenken.

Potenzen

[Bearbeiten]

Folgendes Beispielprogramm zeigt den Umgang mit Potenzen. Es zeigt auch die dabei möglichen Fehler auf. Es arbeitet im Terminalmodus.

STATIC PUBLIC SUB Main()
  PRINT 4^3
  PRINT 3^4
  PRINT 4^1/2
  PRINT 4^(1/2)
  PRINT 8^0.333
  PRINT 8^(1/3)
  PRINT 8^1/3
  PRINT 2^(-2)
  PRINT 1/2^2
END

Die Ausgabe schaut so aus:

64
81
2
2
1,998614185981
2
2,666666666667
0,25
0,25

Frage dazu: Wozu wird hier der Befehl Static verwendet? Geht es auch ohne ihn?

Der Befehl Static wird im Terminalmodus automatisch von der GUI vergeben. Löscht man ihn weg, funktioniert das Programm nicht mehr und es erscheint eine Fehlermeldung: ERROR: #24: No startup method

Modulo oder Modulus (Rest beim Teilen)

[Bearbeiten]

Der MOD Befehl entspricht – einfach erklärt – dem Rest beim Teilen. Geht die Division auf, bleibt kein Rest (also 0).

Ein paar Beispiele sind (besonders für Programmieranfänger) sinnvoll für das Verständnis:

  • 10 MOD 5 ergibt 0 (Oft gemachter Fehler: Es kommt nicht 2 heraus. MOD ist nicht das selbe wie /)
  • 2 MOD 3 ergibt 2
  • 6 MOD 4 ergibt auch 2
  • 8 MOD 3 ergibt 2

Ein weiteres Beispiel zeigt folgendes Programm im Terminalbetrieb:

 STATIC PUBLIC SUB Main()
   DIM a AS Integer
   DIM b AS Integer
 
   b = 2
   FOR a = 10 TO 2 STEP - 1
     PRINT a MOD b
   NEXT
 END

Setzen Sie verschiedene Werte für b ein und schauen Sie sich die Ausgabe an. Falls Sie b = 0 setzen, dann erfolgt eine Fehlermeldung: Divsion by zero.

Lernprogramm Modus

[Bearbeiten]

Waybackmaschine aufrufen und dann unter www.madeasy.de/7/prgmodus.htm suchen.

Quersumme berechnen

[Bearbeiten]

Im folgenden Programm wird der Modus Befehl zur Berechnung der Quersumme einer mehrstelligen Zahl benutzt: Holen Sie sich eine neue Form und nennen Sie diese wie Sie wollen. Holen Sie zwei Textboxen aus der Werkzeugkiste.

Löschen Sie den Text aus den Textboxen bei den Eigenschaften (= Properties) Text.

Holen Sie sich einen Commandbutton dazu und benennen Sie diesen um.

Siehe http://www.madeasy.de/7/prgquer.htm

Hinter dem Befehlsfeld Quersumme steht folgender Code: Beachten Sie das hier das Divisionszeichen / nicht verwendet wird, sondern das Teilenzeichen ohne Rest \.

 PUBLIC SUB Button1_Click()
   DIM zahl AS Integer
   DIM Quersumme AS Integer
 
   zahl = Val(TextBox1.Text)
   DO WHILE zahl <> 0
     Quersumme = Quersumme + zahl MOD 10
     zahl = zahl \ 10
   LOOP
   TextBox2.Text = Str$(Quersumme)
 END

Gerade oder Ungerade

[Bearbeiten]

Den Modulus Befehl kann man nutzen, um zu überprüfen ob eine ganze Zahl gerade (teilbar durch 2) oder ungerade (nicht teilbar durch 2) ist.

Programm: Sie brauchen 2 Befehlsbuttons und 2 Textboxen auf der Form, um das Programm in Gang zu bekommen.

Benutzen Sie folgenden Code um die Eigenschaften der Steuerelemente automatisch einzurichten:

PUBLIC SUB Form_Open()
  Button1.Text = "Zufallszahl erzeugen"
  Button1.Move(16, 8, 176, 32)
  Button2.Text = "Gerade-Ungerade Testen"
  Button2.Move(16, 48, 176, 32)
  Textbox1.Text = ""
  Textbox1.Move(192, 8, 88, 32)
  Textbox2.Text = ""
  Textbox2.Move(192, 48, 88, 32)
END

Sie können die Eigenschaften natürlich auch mit der Hand über das Eigenschaftsfenster festlegen. Der eigentliche Code beginnt hier:

 PUBLIC SUB Button1_Click()
   Randomize()
   textbox1.Text = Str(Int(Rnd(1,101)))
 END
 
 PUBLIC SUB Button2_Click()
   DIM n AS Integer

   n = Val(textbox1.text)

   IF textbox1.Text = "" THEN textbox1.Text = Str(Int(Rnd(1,101)))

   IF n MOD 2 THEN
     textbox2.Text = "Ungerade"
   ELSE
     textbox2.Text = "Gerade"
   ENDIF
 END

Mit dem ersten Befehl wird eine ganze Zufallszahl zwischen 1 und 100 erzeugt. Mit dem zweiten Befehl wird die Teilbarkeit durch 2 überprüft.

Falls n eine ungerade Zahl ist, dann ist n MOD 2 gleich 1, denn es bleibt ein Rest von 1 übrig. Der Wahrheitswert ist true. Wenn kein Rest übrig bleibt ist der Wahrheitswert false.

Ausführlicher kann man auch schreiben:

IF n MOD 2 = true Then

Versuchen Sie es zu verstehen und probieren sie das Programm aus.

Übersicht der mathematischen Zeichen in Gambas

[Bearbeiten]

siehe Mathematische Zeichen in Gambas

Zahlendarstellung

[Bearbeiten]

Einfache Rechnungen mit ganzen Zahlen

[Bearbeiten]

Zahlen werden in Gambas zunächst ganz normal wie gewohnt gehandhabt. So ergibt der Ausdruck PRINT 8 + 8 in der Ausgabe 16.

PUBLIC SUB Form_Open()
  PRINT 8 + 8
END

Will man mit Zahlen im Programm länger arbeiten, muss man sie als Variable definieren. Die einfachste Form dafür ist die Variable Integer. Die Deklaration einer Zahlenvariable erfolgt dann z.B. mit Dim zahl AS Integer.

Im folgenden einfachen Beispielprogramm für die Addition aller Ziffern von 1 bis 10 werden 2 Zahlenvariablen i und k definiert. Sie durchlaufen beide eine Schleife von 1 bis 10 und werden addiert. Kopieren Sie das Programm in Gambas und lassen Sie es laufen. Ersetzen Sie das Pluszeichen durch andere mathematische Zeichen und prüfen Sie was passiert.

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   FOR i = 1 TO 10
     FOR k = 1 TO 10
       PRINT i + k & " ";
     NEXT
     PRINT
   NEXT
 END

Durch die erste Zeile mit dem Befehl Form_Open() startet das Programm sofort beim Aufrufen der Form. Mit den Befehlen DIM werden die Variablen i und k als ganze Zahlen (= Integer) festgelegt. Dann folgen 2 FOR - TO Schleifen, die verschachtelt sind. In der ersten Schleife wird die Variable i von 1 bis 10 hochgezählt. Bevor aber i zu einem höheren Wert springt, muss die innere Schleife für k immer wieder von 1 bis 10 abgearbeitet werden. In der Ausgabe mit dem Printbefehl werden dann i und k mathematisch verknüpft und im Direktfenster mit PRINT ausgegeben. Der Teil & " " fügt immer ein Leerzeichen zwischen die errechneten Zahlen i + k ein. Der Strichpunkt am Ende der Zeile verhindert einen Zeilenwechsel. So wird die Ausgabe in eine Zeile geschrieben.

Erst in der äußeren Schleife für i steht ein einsamer Printbefehl. Dieser bewirkt einen Zeilenvorschub jedesmal wenn ein neuer Wert für i angesagt ist. Der Zeilenwechsel erfolgt also immer nach 10 Zahlen in der Querausgabe. Beachten Sie bitte, dass die Schleifen mit dem Nextbefehl geschlossen werden. Beim Nextbefehl wird in Gambas auf die Angabe Next i oder Next k verzichtet. Der Computer weiß das selbst.

Wenn Sie die 2 Schleifen nicht verstehen, dann ersetzen sie einfach das Pluszeichen durch ein Komma oder einen Strichpunkt. Daraufhin starten Sie das Programm. Jetzt können Sie erkennen wie die Werte von i und k hochgezählt werden. Wenn Sie es immer noch verstehen, empfehle ich Ihnen den Einzelschrittmodus im Programmablauf.

Versuchen Sie das Programm zu vereinfachen und halten einen der Werte z.B. i konstant. Fügen Sie dazu z.B. eine Zeile i = 5 nach den DIM Befehlen ein und streichen Sie die äußere Schleife für den i Wert inklusive des Next Befehles.

Ihr Programm sollte dann so ausschauen:

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   i = 5
   FOR k = 1 TO 10
     PRINT i + k & " ";
   NEXT
   PRINT
 END

Die Variable i ist hier eigentlich überflüssig und kann auch noch herausgeworfen werden. Resultat:

 PUBLIC SUB Form_Open()
   DIM k AS Integer
   
   FOR k = 1 TO 10
     PRINT 5 + k & " ";
   NEXT
 END

Auch die Multiplikation ist einfach und wie gewohnt. Sie müssen dazu nur im obigen Additionsprogramm das Pluszeichen mit dem englischen Multiplikationszeichen, dem Sternchen "*" ersetzen.

Die Multiplikation zeigt z.B. ein einfaches Einmaleinsprogramm: Siehe auch http://www.madeasy.de/7/prgschleife2.htm

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   FOR i = 1 TO 10
     FOR k = 1 TO 10
       PRINT i * k & " ";
     NEXT
     PRINT
   NEXT
 END

Exponential Darstellung mit E

[Bearbeiten]

Wenn Sie folgendes Programm laufen lassen, dann erscheint in der Ausgabe nicht wie erwartet 10 100 1000 etc sondern ab der Zahl eine Million werden die großen Zahlen mit 1.E+8 und 1.E+10 abgekürzt. Der Buchstabe E heißt in diesem Zusammenhang 10 hoch. Die danach folgende Zahl mit einem Plus oder Minuszeichen davor ist die Zahl mit der die Zehn hochgenommen wird, also die Potenz.

1.E+8 heißt also genauer 1,0 *10^8 oder 1,0 * 10 hoch 8 oder 1,0 *108

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   i = 10
   FOR k = 1 TO 10
     PRINT k ^ i & " ";
   NEXT
 END

Noch einmal zur Wiederholung: Das große "E" bedeutet "Mal 10 hoch". Die Ganzzahl, die folgt gibt die Potenz von Zehn an mit der die Zahl zu multiplizieren ist. Eine andere Möglichkeit die Ganzzahl, die dem "E" folgt, zu betrachten ist, dass sie die Richtung und die Anzahl der Stellen angibt, in der der Dezimalpunkt zu verschieben ist. Positive Ganzzahlen bedeuten eine Rechtsverschiebung; negative Ganzzahlen bedeuten eine Linksverschiebung.

Rechenfehler

[Bearbeiten]

Übrigens ergibt das folgende Programm einen Rechenfehler.

PUBLIC SUB Form_Open()
  PRINT 1000000 * 1000000
END

Rechnen Sie alle Ihre Gambas Programme mehrfach nach, da öfter unerwartete Ergebnisse durch Variablenumwandlung und durch die im Englischen und Deutschen verschiedene Verwendung des Punktes und des Kommas in Dezimalbrüchen auftreten.

Beispiel: Deutsch 1/2 = 0,5 Englisch 1/2 = 0.5

Dieses Problem tritt aber in den meisten anderen Programmiersprachen auch auf und ist nicht Gambas spezifisch.

Die deutschen Mathematiker sollten sich bald möglichst an die englische Notation anpassen und auch gleich die Zeichen für die Multiplikation, Division und Potenzierung an die Computernotierung ändern.

Eine Länderliste mit ihren Dezimaltrennzeichen findet sich hier: http://www.f-i-t.net/dezimalTrennz/

Hochzählen, Runterzählen, Abschneiden, Runden etc INC, DEC, INT, FRAC

[Bearbeiten]

INC Hochzählen, 1 dazuzählen

[Bearbeiten]

Der Befehl INC zählt zu jeder numerischen Variable eins dazu. INC steht für Increment, d.h. heraufzählen.

Beispiel im Terminalmodus (d.h ohne Grafik)

STATIC PUBLIC SUB Main()
  DIM X AS Integer
  X = 7
  INC X
  PRINT X
END

Die Ausgabe erfolgt im Direktfenster und lautet: 8

Zweites Beispiel mit einem Array

 STATIC PUBLIC SUB Main()
   DIM A[3, 3] AS Float
   DIM X AS Integer
   DIM Y AS Integer
   
   X = 2
   Y = 1
   A[X, Y] = Pi
   INC A[X, Y]
   PRINT A[X, Y]
 END

Ausgabe: 4.14159265359

Man kann natürlich statt des INC Befehls auch einfach eins dazuzählen

INC X

Ist dasselbe wie

X = X + 1

Folgendes ist falsch und funktioniert nicht:

X = INC X

DEC Herunterzählen

[Bearbeiten]

Das Gegenteil von INC macht der Befehl DEC. Er zieht von der Zahl die 1 ab. DEC heißt auf englisch Decrement, d.h. herunterzählen.

Beispiel im Terminalmodus (d.h. ohne Grafik)

STATIC PUBLIC SUB Main()
  DIM X AS Integer
  X = 7
  DEC X
  PRINT X
END

Die Ausgabe erfolgt im Direktfenster und lautet: 6

 STATIC PUBLIC SUB Main()
   DIM A[3, 3] AS Float
   DIM X AS Integer
   DIM Y AS Integer
   
   X = 2
   Y = 1
   A[X, Y] = Pi
   DEC A[X, Y]
   PRINT A[X, Y]
 END

Ausgabe: 2,14159265359

Vorzeichen und Absolutwert Sgn, Abs

[Bearbeiten]

Sgn (Signum) Vorzeichen einer Zahl

[Bearbeiten]

Der Befehl Sgn liefert einen Wert, der für das Vorzeichen einer Zahl steht. Das Argument Zahl kann ein beliebiger zulässiger numerischer Ausdruck sein. Dessen Vorzeichen bestimmt den von der Sgn-Funktion ausgegebenen Wert:

  • Ist die Zahl > 0 liefert Sgn(Zahl) den Wert 1.
  • Ist die Zahl = 0 liefert Sgn(Zahl) den Wert 0.
  • Ist die Zahl < 0 liefert Sgn(Zahl) den Wert -1.

Einfache Beispiele:

PRINT Sgn(Pi)

Ergebnis: 1

PRINT Sgn(-Pi)

Ergebnis: -1

PRINT Sgn(0)

Ergebnis: 0

Beispiel:

 PUBLIC SUB Form_Open()
   DIM x AS Integer
   DIM y AS Float
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl Null.
         PRINT y & " " & Sgn(y) & " Signum = Null."
       CASE 1 ' Wenn Zahl positiv.
         PRINT y & " " & Sgn(y) & " Signum = positive Zahl."
       CASE -1 ' Wenn Zahl negativ.
         PRINT y & " " & Sgn(y) & " Signum = negative Zahl."
     END SELECT
   NEXT
 END

Oder etwas anders:

 PUBLIC SUB Form_Open()
   DIM x AS Integer
   DIM y AS Float
   DIM pos AS Integer
   DIM neg AS Integer
   DIM nul AS Integer
  
   pos = 0
   neg = 0
   nul = 0
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl null.
         INC nul
       CASE 1 ' Wenn Zahl positiv.
         INC pos
       CASE -1 ' Wenn Zahl negativ.
         INC neg
     END SELECT
   NEXT
   PRINT nul,pos,neg
 END

Es geht natürlich auch ohne den INC Befehl:

 STATIC PUBLIC SUB Main()
   DIM x AS Integer
   DIM y AS Float
   DIM pos AS Integer
   DIM neg AS Integer
   DIM nul AS Integer
  
   pos = 0
   neg = 0
   nul = 0
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl null.
         nul = nul + 1
       CASE 1 ' Wenn Zahl positiv.
         pos = pos + 1
       CASE -1 ' Wenn Zahl negativ.
         neg = neg + 1
     END SELECT
   NEXT
   PRINT nul,pos,neg
 END

Wie zu erwarten gibt es fast keine Treffer auf der Null, Erhöhen Sie die Zahl x und schauen Sie nach, ob irgendwann auch einmal die Null getroffen wird.

Absolutwert einer Zahl ABS

[Bearbeiten]

Der Befehl ABS liefert den Absoluten Betrag einer Zahl, d.h das Vorzeichen wird weggestrichen, wenn es negativ ist. In der Mathematik verwendet man dafür 2 senkrechte Striche |-2| = 2.

Kleine Beispiele dazu:

Print abs(-2)

Ergebnis: 2

Print abs(2)

Ergebnis: 2

Print abs(0)

Ergebnis: 0

Siehe auch: http://www.madeasy.de/7/prgabs.htm

Ein etwas längeres Beispiel im Terminalmodus:

STATIC PUBLIC SUB Main()
  DIM i AS Integer
  FOR i = -10 TO 10
    PRINT i & " => Abs(i) => " & Abs(i)
  NEXT
END

Der Val Befehl - Aus einem Text etwas Sinnvolles machen

[Bearbeiten]

Val() wandelt einen String (= Folge von Asciizeichen) in einen Datentyp um, der dem Inhalt des Strings entspricht. Wenn der String ausschaut wie eine Fließkommazahl, dann macht Val() eine Fließkommazahl daraus. Val() benutzt die lokale Sprache ihrer Maschine (hier also deutsch), die in "locales" festgelegt wurde.

Sie können Ihre Einstellung mit folgendem Konsolenbefehl überprüfen: "locales" oder "echo $LANG".

Auf einer deutschen Maschine erhält man: de_DE@euro

Vorsicht: Mit Kommazahlen und der Ländereinstellung! Der Val Befehl ist fehlerträchtig!

Steht in einer Textbox1 6,6 mit deutscher Ländereinstellung, dann liefert Val(textbox1.text) eine Floatvariable mit dem Wert 6,6.

Steht in der Textbox 6.6 dann liefert Val(textbox1.text) ein Datum 06.06.04

Wollen Sie die Zahl wieder in einen deutschen Text verwandeln, dann nutzen Sie Str(zahl) zur Umwandlung.

Probieren Sie die Ländereinstellungen Ihres PCs mit folgendem Programm einfach einmal aus. Die Ausgabe erfolgt im Direktfenster:

PUBLIC SUB Form_Open()
  PRINT Val("6.6.99")
  PRINT Val("09/06/72 01:00")
  PRINT Val("3.1415")
  PRINT Val("3,1415")
  PRINT Val("-25")
  PRINT Val("True")
  PRINT Val("False")
  PRINT IsNull(Val("Gambas"))
END

Bei deutscher Ländereinstellung ergibt sich:

06.06.99

31415
3,1415
-25
True
False
True

Weiteres Beispielprogramm

Siehe auch: https://web.archive.org und Suchen nach www.madeasy.de/7/prgval.htm

Wenn Sie einen Textstring eingeben, dann wandelt das Programm den String mit Val um und die Art der umgewandelten Variable wird überprüft.

Das Ergebnis wird ausgegeben.

 PUBLIC SUB _new()
   TextLabel1.Text = "Tippen Sie etwas ein, das wie ein Datum, eine Zahl, eine Kommazahl oder eine Boolesche Variable ausschaut"
 END

 PUBLIC SUB Button1_Click()
   x AS Variant
   x = Val(TextBox1.Text)
  
   IF IsDate(x) THEN Label1.Text="Das ist eine Datumsangabe!"
   IF IsBoolean(x) THEN Label1.Text="Das ist eine Boolesche Variable!"
   IF IsInteger(x) THEN Label1.Text="Das ist eine Zahl!"
   IF IsFloat(x) THEN Label1.Text="Das ist eine Kommazahl!"
   IF IsString(x) THEN Label1.Text="Das ist ein String!"
 END

Vorsicht: Bei der Eingabe von True, wird zwar eine Boolesche Variable erkannt, der Wert wird aber in einer zweiten Textbox nicht ausgegeben. Bei der Eingabe von False, wird zwar eine Boolesche Variable erkannt, der Wert wird aber in einer zweiten Textbox nicht ausgegeben.

Theorie

[Bearbeiten]

Ausdruck = Val(String)

Konvertiert einen String in einen booleschen Wert, eine Zahl oder ein Datum, abhängig vom Inhalt des Strings. Bei der Umwandlung von Zahlen und Datumsangaben werden die gegenwärtigen local-Einstellungen berücksichtigt.

Die Umwandlung geschieht folgendermaßen:

  • Wenn der String als Datum und Zeit (mit Datums- und Zeit-Trennzeichen) interpretiert werden kann, dann wird Datum und Zeit zurückgegeben.
  • Andernfalls, wenn der String als Fließkommazahl interpretiert werden kann, dann wird eine Fließkommazahl zurückgegeben.
  • Andernfalls, wenn der String als Ganzzahl interpretiert werden kann, dann wird eine Ganzzahl zurückgegeben.
  • Andernfalls, wenn der String TRUE oder FALSE ist, dann wird der entsprechende boolesche Wert zurückgegeben.
  • Ansonsten wird NULL zurückgegeben.

Eulersche Zahl berechnen

[Bearbeiten]

Siehe auch http://www.madeasy.de/7/prge.htm und http://www.madeasy.de/2/e.htm

Mit der folgenden Formel kann man die Eulersche Zahl berechnen.

e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ... + 1/n!

Die Formel wird in ein einfaches Programm eingebaut. Die unendlich Folge wird im Beispiel nach 15 Schleifendurchgängen abgebrochen. Man kann die Zahl aber auch noch genauer berechnen.

Das Programm ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   E AS Float
   QF AS Float
   F AS Integer
   K AS Integer
  
   E = 1
   F = 1
   FOR K = 1 TO 15
     F = F * K
     QF = CFloat(1)/F
     E = E + QF
     PRINT E
   NEXT
 END

Fibonaccifolge berechnen

[Bearbeiten]

Siehe auch: http://www.madeasy.de/7/prgfibo.htm

Mit dem folgenden Programm kann man die Fibonaccifolge berechnen.

Es ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   a AS Integer
   b AS Integer
   x AS Integer
  
   a = 1
   b = 1
   FOR x = 1 TO 23
     PRINT 2*x-1, a
     PRINT 2*x, b
     a = a + b
     b = a + b
   NEXT
 END

Ausgabe:

1	1
2	1
3	2
4	3
5	5
6	8
7	13
8	21
9	34
10	55
11	89
12	144
13	233
14	377
15	610
16	987
17	1597
18	2584
19	4181
20	6765
21	10946

Versuchen Sie an Hand des obigen Codes, das Ganze als Funktion zu programmieren:

Eingabe der Funktion soll sein fibo(n). Herauskommen soll die Fibonaccizahl, die zu dem entsprechenden N-Wert gehört. Allerdings muss man sicher sehr bald eine Größenbegrenzung einführen, da die Zahlen sehr schnell sehr groß werden.

Lucasfolge berechnen

[Bearbeiten]

Die Lucasfolge hat die gleiche Bildungsregel wie die Fibonacci-Folge. Sie unterscheidet sich allerdings in den beiden Anfangsgliedern. Statt 0 und 1 lauten die beiden Anfangsglieder 2 und 1.

Mit dem folgenden Programm kann man die Lucasfolge berechnen.

Es ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   a AS Integer
   b AS Integer
   x AS Integer
  
   a = 2
   b = 1
   FOR x = 1 TO 23
     PRINT 2*x-1, a
     PRINT 2*x, b
     a = a + b
     b = a + b
   NEXT
 END

Ausgabe

1	2
2	1
3	3
4	4
5	7
6	11
7	18
8	29
9	47
10	76
11	123
12	199
13	322
14	521
15	843
16	1364
17	2207
18	3571
19	5778
20	9349
21	15127
22	24476
23	39603

Das Summenzeichen programmieren

[Bearbeiten]

Die Mathematik bereitet dem Anfänger schon deswegen erhebliche Schwierigkeiten, weil sie dazu neigt, neue komplizierte Zeichen zu benutzen. Ein Beispiel ist das Summenzeichen. Wenn man es verstehen will, sollte man es einfach programmieren. Programmiertechnisch ist es eine For Next Schleife mit Aufsummierung des Ergebnisses aus jedem Schleifendurchlauf.

Wie kann man das Zeichen programmieren?

Dazu benutzen wir 2 Beispiele:

Beispiel 1

[Bearbeiten]

Das Programm dazu schaut so aus: Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

Code:

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne die Summe"
   Textbox1.Text = ""
 END
 
 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von -2 bis 3
   s AS Variant
   's ist die Summe
   s = 0
   FOR i = -2 TO 3
     s = s + i
     'PRINT i, s
   NEXT
   textbox1.Text = Str(s)
 END

Verändern Sie das Programm so, dass Sie den Anfangswert und den Endwert der Laufvariablen i in eine Textbox eingeben können. Fügen Sie dazu in das Programm 2 neue Variablen ein

a as integer
' a = Anfangswert
e as integer
' e = Endwert

Ändern Sie die Schleife in

For i = a to e

Vorher müssen Sie noch a und e Werte zuweisen:

a = 0
e = 6

Oder:

a = val(Textbox2.Text)
e = val(Textbox3.Text)

Beispiel 1a

[Bearbeiten]

Das Programm dazu schaut so aus: Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

Code:

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne die Summe"
   Textbox1.Text = ""
 END
  
 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 1 bis 10
   s AS Variant
   s = 0
   FOR i = 1 TO 10
     s = s + i*i
     'PRINT i, s
   NEXT
   textbox1.Text = Str(s)
 END

Verändern Sie das Programm so, dass Sie den Anfangswert und den Endwert der Laufvariablen i in eine Textbox eingeben können. Fügen Sie dazu in das Programm 2 neue Variablen ein

a as integer
' a = Anfangswert
e as integer
' e = Endwert

Ändern Sie die Schleife in

For i = a to e

Vorher müssen Sie noch a und e Werte zuweisen:

a = 1
e = 10

Oder:

a = val(Textbox2.Text)
e = val(Textbox3.Text)

Beispiel 2

[Bearbeiten]

Berechnet werden soll

Das Programm dazu schaut so aus:

Die Zwischenwerte wurden dabei im Direktfenster mit Print ausgegeben. Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne Summe"
   Textbox1.Text = ""
 END

 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 0 bis 6
   s AS Variant
   s = 0
   FOR i = 0 TO 6
     s = s + i / (i + 1)
     PRINT i, (i / (i + 1)), s
     '0 + 1/2 + 2/3 + 3/4 + 4/5 + 5/6 + 6/7 = 210/420 + 280/420 + 315/420 + 336/420 +  350/420 + 360/420
     NEXT
   textbox1.Text = Str(s)
 END

Man erkennt den Unterschied der Computerberechnung und der eigenen Berechnung auf dem Papier. 0 + 1/2 + 2/3 + 3/4 + 4/5 + 5/6 + 6/7 = 210/420 + 280/420 + 315/420 + 336/420 + 350/420 + 360/420 Auf dem Papier sucht man den kleinsten gemeinsamen Nenner. Dann erweitert man die Brüche entsprechend. Die Zähler kann man dann addieren. Ergebnis 1851/420 = 617/140 = 4.407142857142857

Der entscheidende Vorteil des Computerprogrammes ist die leichte Erweiterbarkeit. Man kann den Anfangswert 0 für i als Variable allgemein lassen. Man kann den Endwert für i = 6 allgemein lassen. Dann eignet sich das Programm nicht nur für eine spezielle Summe, sondern gleich für beliebige Summen derselben Art.

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne Summe"
   Textbox1.Text = ""
 END

 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 0 bis 6
   a as integer
   'a ist der Anfangswert für i
   z as integer
   'z ist der Endwert für i
   s AS Variant
  
   s = 0
   a = 0
   z = 6
   FOR i = a TO z
     s = s + i / (i + 1)
     'PRINT i, (i / (i + 1)), s
   NEXT
   textbox1.Text = Str(s)
 END

Zahlen zählen

[Bearbeiten]

Dieses Programm zählt aus einer langen Schlange von Dezimalzahlen die Häufigkeit von 1,2,3,4,5,6,7,8,9,0. Es ist in typischer Anfängermanier programmiert. Das ist keine Schande, denn es erfüllt seinen Zweck. Mit einem Array könnte man das Programm wahrscheinlich deutlich verkürzen.

Die Ergebnisausgabe erfolgt wie üblich im Direktfenster.

Um das Programm in Gang zu bringen brauchen Sie eine Textarea und 2 Commandbuttons auf ihrer Form.

Screenshot
 PUBLIC SUB Form_Open()
   Button1.Text = "Zahlen zählen"
   Button2.Text = "Beispiel"
   Textarea1.Text = ""
   ME.Text = "Zahlen zählen"
 END
 
 PUBLIC SUB Button1_Click()
   s AS String
   n AS Integer
   Tempo AS String
   char AS String
   z0 AS Integer
   z1 AS Integer
   z2 AS Integer
   z3 AS Integer
   z4 AS Integer
   z5 AS Integer
   z6 AS Integer
   z7 AS Integer
   z8 AS Integer
   z9 AS Integer
  
   s = textarea1.Text
   z0 = 0
   z1 = 0
   z2 = 0
   z3 = 0
   z4 = 0
   z5 = 0
   z6 = 0
   z7 = 0
   z8 = 0
   z9 = 0

   Tempo = RTrim$(s)
   Tempo = LTrim$(Tempo)
   FOR n = 1 TO Len(Tempo)
     char = Mid$(Tempo, n, 1)
     SELECT CASE char
       CASE "0"
         z0 = z0 + 1
       CASE "1"
         z1 = z1 + 1
       CASE "2"
         z2 = z2 + 1
       CASE "3"
         z3 = z3 + 1
       CASE "4"
         z4 = z4 + 1
       CASE "5"
         z5 = z5 + 1
       CASE "6"
         z6 = z6 + 1
       CASE "7"
         z7 = z7 + 1
       CASE "8"
         z8 = z8 + 1
       CASE "9"
         z9 = z9 + 1
     END SELECT
   NEXT
   PRINT z0, z1, z2, z3, z4
   PRINT z5, z6, z7, z8, z9
 END
  
 PUBLIC SUB Button2_Click()
   textarea1.Text = "1234567893523652314232723742734247247899990001223445"
 END

Funktionsdarstellung

[Bearbeiten]

Leider funktioniert der VB Befehl Scale in Gambas noch nicht. Trotzdem gibt es schon ein paar brauchbare Funktionsdarstellungen: http://www.madeasy.de/7/prgkoord.htm http://www.madeasy.de/7/prgfunkt.htm

Trigonometrische Funktionen in Gambas

[Bearbeiten]

Acsh / ACosh, Acs / ACos, Asn / ASin, Asnh / ASinh, Atn / ATan, Atnh / ATanh, Cos, Cosh, Deg, Rad, Pi, Sin, Sinh

Beispiel Programm für den sin und cos ohne Grafik

[Bearbeiten]
STATIC PUBLIC SUB Main()
  DIM a AS Float
  FOR a = - 10 TO 10 STEP 0.1
    PRINT a," Sin ",Sin(a),"       Cos ",Cos(a)
  NEXT
END

In der Ausgabe stecken noch einige Fehler. Der Wert a = 0 wird beispielsweise nicht korrekt ausgegeben. Auch die Werte a = 0,1 und a = 10 machen Schwierigkeiten.

Grafische Ausgabe der Sinusfunktion

[Bearbeiten]

Siehe http://www.madeasy.de/7/prgsinohne.htm

Dieses Grafikprogramm zeigt die Programmierung der Sinusfunktion: Sie brauchen einen Befehlsknopf und ein Zeichenfeld. Stellen Sie die Höhe des Zeichenfeldes bei den Eigenschaften auf 100 ein (Height).

Hinter dem Befehl Sinuskurve steht folgender Code:

 PUBLIC SUB Button1_Click()
   DIM dymax AS Integer
   ' maximaler gezeichneter y - Wert = Height drawymax
   DIM dymin AS Integer
   ' minimaler gezeichneter y - Wert = 0 drawymin
   DIM ymax AS Integer
   DIM ymin AS Integer
   'gewünschtes Koordinatensystem mit ymax und ymin
   DIM y AS Float
   'wechselnder Orginalwert von y
   DIM dy AS Float
   'gezeichneter Wert von y
   DIM dyi AS Integer
   'Ganzzahlwert von dy
   DIM x AS Float
   DIM dxi AS Integer
   'Ganzzahlwert von dx
  
   ' Beispiel dymax = 100 und dymin = 0
   dymax = 100
   dymin = 0
   ymax = 1
   ymin = -1
  
   FOR x = 0 TO 12 STEP 0.1
     y = Sin(x)
     'Formel
     'Verhältnis Teilstrecke / Gesamtstrecke in beiden Maßstäben sind gleich
     '(dy - dymin) / (dymax - dymin) = (y - ymin) / (ymax - ymin)
     '==> dy - dymin = (y - ymin) / (ymax - ymin) * (dymax - dymin)
     '==> dy = (y - ymin) / (ymax - ymin) * (dymax - dymin) + dymin
     dy = CFloat(y - ymin) / (ymax - ymin) * (dymax - dymin) + dymin
     'PRINT x,y,dy
     dyi = Fix(dy)
     dxi = Fix(x *30)
     Draw.Begin(DrawingArea1)
     Draw.Point(dxi,dyi)
     Draw.End
   NEXT
 END

Spielen Sie mit den einzelnen Größen etwas herum und beobachten Sie wie sich die Grafik ändert. Verändern Sie das Programm so, dass der Sinus korrekt mit 0 anfängt und erst ins positive wächst. Was ist hier noch falsch? (dy Werte werden noch von oben nach unten aufgetragen und nicht umgekehrt.) Versuchen Sie die Umrechnungen für dyi alle in eine Formel zu bekommen.

Logik

[Bearbeiten]

Siehe Gambas: Logische Operatoren

Primzahlen berechnen

[Bearbeiten]

Das folgende Programm zeigt die Suche nach Primzahlen mit Hilfe des Siebs von Eratosthenes. Die Ergebnisausgabe erfolgt im Direktfenster.

Um es in Gang zu bringen brauchen Sie 2 Commandbuttons und 1 Textbox auf Ihrer Form.

 PUBLIC SUB Form_Open()
   ME.Text = "Primzahlberechnung"
 END
 
 PUBLIC SUB Button1_Click()
   m AS Integer
   f AS Integer
   n AS Integer
   A$ AS String

   if textbox1.Text = "" Then textbox1.text = "1"
   m = Val(textbox1.Text)
   'holt sich aus dem Textfeld1 die erste Zahl zum Testen

   IF m / 2 = Int(m / 2) THEN m = m - 1
   'Falls diese Zahl ohne Rest durch 2 teilbar ist, also eine gerade Zahl ist
   'geht das Programm noch eine Zahl rückwärts um eine ungerade Zahl zu bekommen
  
   IF textbox1.Text = "" THEN m = 6
   'Falls keine Startzahl eingegeben wurde wird die Startzahl m = 6 vergeben.
  
   FOR m = m TO m + 1000 STEP 2
     'Hauptschleife
     'Die nächsten 1000 ungeraden Zahlen in einer Schleife durchlaufen lassen
     'm ist die Variable für die ungeraden Zahlen

     f = 1
     'f ist die Variable für die Faktorentestung,
     'm teilbar durch f oder nicht

     n = m
     'n = ist die Testzahl, bei der noch nicht klar ist ob sie eine Primzahl ist

     DO WHILE f < Sqr(n)
       'solange der Teiler f kleiner als die Wurzel
       'aus der Testzahl n ist, muss getestet werden
       f = f + 2
       'Teiler von f = 1 beginnend um jeweils 2 vermehren, 3,5,7,9 etc erster Test also mit f = 3
       DO WHILE n / f = Int(n / f)
         'Teiler f testen solange bis n / f ohne Rest teilbar
         'PRINT "m = "; m; " n = "; n; " f = "; f
         n = Int(n / f)
         'Die Testzahl n verkleinern auf die Zahl n/f
       LOOP
     LOOP

     A$ = " 1" & Chr(13) & " 2" & Chr(13) & " 3"
     IF m < 7 THEN PRINT A$
     'Chr(13) = Zeilenwechsel
     'Am Anfang zwischen 1 und 5 gibt es Probleme mit der Ausgabe
     'deswegen werden die ersten drei Zeilen ersetzt durch A$

     IF n = m THEN PRINT n
     'Wenn die Testzahl n nicht teilbar war durch f
     'ist es eine Primzahl und kann ausgedruckt werden
   NEXT
   CATCH
     message.Info("Bitte eine Zahl eingeben")
 END

Logarithmus

[Bearbeiten]

Mit dem Logarithmus kann man sehr große Zahlen übersichtlich und klein machen. Aus 1 000 000 wird beispielsweise 10^6 (Sprich 10 hoch 6 = 10 * 10 * 10 * 10 *10 *10). Dabei ist die Hochzahl 6 der Logarithmus von 1 000 000 zur hier gewählten Basiszahl 10. Der Begriff Hochzahl und Exponent sind identisch.

Die Logarithmusfunktion y = logb (x) liefert für jede beliebige positive Zahl x einen Wert. So ist der Logarithmus der Zahl 1 234 567 zur Basis 10 gleich log10 (1234567) = 6.09151466408626 Insbesondere für Werte, die sehr klein oder sehr groß sind oder die einen sehr großen Wertebereich einnehmen können, haben sich Logarithmen sehr bewährt. Da die Logarithmusfunktion mit größer werden x Werten stetig wächst, bleiben logische Zusammenhänge, die für den x Wert gelten meist auch für den Logarithmus von x erhalten.

Anwendung von Logarithmen:

[Bearbeiten]
  • pH = Säurewert von chemischen Lösungen
  • dB = Dezibel = Messung der Lautstärke
  • bit = Informationseinheit = Messung der Informationsmenge
  • Logarithmuspapier in der Statistik

Siehe auch:

Beispielprogramm Log Befehl

[Bearbeiten]

Um den Befehl Log zu verstehen, kann man ihn einfach für verschiedene Werte berechnen: L = log(x) L ist der natürliche Logarithmus von x zur Basis e,der Eulerschen Zahl

e = 2,718281828459

Man schreibt sich ein Miniprogramm mit einer Form und einem Befehlsbutton:

Der Code dazu lautet:

 PUBLIC SUB Form_Open()
   Button1.Text = "log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Integer
   FOR x = 1 TO 10
   PRINT x, Log(x)
   NEXT
 END

Die Ausgabe erfolgt im Direktfenster. Sie lautet:

1	0
2	0,69314718056
3	1,098612288668
4	1,38629436112
5	1,609437912434
6	1,791759469228
7	1,945910149055
8	2,07944154168
9	2,197224577336
10	2,302585092994

Wenn Sie Ihre Schleife für x mit einer negativen Zahl anfangen lassen, erhalten Sie eine Fehlermeldung:

Mathematic Error

Denn Logarithmus einer negativen Zahl gibt es nicht.

Genauere Version

[Bearbeiten]

Wenn man die Schleife in genaueren Schritten laufen lassen will, benutzt man folgende Codevariante:

 PUBLIC SUB Form_Open()
   Button1.Text = "log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   FOR x = 0.1 TO 10 STEP 0.1
     PRINT x, Log(x)
   NEXT
 END

Ausgabe im Direktfenster:

0,1	-2,302585092994
0,2	-1,609437912434
0,3	-1,203972804326
0,4	-0,916290731874
0,5	-0,69314718056
0,6	-0,510825623766
0,7	-0,356674943939
0,8	-0,223143551314
0,9	-0,105360515658
1	-1,110223024625E-16
1,1	0,095310179804
1,2	0,182321556794
1,3	0,262364264467
1,4	0,336472236621

etc...

Beispielprogramm Logbefehl mit beliebiger Eingabe

[Bearbeiten]

Wenn man den Log Befehl mit einer beliebigen positiven Zahl testen will, kann man folgendes Programm nutzen.

Sie brauchen 2 Textboxen und 1 Befehlsknopf (Commandbutton) auf Ihrer Form. Machen Sie die Textbox2 groß genug, damit alle Nachkommastellen Platz haben.

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Was macht der Log Befehl"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float

   IF Textbox1.Text = "" THEN textbox1.text = "1"
   IF Val(textbox1.Text) <= 0 THEN 
     message.info = "Unzulässige Eingabe"
     RETURN
   ENDIF
 
   'Umformen der Texteingabe 1 in eine genaue Zahl
   x = Val(textbox1.Text)
   L = Log(x)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Im Code dieses Programms steckt noch ein Fehler. Die Messagebox (Meldung) wurde falsch programmiert:

Statt:

 IF Val(textbox1.Text) <= 0 THEN message.info = "Unzulässige Eingabe"

Sollten Sie schreiben:

IF Val(textbox1.Text) <= 0 THEN Message.info("Unzulässige Eingabe Zahl kleiner Null", "OK")

Wie kann man noch Fehleingaben von Buchstaben verhindern?

Beispielprogramm Dualer Logarithmus

[Bearbeiten]

Der Duale Logarithmus nutzt als Basis die Zahl 2. Um ihn mit dem Befehl log zu erhalten, muss man den natürlichen in den dualen umrechnen. dazu nutzt man folgende Formel:

L = log2x = logex / loge2

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Dualer Logarithmus"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log2"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float
 
   x = Val(textbox1.Text)
   L = Log(x)/Log(2)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Beispielprogramm Dekadischer Logarithmus

[Bearbeiten]

Der dekadische Logarithmus nutzt als Basis die Zahl 10. Um ihn mit dem Befehl log zu erhalten, muss man den natürlichen in den dekadischen umrechnen. dazu nutzt man folgende Formel:

L = log10x = logex / loge10

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Dualer Logarithmus"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log2"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float
 
   x = Val(textbox1.Text)
   L = Log(x)/Log(10)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Beispielprogramm Logarithmusrechner

[Bearbeiten]

Zum Berechnen von Logarithmen kann man folgendes kleine Programm nutzen. Um es in Gang zu bringen braucht man:

  • 5 Commandbuttons
  • 4 Textboxen
  • 3 Textlabelfelder

Der Code:

 PUBLIC SUB Form_Open()
   'automatisches Benennen der Steuerelemente beim Programmstart
   Textbox1.Text = ""
   Textbox2.Text = ""
   Textbox3.Text = ""
   textbox4.Text = ""
   Button1.Text = "Basis 2"
   Button2.Text = "Basis e"
   Button3.Text = "Basis 10"
   Button4.Text = "Berechnen"
   Button5.Text = "Ende"
   Textlabel1.Text = "Der Logarithmus der Zahl"
   Textlabel2.Text = "zur Basis "
   Textlabel3.Text = "beträgt: "
   Textlabel1.Alignment = 66
   Textlabel2.Alignment = 66
   Textlabel3.Alignment = 66
   Textlabel1.BackColor = &Hffffff&
   Textlabel2.BackColor = &HFFFFFF&
   Textlabel3.BackColor = &HFFFFFF&
   Textlabel1.Border = 1
   Textlabel2.Border = 1
   Textlabel3.Border = 1
   Form1.Move(174,455,393,242)
   Form1.Border = Window.Fixed
   Button1.Move(80,64,64,32)
   Button2.Move(160,64,64,32)
   Button3.Move(240,64,64,32)
   Button4.Move(272,112,112,32)
   Button5.Move(272,192,112,32)
   TextBox1.Move(240,16,144,40)
   TextBox2.Move(120,112,144,32)
   TextBox3.Move(120,152,144,32)
   TextBox4.Move(24,192,240,32)
   TextLabel1.Move(8,16,216,40)
   TextLabel2.Move(24,112,96,32)
   TextLabel3.Move(24,152,96,32)
 END

 PUBLIC SUB Button4_Click()
   x AS Float
   y AS Float
   L AS Float

   textbox4.Text = ""
   'Fehleingaben abfangen
   IF Textbox1.Text = "" OR textbox2.Text = "" THEN textbox4.text = "Eingabe fehlt!"
   IF Textbox1.Text = "" OR textbox2.Text = "" THEN RETURN
   IF Val(textbox1.Text) <= 0 THEN textbox4.Text = "Unzulässige Eingabe"
   IF Val(textbox1.Text) <= 0 THEN RETURN
   IF Val(textbox2.Text) <= 1 THEN textbox4.Text = "Unzulässige Eingabe"
   IF Val(textbox2.Text) <= 1 THEN RETURN

   'Umformen der Texteingabe 1 und 2 in eine genaue Zahl
   x = Val(textbox1.Text)
   y = Val(textbox2.Text)

   'allgemeine Logarithmusformel
   L = Log(x) / Log(y)

   'Ausgabe des Ergebnises im Textfeld 3
   textbox3.Text = Str(L)
 END

 PUBLIC SUB Button1_Click()
   textbox2.Text = 2
 END

 PUBLIC SUB Button3_Click()
   textbox2.Text = 10
 END

 PUBLIC SUB Button2_Click()
   textbox2.Text = "2,718282"
 END

 PUBLIC SUB Button5_Click()
   ME.Close
 END

Zinsrechnung

[Bearbeiten]

Die im Folgenden aufgeführten Formeln für die Zinsrechnung verwenden Symbole wie folgt:

  • Anfangskapital: K0 (Kapital nach 0 Jahren)
  • Endkapital: Kn (Kapital nach n Jahren)
  • Laufzeit (ganze Jahre): n Eingabe in Jahren
  • Laufzeit (Tage)  : t Eingabe in Tagen
  • Zinssatz als Dezimalangabe: (pro Zinsperiode)

Beispielprogramm Einfache Zinsen ohne Zinseszinsen (lineare Verzinsung)

[Bearbeiten]

Um einfache Zinsen auszurechnen verwenden wir die folgende Formel:


Für das Beispielprogramm braucht sie :

  • 4 Valueboxen
  • 1 Befehlsknopf (Commandbutton)

oder verwenden sie den folgenden .form Code

# Gambas Form File 2.0
{ Form Form
  MoveScaled(0,0,53,31)
  Text = ("")
  { Label1 Label
    MoveScaled(45,8,6,3)
    Text = ("Jahre")
  }
  { Label2 Label
    MoveScaled(45,13,4,3)
    Text = ("%")
  }
  { Label3 Label
    MoveScaled(1,3,14,3)
    Text = ("Anfangskapital")
  }
  { Label4 Label
    MoveScaled(4,8,11,3)
    Text = ("Laufzeit")
  }
  { Label5 Label
    MoveScaled(4,13,11,3)
    Text = ("Zinssatz")
  }
  { Label6 Label
    MoveScaled(1,25,14,4)
    Text = ("Endkapital")
  }
  { Button1 Button
    MoveScaled(7,18,38,5)
    Text = ("Berechnen")
  }
  { ValueBox1 ValueBox
    MoveScaled(16,3,28,3)
  }
  { Label7 Label
    MoveScaled(45,3,6,3)
    Text = ("Euro")
  }
  { ValueBox2 ValueBox
    MoveScaled(16,8,28,3)
  }
  { ValueBox3 ValueBox
    MoveScaled(16,13,28,3)
  }
  { ValueBox4 ValueBox
    MoveScaled(16,25,28,4)
  }
  { Label8 Label
    MoveScaled(45,25,6,3)
    Text = ("Euro")
  }
}

Der .class Code

' Gambas class file

'K (Anfangskapital)      = ValueBox1.Value
'n (Laufzeit in Jahren)  = ValueBox2.Value
'i (Zinssatz)            = ValueBox3.Value / 100
'Kn (Endkapital)         = ValueBox4.Value

PUBLIC SUB Button1_Click()

  'Endkapital berechnen mit der Formel:
  ' Kn = K*(i*n+1)
  ValueBox4.Value = (ValueBox1.Value * (ValueBox3.Value / 100 * ValueBox2.Value + 1))

END


Beispielprogramm Zinseszinsrechnung (exponentielle Verzinsung)

[Bearbeiten]

Um Zinsen mit Zinseszins auszurechnen verwenden, wir die folgende Formel:

Für das Beispielprogramm brauchen Sie:

  • 5 Valueboxen
  • 1 Checkbox
  • 1 Befehlsknopf (Commandbutton)

oder verwenden Sie den folgenden .form-Code

# Gambas Form File 2.0

{ Form Form
  MoveScaled(0,0,53,39)
  Text = ("")
  { Label1 Label
    MoveScaled(45,8,6,3)
    Text = ("Jahre")
  }
  { Label2 Label
    MoveScaled(45,13,4,3)
    Text = ("%")
  }
  { Label3 Label
    MoveScaled(1,3,14,3)
    Text = ("Anfangskapital")
  }
  { Label4 Label
    MoveScaled(4,8,11,3)
    Text = ("Laufzeit")
  }
  { Label5 Label
    MoveScaled(4,13,11,3)
    Text = ("Zinssatz")
  }
  { Label6 Label
    MoveScaled(1,28,14,4)
    Text = ("Endkapital")
  }
  { Button1 Button
    MoveScaled(7,22,38,5)
    Text = ("Berechnen")
  }
  { ValueBox1 ValueBox
    MoveScaled(16,3,28,3)
  }
  { Label7 Label
    MoveScaled(45,3,6,3)
    Text = ("Euro")
  }
  { ValueBox2 ValueBox
    MoveScaled(16,8,28,3)
  }
  { ValueBox3 ValueBox
    MoveScaled(16,13,28,3)
  }
  { ValueBox4 ValueBox
    MoveScaled(16,28,28,4)
  }
  { Label8 Label
    MoveScaled(45,28,6,3)
    Text = ("Euro")
  }
  { Label9 Label
    MoveScaled(1,34,14,3)
    Text = ("Zinsen")
  }
  { ValueBox5 ValueBox
    MoveScaled(16,34,28,3)
  }
  { Label10 Label
    MoveScaled(45,34,6,3)
    Text = ("Euro")
  }
  { CheckBox1 CheckBox
    MoveScaled(16,18,27,2)
    Text = ("Mit Zinseszins")
  }
}

Der .class-Code

' Gambas class file

'K (Anfangskapital)      = ValueBox1.Value
'n (Laufzeit in Jahren)  = ValueBox2.Value
'i (Zinssatz)            = ValueBox3.Value / 100
'Kn (Endkapital)         = ValueBox4.Value
'Z (Zinsen/Zinswert)     = ValueBox5.Value

PUBLIC SUB Button1_Click()

  IF CheckBox1.Value = FALSE THEN 
  'Normale Zinsen berechnen
    
    'Endkapital berechnen, mit der Formel:
    ' Kn = K*(i*n+1)
    ValueBox4.Value = Round(ValueBox1.Value * (ValueBox3.Value / 100 * ValueBox2.Value + 1), -2)
    'Zinsen/Zinswert berechnen, mit der Formel:
    ' Z = K*(i*n+1)-K = Kn-K
    ValueBox5.Value = Round(ValueBox4.Value - ValueBox1.Value, -2)
    
  ELSE 
  'Zinseszins berechnen
    
    'Endkapital berechnen, mit der Formel:
    ' Kn = K*(i+1)^n
    ValueBox4.Value = Round(ValueBox1.Value * (ValueBox3.Value / 100 + 1) ^ ValueBox2.Value, -2)
    'Zinsen/Zinswert berechnen, mit der Formel:
    ' Z = K*(i+1)^n-K = Kn-K
    ValueBox5.Value = Round(ValueBox4.Value - ValueBox1.Value, -2)
    
  ENDIF 

END