Файл: Лабораторная работа 10 Структуры выбора и циклы ! В отчет Задание 1 и 2 !.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.12.2023
Просмотров: 54
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ЛАБОРАТОРНАЯ РАБОТА № 10
Структуры выбора и циклы
! В отчет Задание 1 и 2 !
$ Задание 1. Решение задачи: Ожидание события
Проанализировать условие задачи, разработать код программы и представить его в отчете с результатами и тестированием (т.е. без описания всех этапов проектирования кода).
Постановка задачи
Написать программу WaitForEvent, которая в каждом наступившем месяце года сообщает пользователю сколько времени осталось до запланированного события. Например, выводит в консоль сообщение-напоминание о текущем месяце и годе и о количестве оставшихся месяцев до концерта, на который были куплены билеты заранее. При этом известен год и месяц покупки билетов, и количество месяцев до события (месяц покупки не включается в расчет).
Например, были куплены билеты 15 мая 2021 года на концерт, который пройдет через10 месяцев.
Анализ задачи:
Объявить константы класса, входные и выходные данные:
MONTHS_OF_YEAR – количество месяцев в году
…. – количество дней в году
int startMonth – номер месяца покупки билета, вводится пользователем int startYear – год покупки билета, вводится пользователем
int numberOfMonths – количество месяцев до события (период ожидания),
вводится пользователем
Алгоритм программы (с уточняющими формулами):
-
Получить от пользователя номер месяца покупки билета, startMonth -
Получить год покупки билета, startYear -
Получить количество месяцев до события (концерта), numberOfMonths -
Выполнить проверку количества прошедших с покупки билетов месяцев.
Для этого реализуем итерацию по месяцам пока счетчик месяцев не станет равен количеству месяцев до события:
while (monthsCount < numberOfMonths) // итерация по месяцам периода
ожидания с 0 до numberOfMonths monthsCount = 0 – счетчик месяцев
Этот цикл осуществляет простую проверку количества прошедших до события месяцев. Но он не позволит определить название месяца и номер года текущей итерации. Переходим к следующему этапу алгоритма.
-
Выполнить проверку по месяцам года и определить месяца, участвующие в периоде ожидания.
Так как нумерация месяцев повторяется каждый год реализуем внутреннюю по отношению к while
итерацию по месяцам года:
for (int j = 1; j <= MONTHS_OF_YEAR; j++) // итерация по месяцам года с 1 до 12 j – счетчик месяцев
-
Пропустить первые месяцы первого проверяемого года, так как они не попадают в период ожидания
В нашем случае, пропустить с 1 по 5 месяц включительно 2021 года. Для этого применяем if со следующим условием проверки:
if (i == startYear && j <= startMonth) i – счетчик годов если условие выполняется, то пропускаем текущую итерацию цикла for:
continue;
-
Проверить, равен ли счетчик месяцев количеству месяцев периода ожидания:
if (monthsCount == numberOfMonths)
ЕслиДа, то расчет заканчиваем и выходим из цикла for: break;
-
Сообщить о текущем месяце года и количестве оставшихся месяцев до события.
Для этого в конце цикла for вывести на консоль сообщение, например,
Текущий месяц: Июнь, 2021 года. До концерта осталось 9 месяцев
-
Увеличить счетчик месяцев периода ожидания (в конце цикла for) -
Увеличить год (в конце цикла while)
Если счетчик месяцев периода ожидания меньше его значения, то происходит запуск новой итерации цикла while.
После выхода из цикла while вывести итоговое сообщение: Концерт состоится в … месяце … года.
– Задание 2. Решение задачи: Вычисление процентов по вкладу (аналогичная предыдущей)
Задача для самостоятельной работы, аналогичная предыдущей
Проанализировать задачу, разработать код программы и представить его в отчете с результатом и тестированием (без описания этапов проектирования кода).
Написать код программы DepositeCalculation, которая вычисляет ежемесячные проценты по вкладу (без капитализации1), исходя из введенных пользователем: месяца и года открытия вклада, срока вклада в месяцах, годовой процентной ставки и суммы вклада в рублях. Пусть количество дней в году будет всегда равно 365, т.е. високосные года в вычислениях не учитываются.
Например, месяц открытия вклада равен 3 (март), год открытия равен 2021, срок вклада равен 2 года или 24 месяца, сумма вклада равна 1000 рублей, годовая процентная ставка равна 5%.
Проценты начинают начисляться с четвертого месяца 2021 года. Всего 24 начисления. Начисления в каждом месяце отличаются из-за разности количества дней в месяце.
Методы класса LocalDate из пакета java.time
Для работы с датами будем использовать класс LocalDate из пакета java.time. Класс java.time.LocalDate представляет по умолчанию даты в формате yyyy-MM-dd, где yyyy – год, MM – месяц и dd – день месяца. Для создания даты используется метод of(), например:
LocalDate firstDay = LocalDate.of(2021, 1, 1); // (2021 год, месяц январь, день 1)
Метод lengthOfMonth() возвращает продолжительность месяца для конкретной даты – 28, 29, 30 или 31 – и не требует параметра, например:
int lengthOfMonth = LocalDate.of(2021, 1, 1).lengthOfMonth(); // возвращает 31
Константы
Объявить константы класса:
MONTHS_OF_YEAR (количество месяцев в году);
DAYS_YEAR (количество дней в году);
Входные и выходные данные
Объявить внутри метода main переменные, необходимые для вычислений:
startMonth – номер месяца открытия вклада, вводится пользователем startYear – год открытия вклада, вводится пользователем depositTerm – срок вклада в месяцах, вводится пользователем rate – процентная ставка (% годовых), вводится пользователем depositAmount – сумма вклада
accruedInterestPerMonth – доход по вкладу в текущем месяце accruedInterestTotal – суммарный доход по вкладу
Алгоритм программы
Получить номер месяца открытия вклада, startMonth
Получить год открытия вклада, startYear
Получить срок вклада в месяцах, depositTerm
Получить сумму вклада, depositAmount
Получить годовую процентную ставку, rate
Рассчитать и вывести доход по вкладу для каждого месяца срок вклада. Добавить дополнительные переменные, необходимые для расчета:
int monthsCount = 0; //счетчик месяцев: int i = startYear;
Организовать счетный цикл while, который осуществляет итерацию по месяцам срока вклада и рассчитывает доход по вкладу в текущем месяце, пока значение счетчика месяцев вклада monthsCount меньше срока вклада в месяцах depositTerm:
while (monthsCount < depositTerm).
Организовать вложенный цикл for, который позволит итерироваться по месяцам года (так как начисления в месяце зависят от количества дней в нем):
for (int j = 1; j <= MONTHS_OF_YEAR; j++) { // итерация по месяцам с 1 до 12
}
Следует пропустить первые месяцы первого года срока вклада, если они не попадают в интервал расчета:
if (i == startYear && j <= startMonth) {
continue; // пропускаем текущую итерацию, переходим к следующему месяцу Проверить, если номер текущего месяца равен сроку вклада, то расчет заканчиваем и выходим из цикла for:
if (monthsCount == depositTerm) {
break;
Иначе, определить количество дней в текущем месяце с помощью класса LocalDate из пакета java.time:
int lengthOfMonth = LocalDate.of(i, j, 1).lengthOfMonth(); рассчитать доход по вкладу в текущем месяце:
accruedInterestPerMonth = depositAmount * rate / 100 / DAYS_YEAR *
lengthOfMonth; результат расчета округлить до копеек: accruedInterestPerMonth = Math.round(accruedInterestPerMonth * 100) / 100.0; вывести результат начисленных процентов в текущем месяце:
System.out.println("Начисленопроцентовв " + i + " году " + j + " месяца = " + accruedInterestPerMonth); добавить процент по вкладу текущего месяца к суммарной выплате по вкладу. accruedInterestTotal = accruedInterestTotal + accruedInterestPerMonth; в конце счетчика for увеличить счетчик месяцев на 1: monthsCount++; // увеличимсчетчикмесяцевна 1 в конце счетчика while увеличить год на 1:
i ++;
Вывести итоговый результат начисленных процентов за весь период: System.out.println("Всего начислено процентов = " + accruedInterestTotal); Результат:
1 Под капитализацией вклада следует понимать регулярное начисление процентов на общую денежную сумму, имеющуюся на счету вкладчика. То есть банк начисляет процент на тот вклад, который клиент решает внести на свой счёт. Затем проценты перечисляются на этот же самый счёт, увеличивая общую сумму депозита. В следующий раз процент начисляется уже не на первоначальный взнос денежных средств вкладчика, а на общую сумму, которая числится на его счету.