проблема с применением редуктора фракции - PullRequest
0 голосов
/ 16 января 2010

Я доберусь до этого быстро: у меня есть приложение для iPhone OS 3.1.2, которое уменьшит дроби. У меня есть 4 магазина:

  1. oTop и oBottom: два поля UIText, обозначают originalTop и originalBottom.
  2. rTop и rBottom: две метки UIL, обозначают уменьшенную вершину и уменьшенную нижнюю.

Вот код, который я использую:

- (IBAction) уменьшить {

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, и нажмите кнопку «уменьшить», приложение вылетает. Пожалуйста, помогите,

HiGuy

EDIT: изменен 1-й и 3-й циклы для (int i = 0 до (int i = 1.

Ответы [ 2 ]

3 голосов
/ 16 января 2010

Похоже, что в первом цикле for-i я начинаю с 0 и делится на i (что равно нулю).

РЕДАКТИРОВАТЬ: была одна проблема до деления на ноль, которая вызвала первоначальный сбой и несколько других впоследствии.

  1. В первом цикле addObject выполняется с помощью @ "% @", но это должно быть @ "% d", потому что я - целое число, а не строка. См. Спецификаторы формата строки .

  2. factor1length и factor2length необходимо инициализировать нулем, иначе они начнут со случайных значений, которые будут отбрасывать оставшуюся часть кода.

  3. AddObject во втором цикле должен использовать @ "% f" вместо @ "% @", потому что вы пытаетесь использовать значение с плавающей запятой там (числитель / xxx ...). Однако существуют проблемы с подходом хранения чисел в вашем массиве в виде строк. Сначала вы храните некоторые как целые, а некоторые как плавающие. Придерживайтесь одного типа. Во-вторых, лучше хранить числа как числа, а не преобразовывать их в строку и обратно. Вы можете хранить целые числа / числа с плавающей запятой в NSMutableArray, преобразовав их в объект NSNumber.

Если вы еще этого не сделали, воспользуйтесь советом cdespinosa и пошагово просматривайте код по одной строке в отладчике и посмотрите, какие значения имеют переменные и какой код выполняется.

Я бы также рекомендовал не пытаться поместить слишком много логики в одну строку. Например, строка 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];

Это облегчит отладку.

1 голос
/ 16 января 2010

Возможно, вы захотите взглянуть на алгоритм Евклида для нахождения наибольшего общего делителя двух целых чисел. Это гораздо быстрее (и даже проще для кодирования), чем факторинг. В статье Википедии есть примеры реализаций.

...