/
akryukov
/
programming-basics
Обзор
Документация
Войти
/
akryukov
/
programming-basics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
java/tasks 32.html
614 строк
35 KB
akryukov92
rework source code of task 5108 to clarify error if program failed on writing file
21 ноя 2025, 10:22
21 ноя 2025, 10:22
7aea720
Код
Авторство
О чём код?
<!DOCTYPE html><html lang="ru"><head><meta charset='utf-8'/><title>32 Использование самописных интерфейсов</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> <li>32 <a href='tasks 32.html'>Использование самописных интерфейсов</a></li> </ol></div><div class='nav'><ul><li><a href='#heading'>^</a></li><li><a href='#task4972'>1</a><li><a href='#task6956'>2</a><li><a href='#task5108'>3</a><li><a href='#task7225'>4</a><li><a href='#task2033'>5</a></ul></div><div id='task4972' class='task_block'> <div class='task_id'>4972</div> <h3>Задача</h3> <div class='task_desc'> С помощью наследования, можно отделять логику обработки файла от логики управления его чтением. </div> <ol start='1'><li>Напишите код интерфейса FileWorkerContinueOnError - осторожного класса.</li><li>Он должен прекратить обработку файла, если в процессе обработки файла возникла ошибка.</li><li>У него должно быть два метода для переопределения: processLine и result.</li><li>Реализуйте тело метода work, который будет читать файл и вызывать processLine для каждой строки.</li><li>Добавьте в сигнатуру метода work ключевое слово default</li><li>Если запрошена обработка несуществующего файла, то обработка не должна выполняться и ошибки возникать не должно.</li></ol><ol start='7'><li>Напишите код интерфейса FileWorkerStopOnError - настойчивого класса.</li><li>Он должен продолжить обработку файла, если в процессе обработки файла возникла ошибка.</li><li>Он должен иметь те же методы, что и осторожный класс.</li></ol><div class='task_desc'> Файлы с исходными данными: </div> <ol start='1'><li><a href="files/task4972/test1.csv" target="_blank">скачать test1.csv</a></li><li><a href="files/task4972/test2.csv" target="_blank">скачать test2.csv</a></li><li><a href="files/task4972/test3.csv" target="_blank">скачать test3.csv</a></li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>System.out.println("Обработка файла настойчивым классом"); FileWorkerContinueOnError resilientSummer1 = new FileWorkerContinueOnError() { int sum = 0; @Override public void processLine(String line) { sum += Integer.parseInt(line); } @Override public String result() { return String.valueOf(sum); } }; resilientSummer1.work("files\\task4972\\test1.txt"); resilientSummer1.work("files\\task4972\\test2.txt"); resilientSummer1.work("files\\task4972\\test3.txt"); System.out.println("Результат обработки " + resilientSummer1.result()); System.out.println("Обработка файла осторожным классом"); FileWorkerStopOnError cautiousSummer1 = new FileWorkerStopOnError() { int sum = 0; @Override public void processLine(String line) { sum += Integer.parseInt(line); } @Override public String result() { return String.valueOf(sum); } }; cautiousSummer1.work("files\\task4972\\test1.txt"); cautiousSummer1.work("files\\task4972\\test2.txt"); cautiousSummer1.work("files\\task4972\\test3.txt"); System.out.println("Результат обработки " + cautiousSummer1.result()); System.out.println("Обработка файла анонимным настойчивым классом"); FileWorkerContinueOnError anonymousResilientWorker = new FileWorkerContinueOnError() { List<Integer> values = new ArrayList<>(); @Override public void processLine(String line) { values.add(Integer.parseInt(line)); } @Override public String result() { return String.join(", ", values.toString()); } }; anonymousResilientWorker.work("files\\task4972\\test1.txt"); anonymousResilientWorker.work("files\\task4972\\test2.txt"); anonymousResilientWorker.work("files\\task4972\\test3.txt"); System.out.println("Результат обработки " + anonymousResilientWorker.result()); System.out.println("Обработка файла анонимным осторожным классом"); FileWorkerStopOnError anonymousCautiousWorker = new FileWorkerStopOnError() { List<Integer> values = new ArrayList<>(); @Override public void processLine(String line) { values.add(Integer.parseInt(line)); } @Override public String result() { return String.join(", ", values.toString()); } }; anonymousCautiousWorker.work("files\\task4972\\test1.txt"); anonymousCautiousWorker.work("files\\task4972\\test2.txt"); anonymousCautiousWorker.work("files\\task4972\\test3.txt"); System.out.println("Результат обработки " + anonymousCautiousWorker.result()); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'>Обработка файла настойчивым классом Возникла ошибка: For input string: "not a number" Возникла ошибка: For input string: "some string" Результат обработки 123434505 Обработка файла осторожным классом Возникла ошибка: For input string: "not a number" Результат обработки 123407466 Обработка файла анонимным настойчивым классом Возникла ошибка: For input string: "not a number" Возникла ошибка: For input string: "some string" Результат обработки [400000, 3000000, 20000000, 100000000, 2662, 2262, 2542, 5166, 8974, 4018, 3568, 5313] Обработка файла анонимным осторожным классом Возникла ошибка: For input string: "not a number" Результат обработки [400000, 3000000, 20000000, 100000000, 2662, 2262, 2542] </div> </div> <div id='task6956' class='task_block'> <div class='task_id'>6956</div> <h3>Задача</h3> <div class='task_desc'> Реализуйте класс Rectangle, который описывает прямоугольник на плоскости. В нём должны быть следующие методы: </div> <ol start='1'><li>shiftX - сдвинуть прямоугольник на заданное расстояние вдоль оси X. Если расстояние меньше нуля, нужно сообщить об ошибке</li><li>shiftY - сдвинуть прямоугольник на заданное расстояние вдоль оси Y. Если расстояние меньше нуля, нужно сообщить об ошибке</li><li>toHtml - вернуть HTML-код, описывающий прямоугольник</li></ol><div class='task_desc'> Реализуйте статический метод Rectangle.fromCsv, который принимает строку в формате CSV и возвращает экземпляр класса Rectangle. Строка имеет следующий формат: </div> <ol start='1'><li>Первое значение всегда rectangle</li><li>Второе значение - идентификатор прямоугольника</li><li>Третье значение - координата x</li><li>Четвёртое значение - координата y</li><li>Пятое значение - ширина width</li><li>Шестое значение - высота height</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Rectangle rtg = Rectangle.fromCsv("rectangle;r8;335;159;162;5"); System.out.println(rtg.toHtml()); try { Rectangle rtg1 = Rectangle.fromCsv("rectangle;r8;335;159"); System.out.println("Это сообщение не должно быть выведено 1"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Строка должна содержать 6 значений, разделенных \";\". Строка: rectangle;r8;335;159"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { rtg.shiftX(-1000); System.out.println("Это сообщение не должно быть выведено 2"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Нельзя сдвинуть прямоугольник влево за пределы экрана"); System.out.println("Фактическое сообщение: " + e.getMessage()); } rtg.shiftX(1000); System.out.println(rtg.toHtml()); try { rtg.shiftY(-10000); System.out.println("Это сообщение не должно быть выведено 3"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Нельзя сдвинуть прямоугольник вверх за пределы экрана"); System.out.println("Фактическое сообщение: " + e.getMessage()); } rtg.shiftY(10000); System.out.println(rtg.toHtml()); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'><rect id='r8' x='335' y='159' width='162' height='5' fill='transparent' stroke='black'/> Ожидалось сообщение : Строка должна содержать 6 значений, разделенных ";". Строка: rectangle;r8;335;159 Фактическое сообщение: Строка должна содержать 6 значений, разделенных ";". Строка: rectangle;r8;335;159 Ожидалось сообщение : Нельзя сдвинуть прямоугольник влево за пределы экрана Фактическое сообщение: Нельзя сдвинуть прямоугольник влево за пределы экрана <rect id='r8' x='1335' y='159' width='162' height='5' fill='transparent' stroke='black'/> Ожидалось сообщение : Нельзя сдвинуть прямоугольник вверх за пределы экрана Фактическое сообщение: Нельзя сдвинуть прямоугольник вверх за пределы экрана <rect id='r8' x='1335' y='10159' width='162' height='5' fill='transparent' stroke='black'/> </div> </div> <div id='task5108' class='task_block'> <div class='task_id'>5108</div> <h3>Задача</h3> <div class='task_desc'> Убедитесь, что вы реализовали класс Rectangle из задачи <a href="tasks 32.html#task6956" target="_blank">ЛР32#6956(открыть в новой вкладке)</a> </div> <div class='task_desc'> Исходный файл содержит список действий в формате CSV (<a href="https://ru.wikipedia.org/wiki/CSV" target="_blank">справка в новой вкладке</a>) с разделителем ";". Каждое действие описывается на отдельной строчке: наименование и необходимые значения. Действия описываются в следующем формате: </div> <ol start='1'><li>Создать. Наименование create. Значения: id нового прямоугольника, его координаты x, y, ширина width и высота height.</li><li>Переместить по горизонтали. Наименование shiftX. Значения: id, изменение Х. Ширина прямоугольника остается прежней.</li><li>Переместить по вертикали. Наименование shiftY. Значения: id, изменение Y. Высота прямоугольника остается прежней.</li></ol><div class='task_desc'> Вам нужно реализовать метод performActionsFromSource с сигнатурой: </div> <div class='check_single preformatted'>void performActionsFromSource(Scanner scanner, Map<String, Rectangle> rectangles) {</div> <div class='task_desc'> В теле метода нужно реализовать обработку действий из файла и наполнить коллекцию rectangles. </div> <div class='task_desc'> Файлы с исходными данными: </div> <ol start='1'><li><a href="files/task5108/test1.csv" target="_blank">скачать test1.csv</a></li><li><a href="files/task5108/test2.csv" target="_blank">скачать test2.csv</a></li><li><a href="files/task5108/test3.csv" target="_blank">скачать test3.csv</a></li><li><a href="files/task5108/test4.csv" target="_blank">скачать test4.csv</a></li><li><a href="files/task5108/test5.csv" target="_blank">скачать test5.csv</a></li><li><a href="files/task5108/test6.csv" target="_blank">скачать test6.csv</a></li><li><a href="files/task5108/test7.csv" target="_blank">скачать test7.csv</a></li><li><a href="files/task5108/test8.csv" target="_blank">скачать test8.csv</a></li><li><a href="files/task5108/test9.csv" target="_blank">скачать test9.csv</a></li><li><a href="files/task5108/test10.csv" target="_blank">скачать test10.csv</a></li><li><a href="files/task5108/test11.csv" target="_blank">скачать test11.csv</a></li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>List<String> files = Arrays.asList( "files/task5108/test1.csv" , "files/task5108/test2.csv" , "files/task5108/test3.csv" , "files/task5108/test4.csv" , "files/task5108/test5.csv" , "files/task5108/test6.csv" , "files/task5108/test7.csv" , "files/task5108/test8.csv" , "files/task5108/test9.csv" , "files/task5108/test10.csv" , "files/task5108/test11.csv" ); File resultFile = new File("files/example_result_5108.html"); try (PrintWriter writer = new PrintWriter(resultFile)) { writer.println("<!DOCTYPE html>" + "<head>\n" + "<meta charset=\"utf-8\"/>\n" + "</head>\n" + "<body>\n"); for (String filename : files) { writer.printf("<h1>%s</h1>\n", filename); File target = new File(filename); Map<String, Rectangle> rectangles = new HashMap<>(); try (Scanner scanner = new Scanner(target)) { System.out.println("Читаю файл " + filename); performActionsFromSource(scanner, rectangles); } catch (FileNotFoundException e) { writer.printf("<p>Файл %s не существует</p>\n", filename); } catch (IllegalArgumentException e) { writer.printf("<p>Ошибка: %s</p>\n", e.getMessage()); } finally { if (!rectangles.isEmpty()) { writer.println("<div>Прямоугольники:"); for (String key : rectangles.keySet()) { writer.print(key + " "); } writer.println("</div>"); writer.println("<svg width=\"800\" height=\"600\">\n"); for (Map.Entry<String, Rectangle> entry : rectangles.entrySet()) { writer.println(entry.getValue().toHtml()); } writer.println("</svg>"); } } } writer.println("</body></html>"); } catch (IOException e) { System.out.println("Ошибка при записи в файл " + resultFile.getAbsolutePath()); System.out.println(e.getMessage()); } </div> <div class='task_desc'> Этот фрагмент выводит в HTML файл: идентификаторы прямоугольников, а также получившиеся фигуры в виде картинки. При попытке совершить некорректное действие, обработка файла с данными прекращается, в итоговый файл пишется сообщение об ошибке и последний корректный результат. </div> <div class='task_desc'> В результате запуска программы должен получиться файл <a href="files/example_result_5108.html" target="_blank">открыть в новой вкладке<br>files/example_result_5108.html</a> </div> </div> <div id='task7225' class='task_block'> <div class='task_id'>7225</div> <h3>Задача</h3> <div class='task_desc'> Реализуйте класс Circle, который описывает окружность на плоскости. В нём должны быть следующие методы: </div> <ol start='1'><li>shiftX - сдвинуть окружность на заданное расстояние вдоль оси X</li><li>shiftY - сдвинуть окружность на заданное расстояние вдоль оси Y</li><li>toHtml - вернуть HTML-код, описывающий окружность</li></ol><div class='task_desc'> Реализуйте статический метод Circle.fromCsv, который принимает строку в формате CSV и возвращает экземпляр класса Circle. Строка имеет следующий формат: </div> <ol start='4'><li>Первое значение всегда circle</li><li>Второе значение - идентификатор окружности</li><li>Третье значение - координата x центра окружности</li><li>Четвёртое значение - координата y центра окружности</li><li>Пятое значение - радиус окружности</li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>Circle circle = Circle.fromCsv("circle;f4;375;184;5"); System.out.println(circle.toHtml()); try { Circle cir1 = Circle.fromCsv("rectangle;r8;335;159;162;5"); System.out.println("Это сообщение не должно быть выведено 1"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Строка должна содержать 5 значений, разделенных \";\". Строка: rectangle;r8;335;159;162;5"); System.out.println("Фактическое сообщение: " + e.getMessage()); } try { circle.shiftX(-1000); System.out.println("Это сообщение не должно быть выведено 2"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Левая точка круга должна иметь неотрицательные координаты"); System.out.println("Фактическое сообщение: " + e.getMessage()); } circle.shiftX(1000); System.out.println(circle.toHtml()); try { circle.shiftY(-10000); System.out.println("Это сообщение не должно быть выведено 3"); } catch (IllegalArgumentException e) { System.out.println("Ожидалось сообщение : Верхняя точка круга должна иметь неотрицательные координаты"); System.out.println("Фактическое сообщение: " + e.getMessage()); } circle.shiftY(10000); System.out.println(circle.toHtml()); </div> <div class='task_desc'> В результате запуска программы должно быть выведено сообщение: </div> <div class='check_single preformatted'><circle cx='375' cy='184' r='5' stroke='black' stroke-width='1' fill='transparent'/> Ожидалось сообщение : Строка должна содержать 5 значений, разделенных ";". Строка: rectangle;r8;335;159;162;5 Фактическое сообщение: Строка должна содержать 5 значений, разделенных ";". Строка: rectangle;r8;335;159;162;5 Ожидалось сообщение : Левая точка круга должна иметь неотрицательные координаты Фактическое сообщение: Левая точка круга должна иметь неотрицательные координаты <circle cx='1375' cy='184' r='5' stroke='black' stroke-width='1' fill='transparent'/> Ожидалось сообщение : Верхняя точка круга должна иметь неотрицательные координаты Фактическое сообщение: Верхняя точка круга должна иметь неотрицательные координаты <circle cx='1375' cy='10184' r='5' stroke='black' stroke-width='1' fill='transparent'/> </div> </div> <div id='task2033' class='task_block'> <div class='task_id'>2033</div> <h3>Задача</h3> <div class='task_desc'> Одно из преимуществ наследования - возможность поместить в коллекцию экземпляры разных классов, которые реализуют один и тот же интерфейс. </div> <div class='task_desc'> Убедитесь, что вы реализовали класс Circle из задачи <a href="tasks 32.html#task7225" target="_blank">ЛР32#7225(открыть в новой вкладке)</a> </div> <div class='task_desc'> Убедитесь, что вы реализовали класс Rectangle из задачи <a href="tasks 32.html#task6956" target="_blank">ЛР32#6956(открыть в новой вкладке)</a> </div> <div class='task_desc'> Исходный файл содержит список действий в формате CSV (<a href="https://ru.wikipedia.org/wiki/CSV" target="_blank">справка в новой вкладке</a>) с разделителем ";". Каждое действие описывается на отдельной строчке: наименование и необходимые значения. Действия описываются в следующем формате: </div> <ol start='1'><li>Создать прямоугольник. Наименование rectangle. Значения: id нового прямоугольника, его координаты x, y, ширина width и высота height.</li><li>Создать окружность. Наименование circle. Значения: id новой окружности, его координаты x, y и радиус radius.</li><li>Переместить по горизонтали. Наименование shiftX. Значения: id, изменение Х.</li><li>Переместить по вертикали. Наименование shiftY. Значения: id, изменение Y.</li></ol><div class='task_desc'> Вам нужно реализовать метод performActionsFromSource с сигнатурой: </div> <div class='check_single preformatted'>void performActionsFromSource(Scanner scanner, Map<String, Movable> figures) {</div> <div class='task_desc'> Опишите собственный интерфейс Movable и реализуйте его в классах Circle и Rectangle. Интерфейс должен содержать общие методы для всех фигур. </div> <div class='task_desc'> В теле метода performActionsFromSource реализуйте обработку действий из файла и наполните коллекцию figures. </div> <div class='task_desc'> Файлы с исходными данными: </div> <ol start='1'><li><a href="files/task2033/test1.csv" target="_blank">скачать test1.csv</a></li><li><a href="files/task2033/test2.csv" target="_blank">скачать test2.csv</a></li><li><a href="files/task2033/test3.csv" target="_blank">скачать test3.csv</a></li><li><a href="files/task2033/test4.csv" target="_blank">скачать test4.csv</a></li><li><a href="files/task2033/test5.csv" target="_blank">скачать test5.csv</a></li><li><a href="files/task2033/test6.csv" target="_blank">скачать test6.csv</a></li><li><a href="files/task2033/test7.csv" target="_blank">скачать test7.csv</a></li><li><a href="files/task2033/test8.csv" target="_blank">скачать test8.csv</a></li><li><a href="files/task2033/test9.csv" target="_blank">скачать test9.csv</a></li><li><a href="files/task2033/test10.csv" target="_blank">скачать test10.csv</a></li><li><a href="files/task2033/test11.csv" target="_blank">скачать test11.csv</a></li><li><a href="files/task2033/test12.csv" target="_blank">скачать test12.csv</a></li></ol><div class='task_desc'> В методе main класса Program добавьте следующий код: </div> <div class='check_single preformatted'>List<String> files = Arrays.asList( "files/task2033/test1.csv" , "files/task2033/test2.csv" , "files/task2033/test3.csv" , "files/task2033/test4.csv" , "files/task2033/test5.csv" , "files/task2033/test6.csv" , "files/task2033/test7.csv" , "files/task2033/test8.csv" , "files/task2033/test9.csv" , "files/task2033/test10.csv" , "files/task2033/test11.csv" , "files/task2033/test12.csv" ); String resultFilename = "files/example_result_2033.html"; try (PrintWriter writer = new PrintWriter(resultFilename)) { writer.println("<!DOCTYPE html>" + "<head>\n" + "<meta charset=\"utf-8\"/>\n" + "</head>\n" + "<body>\n"); for (String filename : files) { writer.printf("<h1>%s</h1>\n", filename); File target = new File(filename); Map<String, Movable> figures = new HashMap<>(); try (Scanner scanner = new Scanner(target)) { System.out.println("Читаю файл " + filename); performActionsFromSource(scanner, figures); } catch (FileNotFoundException e) { writer.printf("<p>Файл %s не существует</p>\n", filename); } catch (IllegalArgumentException e) { writer.printf("<p>Ошибка: %s</p>\n", e.getMessage()); } finally { if (!figures.isEmpty()) { writer.println("<div>Фигуры:"); for (String key : figures.keySet()) { writer.print(key + " "); } writer.println("</div>"); writer.println("<svg width=\"800\" height=\"600\">\n"); for (Map.Entry<String, Movable> entry : figures.entrySet()) { writer.println(entry.getValue().toHtml()); } writer.println("</svg>"); } } } writer.println("</body></html>"); } catch (IOException e) { System.out.println("Ошибка при записи в файл " + resultFilename); } </div> <div class='task_desc'> Этот фрагмент выводит в HTML файл: идентификаторы фигур, а также получившиеся фигуры в виде картинки. При попытке совершить некорректное действие, обработка файла с данными прекращается, в итоговый файл пишется сообщение об ошибке и последний корректный результат. </div> <div class='task_desc'> В результате запуска программы должен получиться файл <a href="files/example_result_2033.html" target="_blank">открыть в новой вкладке<br>files/example_result_2033.html</a> </div> </div> Версия 202510. Подборка задач, выбор порядка подачи и подготовка тестовых данных - Крюков Александр, Омск 2013-2026. <a href='https://github.com/AKryukov92/programming-basics'>Основной репозиторий</a></body></html>