Программа Obj-C из текста Кочана не работает должным образом - PullRequest
0 голосов
/ 16 марта 2011

Предполагается, что эта программа выполнит сложение сигма из ряда дробей и отобразит результат. Тем не менее, он выводит только 0,000000. Согласно советам других, похоже, что остатки усекаются целочисленной арифметикой, но я не могу найти где. Есть идеи?

#import <Foundation/Foundation.h>

// The Fraction class

@interface Fraction : NSObject

{
    int numerator;
    int denominator;
}

@property int numerator, denominator;

-(void) print;
-(void) setTo: (int) n over: (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 ((double) numerator / (double) denominator);
    else 
        return 1.0;
}

-(void) setTo: (int) n over: (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 setTo: resultNum over: 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 setTo: 0.0 over: 1.0];



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


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


    }

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




    [pool drain];
    return 0;
}

1 Ответ

2 голосов
/ 16 марта 2011

Решено:

- (недействительно) уменьшить

{int u = числитель;int v = знаменатель;int temp;

while (v != 0) {
    temp = u % v;            // 'u' and 'v' were transposed.
    u = v;
    v = temp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...