Книга: Основы программирования с Java
Назад: Вопросы
Дальше: Пример подкласса

Дополнительные ресурсы

Когда выполняется компьютерная программа, выражения в этой программе, как правило, выполняются по очереди, по порядку.

Однако, реальная компьютерная программа часто содержит тип выражений под названием выражение "choice", которое выбирает одно из выражений, которое следует выполнить в зависимости от некоторых условий.

Примерами являются выражения if, if-else и switch в Java.

Другой тип выражений, которые могут изменять нормальный поток управления, называются выражением "iteration".

Выражения итерации вызывают блок операторов для его повторения несколько раз, в зависимости от счетчика или некоторого условия прекращения.

Примерами являются выражения while, do-while и for в Java.





Программа Control позволяет подготовить короткий сегмент программы в правом верхнем окне, содержащем выражения if-else, while и do-while в Java.

Пример приведен в этом окне, который можно изменить или заменить.

Другие формы выражений выбора и итерации не поддерживаются.

Вы можете нажать на кнопку "Convert", чтобы увидеть эквивалентный сегмент псевдо-кода в правом нижнем углу апплета.

Этот псевдо-код также преобразуется в виде блок-схемы в окне слева.

Затем вы можете использовать кнопки "Next" и "Back", чтобы увидеть анимацию этого сегмента программы.

Для запуска приложения нужно запустить метод main класса ControlFlow.

Вопросы

Задача

Учитывая следующий метод:

public static int fact2(int n1, int n2) {

int t = 1; // initialize t to 1

for (int counter = n1; counter <= n2; counter++) {

t = t * counter;

}

return t;

}

Каким будет возвращаемое значение "t", если

i) n1 = 3, n2 = 5

ii) n1 = 4, n2 = 2

iii) n1 = -2, n2 = 2

Варианты ответа:

1. i) 60 ii) 24 iii) 0

2. i) 60 ii) 1 iii) infinite loop

3. i) 60 ii) 1 iii) 0

4. i) 12 ii) 1 iii) 0

Ответ: 3.

Объяснение

Цикл идет от итерации номер n1 вплоть до итерации номер n2.

Цикл будет завершен, когда текущий номер итерации больше n2.

Вначале инициализируется переменная t в 1.

В каждой итерации, значение t умножается на текущий номер итерации, и результат присваивается обратно в t. Поэтому результатом программы будет:

n1 * (n1 + 1) * … * (n2 – 1) * n2

Для случая i), n1 = 3, n2 = 5.

Таким образом, t = 3 * 4 * 5 = 60.

Для случая i), n1 = 4, n2 = 2.

Так как первоначально n1 больше, чем n2, цикл будет завершен перед выполнением первой итерации.

Таким образом, t остается в ее исходном значении 1.

В случае iii), n1 = -2, n2 = 2, поэтому t = -2 * -1 * 0 * 1 * 2 = 0.

Задача

Что делает эта программа?

public static int fact2(int n1, int n2) {

int t = 1; // initialize t to 1

for (int counter = n2; counter > n1; counter–) {

t = t * counter;

}

return t;

}

Варианты ответа:

1.      n1 * (n1 + 1) * … * (n2 – 1)

2.      n1 * (n1 + 1) * … * (n2 – 1) * n2

3.      (n1 + 1) * … * (n2 – 1)

4.      (n1 + 1) * … * (n2 – 1) * n2

Ответ: 4.

Объянение

Цикл идет от итерации номер n2 до и исключая итерацию номер n1.

Цикл будет завершен, когда текущий номер итерации равен n1.

Вначале инициализируется переменная t в 1.

В каждой итерации, значение t умножается на текущий номер итерации, и результат присваивается обратно в t.

Таким образом, результатом программы будет n2 * (n2 – 1) * … * (n1 + 1), что может быть записано как (n1 + 1) * … * (n2 – 1) * n2.

Общие ошибки

Теперь рассмотри некоторые распространенные ошибки при использовании циклов.

Я уже упоминал, что сравнивание равенства числа с плавающей точкой может привести к проблеме в связи с неточностью в представлении числа с плавающей запятой в компьютерах.

Поэтому использования операторов «==» или «!=» для сравнения чисел с плавающей запятой следует избегать как условий цикла.

Цикл может никогда не остановиться, если эти числа не точно равны или не равны из-за неточности.







В этом примере, бесконечный цикл никогда не закончится, если item не будет никогда в точности равно 0.







Можете ли вы определить проблемы с этим while циклом?

Здесь есть две проблемы.

Первая для сравнения неравенства числа с плавающей точкой, как я только что описал.

Вторая – это точка с запятой после условия.

Это создаст пустое тело цикла, и приведет к бесконечному циклу!

Как насчет for цикла?

Опять же, есть дополнительная точка с запятой после закрытия скобки for выражения.

Цикл будет выполняться подсчет, ничего не делая в теле цикла.

Когда произойдет выход из for цикла, привет будет напечатано только один раз.

