質問

簡単に説明します。端数を削減する iPhone OS 3.1.2 用のアプリケーションがあります。コンセントが4つあります。

  1. o上部とo下部:2 つの UITextField は、originalTop とoriginalBottom を表します。
  2. r上部とr下部:2 つの 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 より大きい数値を入力し、[縮小] ボタンを押すと、アプリがクラッシュします。助けてください、

ハイガイ

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

役に立ちましたか?

解決

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

編集:ゼロ除算の前に最初のクラッシュを引き起こす問題が 1 つあり、その後も他の問題がいくつかありました。

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

  2. 0 に初期化する必要があります。そうしないと、ランダムな値で開始され、コードの残りの部分が混乱します。

  3. 2 番目のループの addObject では、浮動小数点値 (分子 / xxx...) を使用しようとしているため、@"%@" の代わりに @"%f" を使用する必要があります。ただし、数値を文字列として配列に格納する方法には問題があります。まず、一部を int として保存し、一部を float として保存します。1 つのタイプに固執します。次に、数値を文字列に変換して元に戻すよりも、数値として保存する方が適切です。ints/floats を 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];

これにより、デバッグが容易になります。

他のヒント

次の2つの整数の最大公約数を見つけるためのユークリッド互除のnoreferrer">

scroll top