-2

几个星期以来,我一直在努力学习在线 Objective-c 课程。我觉得自己很愚蠢。我最近的任务是编写一个程序来演示一个名为 Circle 的类,它向用户询问圆的半径,创建一个 Circle 对象,然后报告圆的面积、直径和周长。我们应该有以下成员变量:

radius:  a double
pi: a double initialized to 3.14159

以及以下成员函数:

setRadius - a mutator function for the radius variable
getRadius - an accessor function for the radius variable
getArea - returns the area of the circle, which is calculated as:    area = pi * radius * radius
getDiameter - returns the diameter of the circle, which is calculated as:   diameter = radius * 2
getCircumference - returns the circumference of the circle, which is calculated as:   circumference = 2 * pi * radius

类的成员变量应设置为私有。

到目前为止,这是我的程序:

主要的:

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        int radius;

        NSLog(@"Enter the circles radius:");
        scanf ("%d", &radius);





    }
    return 0;
}

界面:

#import <Foundation/Foundation.h>

//circle class

@interface circle : NSObject

{ @private

-(double)      radius;
-(double)      pi;

}

@property int setRadius, getRadius;

-(double)      getArea;
-(double)      getDiameter;
-(double)      getCircumcerence;


@end

执行:

#import "circle.h"

@implementation circle

@synthesize setRadius, getRadius;


-(double) pi
{
    pi = 3.14159;
}

-(double) getArea
{
    pi * radius * radius;
}

-(double) getDiameter
{
    radius * 2;
}

-(double) getCircumcerence
{
    2 * pi * radius;
}
@end

如你所见,我还没有走多远。我对如何简单地在我的主要中使用我的方法感到困惑,并且确信我已经犯了错误。

任何建议表示赞赏!我真的需要帮助,而且时间紧迫。此外,这可能有点牵强,但如果有人可以和我通过Skype 来帮助我度过难关吗?谢谢!

4

2 回答 2

2

作为一个起点,你应该设置你.h的东西更像这样:

@interface Circle : NSObject

@property double radius;
@property (readonly) double area;
@property (readonly) double diameter;
@property (readonly) double circumference;
@property (readonly) double pi;

-(id)initWithRadius:(double)r;

+(instancetype)circleWithRadius:(double)r;

@end

这将设置 asettergetterforradius以及gettersfor areadiametercircumference。它还为您设置了一个initandfactory方法,circle该方法需要一个双倍的半径。

我会回来并编辑您需要对您的文件.m以及您的main文件进行的一些修改,以使其正常工作。请注意,至少我们将覆盖getters3 个readonly属性。这将阻止编译器ivars为这些属性创建(实例变量)(因为我们可以在调用它时计算并返回我们计算的数字)。

在你的.m

#import Circle.h

@implementation Circle

-(id)initWithRadius:(double)r
{
    self = [super init];
    if(self) {
        self.radius = r;
    }
    return self;
}

+(instancetype)circleWithRadius:(double)r
{
    return [[Circle alloc] initWithRadius:r];
}

-(void)setRadius:(double)r  //This method is automatically created by @property
{  //include any verification logic (make sure r>0 etc), then...
    self.radius = r;
}

//we don't really need to override the radius getter

-(double)pi
{
    return 3.14159;  //or however much accuracy you want
}

-(double)area
{
    return (self.pi * self.radius * self.radius);
}

-(double)diameter
{
    return (2.0 * self.radius);
}

-(double)circumference
{
    return (self.diameter * self.pi);
}

main中,您使用此类Circle的方式与在 Objective-C 中使用任何其他对象的方式相同(想想NSStringNSArray等)。

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        double radius;

        NSLog(@"Enter the circles radius:");
        scanf ("%lf", &radius);

        Circle *myCircle = [Circle circleWithRadius:radius]; //the factory method we set up

        NSLog(@"myCircle radius: %lf", myCircle.radius);
        NSLog(@"myCircle area: %lf", myCircle.area);
        NSLog(@"myCircle diameter: %lf", myCircle.diameter);
        NSLog(@"myCircle circumference: %lf", myCircle.circumference);

    }
    return 0;
}
于 2013-11-04T20:13:10.030 回答
0

当然有很多方法可以设置它。我记得刚开始时很困惑,下面是一个替代示例,可以让您看到其他内容。

它不是为了花哨而只是简单的,这样您就可以看到带有初始化程序的类的最小设置。

请注意,唯一初始化的值是 const pi,当然,半径也可以在那里初始化,nhgrif 的示例显示得非常好。

希望这可以帮助!

//  Circle.h

#import <Foundation/Foundation.h>

@interface Circle : NSObject
{
    double radius;
    double pi;
}

@property double radius, pi;

-(double) getArea;
-(double) getDiameter;
-(double) getCircumference;

@end

然后是实现:

//  Circle.m

#import "Circle.h"

@implementation Circle

@synthesize radius, pi;

// Initialize with const pi:
- (id)init {
    self = [super init];
    if (self) {
        pi = 3.14159;
        NSLog(@"Circle created.");
    }
    return self;
}

-(double) getArea {
    return pi*radius*radius;
}

-(double) getDiameter {
    return 2*radius;
}

-(double) getCircumference {
    return 2*pi*radius;
}

@end

然后是主要的:

//  main.m

#import <Foundation/Foundation.h>
#import "Circle.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        Circle *aCircle = [[Circle alloc] init];

        // Use an arbitrary value:            
        [aCircle setRadius:2];

        NSLog(@"Area = %f",[aCircle getArea]);
        NSLog(@"Circumference = %f",[aCircle getCircumference]);
        NSLog(@"Diameter = %f",[aCircle getDiameter]);
        NSLog(@"Check pi = %f",[aCircle pi]);

    }
    return 0;
}
于 2013-11-04T20:39:33.317 回答