0

これについては簡単に説明します。分数を減らすiPhoneOS3.1.2用のアプリケーションがあります。私は4つのアウトレットを持っています:

  1. oTopとoBottom:2つのUITextFieldsは、originalTopとoriginalBottomを表します。
  2. rTopとrBottom:2つのUILabelは、reducedTopとreducedBottomを表します。

私が使用するコードは次のとおりです。

-(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より大きい数字を入力し、[縮小]ボタンを押すと、アプリがクラッシュします。助けてください、

HiGuy

編集:1番目と3番目のforループを(int i = 0から(int i = 1)に変更しました。

4

2 に答える 2

3

最初のfor-iループのように見えますが、iは0から始まり、i(ゼロ)で除算されます。

編集:ゼロ除算の前に1つの問題があり、最初のクラッシュとその後のいくつかの問題が発生しました。

  1. 最初のループでは、addObjectは@ "%@"を使用して実行されますが、iは文字列ではなく整数であるため、これは@ "%d"である必要があります。文字列形式指定子を参照してください。

  2. factor1lengthとfactors2lengthは、ゼロに初期化する必要があります。そうしないと、ランダムな値で開始され、残りのコードが破棄されます。

  3. 2番目のループのaddObjectは、浮動小数点値(分子/ xxx ...)を使用しようとしているため、@ "%@"ではなく@ "%f"を使用する必要があります。ただし、配列に数値を文字列として格納する方法には問題があります。まず、いくつかをintとして、いくつかをfloatとして保存します。1つのタイプに固執します。次に、文字列に変換して戻すよりも、数値を数値として格納する方が適切です。ints / floatをNSNumberオブジェクトに変換することにより、NSMutableArrayに格納できます。

まだ行っていない場合は、cdespinosaのアドバイスに従って、デバッガーで一度に1行ずつコードをステップ実行し、変数の値と実行されているコードを確認してください。

また、1行に多くのロジックを入れようとしないことをお勧めします。たとえば、2番目のループの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

2つの整数の最大公約数を見つけるために、ユークリッドのアルゴリズムを調べることをお勧めします。因数分解よりもはるかに高速です(そしてコーディングがさらに簡単です)。ウィキペディアの記事にサンプルの実装があります。

于 2010-01-16T19:22:05.190 に答える