フラクションリデューサーアプリケーションの問題
-
21-09-2019 - |
質問
簡単に説明します。端数を削減する iPhone OS 3.1.2 用のアプリケーションがあります。コンセントが4つあります。
- o上部とo下部:2 つの UITextField は、originalTop とoriginalBottom を表します。
- 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 つあり、その後も他の問題がいくつかありました。
最初のループでは、addObject は @"%@" を使用して実行されますが、i は文字列ではなく整数であるため、これは @"%d" である必要があります。見る 文字列フォーマット指定子.
0 に初期化する必要があります。そうしないと、ランダムな値で開始され、コードの残りの部分が混乱します。
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">