Здравствуйте! Начал осваивать ООП и столкнулся с проблемой, решил написать класс matematik и несколько методов в нем. Первым стал возведение в степень. Вот код: public class matematik { public int result; public int erection (int a, int n) { if (n>0) { for(int i = 1; i <= n; i++) { result = 1; result = result * a; } return result; } if (n<0){ for(int i = n; i <= 1; i++){ result = 1; result = result/a; } return result; } } } Эклипс ругается на вот эту строчку "public int erection (int a, int n)" This method must return a result of type int. Подскажите новичку, что я делаю не так?
Ответ
// matematik - неправильно, правильно mathematic.
// а кроме того в java принято называть классы с заглавной
class Mathematic {
// есть смысл сделать метод статичным,
// - т.к. его выполнение не повлияет на состояние класса
public static int power(int base, int power) {
// эта переменная не может быть полем
// потому что нет смысла хранить временные данные за пределами данного
// метода
int result = 0;
if (power > 0) {
for (int i = 1; i <= power; i++) {
result = 1;
result = result * base;
}
// мы в любом случае будем возвращать результат
// посему именно здесь можно не возвращать результат
// return result;
} else if (power < 0) {
// чутье подсказывает что этот код работает неправильно
for (int i = power; i <= 1; i++) {
result = 1;
result = result / base;
}
// мы в любом случае будем возвращать результат
// посему именно здесь можно не возвращать результат
// return result;
}
// результат возвращаем в любом случае
return result;
}
}
имеет смысл рассмотреть частные случаи:
1) степень равна 0
2) степень равна 1
3) степень меньше 0
4) степень - дробное число
последний частный случай подразумевает что у вас степень может быть не только целочисленным значением, но еще и дробным. а посему лучше поменять тип данных int на double, но не думаю что есть смысл рассматривать этот вариант, т.к. его реализация не так уж проста. с другой стороны возможность задания негативной степени показывает что на входе функции может быть дробное число (5^-2 = 1/5^2 = 1/25).
код учитывая все вышесказанное:
public static double power(double base, int power) {
// сначала обрабатываем частные случаи
// это нужно чтоб наш код не делал лишних действий
// возведение 0 в любую степень даст 0
// в случае когда степень будет отрицательной
// придется делить на 0
if (0 == base) {
return 0;
}
// если степень равна единице, то выполнять возведение бесполезно
// if (1.0 == power) { - неправильно (1.0 имеет тип double)
// спасибо @avp что заметил, так будет правильно
if (1 == power) {
return base;
}
// если степень отрицательная: то 2^(-3) = 1/(2^3)
if (0 > power) {
return power(1 / base, -power);
}
// будет хранить результат в этой переменой
double result = base;
// само вычисление
for (int i = 1; i < power; i++) {
result = result * base;
}
return result;
}
Комментариев нет:
Отправить комментарий