Вопрос

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

  1. oВерх и oНиз:два UITextFields обозначают originalTop и originalBottom.
  2. rTop и rBottom:две UILabels, обозначающие уменьшенныйTop и уменьшенныйBottom.

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

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

Привет парень

РЕДАКТИРОВАТЬ:Изменены 1-й и 3-й циклы for с (int i = 0 на (int i = 1.

Это было полезно?

Решение

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

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

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

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

  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];

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top