2011-03-15 4 views
0

교본에있는 예제 프로그램입니다. 예상대로 실행되지 않습니다. 시그마 계산을 시뮬레이트하고 모든 분수를 시리즈에 추가해야합니다. 루프가 완료되면 0.000000이됩니다. 어떤 아이디어? 미리 감사드립니다 :이 Obj-C 코드의 문제점은 무엇입니까?

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

답변

1

분자가 분모보다 작은 경우 convertToNum 함수는 0을 반환합니다. 어떤 값을 실제로 때문에, (int로 항상 2 개의 int 치의을 나눈 결과)

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

double을 반환하도록 convertToNum 메서드를 변경했지만 루프가 완료되면 여전히 0.000000을 제공합니다. 더 이상의 아이디어? - (double) convertToNum {(분모! = 0) 반환 값 (double) 분자/(double) 분모; 그렇지 않으면 1.0을 반환합니다. – Andrew

+0

@Andrew Jimley는 main에서 for 루프를 확인합니다. sum2를 sum으로 설정 한 다음 sum을 릴리스하면 sum2도 릴리스됩니다. 둘 다 동일한 객체를 가리키기 때문입니다. 또한 분수에 dealloc 메서드가 없습니다 ... 나는 당신이해야한다는 것을 알기에는 충분하지만, 여기서 일어날 일을 알기에는 충분하지 않습니다. 이 루프를 다시 작성하여 새 값을 생성하고 새로 작성하는 대신 한 값에서 다른 값으로 값을 복사하십시오. – SecretMarmoset

4

귀하의 convertToNum 방법은 배를 반환로 선언되어 있지만 반환 실제 값은 int이며 : 시도이로 변경 1보다 작 으면 0으로 절단됩니다.

또한 부수적으로 : 인수에 이름을 지정하지 않는 코딩 스타일은 읽기가 어렵습니다. - (void)set:(int)n :(int)d은 좋은 메소드 선언이 아니며 책에서 실제로 사용되는 경우 인쇄물에서 가져와야합니다. nd은 무엇이며, 두 번째 인수는 이 아닌이라는 글자가 있지만 그 앞에 콜론이 붙지 않았다는 것을 알 수 없습니다. 그것은 - (void)setNumerator:(int)aNumerator denominator:(int)aDenominator과 같아야합니다.

+0

+1 더 읽기 쉬운 메소드 서명. 내 생각에 목표 C의 위대한 측면 중 하나 – Stew

+0

답장을 보내 주셔서 감사합니다; 예, 텍스트는 "setTo : x over : y"로 설정된 메소드를 가지고 있습니다. 나는 다르게 시도했습니다. 나쁜 습관을 언급합니다. double을 반환하도록 convertToNum 메서드를 변경했지만 루프가 완료되면 여전히 0.000000을 제공합니다. 더 이상의 아이디어? - (더블) convertToNum { \t 경우 (분모 = 0!) \t \t 리턴 (더블) 분자/(더블) 분모; \t else \t \t return 1.0; – Andrew

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

이 가까워 야합니다. 이름 변경에 대해 유감스럽게 생각하지만 단일 문자 바를 많이 사용하면 작동하지 않습니다.

관련 문제