Question

Je vais arriver à ce rapide: J'ai une application pour l'iPhone OS 3.1.2 qui réduira les fractions. J'ai 4 points:

  1. Otop et oBottom:. Deux UITextFields, est synonyme de originalTop et originalBottom
  2. TRP et rBottom: deux UILabels, est synonyme de reducedTop et reducedBottom
.

est le code que j'utilise ici:

- (IBAction) réduire {

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 
}

}

Désolé les lignes parasites. Quoi qu'il en soit, quelqu'un pourrait me dire ce qui se passe? Quand je lance, tapez un numéro dans les deux champs de texte, supérieur à 0, et appuyez sur le bouton « réduire », les accidents de l'application. S'il vous plaît aider,

HiGuy

EDIT:. Changement de la 1ère et 3ème pour les boucles de (int i = 0 à (int i = 1

Était-ce utile?

La solution

On dirait que dans la première boucle pour-i, i commence à 0 et le divise par i (ce qui est égal à zéro).

EDIT:. Il y avait un problème avant la division par zéro, ce qui a causé l'accident initial et plusieurs autres par la suite, ainsi

  1. Dans la première boucle, le addObject est réalisé en utilisant @ « % @ », mais cela doit être @ « % d » parce que i est un entier non une chaîne. Voir Format Chaîne Prescripteurs .

  2. factors1length et factors2length doivent être initialisés à zéro sinon ils vont commencer par des valeurs aléatoires qui jetteront hors du reste du code.

  3. Le addObject dans la deuxième boucle doit utiliser @ « % f » au lieu de @ « % @ » parce que vous essayez d'utiliser une valeur en virgule flottante, il (numérateur / xxx ...). Cependant, il y a des problèmes avec l'approche de stocker des numéros dans votre tableau sous forme de chaînes. Tout d'abord, vous stockez certains comme ints et certains flotteurs. Tenez-vous à un type. En second lieu, il est préférable de stocker des nombres sous forme de nombres au lieu de convertir la chaîne et le dos. Vous pouvez stocker ints / flotte dans un NSMutableArray en les convertissant à un objet NSNumber.

Si vous ne l'avez pas déjà fait, s'il vous plaît prendre les conseils de cdespinosa et étape par le code à une ligne à la fois dans le débogueur et voir quelles sont les valeurs des variables et ont exactement ce que le code est en cours d'exécution.

Je vous recommande aussi ne pas essayer de mettre trop de logique en une seule ligne. Par exemple, la ligne de addObject dans la seconde boucle est en train de faire trop ce qui rend difficile de voir le problème. Break it up en déclarant des variables locales pour stocker les valeurs des expressions dans la ligne.
Ainsi, au lieu de ceci:

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

écrire comme ceci:

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

Ce sera plus facile à déboguer.

Autres conseils

Vous pouvez regarder dans algorithme d'Euclide pour trouver le plus grand commun diviseur de deux entiers . Il est beaucoup plus rapide (et encore plus facile à coder) que l'affacturage. Il existe des implémentations exemples dans l'article de Wikipedia.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top