0

我会快速解决这个问题:我有一个适用于 iPhone OS 3.1.2 的应用程序,可以减少分数。我有4个网点:

  1. oTop 和 oBottom:两个 UITextField,分别代表 originalTop 和 originalBottom。
  2. rTop和rBottom:两个UILabel,分别代表reduceTop和reduceBottom。

这是我使用的代码:

-(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 的数字,然后按“减少”按钮,应用程序崩溃。请帮忙,

嗨盖伊

编辑:将第一个和第三个 for 循环从 (int i = 0 更改为 (int i = 1.

4

2 回答 2

3

看起来在第一个 for-i 循环中,i 从 0 开始,然后除以 i(为零)。

编辑:在除以零之前存在一个问题,导致最初的崩溃以及之后的其他几个问题。

  1. 在第一个循环中,addObject 使用 @"%@" 完成,但这需要 @"%d" 因为 i 是整数而不是字符串。请参阅字符串格式说明符

  2. Factors1length 和 Factors2length 需要初始化为零,否则它们将以随机值开始,这将抛出其余代码。

  3. 第二个循环中的 addObject 需要使用 @"%f" 而不是 @"%@" 因为您试图在那里使用浮点值(分子 / xxx ...)。但是,将数组中的数字作为字符串存储的方法存在问题。首先,您将一些存储为整数,一些存储为浮点数。坚持一种类型。其次,最好将数字存储为数字,而不是转换为字符串并返回。您可以通过将整数/浮点数转换为 NSNumber 对象将它们存储在 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];

这将使调试更容易。

于 2010-01-16T17:32:02.620 回答
1

您可能需要研究欧几里得算法来找到两个整数的最大公约数。它比分解要快得多(甚至更容易编码)。维基百科文章中有示例实现。

于 2010-01-16T19:22:05.190 回答