Frage

Ich werde auf diese schnell bekommen: Ich habe eine Anwendung für das iPhone OS 3.1.2, die Fraktionen zu reduzieren. Ich habe 4 Ausgänge:

  1. OTOP und oBottom. Zwei UITextFields, steht für originalTop und originalBottom
  2. rTop und rBottom: zwei UILabels, steht für reducedTop und reducedBottom
.

Hier ist der Code, den ich verwenden:

- (IBAction) reduzieren {

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 
}

}

Es tut uns Leid über die Streulinien. Wie auch immer, könnte mir jemand sagen, was los ist? Wenn ich starten, geben Sie eine Zahl in den beiden Textfelder, größer als 0, und drücken Sie die „verringern“ Taste, um die App stürzt ab. Bitte Hilfe,

HiGuy

EDIT:. Changed die 1. und 3. für Schleifen von (int i 0 bis (int = i = 1

War es hilfreich?

Lösung

sieht aus wie in der ersten for-Schleife i, i beginnt bei 0 und er teilt durch i (die Null ist).

EDIT: Es war ein Problem, bevor die Division durch Null, die den anfänglichen Absturz und einig anderes verursachten auch danach

.
  1. In der ersten Schleife wird die addObject fertig mit @ „% @“ aber das muss sein @ „% d“, weil ich eine ganze Zahl ist kein String. Siehe String Formatbezeichner .

  2. factors1length und factors2length Bedarf auf Null initialisiert werden, sonst werden sie mit zufälligen Werten beginnen, die den Rest des Codes abwerfen wird.

  3. Die addObject in der zweiten Schleife Bedürfnisse Nutzung @ „% f“ statt @ „% @“, weil Sie versuchen, einen Fließkommawert dort zu verwenden (Zähler / xxx ...). Allerdings gibt es Probleme mit dem Ansatz der Zahlen im Array als Strings zu speichern. Erstens sind einige als ints und einige als Schwimmer zu speichern. Halten Sie sich an einen Typ. Zweitens, es ist besser, zu speichern Zahlen als Zahlen und nicht auf Zeichenfolge und zurück konvertieren. Sie können speichern ints / schwimmt in einem NSMutableArray von ihnen zu einem NSNumber Objekt umgewandelt wird.

Wenn Sie nicht bereits getan haben, nehmen Sie bitte cdespinosa Rat und Schritt durch den Code eine Zeile zu einem Zeitpunkt, in dem Debugger und sehen, welche Werte die Variablen haben und genau das, was der Code ausgeführt wird.

Ich würde auch nicht versuchen, empfehlen zu viel Logik in eine Zeile zu setzen. Zum Beispiel macht die addObject Linie in der zweiten Schleife zu viel es schwer zu sehen, das Problem zu machen. Break it, indem er erklärt lokale Variablen bis speichern die Werte von Ausdrücken innerhalb der Linie.
Anstatt also folgendermaßen aus:

[factors1 addObject:[NSString stringWithFormat:@"%@", (numerator / [[factors1 objectAtIndex:i] intValue])]];

schreiben Sie es wie folgt aus:

int iFactor = [[factors1 objectAtIndex:i] intValue];
float value = (numerator / iFactor);
NSString *newFactor = [NSString stringWithFormat:@"%@", value];
[factors1 addObject:newFactor];

Damit wird es einfacher zu debuggen machen.

Andere Tipps

Sie können schauen wollen Euklids Algorithmus für den größten gemeinsamen Teiler zweier ganzer Zahlen zu finden, . Es ist viel schneller (und noch einfacher zu Code) als Factoring. Es gibt Beispielimplementierungen in Wikipedia-Artikel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top