From d88bf24abd71e33fe4e35adead241077115a4b70 Mon Sep 17 00:00:00 2001 From: Random2142Max <104144843+Random2142Max@users.noreply.github.com> Date: Thu, 1 Dec 2022 16:17:07 +0500 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=20=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20+=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B4=D0=B8=D0=B0=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B2=20=D0=B2=D0=B8=D0=B4=D0=B5=20=D0=BA=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + .idea/workspace.xml | 53 +- ImageDiagrams/Sc_1.png | Bin 0 -> 56517 bytes basicprogramming_2.csv | 977 ++++++++++++++++++ src/main/java/org/example/Main.java | 4 +- src/main/java/org/example/Models/Chapter.java | 15 + src/main/java/org/example/Models/Course.java | 19 + src/main/java/org/example/Models/Student.java | 16 + src/main/java/org/example/Models/Task.java | 16 + .../java/org/example/Models/TypeTask.java | 11 + 10 files changed, 1103 insertions(+), 9 deletions(-) create mode 100644 ImageDiagrams/Sc_1.png create mode 100644 basicprogramming_2.csv create mode 100644 src/main/java/org/example/Models/Chapter.java create mode 100644 src/main/java/org/example/Models/Course.java create mode 100644 src/main/java/org/example/Models/Student.java create mode 100644 src/main/java/org/example/Models/Task.java create mode 100644 src/main/java/org/example/Models/TypeTask.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index ba1ec5c..611e7c8 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + - + + + + + + + + + + + + - + + + - { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "WebServerToolWindowFactoryState": "false", + "last_opened_file_path": "D:/Bandik/Java Study/AnalyticsProject", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)" } -}]]> +} + + + + + + + + @@ -36,9 +68,14 @@ + + - - - - + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + org.example.* + \ No newline at end of file diff --git a/basicprogramming_2.csv b/basicprogramming_2.csv index 4a06ba8..eeca22d 100644 --- a/basicprogramming_2.csv +++ b/basicprogramming_2.csv @@ -1,4 +1,4 @@ -;;За весь курс;;;;Преподавателю о курсе;;Первое знакомство с C#;;;;;;;;;;;;;;Ошибки;;;;;;;;;;;;;;;Ветвления;;;;;;;;;;;;Циклы;;;;;;;;;;;;Массивы;;;;;;;;;;;;;;;;;Коллекции, строки, файлы;;;;;;;;;;;;;;;Тестирование;;;;;;;;;;Сложность алгоритмов;;;;;;;;;;;;;Рекурсивные алгоритмы;;;;;;;;;;Поиск и сортировка;;;;;;;;;;;Практикум;;;;;;;Основы ООП;;;;;;;;;;;;;;;;Наследование;;;;;;;;;;;;;;;;Целостность данных;;;;;;;;;;;;Структуры;;;;;;;;; +;;За весь курс;;;;Преподавателю о курсе;;Первое знакомство с C#;;;;;;;;;;;;;;Ошибки;;;;;;;;;;;;;;;Ветвления;;;;;;;;;;;;Циклы;;;;;;;;;;;;Массивы;;;;;;;;;;;;;;;;;Коллекции, строки, файлы;;;;;;;;;;;;;;;Тестирование;;;;;;;;;;Сложность алгоритмов;;;;;;;;;;;;;Рекурсивные алгоритмы;;;;;;;;;;Поиск и сортировка;;;;;;;;;;;Практикум;;;;;;;Основы ООП;;;;;;;;;;;;;;;;Наследование;;;;;;;;;;;;;;;;Целостность данных;;;;;;;;;;;;Структуры;;;;;;;;; Фамилия Имя;Группа;Акт;Упр;ДЗ;Сем;Акт;Сем;Акт;Упр;Упр: Терминология;Упр: Первый шаг;Упр: Неверный тип данных;Упр: Ошибки преобразования типов;Упр: Биткоины в массы!;Упр: Преобразование строки в число;Упр: Использование var;Упр: Добрый работодатель;Упр: Главный вопрос Вселенной;Упр: Разыскиваются методы!;Упр: Области видимости;Сем;Акт;Упр;Упр: Ошибки компиляции;Упр: Очепятки;Упр: Минимум функции;Упр: Горячие клавиши отладки;Упр: Дизайн кода;Упр: Рефакторинг и улучшение кода;Упр: Сделай то, не знаю что;ДЗ;ДЗ: Практика «Angry Birds»;ДЗ: Практика «Бильярд»;ДЗ: Практика «Проценты»;ДЗ: Практика «Рефакторинг»;Сем;Акт;Упр;Упр: Високосный год;Упр: Ход ферзя;Упр: Среднее трех;Упр: Логические выражения и условия;Упр: Управление роботом;ДЗ;ДЗ: Практика «Рубль -лей -ля»;ДЗ: Практика «Два прямоугольника»;ДЗ: Практика «Расстояние до отрезка»;Сем;Акт;Упр;Упр: В поисках степени двойки;Упр: Убрать пробелы;Упр: Рамочка;Упр: * Шахматная доска;ДЗ;ДЗ: Практика «Пустой лабиринт»;ДЗ: Практика «Лабиринт змейка»;ДЗ: Практика «Лабиринт диагональ»;ДЗ: Практика «Dragon curve»;Сем;Акт;Упр;Упр: Четный массив;Упр: Индекс максимума;Упр: Подсчет;Упр: Поиск массива в массиве;Упр: Карты Таро;Упр: Карты памяти;Упр: Null или не Null?;Упр: Возвести массив в степень;Упр: Массивы;Упр: * Крестики-нолики;ДЗ;ДЗ: Практика «Гистограмма»;ДЗ: Практика «Тепловая карта»;Доп;Сем;Акт;Упр;Упр: Шифр незнакомки;Упр: Полезные знакомства;Упр: Карты памяти;Упр: Закон Бенфорда;Упр: Split и Join;Упр: Снова незнакомка;Упр: Работа со строками;Упр: Работа с файлами;ДЗ;ДЗ: Практика «Парсер предложений»;ДЗ: Практика «Частотность N-грамм»;ДЗ: Практика «Продолжение текста»;Сем;Акт;Упр;Упр: Тестирование;Упр: Модульные тесты;Упр: Модульные тесты 2;ДЗ;ДЗ: Практика «Поля в кавычках»;ДЗ: Практика «Тестирование»;ДЗ: Практика «Парсер полей»;Сем;Акт;Упр;Упр: Базовые понятия;Упр: Сложность и скорость;Упр: O-символика;Упр: Оценка сложности алгоритма;Упр: O-символика 2;ДЗ;ДЗ: Практика «Оттенки серого»;ДЗ: Практика «Медианный фильтр»;ДЗ: Практика «Пороговый фильтр»;ДЗ: Практика «Фильтр Собеля»;Сем;Акт;Упр;Упр: Исправить рекурсию;Упр: Понимание рекурсии;Упр: Перебор паролей;Упр: Брошенный код :(;ДЗ;ДЗ: Практика «Перебор паролей 2»;ДЗ: Практика «Хождение по чекпоинтам»;Сем;Акт;Упр;Упр: Анализ алгоритма;Упр: Рекурсивный бинарный поиск;Упр: Сортировка диапазона;Упр: Сложность поиска и сортировки;ДЗ;ДЗ: Практика «Левая граница»;ДЗ: Практика «Правая граница»;ДЗ: Практика «Автодополнение»;Сем;Акт;ДЗ;ДЗ: Практика «Манипулятор»;ДЗ: Практика «Визуализация»;ДЗ: Практика «Поиск угла»;ДЗ: Практика «Решение манипулятора»;Сем;Акт;Упр;Упр: Создание классов;Упр: Сокращенный синтаксис;Упр: Поля классов;Упр: Методы классов;Упр: Карты памяти;Упр: Создание методов расширения;Упр: Список директорий;Упр: Рефакторинг статического класса;ДЗ;ДЗ: Практика «Вектор»;ДЗ: Практика «Отрезок»;ДЗ: Практика «Нестатические методы»;ДЗ: Практика «256 оттенков серого»;Сем;Акт;Упр;Упр: Наследование;Упр: Касты;Упр: Всем печать!;Упр: Склейка массивов;Упр: Снова среднее трех;Упр: Поиск минимума;Упр: Сравнение книг;Упр: Против часовой стрелки;Упр: Метод ToString;ДЗ;ДЗ: Практика «Земля и Диггер»;ДЗ: Практика «Мешки и Золото»;ДЗ: Практика «Монстры»;Сем;Акт;Упр;Упр: Использование private;Упр: Не откладывать ошибки;Упр: Свойство вместо поля;Упр: Вектор;Упр: Дробь;ДЗ;ДЗ: Практика «Readonly Vector»;ДЗ: Практика «Счет из отеля»;ДЗ: Практика «Карманный гугл»;Сем;Акт;Упр;Упр: Структура или класс?;Упр: Карты памяти;Упр: Применение ref;Упр: Последствия boxing;ДЗ;ДЗ: Практика «Benchmark»;ДЗ: Практика «Эксперименты»;Сем Максимум:;;32;411;2800;32;2;2;2;55;5;5;5;5;5;5;5;5;5;5;5;2;2;27;2;5;5;1;5;4;5;200;50;50;50;50;2;2;23;5;5;5;3;5;200;50;100;50;2;2;20;5;5;5;5;200;50;50;50;50;2;2;50;5;5;5;5;5;6;5;5;4;5;200;50;50;100;2;2;39;5;5;3;5;5;5;5;6;200;50;100;50;2;2;12;2;4;6;200;50;50;100;2;2;22;4;2;9;3;4;200;50;50;50;50;2;2;22;5;7;5;5;200;100;100;2;2;18;2;5;5;6;200;50;50;100;2;2;200;50;50;50;50;2;2;38;5;5;2;5;6;5;5;5;200;50;50;50;50;2;2;46;4;7;5;5;5;5;5;5;5;200;50;100;50;2;2;21;1;5;5;5;5;200;50;100;50;2;2;18;4;7;5;2;200;100;100;2 Vergara Dylan;РТФ.2021 Пересдачи Часть 1.;0;357;430;0;0;0;0;52;2;5;5;5;5;5;5;5;5;5;5;0;0;26;2;5;5;1;5;3;5;30;10;10;10;0;0;0;18;0;5;5;3;5;20;10;0;10;0;0;15;5;5;5;0;40;10;10;10;10;0;0;45;5;5;5;5;5;6;5;5;4;0;20;10;10;0;0;0;22;5;0;2;0;5;0;5;5;40;10;20;10;0;0;8;2;3;3;0;0;0;0;0;0;20;2;2;9;3;4;40;10;10;10;10;0;0;19;5;4;5;5;20;0;20;0;0;18;2;5;5;6;40;10;10;20;0;0;20;0;10;0;10;0;0;35;5;5;2;5;3;5;5;5;40;10;10;10;10;0;0;46;4;7;5;5;5;5;5;5;5;40;10;20;10;0;0;21;1;5;5;5;5;40;10;20;10;0;0;12;4;1;5;2;40;20;20;0 diff --git a/build.gradle b/build.gradle index 3cae2d7..47b3daf 100644 --- a/build.gradle +++ b/build.gradle @@ -10,8 +10,17 @@ repositories { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' + implementation 'com.vk.api:sdk:1.0.14' + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' + implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.2' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.2' + implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.4' + implementation 'org.apache.httpcomponents:httpclient:4.5.13' + implementation 'commons-io:commons-io:2.11.0' + implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.3' + implementation 'com.google.code.gson:gson:2.10' } test { diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 407f157..dc0f106 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -1,7 +1,7 @@ package org.example; - public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + Report report = new Report("basicprogramming_2.csv"); + report.report(); } } \ No newline at end of file diff --git a/src/main/java/org/example/Models/Courses/TypeTask.java b/src/main/java/org/example/Models/Courses/TypeTask.java index 96e5a6c..fb6f1d9 100644 --- a/src/main/java/org/example/Models/Courses/TypeTask.java +++ b/src/main/java/org/example/Models/Courses/TypeTask.java @@ -1,5 +1,12 @@ package org.example.Models.Courses; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; + enum TypeTaskEnum { ACTIVE, EXERCISE, @@ -12,6 +19,8 @@ public class TypeTask { private TypeTaskEnum typeTask; public TypeTask(String typeTask) { + // Проверка на кодировку, так как ранее она ломалась + //System.out.println(Charset.defaultCharset()); switch (typeTask.toUpperCase()) { case "АКТ": this.typeTask = TypeTaskEnum.ACTIVE; @@ -29,7 +38,14 @@ public TypeTask(String typeTask) { this.typeTask = TypeTaskEnum.ADDITIONALLY; break; default: - throw new IllegalArgumentException(String.format("В ведомости указан %s. Данный тип заданий отсутствует!", typeTask)); + throw new IllegalArgumentException((String.format("В ведомости указан %s. Данный тип заданий отсутствует!", typeTask))); +// try { +// throw new IllegalArgumentException((String.format("В ведомости указан %s. Данный тип заданий отсутствует!", typeTask))); +// } +// catch (RuntimeException e) { +// System.out.println(typeTask); +// e.printStackTrace(); +// } } } diff --git a/src/main/java/org/example/Report.java b/src/main/java/org/example/Report.java new file mode 100644 index 0000000..3d6d696 --- /dev/null +++ b/src/main/java/org/example/Report.java @@ -0,0 +1,240 @@ +package org.example; + +import org.example.Models.Courses.Task; +import org.example.Models.Courses.TypeTask; +import org.example.Models.Persons.Student; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Report { + private final String url; + private final Path path; + private static List fileList = new ArrayList<>(); + private static HashMap studentMap = new HashMap<>(); + private static HashMap readInfoChapterMap = new HashMap<>(); + private static HashMap readTaskMap = new HashMap<>(); + public Report(String url) { + this.url = url; + this.path = Paths.get(url).toAbsolutePath(); + } + public void report() { + // Считываем данные из файла и записываем в List + try { + fileList = Files.readAllLines(path, StandardCharsets.UTF_8); + } + catch (IOException e) { + System.out.println("Ошибка, файл не считался!"); + e.printStackTrace(); + } + + // Методы для работы с файлом + readWriteAllInfo(); + // Выводим студентов записанных в коллекцию + outAllInfoConsole(); + } + // Метод, для считывания и записывания всех данных с файла + private void readWriteAllInfo() { + // Запись глав курса + setFilteredHeader(); + // Запись заданий из глав курса + setTasks(); + // Запись студентов + setStudentInformation(); + } + // Метод для вывода всей информации в консоль + private void outAllInfoConsole() { + // Вывод глав курса + //outFilteredHeader(); + // Вывод заданий + //outTasks(); + // Вывод студентов + //outStudentMap(); + } + private void setFilteredHeader() { + + // Берём заголовок таблицы + var arrHeading = fileList.get(0).toCharArray(); + System.out.println(" Главы\tКол-во заданий"); + + // Объявляем временные переменные для HashMap + String strHead = "Students";// В первых 2 абзацах информация о студентах + Integer countSemicolon = 0; + + for (int i = 0; i < arrHeading.length; i++) { + if (arrHeading[i] == ';') { + // Тут считаем кол-во абзацев + countSemicolon++; + } + else { + // Записываем по символьно наименование абзаца + if (countSemicolon != 0) { + // Закидываем во временный HashMap + readInfoChapterMap.put( + getUid("readInfoChapterMap"), + String.format("%s - %s",strHead,countSemicolon)); + // Обнуляем временные переменные + countSemicolon = 0; + // Так как у нас уже начинается новое название главы, + // чтобы не потерять первую букву названия главы, + // мы обнуляем значение и записываем первый символ + strHead = "" + arrHeading[i]; + } + else { + // Записываем заголовок по символам + strHead += arrHeading[i]; + } + } + } + } + private void setTasks() { + // Берём следующие 2 строки Tasks и MaxScoreTasks и немного корректируем внутренние данные для читабельности. + var massStrTasks = fileList.get(1) + .replaceAll("[,\\[\\]]","") + .replace(" ","") + .replaceFirst(" ","") + .split(";"); + + var massStrMaxScores = fileList.get(2) + .replaceAll("[, \\[]","") + .split(";"); + + // Для фильтрации по главам, я прохожусь по мапе глав. + // Создаём общий счётчик, для установления границ, перебора глав + int countStartChapter = 0; + + for (var chapter : readInfoChapterMap.values()) { + // Берём название и кол-во заданий в главе + var arrChapter = chapter.split(" - "); + var nameChapter = arrChapter[0]; + var countTasks = Integer.parseInt(arrChapter[1]); + + // Проверка на колонку студентов, если бы раздел студентов не находился в начале ведомости. + // Пытался сделать через == или equals, но эти варианты не работали с текстом "Student", + // поэтому я решил использовать contains + if (nameChapter.contains("Students")) { + // Если это раздел студентов, то мы его пропускаем + countStartChapter += countTasks; + } + else { + // Теперь, через цикл, можно одновременно работать с 2 массивами строк + for (int i = countStartChapter; i < countStartChapter + countTasks; i++) { + // Тут должно записываться новое задание + его макс. кол-во баллов + + // С помощью countStartChapter мы берём нужные нам данные, + // а также заранее устанавливаем предел, через сумму начальной и конечной границы главы + + // Создание типов заданий и самих заданий + var typeTask = new TypeTask(getTypeTask(massStrTasks[i])); + var task = new Task( + getUid("readTaskMap"), + massStrTasks[i], + typeTask.getTypeTask(), + Integer.parseInt(massStrMaxScores[i]) + ); + readTaskMap.put( + getUid("readTaskMap"), + task); + } + // Сохраняем текущую границу, чтобы избежать повторения и не выходить за конец строки + countStartChapter += countTasks; + } + } + } + private void setStudentInformation() { + // Счётчик для ограничения вывода информации + Integer count = 0; + + fileList.remove(0); // Удаляем заголовки + fileList.remove(0); // Удаляем подзаголовки + fileList.remove(0); // Удаляем максимальные числа + + // Перебираем строки из List + // Также тут надо поставить ограничение, + // чтобы метод не сломался, при достижении конца + for (var item : fileList) { + // Остановка после получения 1-ых 7-ых студентов + if (count == 6) break;// Ограничение + + // Работа со списком студентов + setStudents(item); + count++; + } + } + private void setStudents(String str) { + // Проходим по первым 2 столбцам + Integer countSemicolon = 0; + // Чтобы не было проблем с памятью, используем StrBuilder + StringBuilder strBuild = new StringBuilder(); + // Превращаем строку в массив символов и перебираем символы + for (var _char : str.toCharArray()) { + if (countSemicolon == 2) { + break; + } + // Если встретилась ';', то check++ + if (_char == ';') { + countSemicolon++; + } + strBuild.append(_char); + } + // Разделяем полученную строку на части (массив) + var arrParagraph = strBuild.toString().split(";"); + // Нужно теперь добавить студента + studentMap.put( + getUid("studentMap"), + new Student( + getUid("studentMap"), + arrParagraph[0], + arrParagraph[1] + )); + // Не забываем почистить strBuilder, + // если собираемся его в дальнейшем использовать + strBuild.setLength(0); + } + private String getTypeTask(String task) { + if (task.length() > 3) { + var massTask = task.split(": "); + return massTask[0]; + } + else return task; + } + private Integer getUid(String map) { + // Тут откорректировало IDE + return switch (map) { + case "studentMap" -> studentMap.isEmpty() ? 0 : studentMap.size(); + case "readInfoChapterMap" -> readInfoChapterMap.isEmpty() ? 0 : readInfoChapterMap.size(); + case "readTaskMap" -> readTaskMap.isEmpty() ? 0 : readTaskMap.size(); + default -> throw new IllegalArgumentException( + String.format("Данной %s не существует!", map)); + }; + } + private static void outFilteredHeader() { + System.out.println(); + for (var item : readInfoChapterMap.values()) { + System.out.println(item); + } + } + private static void outTasks() { + System.out.println("\n Задания "); + System.out.println(" Name\tType exercise\tMax score\n"); + for (var item : readTaskMap.values()) { + System.out.println(item.toString()); + } + } + private static void outStudentMap() { + System.out.println("\n Студенты "); + System.out.println(" Uid\tFull name\tName group\n"); + for (var item : studentMap.values()) { + System.out.println(item.toString()); + } + } + public String getUrl() {return url;} + + public Path getPath() {return path;} +}