这是教科书中的示例程序。它没有按预期运行。它应该模拟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;
}
答案 0 :(得分:4)
你的convertToNum
方法被声明为返回一个double,但是你返回的实际值是一个int(两个int的除法结果总是一个int),所以实际上任何小于1的值都会被截断到0。
另外,作为旁注:那个你不给参数命名的编码风格真的很难读。 - (void)set:(int)n :(int)d
不是一个好的方法声明,如果它实际上在书中使用,它应该从印刷品中拉出来。不知道n
和d
是什么,第二个参数没有任何,而是前面的冒号。它应该是- (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++;
}
应该更接近。对于名称更改感到抱歉,但是对于大量单字母变种我不能很好地工作