【问题标题】:Assistance needed writing simple Objective-C program编写简单的 Objective-C 程序需要帮助
【发布时间】:2013-11-04 19:45:28
【问题描述】:

几周以来,我一直在努力学习在线 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

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

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

【问题讨论】:

  • 您应该查看@properties。照原样,您需要先添加 setter 方法和 init 方法,然后才能执行任何操作。
  • 您的母语编程语言是什么?你学过任何语言的OOP吗?我不想对此投反对票,因为这个问题没有什么特别的问题,但是一个完整的答案会很长。
  • 这是一个可以在mac上运行的命令行工具吗?我使用objective-C,但主要在iphone上。让我知道,我会尽力帮助你,当然有指导;)
  • nhgrif- 我很菜鸟,不知道你的意思。
  • 这是我的第一门编程语言。另外,是的,我相信 William,我在 mac 虚拟机中使用 xcode 来编写这个。

标签: objective-c class geometry


【解决方案1】:

作为起点,您应该将.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

这将为radius 设置settergetter,为areadiametercircumference 设置getters。它还为您的circle 设置了一个initfactory 方法,该方法的半径是双倍的。

我会回来编辑您需要对.mmain 文件进行的一些修改,以使这项工作正常进行。需要注意的是,至少我们将覆盖 3 个readonly 属性的getters。这将阻止编译器为这些属性创建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;
}

【讨论】:

  • 非常感谢您的帮助!现在我只希望我能更好地遵循你的解释。我还有很长的路要走@_@
  • @myck 我将在编辑时解释更多内容。我现在包含了与此.h 对应的.m。让我知道到目前为止有什么令人困惑的地方。到目前为止,我们还没有到在 main 中调用任何东西的地步。
  • 我想我只需要多花点时间学习词汇。
  • @myck 如果您有任何具体问题,请告诉我。 Apple 的 Objective-C 文档非常有帮助。
【解决方案2】:

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

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

请注意,唯一初始化的值是 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:

//  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;
}

【讨论】:

  • 天哪,这太有帮助了!非常感谢!
  • 按照 Objective-C 的约定,只有通过引用返回值的方法才以“get”为前缀。 getAreagetDiametergetCircumference 应命名为:areadiametercircumference
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多