Что не так с этим кодом 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) 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 ]

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

Ваш метод convertToNum объявлен как возвращающий значение типа double, но реальное значение, которое вы возвращаете, является целым числом (результат деления двух целых чисел всегда является целым числом), поэтому на практике любые значения, меньшие 1, будут усечены до 0 .

Также, как примечание: этот стиль кодирования, когда вы не даете имен аргументам, действительно трудно читать. - (void)set:(int)n :(int)d не является хорошим объявлением метода, и если оно действительно используется в книге, его следует извлечь из печати. Понятия не имеют, что такое n и d, а второй аргумент не имеет что-либо , кроме двоеточия перед ним. Это должно быть что-то вроде - (void)setNumerator:(int)aNumerator denominator:(int)aDenominator.

1 голос
/ 16 марта 2011

Ваша функция convertToNum вернет 0, когда числитель меньше знаменателя.Попробуйте изменить это на это:

-(double) convertToNum
{
    if (denominator != 0) 
        return (double)numerator / (double)denominator;
    else 
       return 1.0;
}
0 голосов
/ 16 марта 2011

Уменьшить кажется неправильным. Я не знаю, как заставить эту логику работать, но

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

должно быть ближе. извините за изменения названия, но я не слишком хорошо работаю с большим количеством однобуквенных переменных

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