diff --git a/.gitignore b/.gitignore index f68d109..ea3a58a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ ### IntelliJ IDEA ### +.idea/ out/ !**/src/main/**/out/ !**/src/test/**/out/ @@ -26,4 +27,4 @@ bin/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 07115cd..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 65e8411..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/DeanOffice.java b/src/DeanOffice.java new file mode 100644 index 0000000..f3ce1d2 --- /dev/null +++ b/src/DeanOffice.java @@ -0,0 +1,219 @@ +import java.util.*; +import java.util.random.RandomGenerator; + +/** + * Этот класс Деканат нужен для управления студентами. + */ +public class DeanOffice { + private List studentDataBase = new ArrayList<>(); + + DeanOffice(){} + + /** + * Случайное заполнение имен и групп студентов + * @param countRandomStudents Количество студентов, сгененрированых псевдослучайно. + * @param groupCount Количество групп студентов. + * @param subjects Предметы курса. + */ + DeanOffice(int countRandomStudents, int groupCount, String[] subjects){ + for (int i = 0; i < countRandomStudents; i++){ + Map mapEvaluations = new HashMap<>(); + for (String str : subjects){ + mapEvaluations.put(str, RandomGenerator.getDefault().nextInt(2,6)); + } + + Students student = new Students("student #"+i, + "group #"+RandomGenerator.getDefault().nextInt(groupCount+1), + RandomGenerator.getDefault().nextInt(1,7), + mapEvaluations); + } + } + + /** + * По умолчанию групп 3. + * @param countRandomStudents Количество студентов, сгененрированых псевдослучайно. + * @param subjects Предметы курса. + */ + DeanOffice(int countRandomStudents, String[] subjects){ + for (int i = 0; i < countRandomStudents; i++){ + Map mapEvaluations = new HashMap<>(); + // заполняем Map случайными оценками + for (String str : subjects){ + mapEvaluations.put(str, RandomGenerator.getDefault().nextInt(2,6)); + } + + Students student = new Students("student #"+i, + "group #"+RandomGenerator.getDefault().nextInt(4), + RandomGenerator.getDefault().nextInt(1,7), + mapEvaluations ); + addStudentInStudentDataBase(student); + } + } + + /** + * @param countRandomStudents Количество студентов, сгененрированых псевдослучайно. + * @param names массив имен. Из него будет случайно браться имена для студентов. + * @param groups массив груп. Из него будет случайно браться названия групп для студентов. + * @param courses массив номеров курса. Из него будет случайно браться номера для определения курса студента. + * @param subjects массив предметов. Из него будет случайно браться названия предметов для студента. + */ + DeanOffice(int countRandomStudents, String[] names, String[]groups, int[]courses, String[] subjects){ + for (int i = 0; i < countRandomStudents; i++){ + Map mapEvaluations = new HashMap<>(); + // заполняем Map случайными оценками + for (String str : subjects){ + mapEvaluations.put(str, RandomGenerator.getDefault().nextInt(2,6)); + } + Students student = new Students(names[RandomGenerator.getDefault().nextInt(names.length)], + groups[RandomGenerator.getDefault().nextInt(groups.length)], + courses[RandomGenerator.getDefault().nextInt(groups.length)], + mapEvaluations); + addStudentInStudentDataBase(student); + } + } + + /** + * Генерирует countRandomStudents студентов. + * @param countRandomStudents Количество студентов, сгененрированых псевдослучайно. + * @param names массив имен. Из него будет случайно браться имена для студентов. + * @param groups массив груп. Из него будет случайно браться названия групп для студентов. + * @param courses массив номеров курса. Из него будет случайно браться номера для определения курса студента. + * @param subjects массив предметов. Из него будет случайно браться названия предметов для студента. + * @param estimations массив оценок. Из него будет случайно браться оценки по предметам студента. + */ + DeanOffice(int countRandomStudents, String[] names, String[]groups, int[]courses, + String[] subjects, int[] estimations) + { + for (int i = 0; i < countRandomStudents; i++){ + Students student = new Students(names[RandomGenerator.getDefault().nextInt(names.length)], + groups[RandomGenerator.getDefault().nextInt(groups.length)], + courses[RandomGenerator.getDefault().nextInt(groups.length)], + subjects,estimations); + studentDataBase.add(student); + } + } + + public void setStudentDataBase(List studentDataBase){ + this.studentDataBase = studentDataBase; + } + /** + * Добавить объект студент в базу данных. + * @param student объект студент. + */ + public void addStudentInStudentDataBase(Students student){ + this.studentDataBase.add(student); + } + + /** + * Добавить студента по имени, группе, курсу, предметам. + * @param name имя студента. + * @param group группа студента. + * @param course номер курса. + * @param subjects предметы студента. + */ + public void addStudentInStudentDataBase(String name, String group, int course, String[] subjects){ + Students student = new Students(name, group, course, subjects); + addStudentInStudentDataBase(student); + } + public void addStudentInStudentDataBase(String name, String group, int course, String[] subjects, int[] estimations){ + Students student = new Students(name, group, course, subjects, estimations); + addStudentInStudentDataBase(student); + } + + /** + * Получение массива студентов. + * @return список студентов. + */ + public List getStudentDataBase(){ + return studentDataBase; + } + + /** + * Функция, которя удаляет студентов со средним баллом <3. + * @return количество удаленных студентов из списка. Или -1 если список студентов пуст + */ + public int delBadStudents(){ + return delBadStudents(studentDataBase); + } + + /** + * Функция, которя удаляет студентов со средним баллом <3. + * @param studs Список студентов + * @return количество удаленных студентов из списка. Или -1 если список студентов пуст + */ + public int delBadStudents(List studs){ + if (studs.isEmpty()){ + return -1; + } + int oldStudentSize = studs.size(); + List temp = new ArrayList<>(); + for (Students stud : studs){ + int sum = 0; + if (stud.getEvaluations().isEmpty()) { //если у студента нет оценок, то его в temp не добавляем + continue; //Скипаем к следующему + } + for (Integer it : stud.getEvaluations().values()) { // берем оценки + sum += it; + } + int avgEvalutation = sum / stud.getEvaluations().size(); + if (avgEvalutation >= 3) { + /*здесь catch на деление на ноль не нужен, + ибо в первом if мы исключаем пустой список*/ + temp.add(stud); + } + } + this.setStudentDataBase(temp); + return oldStudentSize - temp.size(); + } + + + /** + * Могут перевестись на курс старше + * @param studs Список студентов + * @return количество студентов которые перевелись. Или -1 если список студентов пуст + */ + public int transferToOlderCourse(List studs){ + if (studs.isEmpty()){ + return -1; + } + int promotedStudents = 0; + for (Students stud : studs){ + int sum = 0; + if (stud.getEvaluations().isEmpty()) { //если у студента нет оценок, то его в temp не добавляем + continue; //Скипаем к следующему + } + for (Integer it : stud.getEvaluations().values()) { + sum += it; + } + if (sum / stud.getEvaluations().size() >= 3) { + /*здесь catch на деление на ноль не нужен, + ибо в первом if мы исключаем пустой список*/ + stud.setCourse(stud.getCourse()+1); + promotedStudents++; + } + } + this.setStudentDataBase(studs); + return promotedStudents; + } + /** + * Могут перевестись на курс старше + * @return количество студентов которые могут перевестись. Или -1 если список студентов пуст + */ + public int transferToOlderCourse(){ + return transferToOlderCourse(studentDataBase); + } + public void printStudents(Liststudents, int course){ + for (Students stud: students){ + if (stud.getCourse()==course){ + System.out.println(stud.getName() + " | "+stud.getCourse() + " | "+stud.getGroup() + " | " + stud.getStringEvaluations()); + } + } + } + + + public void printAllStudents(){ + for (Students stud: this.getStudentDataBase()){ + System.out.println(stud.getName() + " | "+stud.getCourse() + " | "+stud.getGroup() + " | " + stud.getStringEvaluations()); + } + } +} diff --git a/src/Main.java b/src/Main.java index 7aeb918..5869eb7 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,15 +1,31 @@ -//TIP To Run code, press or -// click the icon in the gutter. + +import java.util.random.RandomGenerator; + public class Main { + /** + * Это основной метод, использующий методы классов. + * @param args Не используется. + */ public static void main(String[] args) { - //TIP Press with your caret at the highlighted text - // to see how IntelliJ IDEA suggests fixing it. - System.out.printf("Hello and welcome!"); + /** + * Я как обычно лишний раз замарочился + * пополнение List'a со студентами пополсянется несколькими способами. + * Либо мы передаем параметры в функцию и внутри этой функции создается объект класса Students и помещается + * в List или мы передаем сам объект класса Students и внутри + */ + DeanOffice dean = new DeanOffice(); + String[] subjects = {"Русский", "Математика", "Информатика"}; + dean.addStudentInStudentDataBase("Аня", "ИТСС", 1, subjects, new int[] {2,2,3}); + dean.addStudentInStudentDataBase("Глеб", "ЖТО", 2, subjects, new int[] {3,3,3}); + dean.addStudentInStudentDataBase("Боря", "ЖТО", 3, subjects, new int[] {4,4,3}); + dean.addStudentInStudentDataBase("Ира", "ИТСС", 3, subjects, new int[] {5,5,5}); - for (int i = 1; i <= 5; i++) { - //TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i test git= " + i); - } + dean.printAllStudents(); + System.out.println("Студенты 3-го курса"); + dean.printStudents(dean.getStudentDataBase(),3); + System.out.println("Удаляем " + dean.delBadStudents() + " студентов, со средним баллом <3."); + dean.printAllStudents(); + System.out.println("Переводим " + dean.transferToOlderCourse() + " студентов со средним балом >=3 на курс старше"); + dean.printAllStudents(); } -} \ No newline at end of file +} diff --git a/src/Students.java b/src/Students.java new file mode 100644 index 0000000..643e505 --- /dev/null +++ b/src/Students.java @@ -0,0 +1,214 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.random.RandomGenerator; + +/** + * Класс Студент/
+ * Содержит имя, номер курса, название группы, и map оценок(по пятибальной системе(2,3,4,5)). + * */ +public class Students { + private String name; + private Map evaluations = new HashMap(); + private String group; + private int course; + + Students(){ + this.name = ""; + this.group = ""; + this.course = 1; + } + + Students(int course, Map evaluations){ + this("","",1,evaluations); + } + + Students(String name, String group, int course, String[] subjects) { + this.name = name; + this.group = group; + this.course = course; + setEvaluations(subjects); + } + Students(String name, String group, int course, String[] subjects, int[] estimations){ + this.name = name; + this.group = group; + this.course = course; + setEvaluations(subjects,estimations); + } + + Students(String name, String group, int course, Map evaluations){ + this.name = name; + this.group = group; + this.course = course; + setEvaluations(evaluations); + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + /** + * Геттер map оценок. + * @return Map (String, Integer). + */ + public Map getEvaluations() { + return evaluations; + } + + public String getStringEvaluations() { + String str = ""; + for (String k : evaluations.keySet()){ + str += k+" - " + evaluations.get(k) + ","; + } + return str; + } + + /** + * Вставка оценок. + * @param evaluations мап с предметами и оценками. + * @return 0, если все оценки в рамках пятибальной системы и изменения вступят в силу. Иначе -1. + */ + public Integer setEvaluations(Map evaluations) { + Map temp = new HashMap<>(); + for(String it : evaluations.keySet()){ + int val = evaluations.get(it); + if (val < 2 || val > 5){ // если несоблюдается условие пятибальной системы, то кидаем -1 + return -1; + } + temp.put(it,evaluations.get(it)); // заполняем временный map + } + this.evaluations = temp; + return 0; + } + + /** + * Вставка оценок. + * В случае, если в массив оценок меньше массива предметов, то недостающие оценки заполнятся случайно + * от 2 до 5 включительно. + * @param subjects предметы. + * @param estimations оценки. + * @return 0, если метод отработал стабильно. -1 если массив предметов пуст. + */ + public Integer setEvaluations(String[] subjects, int[] estimations) { + if(subjects.length == 0){ + return -1; + } + + Map temp = new HashMap<>(); + int it = 0; + try { + do{ + temp.put(subjects[it], estimations[it]); + it++; + }while(it < subjects.length); + } + catch (IndexOutOfBoundsException e){ + do{ + temp.put(subjects[it], RandomGenerator.getDefault().nextInt(2,6)); + it++; + }while(it < subjects.length); + } + this.evaluations = temp; + return 0; + + } + /** + * Вставка оценок. + * В случае, если в массив оценок меньше массива предметов, то недостающие оценки заполнятся 2-ми + * @param subjects предметы. + * @param estimations оценки. + * @return 0, если метод отработал стабильно. -1 если массив предметов пуст. + */ + public Integer setEvaluationsNoRand(String[] subjects, int[] estimations) { + if(subjects.length == 0){ + return -1; + } + + Map temp = new HashMap<>(); + int it = 0; + try { + do{ + temp.put(subjects[it], estimations[it]); + it++; + }while(it < subjects.length); + } + catch (IndexOutOfBoundsException e){ + do{ + temp.put(subjects[it], 2); + it++; + }while(it < subjects.length); + } + this.evaluations = temp; + return 0; + + } + + /** + * Вставка случайных оценок. + * @param subjects предметы. + * @return 0, если метод отработал стабильно. -1 если массив предметов пуст. + */ + public Integer setEvaluations(String[] subjects) { + if(subjects.length == 0){ + return -1; + } + + Map temp = new HashMap<>(); + int it = 0; + do{ + temp.put(subjects[it], RandomGenerator.getDefault().nextInt(2,6)); + it++; + }while(it < subjects.length); + this.evaluations = temp; + return 0; + } + /** + * Геттер оценки. + * @param K название предмета. + * @return оценка по предмету. + */ + public Integer getEvaluation(String K) { + return evaluations.get(K); + } + + /** + * Установка оценки. + * @param K предмет. + * @param V оценка. + * @return Вернет предыдущее значение при изменении значения объекта, если это новый объект, вернется null. + * Но если введеная оценка <2, то вернется -1. + */ + public Integer setEvaluation(String K,Integer V) { + if(V > 2 && V < 5){ + return evaluations.put(K,V); + } + else { + return -1; + } + } + + /** + * Геттер курса. + * @return номер курса. + */ + public int getCourse() { + return course; + } + + public void setCourse(int course) { + this.course = course; + } + +}