Pregunta

Voy a llegar a esta rápida: Tengo una aplicación para el iPhone OS 3.1.2 que reducirá fracciones. Tengo 4 salidas:

  1. Otop y oBottom:. UITextFields dos, es sinónimo de originalTop y originalBottom
  2. TRP y rBottom: dos UILabels, casetas para reducedTop y reducedBottom
.

Este es el código que utilizo:

- (IBAction) reducir {

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 
}

}

Lo siento por las líneas perdidas. De todos modos, es posible que alguien me diga lo que está pasando? Cuando inicio, escriba un número en ambos campos de texto, mayor que 0, y presione el botón de "reducir", la aplicación se bloquea. Por favor ayuda,

HiGuy

EDIT:. Se ha cambiado el primero y el tercero para los bucles de (int i = 0 a (int i = 1

¿Fue útil?

Solución

Parece que en el primer bucle para-i, i se inicia en 0 y se divide por i (que es cero).

EDIT:. Pero había un problema antes de que los de división por cero, lo que causó el accidente inicial y varios otros después también

  1. En el primer bucle, el addObject se hace usando @ "% @", pero esto tiene que ser @ "% d" porque i es un número entero no una cadena. Ver cadena especificadores de formato .

  2. factors1length y factors2length necesitan ser inicializado a cero en caso contrario van a empezar con valores aleatorios, que se lanzan fuera del resto del código.

  3. El addObject en el segundo bucle tiene que usar @ "% f" en lugar de @ "% @" ya que están tratando de utilizar un valor de punto flotante allí (numerador / xxx ...). Sin embargo, hay problemas con el enfoque de almacenar números en su conjunto como cadenas. En primer lugar, usted está almacenando algunos como enteros y algunos como flotadores. Se adhieren a un tipo. En segundo lugar, es mejor para almacenar números como números en lugar de convertir a la cadena y la espalda. Puede almacenar enteros / flota en un NSMutableArray mediante la conversión a un objeto NSNumber.

Si no lo ha hecho, por favor seguir el consejo de cdespinosa y el paso a través de la una sola línea de código en un momento en el depurador y ver cuáles son los valores de las variables tienen y exactamente lo que se está ejecutando el código.

También me gustaría recomendar no tratar de poner demasiada lógica en una sola línea. Por ejemplo, la línea addObject en el segundo bucle está haciendo demasiado por lo que es difícil de ver el problema. Dividirla por la declaración de variables locales para almacenar los valores de las expresiones dentro de la línea.
Así que en lugar de esto:

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

escribirlo así:

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

Esto hará que sea más fácil de depurar.

Otros consejos

Es posible que desee ver en algoritmo de Euclides para encontrar el máximo común divisor de dos enteros . Es mucho más rápido (y aún más fácil de código) que la factorización. Existen implementaciones de muestra en el artículo de Wikipedia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top