我会很快讲到这一点:我有一个适用于 iPhone OS 3.1.2 的应用程序,可以减少分数。我有4个网点:

  1. o顶部和o底部:两个UITextField,分别代表originalTop和originalBottom。
  2. r顶部和r底部:两个UILabel,分别代表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 的数字,然后按“减少”按钮,应用程序崩溃。请帮忙,

嗨盖伊

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

有帮助吗?

解决方案

看起来像在第一个 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];

这将使调试更加容易。

其他提示

您可能想调查一下 欧几里得算法 用于查找两个整数的最大公约数。它比因式分解要快得多(甚至更容易编码)。维基百科文章中有示例实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top