| |
|
|
p.specht
| Hier ein Versuch einer objektorientierten Version zum Rechnen mit Komplexen Zahlen als Class CPLX. Es fehlen noch Wurzelfunktion und einige Hilfsfunktionen, z.B. Koordinatensystem-Transformationen.
WindowTitle "Eine Class für Komplexe Zahlenarithmetik"
' (CL) CopyLeft 2013-04 ff by P.Specht(at)GMX.at
' Jegliche Haftung ist ausdrücklich ausgeschlossen! Betaversion nach Kurztest.
' Die Verwendung erfolgt auf eigene Gefahr des Anwenders/der Anwenderin!
Cls : Font 2
'{ Class cplx, Beta-Version 14.04.2013-06:00
Class cplx=re!,im!,inp@,prt@,prtln@, add@,sub@,mul@,konj@,div@, polar@,vect@,pprt@,pprtln@
' .re!: Realteil, .im!: Imaginärteil der jeweilgen Komplexen_Zahl#
' .inp(): Manuelle Einzelwerteingabe mit Input
' <var#>.prt(PromptText$): Ausgabe von var#, .prtln("Test:"): Ausgabe + newline
' <var#>.add(a#,b#), .sub(a#,b#), .mul(a#,b#), .konj(a#), .div(a#,b#): Zeigerarithmetik
'
' p#.polar(a#): Wandelt Komplexe Koordinaten in Versor(=Polar-)darstellung [Länge+Winkelgrade],
' a#.vect(p#): Wandelt Polardarstellung [Länge+Winkelgrade] zu Komplexen Koordinaten .re+j*.im
' p#.pprt(text$): polarprint, p#.pprtln(text$): polarprint + newline
'
proc cplx.inp
declare re!,im!
print "Re=";:input re!
locate %csrlin-1,%pos+20
print "Im=";:input im!
.re!=re! : .im!=im!
endproc
proc cplx.cplx' für declare x#:x#=new(cplx)
declare re!,im!
print "re=";:input re!
locate %csrlin-1,%pos+20
print "im=";:input im!
.re!=re! : .im!=im!
endproc
proc cplx.prt
if %pcount=1:parameters t$:print t$,:endif
print format$("%g",.re!);@IF(.im!<0,"-j*"+\
format$("%g",-1*.im!),"+j*"+format$("%g",.im!)),
endproc
proc cplx.prtln
if %pcount=1:parameters t$:print t$,:endif
print format$("%g",.re!);@If(.im!<0,"-j*"+\
format$("%g",-1*.im!),"+j*"+format$("%g",.im!))
endproc
proc cplx.add :parameters a#,b#
.re! = a#.re! + b#.re!
.im! = a#.im! + b#.im!
endproc
proc cplx.sub :parameters a#,b#
.re! = a#.re! - b#.re!
.im! = a#.im! - b#.im!
endproc
proc cplx.mul :parameters a#,b#
.re! = a#.re! * b#.re! - a#.im! * b#.im!
.im! = a#.re! * b#.im! + a#.im! * b#.re!
endproc
proc cplx.konj :parameters a#
.re! = a#.re!
.im! = -1*a#.im!
endproc
proc cplx.div :parameters a#,b#
var nenn!=sqr(b#.re!)+sqr(b#.im!)
.re! = a#.re!*b#.re! + a#.im!*b#.im!
.im! = a#.im!*b#.re! - a#.re!*b#.im!
if nenn!<>0
.re! = .re!/nenn!
.im! = .im!/nenn!
else
if .re!<>0
.re! = 10^200
.im! = 180/pi()*arctan(.im!/.re!)
else
.re!=10^200
.im!=90
endif
endif
endproc
proc cplx.pprt
if %pcount=1:parameters t$:print t$,:endif
print format$("%g",.re!);"_in_";format$("%g",.im!);"_rad",
endproc
proc cplx.pprtln
if %pcount=1:parameters t$:print t$,:endif
print format$("%g",.re!);"_in_";format$("%g",.im!);"_rad"
endproc
proc cplx.polar:parameters a#
set("decimals",12)
.re!=sqrt(sqr(a#.re!)+sqr(a#.im!))
var pi!=3.1415926535897932384626433832795028842
var prec&=lg(.re!)
var Winkel!=0
if Nearly(a#.re!,0,15-prec&) and Nearly(0,a#.im!,15-prec&):winkel!=0
elseif (a#.re!>0) and Nearly(0,a#.im!,15-prec&):winkel!=0' 10^-38
elseif (a#.re!>0) and (a#.im!>0) and Nearly(a#.re!,a#.im!,14-prec&):winkel!=pi!*0.25
elseif Nearly(a#.re!,0,15-prec&) and (a#.im!>0):winkel!=pi!*0.5
elseif (a#.re!<0) and (a#.im!>0) and Nearly(-a#.re!,a#.im!,14-prec&):winkel!=pi!*0.75
elseif (a#.re!<0) and Nearly(0,a#.im!,15-prec&):winkel!=pi!
elseif (a#.re!<0) and (a#.im!<0) and Nearly(-a#.re!,-a#.im!,14-prec&):winkel!=pi!*1.25
elseif Nearly(a#.re!,0,15-prec&) and (a#.im!<0):winkel!=pi!*1.5
elseif (a#.re!>0) and (a#.im!<0) and Nearly(a#.re!,-a#.im!,14-prec&):winkel!=pi!*1.75
elseif (a#.re!>0) and (a#.im!>0) and (a#.re!>a#.im!):winkel!=arctan(a#.im!/a#.re!)
elseif (a#.re!>0) and (a#.im!>0) and (a#.re!<a#.im!):winkel!=pi!/2-arctan(a#.re!/a#.im!)
elseif (a#.re!<0) and (a#.im!>0) and (-a#.re!<a#.im!):winkel!=pi!/2+arctan(-a#.re!/a#.im!)
elseif (a#.re!<0) and (a#.im!>0) and (-a#.re!>a#.im!):winkel!=pi!-arctan(a#.im!/-a#.re!)
elseif (a#.re!<0) and (a#.im!<0) and (a#.re!<a#.im!):winkel!=pi!+arctan(-a#.im!/-a#.re!)
elseif (a#.re!<0) and (a#.im!<0) and (a#.re!>a#.im!):winkel!=pi!*1.5-arctan(-a#.re!/-a#.im!)
elseif (a#.re!>0) and (a#.im!<0) and (a#.re!< -a#.im!):winkel!=pi!*1.5+arctan(a#.re!/-a#.im!)
elseif (a#.re!>0) and (a#.im!<0) and (a#.re!> -a#.im!):winkel!=2*pi!-arctan(-a#.im!/a#.re!)
endif
.im!=Winkel!
endproc
proc cplx.vect :parameters c#
.re!=c#.re!*cos(c#.im!)
.im!=c#.re!*sin(c#.im!)
endproc
' }
' HAUPTTEIL:
declare u#:dim u#,cplx
declare v#:dim v#,cplx
declare w#:dim w#,cplx
u#.inp() :u#.prtln("u:")
v#.inp() :v#.prtln("v:")
w#.add(u#,v#):w#.prt("add:")
w#.sub(u#,v#):w#.prtln("sub:")
w#.mul(u#,v#):w#.prt("mul:")
w#.konj(u#) :w#.prtln("konj:")
w#.div(u#,v#)
print w#.re!
print w#.im!
w#.prtln("div:")
w#.polar(u#) :w#.pprtln("polar:")
u#.vect(w#) :u#.prtln("vect:")
waitinput
dispose u#,v#,w#
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 09.05.2021 ▲ |
|
|
|