2010-01-16 65 views
0

我会快速的:我有一个iPhone OS 3.1.2的应用程序,它可以减少分数。我有4个网点:分数缩减器应用程序的问题

  1. oTop和oBottom:两个UITextFields,代表originalTop和originalBottom。
  2. rTop和rBottom:两个UILabels,代表reducedTop和reducedBottom。

这里是我使用的代码:

- (IBAction为)减少{

int numerator = [[oTop text] intValue]; 
int denominator = [[oBottom text] intValue]; 
if (denominator > 0) { 
    NSMutableArray *factors1 = [[NSMutableArray alloc] init]; 
    NSMutableArray *factors2 = [[NSMutableArray alloc] init]; 
    int factors1length; 
    int factors2length; 
    for (int i = 1; i < ceil(sqrt(numerator)); i ++) { 
     [factors1 addObject:[NSString stringWithFormat:@"%@", i]]; 
     if (round(numerator/i) != numerator/i) { 
      [factors1 removeLastObject]; 
     } else { 
      factors1length ++; 
     } 
    } 
    for (int i = factors1length; i <= 0; i --) { 
     [factors1 addObject:[NSString stringWithFormat:@"%@", (numerator/[[factors1 objectAtIndex:i] intValue])]]; 
    } //End get numerator factors 
    for (int i = 1; i < ceil(sqrt(denominator)); i ++) { 
     [factors2 addObject:[NSString stringWithFormat:@"%@", i]]; 
     if (round(denominator/i) != denominator/i) { 
      [factors2 removeLastObject]; 
     } else { 
      factors2length ++; 
     } 
    } 
    for (int i = factors2length; i <= 0; i --) { 
     [factors2 addObject:[NSString stringWithFormat:@"%@", (denominator/[[factors2 objectAtIndex:i] intValue])]]; 
    } //End get denominator factors 
} 

}

很抱歉的杂散线。 无论如何,有人能告诉我发生了什么事吗? 当我启动时,在两个文本字段中输入一个大于0的数字,然后按下“减少”按钮,应用程序崩溃。 请帮帮忙,

HiGuy

编辑:改变了第一和第三从环路(INT I = 0(INT I = 1

回答

3

看起来像第一的-i循环,我从0开始,并将其划分为i(其是零)

编辑:。有一个问题除以零,这导致最初碰撞和其他几个人之前之后以及

  1. 在第一个循环中,使用@“%@”完成addObject,但这需要是@“%d”,因为我是一个不是字符串的整数。见String Format Specifiers

  2. 因子1的长度和因子2的长度需要被初始化为零,否则它们将以随机值开始,这会抛出其余的代码。

  3. 因为您尝试在那里使用浮点值(分子/ xxx ...),所以第二个循环中的addObject需要使用@“%f”而不是@“%@”。但是,将数组作为字符串存储的方法存在问题。首先,你存储一些整数和一些浮点数。坚持一种类型。其次,最好将数字存储为数字,而不是转换为字符串和数字。您可以通过将它们转换为NSNumber对象来将ints/float存储在NSMutableArray中。

如果您还没有这样做的话,请通过一行代码采取cdespinosa的建议和步骤在调试程序时,看到什么值的变量已经和正在执行什么代码。

我也建议不要试图把太多的逻辑放入一行。例如,第二个循环中的addObject行太多,很难看到问题。 通过声明局部变量来存储行内表达式的值来分解它。
因此,而不是这样的:

[factors1 addObject:[NSString stringWithFormat:@"%@", (numerator/[[factors1 objectAtIndex:i] intValue])]]; 

写这样的:

int iFactor = [[factors1 objectAtIndex:i] intValue]; 
float value = (numerator/iFactor); 
NSString *newFactor = [NSString stringWithFormat:@"%@", value]; 
[factors1 addObject:newFactor]; 

这将使它更容易调试。

+0

感谢您的帮助,但它仍然崩溃。还有更多问题吗? (除了第三个for循环) – 2010-01-16 18:02:16

+1

您是否曾尝试在方法开始时设置断点,逐步执行代码,查看执行时局部变量的值,并注意它崩溃的行? – cdespinosa 2010-01-16 23:19:03

+0

不知道你是否已经在遵循cdespinosa的好建议之后解决了这个问题,但我很快就会在代码中发现更多问题。 – DyingCactus 2010-01-17 03:29:17

1

您可能需要查看Euclid's algorithm以找出两个整数的最大公约数。它比保理要快得多(甚至更容易编码)。维基百科文章中有示例实现。