проблема с применением редуктора дробей
-
21-09-2019 - |
Вопрос
Я перейду к этому быстро:У меня есть приложение для iPhone OS 3.1.2, которое сокращает дроби.У меня 4 розетки:
- oВерх и oНиз:два UITextFields обозначают originalTop и originalBottom.
- 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 (что равно нулю).
РЕДАКТИРОВАТЬ:Перед делением на ноль возникла одна проблема, которая вызвала первоначальный сбой, а также несколько других впоследствии.
В первом цикле addObject выполняется с использованием @"%@", но это должно быть @"%d", поскольку i — целое число, а не строка.Видеть Спецификаторы строкового формата.
Факторы1длина и Фактор2длина должны быть инициализированы нулевым значением, иначе они начнутся со случайных значений, которые отбросят остальную часть кода.
В 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];
Это облегчит отладку.
Другие советы
Возможно, вы захотите изучить Алгоритм Евклида для нахождения наибольшего общего делителя двух целых чисел.Это намного быстрее (и даже проще кодировать), чем факторинг.В статье в Википедии приведены примеры реализаций.