Pergunta

Eu vou chegar a esta rápida:Eu tenho um aplicativo para o iPhone OS 3.1.2, o que irá reduzir frações.Eu tenho 4 tomadas:

  1. oTop e oBottom:dois UITextFields, significa originalTop e originalBottom.
  2. rTop e rBottom:dois UILabels, significa reducedTop e reducedBottom.

Aqui está o código que eu uso:

-(IBAction)reduzir {

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 
}

}

Desculpem a divagação linhas.De qualquer maneira, alguém poderia me dizer o que está acontecendo?Quando eu lançar, digite um número em ambos os campos de texto, maior que 0, e pressione o botão "reduzir" botão, o aplicativo falha.Por favor,ajudem,

HiGuy

EDITAR:Mudou o 1º e 3º ciclos do (int i = 0 para (int i = 1.

Foi útil?

Solução

Parece que o primeiro-eu loop, i começa em 0 e divide-se por i (que é zero).

EDITAR:Havia um problema antes de o de divisão por zero, o que causou o acidente inicial e vários outros posteriormente.

  1. No primeiro ciclo, o addObject é feito usando @"%@", mas isso precisa ser @"%d", pois não é um número inteiro não uma cadeia.Ver Os Especificadores De Formato De Seqüência De Caracteres.

  2. factors1length e factors2length precisam ser inicializados para zero caso contrário, eles vão começar com valores aleatórios que vai jogar fora o resto do código.

  3. O addObject no segundo loop precisa usar @"%f" em vez de @"%@" porque você está tentando usar um valor de ponto flutuante de lá (numerador / xxx...).No entanto, há problemas com a abordagem de armazenar números em sua matriz como seqüências de caracteres.Primeiro, você está guardando um pouco de como ints e alguns como flutuadores.Stick para um tipo.Segundo, é melhor armazenar números como números em vez de converter a cadeia de caracteres e de volta.Você pode armazenar ints/flutua em um NSMutableArray convertendo-os para um NSNumber objeto.

Se você ainda não tiver feito isso, por favor, tome cdespinosa conselhos e passo o código de uma linha em um momento no depurador e ver quais os valores que as variáveis têm e exatamente o que o código está sendo executado.

Eu também recomendo não tentar colocar muita lógica em uma linha.Por exemplo, o addObject linha no segundo ciclo está fazendo muito que torna difícil ver o problema.Quebrá-lo até ao declarar variáveis locais para armazenar os valores das expressões na linha.
Assim, em vez de este:

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

escrever assim:

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

Isto irá torná-lo mais fácil de depurar.

Outras dicas

Você pode querer olhar para Algoritmo de Euclides por encontrar o maior divisor comum de dois números inteiros. É muito mais rápido (e ainda mais fácil de codificar) do que fatorar. Existem implementações de amostra no artigo da Wikipedia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top