【问题标题】:problem with fraction reducer application分数减少器应用程序的问题
【发布时间】:2023-03-10 22:29:01
【问题描述】:

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

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

这是我使用的代码:

-(IBAction)reduce {

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.

【问题讨论】:

    标签: objective-c crash reduce fractions


    【解决方案1】:

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

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

    1. 在第一个循环中,addObject 是使用 @"%@" 完成的,但这必须是 @"%d",因为 i 是整数而不是字符串。见String Format Specifiers

    2. factors1length 和factors2length 需要初始化为零,否则它们将从随机值开始,这会丢弃其余代码。

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

    如果您还没有这样做,请听从 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];
    

    这将使调试更容易。

    【讨论】:

    • 感谢您的帮助,但它仍然崩溃。还有问题吗? (除了第三个 for-i 循环)
    • 您是否尝试过在方法的开头设置断点,单步执行代码,在执行时查看局部变量的值,并注意崩溃所在的行?
    • 在遵循 cdespinosa 的好建议后,不确定您是否已经解决了这个问题,但我会尽快将代码中发现的更多问题添加到我的答案中。
    • 好的,我发现了问题。它在第二个和第四个 for-i 循环中。我将对此进行更多调查。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多