NOTE: This page was written in the pre-Objective 2.0 days, when I was working on my own set of changes to Objective-C. My project has since been abandoned in favor of solutions made available both by Objective-C 2.0 and by F-Script.
An example of a single-file objective-c source for creating two complex number classes and testing them out (the MyComplex class isn't actually tested, just built).
( objc ) ✂
Complex *z = [Complex complexWithReal:-3.0 andImaginary:2.0];
Complex *y = [Complex complexWithMangitude:4.0 andAngle:35.0];
print "\n";
print "z = %s\n", [[z wesselDescription] cString];
print " = %s\n", [[z phasorDescription] cString];
print "\n";
print "y = %s\n", [[y wesselDescription] cString];
print " = %s\n", [[y phasorDescription] cString];
print "\n";
[z multiplyBy:y];
print "z * y = %s\n", [[z wesselDescription] cString];
print " = %s\n", [[z phasorDescription] cString];
print "\n";
class Complex {
#include "math.h"
float real, imaginary, magnitude, angle;
+(Complex *)complexWithReal:(float)x andImaginary:(float)y {
Complex *z = [Complex new];
[z setReal:x andImaginary:y];
return z;
}
+(Complex *)complexWithMangitude:(float)r andAngle:(float)theta {
Complex *z = [Complex new];
[z setMagnitude:r andAngle:theta];
return z;
}
-(void)setMagnitude:(float)r andAngle:(float)theta {
magnitude = r;
angle = theta;
real = r * cos( theta );
imaginary = r * sin( theta );
}
-(void)setReal:(float)x andImaginary:(float)y {
real = x;
imaginary = y;
magnitude = sqrt( x * x + y * y );
angle = 180 * acos( real / magnitude );
}
-(void)multiplyBy:(Complex *)z {
magnitude = magnitude * [z magnitude];
angle = angle + [z angle];
}
-(NSString *)wesselDescription {
return [NSString stringWithFormat:@"%f + %fi", real, imaginary ];
}
-(NSString *)phasorDescription {
return [NSString stringWithFormat:@"%f < %f", magnitude, angle ];
}
-(float)magnitude {
return magnitude;
}
-(float)angle {
return angle;
}
}
class MyComplex : Complex {
Complex *a;
NSString *name;
-(void)setName:(NSString *)newName {
[newName retain];
name = newName;
[newName release];
}
-(NSString *)name {
return name;
}
}
1 Complex *z = [Complex complexWithReal: -3 .0 andImaginary: 2 .0]; 2 Complex *y = [Complex complexWithMangitude: 4 .0 andAngle: 35 .0]; 3 4 print "\n"; 5 print "z = %s\n", [[z wesselDescription ] cString ]; 6 print " = %s\n", [[z phasorDescription ] cString ]; 7 print "\n"; 8 9 print "y = %s\n", [[y wesselDescription ] cString ]; 10 print " = %s\n", [[y phasorDescription ] cString ]; 11 print "\n"; 12 13 [z multiplyBy: y]; 14 15 print "z * y = %s\n", [[z wesselDescription ] cString ]; 16 print " = %s\n", [[z phasorDescription ] cString ]; 17 print "\n"; 18 19 class Complex { 20 #include "math .h" 21 22 float real, imaginary, magnitude, angle; 23 24 +( Complex *) complexWithReal: ( float) x andImaginary: ( float) y { 25 Complex *z = [Complex new ]; 26 [z setReal: x andImaginary: y]; 27 return z; 28 } 29 30 +( Complex *) complexWithMangitude: ( float) r andAngle: ( float) theta { 31 Complex *z = [Complex new ]; 32 [z setMagnitude: r andAngle: theta]; 33 return z; 34 } 35 36 -( void) setMagnitude: ( float) r andAngle: ( float) theta { 37 magnitude = r; 38 angle = theta; 39 real = r * cos ( theta ) ; 40 imaginary = r * sin ( theta ) ; 41 } 42 43 -( void) setReal: ( float) x andImaginary: ( float) y { 44 real = x; 45 imaginary = y; 46 magnitude = sqrt ( x * x + y * y ) ; 47 angle = 180 * acos ( real / magnitude ) ; 48 } 49 50 -( void) multiplyBy: ( Complex *) z { 51 magnitude = magnitude * [z magnitude ]; 52 angle = angle + [z angle ]; 53 } 54 55 -( NSString *) wesselDescription { 56 return [NSString stringWithFormat: @"%f + %fi" , real, imaginary ]; 57 } 58 59 -( NSString *) phasorDescription { 60 return [NSString stringWithFormat: @"%f < %f" , magnitude, angle ]; 61 } 62 63 -( float) magnitude { 64 return magnitude; 65 } 66 67 -( float) angle { 68 return angle; 69 } 70 } 71 72 class MyComplex : Complex { 73 Complex *a ; 74 NSString *name ; 75 76 -( void) setName: ( NSString *) newName { 77 [newName retain ]; 78 name = newName; 79 [newName release ]; 80 } 81 82 -( NSString *) name { 83 return name; 84 } 85 } which produces this set of files in a subdirectory:
1 8 -rwxr-xr-x .compile 2 0 -rw-r--r-- .objcIncFile 3 56 -rwxr-xr-x complex 4 8 -rw-r--r-- Complex.h 5 8 -rw-r--r-- Complex.m 6 8 -rw-r--r-- MyComplex.h 7 8 -rw-r--r-- MyComplex.m 8 8 -rw-r--r-- main.mAnd the
complex file is compiled and ready to run. The output, for the curious, is: (the "<" notation is my text attempt at phasor notation, indicated the angle of the vector with respect to the x-axis.)
1 z = -3.000000 + 2.000000i 2 = 3.605551 < 459.646210 3 4 y = -3.614769 + -1.712731i 5 = 4.000000 < 35.000000 6 7 z * y = -3.000000 + 2.000000i 8 = 14.422205 < 494.646210