这个Obj-C代码有什么问题?

时间:2011-03-15 21:04:19

标签: objective-c

这是教科书中的示例程序。它没有按预期运行。它应该模拟sigma计算并添加一系列的所有分数。但是当它完成循环时它只给我0.000000。有任何想法吗?提前致谢:

#import <Foundation/Foundation.h>

// The Fraction class

@interface Fraction : NSObject

{
    int numerator;
    int denominator;
}

@property int numerator, denominator;

-(void) print;
-(void) set: (int) n: (int) d;
-(double) convertToNum;
-(void) reduce;
-(Fraction *) add: (Fraction *) f;


@end

-------------------------------------

#import "Fraction.h"


@implementation Fraction

@synthesize numerator, denominator;

-(void) print

{
    NSLog (@"%i/%i", numerator, denominator);
}

-(double) convertToNum
{
    if (denominator != 0) 
        return (int) numerator / denominator;
    else 
        return 1.0;
}

-(void) set:(int)n:(int)d
{
    numerator = n;
    denominator = d;
}


-(void) reduce

{
    int u = numerator;
    int v = denominator;
    int temp;

    while (v != 0) {
        temp = v % u;
        u = v;
        v = temp;
    }

    numerator /= u;
    denominator /= u;
}


-(Fraction *) add: (Fraction *) f

{

    Fraction *result = [[Fraction alloc] init];
    int resultNum, resultDenom;

    resultNum = numerator * f.denominator + 
    denominator * f.numerator;
    resultDenom = denominator * f.denominator;

    [result set: resultNum: resultDenom];

    [result reduce];
    return result;
}

@end



--------------------------------------------

#import "Fraction.h"

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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Fraction *aFraction = [[Fraction alloc] init]; 
    Fraction *sum = [[Fraction alloc] init], *sum2; 
    int i, pow2, n;

    // set 1stfraction to 0 

    [sum set: 0.0 : 1.0];



    NSLog (@"Enter your value for n:");
    scanf ("%i", &n);


    pow2 = 2; 
    for (i = 1; i <= n; ++i) {
        [aFraction set: 1 : pow2]; 
        sum2 = [sum add: aFraction]; 
        [sum release]; // release previous sum 
        sum = sum2; 
        pow2 *= 2;


    }

    NSLog (@"After %i iterations, the sum is %f", n, [sum convertToNum]);
    [aFraction release];
    [sum release];




    [pool drain];
    return 0;
}

3 个答案:

答案 0 :(得分:4)

你的convertToNum方法被声明为返回一个double,但是你返回的实际值是一个int(两个int的除法结果总是一个int),所以实际上任何小于1的值都会被截断到0。

另外,作为旁注:那个你不给参数命名的编码风格真的很难读。 - (void)set:(int)n :(int)d不是一个好的方法声明,如果它实际上在书中使用,它应该从印刷品中拉出来。不知道nd是什么,第二个参数没有任何,而是前面的冒号。它应该是- (void)setNumerator:(int)aNumerator denominator:(int)aDenominator

答案 1 :(得分:1)

当分子小于分母时,convertToNum函数将返回0。尝试将其更改为:

-(double) convertToNum
{
    if (denominator != 0) 
        return (double)numerator / (double)denominator;
    else 
       return 1.0;
}

答案 2 :(得分:0)

减少似乎不正确。我不知道如何使逻辑工作,但

i = 2;
    lLimit = ((lNumerator > lDenominator) ? lNumerator : lDenominator)/2;

while (i < lLimit) {
    if ((lNumerator %  i == 0) &&(lDenominator % i == 0)) {
        lNumerator /= i;
        lDenominator /= i;
        i = 1;
    }
    i++;
}

应该更接近。对于名称更改感到抱歉,但是对于大量单字母变种我不能很好地工作

相关问题