/
AlexStone
/
Java25sep
Обзор
Документация
Войти
/
AlexStone
/
Java25sep
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
java/tasks 23.html
831 строка
50 KB
unknown
КР 05.11.25
05 ноя 2025, 09:55
05 ноя 2025, 09:55
4a942c9
Код
Авторство
О чём код?
<!DOCTYPE html><html lang="ru"><head><meta charset='utf-8'/><title>23 Составные типы данных</title><style>.check_single { margin:15px; border:1px solid black; padding:5px; width:calc(100% - 40px); } sqrt val { border-top: 1px solid black; } sqrt:before { content:"\221A"; } .section { counter-reset:section; } .section h3:after { counter-increment:section; content: " " counter(section); } table { border-collapse:collapse; } .check_values, .check_values_v2 { width:100%; counter-reset:test_case; } .check_values td:first-child::before { counter-increment:test_case; content: counter(test_case); } table td, table th { border:1px solid black; text-align:center; } .check_values td:first-child, .check_values_v2 td:first-child{ width:40px; } .check_values td, .check_values_v2 td { max-width: 450px; } .lab_nav ol { list-style:none; } .nav { position:fixed; top:0; right:0; margin:15px; clear:both; } .nav ul{ list-style-type:none; padding:0; float:left; } .nav li { margin:2px; border:1px solid black; } .nav li a { display:block; padding:7px; } .task_block { width:80%; page-break-inside:avoid; padding:10px; display:block; } .task_block:target{ background-color:lightgrey; } .task_block:target .task_id{ color:white; } .task_id { float:right; color:lightgrey; } .quiz_block { width:80%; } .quiz_block:target{ background-color:lightgrey; } .task_desc { margin:5px; } .example_image { width:200px; } .lab_nav { width:80%; overflow:auto; } .check_values .preformatted, .preformatted { font-family:monospace; white-space-collapse:preserve; white-space:pre; text-wrap:pretty; text-align:left; padding:10px; } .stream_values tr td:nth-child(3) { border-top-width:0; border-bottom-width:0; text-align:left; } .stream_values tr:nth-child(2) td:nth-child(2) { border-top-width:0; border-bottom-width:0; text-align:right; } .stream_values tr td:nth-child(1){ border-top-width:0; border-bottom-width:0; text-align:right; } .stream_values tr.test_row td:nth-child(2){ text-align:right; } .stream_values tr td:nth-child(2){ border-top-width:0; border-bottom-width:0; text-align:left; } .stream_values .preformatted{ padding: 0; } .stream_values tr.test_row td { border-top-width:1px; } .stream_values tr.test_row td:first-of-type { border-top-width:1px; border-bottom-width:1px; text-align:center; width:15px; } .stream_values tr:last-of-type td { border-bottom-width:1px; } .stream_values { width:100%; } formula { font-weight:bold; text-align:center; vertical-align:middle; } fraction { display:inline-block; text-align:center; vertical-align:middle; font-weight:bold; } formula .abs{ border-left: solid black 1px; border-right: solid black 1px; padding: 2px; } numerator { display:block; border-bottom:2px solid black; } denominator { display:block; } .comment{ color:darkgrey; } .step{ display:none; } .step:last-child, .step:target{ display:block; } .step:target ~ .step:last-child{ display:none; } .console{ background-color:black; color:white; width:300px; } .zoom{ background-color:lightgrey; font-size:40pt; padding:0 10px; } .task_block:target .zoom { background-color:white; }</style><meta name="author" content="Подборка задач, выбор порядка подачи и подготовка тестовых данных - Крюков Александр, Омск 2013-2019"/></head><body class='section'><a name='heading'><h1>Составные типы данных</h1></a><div class='lab_nav'>Другие темы<ol> <li>1 <a href='tasks 1.html'>Печать текста на экран</a></li> <li>2 <a href='tasks 2.html'>Заполнение шаблона данными от пользователя</a></li> <li>3 <a href='tasks 3.html'>Организация вычислений</a></li> <li>4 <a href='tasks 4.html'>Проверка исходных данных</a></li> <li>5 <a href='tasks 5.html'>Запуск программы с известными исходными данными</a></li> <li>6 <a href='tasks 6.html'>Взаимоисключающие случаи</a></li> <li>7 <a href='tasks 7.html'>Работа с интервалами значений</a></li> <li>8 <a href='tasks 8.html'>Реорганизация повторяющихся действий</a></li> <li>9 <a href='tasks 9.html'>Обработка неизвестного объема данных</a></li> <li>10 <a href='tasks 10.html'>Вложенные циклы</a></li> <li>11 <a href='tasks 11.html'>Базовые операции с массивами</a></li> <li>12 <a href='tasks 12.html'>Перестановки элементов массива</a></li> <li>13 <a href='tasks 13.html'>Использование числовых массивов</a></li> <li>14 <a href='tasks 14.html'>Вычисление агрегатов</a></li> <li>15 <a href='tasks 15.html'>Поиск в массиве</a></li> <li>16 <a href='tasks 16.html'>Сортировка вставкой</a></li> <li>17 <a href='tasks 17.html'>Строки</a></li> <li>18 <a href='tasks 18.html'>Чтение файлов</a></li> <li>19 <a href='tasks 19.html'>Запись в файлы</a></li> <li>20 <a href='tasks 20.html'>Возврат значения</a></li> <li>21 <a href='tasks 21.html'>Перехват исключений</a></li> <li>22 <a href='tasks 22.html'>Выбрасывание исключений</a></li> <li>23 <a href='tasks 23.html'>Составные типы данных</a></li> <li>24 <a href='tasks 24.html'>Внутреннее состояние</a></li> <li>25 <a href='tasks 25.html'>Коллекции</a></li> <li>26 <a href='tasks 26.html'>Рекурсия</a></li> <li>27 <a href='tasks 27.html'>Даты</a></li> <li>28 <a href='tasks 28.html'>Комбинаторика</a></li> <li>29 <a href='tasks 29.html'>SQL СУБД</a></li> <li>30 <a href='tasks 30.html'>Псевдослучайные числа</a></li> <li>31 <a href='tasks 31.html'>Реализация стандартных интерфейсов</a></li> </ol></div><div class='nav'><ul><li><a href='#heading'>^</a></li><li><a href='#task2686' class='example'>1*</a><li><a href='#task6011'>2</a><li><a href='#task8347'>3</a><li><a href='#task6791'>4</a><li><a href='#task1979'>5</a><li><a href='#task7380'>6</a><li><a href='#task8225'>7</a><li><a href='#task1566'>8</a><li><a href='#task3957'>9</a></ul></div><div id='task2686' class='task_block'> <div class='task_id'>2686</div> <h3>Задача</h3> <h4>Реализуйте статический метод для печати координат точки на экран</h4> <ol start='1'><li>В папке для исходного кода создайте класс Point.</li><li>Объявите у класса Point поля для действительных значений "x" и "y".</li></ol><div class='task_desc'> Должно получиться так: </div> <div class='check_single preformatted'> public class Point { public double x; public double y; }</div> <h4>Реализуйте конструктор класса Point с параметрами</h4> <div class='task_desc'> Конструктор класса - специальный метод, тело которого выполняется при создании экземпляра класса. </div> <ol start='3'><li>В классе Point реализуйте конструктор. Это публичный метод, который принимает в качестве аргументов 2 числа ("px" и "py") и называется Point (как класс). У него должно отсутствовать указание типа возвращаемого значения.</li><li>В теле конструктора инициализируйте поля "x" и "y" значениями, которые были переданы в качестве аргументов.</li></ol><div class='check_single preformatted'> public class Point { public double x; public double y; public Point(double px, double py) { x = px; y = py; } }</div> <h4>Реализуйте статический метод для печати координат точки на экран</h4> <ol start='5'><li>Реализуйте публичный статический метод print.</li><li>Он принимает в качестве аргумента 1 экземпляр класса Point.</li><li>Метод возвращает строку, содержащую координаты точки в виде "($x | $y)"</li><li>Вместо $x подставьте поле x класса Point. Вместо $y - поле y класса Point.</li></ol><div class='task_desc'> Чтобы получить значение поля x из точки, нужно обратиться через точку. Например: </div> <div class='check_single preformatted'>Point p = new Point(1,2); System.out.println("Координата точки x равна" + p.x);</div> <div class='task_desc'> Сигнатура метода будет выглядеть так: </div> <div class='check_single preformatted'>public static String print(Point p) {</div> <div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point p = new Point(1, 2); System.out.println("Координата x точки равна " + p.x); System.out.println("Координата y точки равна " + p.y); Point p2 = new Point(3, 4); String pointAsString = print(p2); System.out.printf("Координаты точки: %s\n", pointAsString); Point p3 = new Point(0, 0); System.out.printf("Координаты точки: %s\n", print(p3)); System.out.printf("Координаты точки: %s\n", print(new Point(2, 0))); Point p5 = p3; p5.x = 10; System.out.printf("Координаты точки: %s\n", print(p5)); System.out.printf("Координаты точки: %s\n", print(p3)); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>Координата x точки равна 1.0 Координата y точки равна 2.0 Координаты точки: (3.0 | 4.0) Координаты точки: (0.0 | 0.0) Координаты точки: (2.0 | 0.0) Координаты точки: (10.0 | 0.0) Координаты точки: (10.0 | 0.0) </div> </div> <div id='task6011' class='task_block'> <div class='task_id'>6011</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Числа обозначают координаты двух точек A и B. Первое число это x точки A. Второе - y точки A. Третье - x точки B. Четвертое - y точки B. Вычислить расстояние между точками по формуле: <br/> <formula> <sqrt><val> (Bx - Ax)<sup>2</sup> + (By - Ay)<sup>2</sup> </val></sqrt> </formula> </div> <h4>Реализуйте статический метод для решения задачи</h4> <ol start='1'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>Реализуйте публичный статический метод distanceBetween</li><li>Новый метод distanceBetween принимает в качестве аргументов 2 экземпляра класса Point.</li><li>Метод возвращает действительное число.</li><li>Для вычисления результата используйте поля "x" и "y" экземпляров класса Point, которые были переданы в качестве аргументов.</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point a = new Point(1, 2), b = new Point(4, 6); double distance = distanceBetween(a, b); System.out.printf("Расстояние между точками\t%s и\t%s\tравно\t" + distance + "\n", print(a), print(b)); Point src = new Point(-2, 4); Point dest = new Point(8, -10); String srcStr = print(src); String destStr = print(dest); System.out.printf("Расстояние между точками\t" + srcStr + " и\t%s\tравно\t" + distanceBetween(src, dest) + "\n", destStr); src = new Point(0, 0); dest = new Point(-5, -7); System.out.printf("Расстояние между точками\t%s и\t%s\tравно\t%.4f\n", print(src), print(dest), distanceBetween(src, dest)); dest = new Point(0, 0); System.out.printf("Расстояние между точками\t" + print(src) + " и\t" + print(dest) + "\tравно\t%.4f\n", distanceBetween(src, dest)); src = new Point(5, 5); for (int i = 0; i < 10; i++) { dest = new Point(0, i); System.out.printf("Расстояние между точками\t" + print(src) + " и\t" + print(dest) + "\tравно\t%.4f\n", distanceBetween(src, dest)); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>Расстояние между точками (1.0 | 2.0) и (4.0 | 6.0) равно 5.0 Расстояние между точками (-2.0 | 4.0) и (8.0 | -10.0) равно 17.204650534085253 Расстояние между точками (0.0 | 0.0) и (-5.0 | -7.0) равно 8,6023 Расстояние между точками (0.0 | 0.0) и (0.0 | 0.0) равно 0,0000 Расстояние между точками (5.0 | 5.0) и (0.0 | 0.0) равно 7,0711 Расстояние между точками (5.0 | 5.0) и (0.0 | 1.0) равно 6,4031 Расстояние между точками (5.0 | 5.0) и (0.0 | 2.0) равно 5,8310 Расстояние между точками (5.0 | 5.0) и (0.0 | 3.0) равно 5,3852 Расстояние между точками (5.0 | 5.0) и (0.0 | 4.0) равно 5,0990 Расстояние между точками (5.0 | 5.0) и (0.0 | 5.0) равно 5,0000 Расстояние между точками (5.0 | 5.0) и (0.0 | 6.0) равно 5,0990 Расстояние между точками (5.0 | 5.0) и (0.0 | 7.0) равно 5,3852 Расстояние между точками (5.0 | 5.0) и (0.0 | 8.0) равно 5,8310 Расстояние между точками (5.0 | 5.0) и (0.0 | 9.0) равно 6,4031 </div> </div> <div id='task8347' class='task_block'> <div class='task_id'>8347</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Даны координаты двух точек: start, end. Они обозначают границы отрезка. Нужно найти координаты середины отрезка. Координата mx середины отрезка вычисляется по формуле (startX + endX)/2. Координата my середины отрезка вычисляется по формуле (startY + endY)/2. </div> <h4>Реализуйте статический метод для решения задачи</h4> <ol start='1'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>Реализуйте публичный статический метод getMidpointOfSegment.</li><li>Он принимает в качестве аргумента 2 экземпляра класса Point и возвращает экземпляр класса Point.</li><li>Вычислите значения mx и my середины отрезка.</li><li>В теле метода создайте экземпляр класса Point, запишите в его поля вычисленные значения mx и my.</li><li>Верните полученный экземпляр класса Point как результат вызова метода.</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point start = new Point(11, 13); Point end = new Point(89, 61); Point result = getMidpointOfSegment(start, end); System.out.printf("У отрезка %s %s середина находится в точке %s\n", print(start), print(end), print(result)); Point zero = new Point(0, 0); start = new Point(40, 0); result = getMidpointOfSegment(start, zero); System.out.printf("У отрезка %s %s середина находится в точке %s\n", print(start), print(zero), print(result)); start = new Point(0, 30); result = getMidpointOfSegment(start, zero); System.out.printf("У отрезка %s %s середина находится в точке %s\n", print(start), print(zero), print(result)); result = getMidpointOfSegment(new Point(20, 0), zero); System.out.printf("У отрезка %s %s середина находится в точке %s\n", print(start), print(zero), print(result)); result = getMidpointOfSegment(start, new Point(0, 10)); System.out.printf("У отрезка %s %s середина находится в точке %s\n", print(start), print(zero), print(result)); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>У отрезка (11.0 | 13.0) (89.0 | 61.0) середина находится в точке (50.0 | 37.0) У отрезка (40.0 | 0.0) (0.0 | 0.0) середина находится в точке (20.0 | 0.0) У отрезка (0.0 | 30.0) (0.0 | 0.0) середина находится в точке (0.0 | 15.0) У отрезка (0.0 | 30.0) (0.0 | 0.0) середина находится в точке (10.0 | 0.0) У отрезка (0.0 | 30.0) (0.0 | 0.0) середина находится в точке (0.0 | 20.0) </div> </div> <div id='task6791' class='task_block'> <div class='task_id'>6791</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Даны координаты srcX и srcY исходной точки, а также destX и destY точки назначения. Решите обратную геодезическую задачу - определите горизонтальное п<b>р</b>оложение между точками (длина линии, distance) и дирекционный угол этого отрезка angle, выраженный в градусах </div> <ol start='1'><li>Вычислите приращение координат. <formula>dx = destX - srcX</formula>; <formula>dy = destY - srcY</formula></li><li>Определите румб линии в радианах по формуле <formula>r = arctg<fraction class="abs"><numerator>dy</numerator><denominator>dx</denominator></fraction></formula>. Арктангенс из абсолютного значения результата деления.</li><li>Переведите румб из радианов в градусы с помощью метода Math.toDegrees</li><li>Выберите формулу для вычисления угла по знакам приращения координат и определите дирекционный угол по ней<table class="check_values"> <tr> <th rowspan="2">Четверть</th> <th colspan="2">Знаки приращения координат</th> <th rowspan="2">Связь между румбами и дирекционными углами. В градусах</th> </tr> <tr> <th>dx</th> <th>dy</th> </tr> <tr> <td></td> <td>0 и более</td> <td>больше 0</td> <td>angle = r</td> </tr> <tr> <td></td> <td>меньше 0</td> <td>0 и более</td> <td>angle = 180 - r</td> </tr> <tr> <td></td> <td>0 и менее</td> <td>меньше 0</td> <td>angle = 180 + r</td> </tr> <tr> <td></td> <td>больше 0</td> <td>0 и менее</td> <td>angle = 360 - r</td> </tr> </table></li><li>Определите горизонтальное проложение (расстояние между точками). Можете воспользоваться формулой из задачи <a href="tasks 23.html#task6011" target="_blank">ЛР23#6011(открыть в новой вкладке)</a></li></ol><h4>Реализуйте логику вычислений</h4> <ol start='6'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>В папке для исходного кода создайте класс Direction.</li><li>В классе Direction объявите поля для действительных значений "angle" и "distance".</li><li>Реализуйте конструктор класса Direction, который инициализирует соответствующие поля.</li><li>Реализуйте публичный статический метод backwardTask.</li><li>Он принимает в качестве аргумента два экземпляра класса Point и возвращает экземпляр класса Direction.</li><li>В теле метода вычислите горизонтальное проложение и дирекционный угол, используя значения аргументов в качестве исходных данных.</li><li>Реализуйте публичный статический метод print, который принимает в качестве аргумента экземпляр класса Direction и возвращает строку в виде: "Угол: $angle проложение: $distance.". Значения с точностью до 4 знаков после запятой.</li><li>Сформируйте ответ в виде экземпляра класса Direction и верните его в качестве результата.</li></ol><div class='task_desc'> Для оформления результата с нужной точностью примените метод String.format </div> <div class='check_single preformatted'>public static String print(Direction direction) { return String.format("Угол %.4f проложение %.4f", direction.angle, direction.distance); }</div> <div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point src = new Point(10, 10); Point dest = new Point(13, 14); Direction direction = backwardTask(src, dest); System.out.println(print(direction)); src = new Point(24, 4); dest = new Point(3, 17); System.out.println(print(backwardTask(src, dest))); direction = backwardTask( new Point(23, 25), new Point(12, 16) ); String result = print(direction); System.out.println(result); result = print( backwardTask( new Point(3, 11), new Point(13, 5) ) ); System.out.println(result); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>Угол 53,1301 проложение 5,0000 Угол 148,2405 проложение 24,6982 Угол 219,2894 проложение 14,2127 Угол 329,0362 проложение 11,6619 </div> </div> <div id='task1979' class='task_block'> <div class='task_id'>1979</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Даны координаты aX и aY исходной точки, горизонтальное п<b>р</b>оложение между точками (длина линии, distance) и дирекционный угол angle, выраженный в градусах. Решите прямую геодезическую задачу - определите координаты другого конца отрезка. </div> <ol start='1'><li>Приращение координаты x по формуле <formula>dX = distance * cos(angleRad)</formula></li><li>Приращение координаты y по формуле <formula>dY = distance * sin(angleRad)</formula></li><li>Координату X<sub>b</sub> другой точки по формуле <formula>bx = ax + dX</formula>.</li><li>Координату Y<sub>b</sub> другой точки по формуле <formula>by = ay + dY</formula></li></ol><h4>Релизуйте логику вычислений</h4> <ol start='5'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>Убедитесь, что вы реализовали класс Direction и метод print из задачи <a href="tasks 23.html#task6791" target="_blank">ЛР23#6791(открыть в новой вкладке)</a></li><li>Реализуйте публичный статический метод forwardTask</li><li>В теле метода вычислите координаты другой точки, используя значения аргументов в качестве исходных данных. </li><li>Сформируйте ответ в виде экземпляра класса Point и верните его в качестве результата. </li><li>Если методу был передан экземпляр класса Direction с некорректными значениями полей, метод должен выбросить исключение IllegalArgumentException, содержащий текст ошибки из задачи.</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point src = new Point(1, 2); Direction dir = new Direction(5, 30); Point dest = forwardTask(src, dir); System.out.println(print(dest)); src = new Point(7, 11); dir = new Direction(13, 110); System.out.println(print(forwardTask(src, dir))); src = new Point(17, 19); dir = new Direction(23, 230); String asText = print(forwardTask(src, dir)); System.out.println(asText); System.out.println(print(forwardTask( new Point(29, 31), new Direction(3, 290) ))); src = new Point(33, 37); for (int angle = 0; angle <= 360; angle += 90) { dir = new Direction(10, angle); System.out.println(print(forwardTask(src, dir))); } try { Point result = forwardTask( new Point(1, 2), new Direction(-5, 45) ); System.out.println("Это сообщение не должно быть выведено"); } catch (IllegalArgumentException e) { System.out.println("Ожидаемое сообщение : Угол должен быть неотрицательным"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { Point result = forwardTask( new Point(1, 2), new Direction(10, -5) ); System.out.println("Это сообщение не должно быть выведено"); } catch (IllegalArgumentException e) { System.out.println("Ожидаемое сообщение : Горизонтальное проложение линии должно быть положительно"); System.out.println("Фактическое сообщение: " + e.getMessage()); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>(30,8858| 4,6147) (114,1807| 35,7446) (228,7161| 108,8682) (318,6026| 46,1774) (33,0000| 37,0000) (121,6327| 52,6283) (210,2654| 68,2567) (298,8981| 83,8850) (387,5308| 99,5133) Ожидаемое сообщение : Угол должен быть неотрицательным Фактическое сообщение: Угол должен быть неотрицательным Ожидаемое сообщение : Горизонтальное проложение линии должно быть положительно Фактическое сообщение: Горизонтальное проложение линии должно быть положительно </div> </div> <div id='task7380' class='task_block'> <div class='task_id'>7380</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Смешали volume<sub>1</sub> литров воды с температурой temperature<sub>1</sub> градусов Цельсия с volume<sub>2</sub> литрами воды с температурой temperature<sub>2</sub> градусов Цельсия. Вычислите объем <formula>volume=volume<sub>1</sub>+volume<sub>2</sub></formula> и температуру образовавшейся смеси по формуле<formula> temperature= <fraction> <numerator> (temperature<sub>1</sub>*volume<sub>1</sub>+temperature<sub>2</sub>*volume<sub>2</sub>) </numerator> <denominator> volume<sub>1</sub>+volume<sub>2</sub> </denominator> </fraction> </formula> </div> <h4>Подготовьте класс для хранения исходных данных и результата</h4> <ol start='1'><li>В папке для исходного кода создайте класс LiquidPortion</li><li>Объявите в нём два поля для действительных чисел: volume и temperature</li><li>Создайте конструктор с параметрами</li><li>Если в конструктор переданы некорректные значения, то конструктор должен выбросить исключение IllegalArgumentException</li></ol><h4>Реализуйте метод для вычисления результата</h4> <ol start='5'><li>Реализуйте публичный статический метод mixLiquids</li><li>Метод должен принимать два параметра типа LiquidPortion и возвращать результат типа LiquidPortion</li><li>В теле метода вычислите объём и температуру получившейся смеси</li><li>Создайте новый объект типа LiquidPortion и инициализируйте его поля</li></ol><div class='task_desc'> Сигнатура метоода будет выглядеть так: </div> <div class='check_single preformatted'>public static LiquidPortion mixLiquids(LiquidPortion a, LiquidPortion b) {</div> <div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>LiquidPortion a = new LiquidPortion(1, 30); LiquidPortion b = new LiquidPortion(3, 20); LiquidPortion res = mixLiquids(a, b); //значения в a и b не меняются System.out.printf("Объем первой емкости: %.4f л Температура смеси: %.4f °C\n", a.volume, a.temperature); System.out.printf("Объем второй емкости: %.4f л Температура смеси: %.4f °C\n", b.volume, b.temperature); System.out.printf("Объем смеси: %.4f л Температура смеси: %.4f °C\n", res.volume, res.temperature); try { a = new LiquidPortion(-2, 10); System.out.println("Это сообщение не должно быть выведено, потому что объем должен быть неотрицательным"); b = new LiquidPortion(5, 50); mixLiquids(a, b); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Объем должен быть неотрицательным"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { mixLiquids(new LiquidPortion(4, 100), new LiquidPortion(-10, 4)); System.out.println("Это сообщение не должно быть выведено, потому что объем должен быть неотрицательным"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Объем должен быть неотрицательным"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { mixLiquids( new LiquidPortion(20, -800), new LiquidPortion(20, 30) ); System.out.println("Это сообщение не должно быть выведено, потому что температура должна быть выше абсолютного нуля (-273.15)"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Температура должна быть выше абсолютного нуля (-273.15)"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { LiquidPortion c = new LiquidPortion(20, 10); System.out.printf("Объем первой емкости: %.4f л Температура смеси: %.4f °C\n", c.volume, c.temperature); LiquidPortion d = new LiquidPortion(30, -500); System.out.println("Это сообщение не должно быть выведено, потому что температура должна быть выше абсолютного нуля (-273.15)"); mixLiquids(c, d); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Температура должна быть выше абсолютного нуля (-273.15)"); System.out.println("Фактическое сообщение: " + e.getMessage()); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>Объем первой емкости: 1,0000 л Температура смеси: 30,0000 °C Объем второй емкости: 3,0000 л Температура смеси: 20,0000 °C Объем смеси: 4,0000 л Температура смеси: 22,5000 °C Ожидалось сообщение : Объем должен быть неотрицательным Фактическое сообщение: Объем должен быть неотрицательным Ожидалось сообщение : Объем должен быть неотрицательным Фактическое сообщение: Объем должен быть неотрицательным Ожидалось сообщение : Температура должна быть выше абсолютного нуля (-273.15) Фактическое сообщение: Температура должна быть выше абсолютного нуля (-273.15) Объем первой емкости: 20,0000 л Температура смеси: 10,0000 °C Ожидалось сообщение : Температура должна быть выше абсолютного нуля (-273.15) Фактическое сообщение: Температура должна быть выше абсолютного нуля (-273.15) </div> </div> <div id='task8225' class='task_block'> <div class='task_id'>8225</div> <h3>Задача</h3> <h4>Постановка задачи</h4> <div class='task_desc'> Даны два вектора. Каждый вектор описан координатами x,y и значением силы force. Вычислите: </div> <ol start='1'><li>Модули векторов a и b по формуле (для вектора a) <formula>a<sub>mod</sub>=<sqrt><val>x<sub>a</sub><sup>2</sup> * y<sub>a</sub><sup>2</sup></val></sqrt></formula></li><li>Скалярное произведение векторов по формуле <formula>product<sub>a,b</sub> = x<sub>a</sub> * x<sub>b</sub> + y<sub>a</sub> * y<sub>b</sub></formula></li><li>Угол между векторами a и b по формуле <formula>angle<sub>a,b</sub>=arccos(<fraction><numerator>product<sub>a,b</sub></numerator><denominator>a<sub>mod</sub> * b<sub>mod</sub></denominator></fraction>)</formula></li><li>Координаты вектора равнодействующей сил по формулам <formula>x<sub>равн</sub>=x<sub>a</sub>+x<sub>b</sub></formula>; <formula>y<sub>равн</sub>=y<sub>a</sub>+y<sub>b</sub></formula></li><li>Значение равнодействующей силы по формуле <formula>force<sub>равн</sub> = <sqrt><val>force<sub>a</sub><sup>2</sup>+force<sub>b</sub><sup>2</sup> + 2 * force<sub>a</sub> * force<sub>b</sub> * cos(angle<sub>a,b</sub>)</val></sqrt></formula></li></ol><h4>Реализуйте логику вычислений</h4> <ol start='6'><li>В папке для исходного кода создайте класс Force</li><li>Объявите у класса Force поля для действительных значений x, y, force</li><li>Реализуйте публичный конструктор для инициализации полей класса Force. Если сила меньше нуля, выбросите исключение IllegalArgumentException</li><li>Реализуйте публичный метод print для печати значений полей по шаблону: "($x|$y)->$force". Числа с точностью до 2 знаков после запятой</li><li>Реализуйте публичный статичский метод findResultantForce</li><li>Он принимает в качестве аргумента два экземпляра класса Force и возвращает экземпляр класса Force</li><li>Вычислите координаты, значение равнодействующей силы и заполните поля экземпляра класса Force</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Force left = new Force(-50, -86.6025, 100); Force right = new Force(60, 0, 100); Force result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); left = new Force(10, 0, 40); right = new Force(0, 10, 30); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); left = new Force(11, 13, 50); right = new Force(7, 17, 30); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); left = new Force(-70.7106, 50, 100); right = new Force(60, 0, 100); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); left = new Force(-86.6025, 50, 100); right = new Force(60, 0, 100); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); left = new Force(3, 4, 1); right = new Force(4, 3, 1); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); try { left = new Force(5, 7, 11); right = new Force(7, 3, -20); result = findResultantForce(left, right); System.out.println("Это сообщение не должно быть выведено"); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Сила не может быть отрицательной"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { left = new Force(15, 17, -4); System.out.println("Это сообщение не должно быть выведено"); right = new Force(19, 13, 5); result = findResultantForce(left, right); System.out.println(print(left) + "\t" + print(right) + "\t" + print(result)); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Сила не может быть отрицательной"); System.out.println("Фактическое сообщение: " + e.getMessage()); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>(-50,00|-86,60)->100,00 (60,00|0,00)->100,00 (10,00|-86,60)->100,00 (10,00|0,00)->40,00 (0,00|10,00)->30,00 (10,00|10,00)->50,00 (11,00|13,00)->50,00 (7,00|17,00)->30,00 (18,00|30,00)->79,09 (-70,71|50,00)->100,00 (60,00|0,00)->100,00 (-10,71|50,00)->60,58 (-86,60|50,00)->100,00 (60,00|0,00)->100,00 (-26,60|50,00)->51,76 (3,00|4,00)->1,00 (4,00|3,00)->1,00 (7,00|7,00)->1,98 Ожидалось сообщение : Сила не может быть отрицательной Фактическое сообщение: Сила не может быть отрицательной Ожидалось сообщение : Сила не может быть отрицательной Фактическое сообщение: Сила не может быть отрицательной </div> </div> <div id='task1566' class='task_block'> <div class='task_id'>1566</div> <h3>Задача</h3> <div class='task_desc'> Прямоугольник описывается координатой верхнего левого угла, шириной и высотой. Реализуйте метод, который возвращает координаты всех углов прямоугольника. Логику вычисления координат определите по тестовым примерам. </div> <ol start='1'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>Реализуйте метод getCorners. Он принимает экземпляр класса Point и два действительных значения: width и height</li><li>Метод возвращает массив типа Point</li><li>В теле метода вычислите координаты углов прямоугольника.</li></ol><div class='task_desc'> Создание массива для экземпляров каких-либо классов выглядит так же, как и для чисел. В квадратных скобках указывается количество элементов. Например: </div> <div class='check_single preformatted'>Point[] result = new Point[3];</div> <div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Point base = new Point(100, 100); Point[] result = getCorners(base, 20, 30); System.out.println(print(result[0])); System.out.println(print(result[1])); System.out.println(print(result[2])); System.out.println(print(result[3])); System.out.println("---------"); result = getCorners(base, -15, -17); System.out.println(print(result[0])); System.out.println(print(result[1])); System.out.println(print(result[2])); System.out.println(print(result[3])); try { System.out.println(print(result[4])); System.out.println("Это сообщение не должно быть выведено"); } catch (ArrayIndexOutOfBoundsException ex) { System.out.println("В массиве углов должно быть ровно 4 элемента"); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>(100.0 | 100.0) (120.0 | 100.0) (120.0 | 130.0) (100.0 | 130.0) --------- (100.0 | 100.0) (85.0 | 100.0) (85.0 | 83.0) (100.0 | 83.0) В массиве углов должно быть ровно 4 элемента </div> </div> <div id='task3957' class='task_block'> <div class='task_id'>3957</div> <h3>Задача</h3> <div class='task_desc'> Круг описывается координатами центра и радиусом. Нужно реализовать метод, который равномерно распределяет точки по данной окружности. </div> <ol start='1'><li>Убедитесь, что вы реализовали класс Point и метод print из задачи <a href="tasks 23.html#task2686" target="_blank">ЛР23#2686(открыть в новой вкладке)</a></li><li>Убедитесь, что вы реализовали класс Direction и метод forwardTask из задачи <a href="tasks 23.html#task1979" target="_blank">ЛР23#1979(открыть в новой вкладке)</a></li><li>Реализуйте класс Circle содержащий действительные значения cx, cy, radius</li><li>Реализуйте публичный статический метод getCirclePoints</li><li>Новый метод принимает в качестве аргумента экземпляр типа Circle и целое число amount</li><li>Новый метод возвращает массив типа Point. Количество элементов массива равно числу amount</li><li>Координата x первой точки равна cx, координата y первой точки равна cy - radius</li><li>Вычислите угол поворота как rotationAngle = 360 / amount</li><li>Вызовите метод forwardTask и передайте ему координаты центра, а также угол поворота, который увеличивается с шагом rotationAngle.</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Circle circle = new Circle(100, 150, 19); Point[] result = getCirclePoints(circle, 1); String pointAsStr = print(result[0]); System.out.println(pointAsStr); System.out.println("------------"); result = getCirclePoints(circle, 2); System.out.println(print(result[0])); System.out.println(print(result[1])); System.out.println("------------"); result = getCirclePoints(circle, 4); for (int i = 0; i < result.length; i++) { System.out.println(print(result[i])); } System.out.println("------------"); result = getCirclePoints(circle, 10); for (int i = 0; i < result.length; i++) { System.out.println(print(result[i])); } try { result = getCirclePoints(circle, 0); System.out.println("Это сообщение не должно быть выведено"); } catch (IllegalArgumentException ex) { System.out.println("Ожидалось сообщение : Количество точек должно быть больше 0"); System.out.println("Фактическое сообщение: " + ex.getMessage()); } try { result = getCirclePoints(circle, -1); System.out.println("Это сообщение не должно быть выведено"); } catch (IllegalArgumentException ex) { System.out.println("Ожидалось сообщение : Количество точек должно быть больше 0"); System.out.println("Фактическое сообщение: " + ex.getMessage()); } </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>(100.0 | 131.0) ------------ Поворот на 180.0 (100.0 | 131.0) (81.0 | 150.0) ------------ Поворот на 90.0 Поворот на 180.0 Поворот на 270.0 (100.0 | 131.0) (100.0 | 169.0) (81.0 | 150.0) (100.0 | 131.0) ------------ Поворот на 36.0 Поворот на 72.0 Поворот на 108.0 Поворот на 144.0 Поворот на 180.0 Поворот на 216.0 Поворот на 252.0 Поворот на 288.0 Поворот на 324.0 (100.0 | 131.0) (115.371322893124 | 161.167919793557) (105.871322893124 | 168.07007380960792) (94.128677106876 | 168.07007380960792) (84.628677106876 | 161.167919793557) (81.0 | 150.0) (84.628677106876 | 138.832080206443) (94.128677106876 | 131.92992619039208) (105.871322893124 | 131.92992619039208) (115.371322893124 | 138.832080206443) Ожидалось сообщение : Количество точек должно быть больше 0 Фактическое сообщение: Количество точек должно быть больше 0 Ожидалось сообщение : Количество точек должно быть больше 0 Фактическое сообщение: Количество точек должно быть больше 0 </div> </div> Версия 20240202. Подборка задач, выбор порядка подачи и подготовка тестовых данных - Крюков Александр, Омск 2013-2026. <a href='https://github.com/AKryukov92/programming-basics'>Основной репозиторий</a></body></html>