FreeBasic: Mathematik
Aus Wikibooks
Dieses Kapitel zeigt nur die Anwendung in Freebasic. Das Grundlagenwissen für die jeweilige Funktion sollte vorhanden sein. Wenn nicht, sollten die Links am Anfang des Kapitels weiterhelfen.
Inhaltsverzeichnis |
[Bearbeiten] Grundrechenarten
Multiplikation * Division / Addition + Subtraktion -
Bei der Division gibt es noch einen Spezialfall:
Sind alle beteiligten Zahlen (Dividend, Divisor und Resultat) Ganzzahlen, kann man auch \ verwenden.
Der Vorteil von \ ist, dass er wesentlich schneller ist als /.
[Bearbeiten] Kurzschreibweisen
In FreeBasic gibt es einige Kurzschreibweisen, z.B. kann man anstelle von
x=x+1
auch
x+=1
schreiben. Was jetzt bei kurzen Variablennamen belanglos aussieht, hilft bei langen Variablennamen.
Natürlich gibt es das auch mit anderen Rechenoperationen:
dim a as single dim b as single dim c as single input a input b c = a c += b 'c=c+b ? c c = a c -= b 'c=c-b ? c c = a c *= b 'c=c*b ? c c = a c /= b 'c=c/b ? c sleep
[Bearbeiten] Operatorvorrang
- Funktionsaufrufe/Klammern
- Potenzierung
- Vorzeichenoperator + und -
- Multiplikation und Division
- Integerdivision
- Mod
- Addition und Subtraktion
- Vergleichsoperatoren
- NOT
- AND
- OR
- XOR
- EQV
- IMP
(Operationen wie += etc. Nachtragen, Liste ist eigentlich für QBasic!)
[Bearbeiten] Runden
Am Einfachsten ist es, auf Ganzzahlen zu runden:
dim a as single input a print cint(a) sleep
Jedoch ist das nicht immer zweckmäßig; es ergibt sich die Frage, wie man auf z. B. 3 Kommastellen rundet.
Wie könnte man das nun machen?
Wenn man a mit 1000 multipliziert, auf Ganzzahl rundet und dann durch 1000 teilt, dann bekommt man genau 3 Kommastellen.
Also:
dim a as single input a print cint(a*1000)/1000 sleep
Für spezielle Fälle muss man auf 0.05 (Schweizer Franken), 0.25 (Schulnoten allgemein) oder 0.5 (Zeugnisnoten) runden. Sehen wir uns das Beispiel 0.25 an: Also:
dim a as single input a print cint(a*4)/4 sleep
[Bearbeiten] Allgemeine Formel
declare function Runden(Zahl as single, Genau as single) as single ... function Runden(Zahl as single, Genau as single) as single return cint(Zahl/Genau)*Genau End function
oder
#define RUNDEN(Zahl, Genau) (Cint(Zahl/Genau)*Genau)
Beispiel:
declare function Runden(Zahl as single, Genau as single) as single Dim a as single input a print Runden(a,0.25) sleep function Runden(Zahl as single, Genau as single) as single return cint(Zahl/Genau)*Genau End function
oder
#define RUNDEN(Zahl, Genau) (Cint(Zahl/Genau)*Genau) dim a as single input a print runden(a,0.25) sleep
Ich persönlich bevorzuge die zweite Methode, weil dann Freebasic den Quellcode besser optimieren kann.
[Bearbeiten] Modulo oder Modulus (Rest beim Teilen)
Einfach gesagt: MOD gibt den Rest einer Division aus.
Beispiel:
5/2=2 Rest 1
kann man auch so ausdrücken:
5 mod 2 = 1
Andere Beispiele: 3 mod 2 = 1
5 mod 6 = 5
125 mod 10 = 5
Zum weiter ausprobieren:
input a input b print a mod b sleep
Weitere Theorie:
[Bearbeiten] Anwendungen
[Bearbeiten] Geradzahligkeitsprüfer
input a if a mod 2 = 1 then print "Ungerade" else print "Gerade" end if sleep
[Bearbeiten] Quersumme
Für manche komplizierte Berechnungen, zum Beispiel für physikalischen Berechnungen, ist die Quersumme notwendig. Diese ermittelt man so:
input zahl do while zahl <> 0 Quersumme += zahl mod 10 zahl= zahl \ 10 loop print Quersumme sleep
[Bearbeiten] Zahlensysteme
Mit dieser Funktion kann man Zahlen in andere Zahlensysteme konvertieren. Es funktioniert ab dem 2er- und bis zum 10er-System.
input "im 10er System? ",zahl input "Welches System? ",sys do while zahl <> 0 a$=str$(zahl mod sys)+a$ zahl= zahl \ sys loop print a$ sleep
Funktioniert ab dem 2er- und bis zum 36er-System.
Input "im 10er-System? ",zahl input "Welches System? ",sys do while zahl <> 0 temp=zahl mod sys if temp<10 then a$=str$(temp)+a$ else a$=chr(temp+55)+a$ end if zahl= zahl \ sys loop print a$ sleep
Die Umrechnungen nach Binaer (2er-System), Oktal (8er-System) und Hexadezimal (16er-System) sind nicht sinnvoll; dafür gibt es die Befehle BIN(), OCT() und HEX().
[Bearbeiten] Winkelfunktionen
Die Theorie:
Die Befehle heißen in FreeBasic
- SIN()
- COS()
- TAN()
- ASIN()
- ACOS()
- ATN()
Die Winkel werden im Bogenmaß angegeben.
Die Umrechnung von Bogenmaß nach Grad geht im Prinzip wie folgt:
const PI as double = 3.1415926535897932 dim Grad as single dim Bogenmass as single input "Bogenmass? ", Bogenmass Grad=Bogenmass / PI * 180 print Grad print input "Grad? ", Grad Bogenmass=Grad * PI / 180 print Bogenmass sleep
In der Praxis verwendet man optimierte Methoden wie diese:
const PI = atn(1)*4 const Deg2Rad = atn(1)/45 '=PI/180 const Rad2Deg = 45/atn(1) '=1/Deg2Rad (Kehrwert)
[Bearbeiten] Beispiel 1
const PI = ATN(1)*4 const Deg2Rad = ATN(1)/45 '=PI/180 screen 12 input "Laenge ",Laenge input "Winkel ",Winkel line(100,100)-(100+cos(Winkel*Deg2Rad)*Laenge,100-sin(Winkel*Deg2Rad)*Laenge) sleep
Dieses Programm zeichnet eine Linie beliebiger Länge in einem beliebigen Winkel.
[Bearbeiten] Beispiel 2
const PI = atn(1)*4 const Deg2Rad = atn(1)/45 '=PI/180 screen 12 sleep 500 h=50 'Höhe in Pixel b=50 'Breite in Pixel for Beta=0 to 360 line(100,100)-(100+cos(Beta*Deg2Rad)*b,100-sin(Beta*Deg2Rad)*h) sleep 20 next beta sleep
Wenn Höhe und Breite ungleich sind, entsteht übrigens ein Oval.
[Bearbeiten] Logarithmus
Die Theorie:
Der Befehl in FreeBasic heißt
- LOG()
Obwohl er LOG heißt, meint er eigentlich den natürlichen Logarithmus.
Die Umrechnung zum Zehner-Logarithmus geht wie folgt:
dim a as single input a print log(a)/log(10) sleep
[Bearbeiten] Beispiel
DEFSNG A-Z input "Startkapital ", Startkapital Input "Endbetrag ", Endbetrag Input "Zins ", Zins Jahre=log(Endbetrag/Startkapital)/log(1+Zins/100) Print Jahre sleep
[Bearbeiten] Exponenten
Exponenten sind nicht schwer zu benutzten in FreeBasic.
dim a as double a = 3 a = a^3 print a a = a^0.5 print a a = a^-3 print a sleep
Sie können benutzt werden wie im Matheunterricht. Man muss nur auf den Variablentyp achten, wenn hohe Zahlen heraus kommen können.