Вот некоторые из ошибок, которые вы никогда не должны делать.

Не существует четких правил, по которым следует решать, какой тип цикла лучше для решения определенных задач.

В общем, for цикл является лучшим для случаев, если известно число итераций.

Например, количество студентов в классе, если оно известно.

В то же время while или do-while циклы используются, когда число итераций неизвестно.

Основное различие между while и do-while циклом является то, что do-while цикл всегда будет выполнять тело цикла по крайней мере, один раз.

Что касается while цикла, бывают случаи, что тело цикла не будет выполнено вообще.

Задание

Вы только что увидели несколько распространенных ошибок циклов.

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







Ответ:







Подклассы

Давайте посмотрим на другой пример, который связан с классом BankAccount, который мы обсуждали ранее.

Вид счета, который мы собираемся рассмотреть, это сберегательный счет.

Сберегательные счета зарабатывают проценты от остатка на счете.

Давайте предположим, что составные проценты используются при вычислении процентов, получаемых от сберегательного счета.

Для сложных процентов, в дополнение к основной сумме, проценты, начисленные ранее, также будут включены в вычисление новых процентов.

В то время как для простых процентов, только первоначальная основная сумма используется при определении процентов.

Например, если предположить, что проценты составляются ежегодно, если основной счет 1000 рублей с годовой процентной ставкой в 10%, начисляемой ежегодно в течение 5 лет.







Какой будет баланс в конце 5 лет.

В конце 1-го года, проценты, 1000 * 10% от 100 рублей, будут прибавляться к основному счету и получится новый баланс 1100 рублей.

Сумма 1100 руб. будет использоваться при определении процентов, полученных в конце 2-го года, то есть 1100 * 10% или 110 руб.

Новый баланс становится 1100 + 110 или 1210 руб.

В конце 3-го года, проценты будут 121 руб. и новый баланс 1331 руб.

В конце 4-го года, проценты будут 133,1 руб. и новый баланс 1464,1 руб.

В конце 5-го года, баланс будет составлять 1610,51 руб.

Это ужасно хорошо, но это всего лишь пример.

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

Во всяком случае, как указано в начале, сберегательный счет является своего рода банковским счетом.

Так как мы уже определили класс банковского счета в предыдущих лекциях, вместо того чтобы начинать с нуля, возможно ли для нас, чтобы использовать то, что мы уже сделали?

В ООП, есть важная концепция, которая называется наследованием.

Наследование является простой, но мощной концепцией.

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

Это часто называют повторное использование кода.

Через повторное использование кода вы не должны повторять те усилия, которые были затрачены на проектирование и отладку кода.

Новый класс может быть получен из существующего класса.

При этом, вы можете использовать поля и методы существующего класса без необходимости переписывать их самостоятельно.

Наследование поддерживается в Java через отношения подкласса и суперкласса, которые я буду обсуждать далее.

Подкласс, это класс, который является производным от другого класса. И класс, из которого подкласс происходит, называется суперкласс.

Подкласс часто называют дочерний класс или расширенный класс. И суперкласс иногда называют родительский класс.







Ключевое слово extends используется в объявлении подкласса для указания отношения подкласса-суперкласса. Я уверен, что вы видели это раньше в других примерах.

В Java, класс Object является корнем иерархии классов, то есть, в каждом классе есть Object как суперкласс.

Такая иерархическая организация является мощной для решения проблем, потому что объекты из реальной жизни часто организуются или классифицированы в некоторой иерархической структуре.

Например, человек является млекопитающим, млекопитающее является позвоночным, и позвоночное является животным.

Для географического образования, у нас есть города, которые разделены на районы, города на страны и страны на разные континенты.

Для физических устройств, телефоны можно классифицировать по двум основным категориям – стационарные телефоны и мобильные телефоны.

Мобильные телефоны классифицируются на айфоны, Android телефоны и другие менее популярные модели, таких как телефоны Windows. И далее, мобильные телефоны и планшеты, такие как iPad, могут быть сгруппированы в классе мобильных устройств.

Таким образом, в реальной жизни могут быть очень сложные иерархические структуры.

То есть, родительский класс может иметь несколько подклассов и один класс может быть подклассом нескольких суперклассов.

В Java, каждый класс может иметь один и только один прямой суперкласс. Это также называется одиночным наследованием.

Позволяя наследование в программировании, подкласс наследует все поля и методы от его суперкласса без необходимости переписывать их самостоятельно, или изобретать колесо.







Ключевое слово super можно использовать для подкласса, чтобы ссылаться на конструкторы и методы из своего суперкласса. И ключевое слово super может понадобится, когда метод с тем же именем, объявленный в подклассе, переопределяет код суперкласса.

Когда переопределённый метод вызывается из своего подкласса, он всегда будет ссылаться на версию этого метода, определённую подклассом. А версия метода из суперкласса будет скрыта.

Если нужно получить доступ к версии метода, определённого в суперклассе, тогда нужно использовать ключевое слово super.

Назад: Вопросы
Дальше: Пример подкласса