Математическая функция не показывает правильные результаты - PullRequest
1 голос
/ 18 марта 2011

Мне нужна помощь для получения правильных результатов по дробным результатам. После сложения их и уменьшения, они должны показать конечный результат 3/4, но я получаю результат 3/1. Можете ли вы показать мне, где мои функции не так?

Fraction.h

#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) add: (Fraction *) f;
-(void) reduce; 

@end

Фракция.м

#import "Fraction.h"


@implementation Fraction

@synthesize numerator, denominator;

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


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

}    

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

//add a fraction to the receiver

-(void) add: (Fraction *) f {
    //To add two fractions
    //a/b + c/d = ((a*d) + (b*c))/(b * d)

    numerator = (numerator * [f denominator])
    + (denominator * [f numerator]);
    denominator = [f denominator];

    [self reduce];
}

-(void) reduce{
    int u = numerator;
    int v = denominator;
    int temp;

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

    numerator /= u;
    denominator /= u;
}

@end

FractionTest.m

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



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

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

    Fraction *aFraction = [[Fraction alloc]init];
    Fraction *bFraction = [[Fraction alloc]init];

    //Set two fractions to 1/4 and 1/2 and add them together

    [aFraction setTo:1 over:4];
    [bFraction setTo:1 over:2];

    //Print the results

    [aFraction print];
    NSLog(@"+");
    [bFraction print];
    NSLog(@"=");    

    [aFraction add:bFraction];

    //reduce the result of the addition and print the result

    [aFraction reduce];
    [aFraction print];

    [aFraction release];
    [bFraction release];


    [pool drain];
    return 0;
}

Можете ли вы сказать, что я делаю не так? TIA

1 Ответ

0 голосов
/ 18 марта 2011

Проверьте свою математику: -)

-(void) add: (Fraction *) f {
//To add two fractions
//a/b + c/d = ((a*d) + (b*c))/(b * d)

numerator = (numerator * [f denominator])
+ (denominator * [f numerator]);
denominator = [f denominator];

Вы устанавливаете знаменатель объекта в знаменатель аргумента, когда вы должны установить его в результате умножения двух.

denominator = denominator * [f denominator];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...