Advertisement
lithie_oce

Lab4task1Java

Feb 29th, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 22.88 KB | Source Code | 0 0
  1. import java.util.HashSet;
  2. import java.io.*;
  3. import java.util.Set;
  4. import java.util.*;
  5.  
  6. import static java.lang.Math.round;
  7.  
  8. public class Main {
  9.     private static final int TYPE_CHOICE_CONTINUE_OR_EXIT = 1;
  10.     private static final int TYPE_CHOICE_FUNCTION = 0;
  11.     private static final int MIN_SALARY = 1;
  12.     private static final int MAX_SALARY = 999999;
  13.     private static final int MAX_NAME_LENGTH = 15;
  14.     private static final int MAX_DEPARTMENT_NAME_LENGTH = 15;
  15.     private static final int MAX_MONTH_LENGTH = 8;
  16.     private static final Scanner consoleScan = new Scanner(System.in);
  17.     private static final HashSet<String> setMonths = new HashSet<String>(Set.of("январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"));
  18.     private static final String[] monthNameArr = {"январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"};
  19.     static class employee {
  20.         String name;
  21.         String department;
  22.         String month;
  23.         int salary;
  24.         //float price;
  25.  
  26.         public employee(String name, String department, String month, int salary) {
  27.             this.name = name;
  28.             this.department = department;
  29.             this.month = month;
  30.             this.salary = salary;
  31.         }
  32.     }
  33.  
  34.     static employee[] listOfEmployee = new employee[1];
  35.  
  36.     private static void writeTask() {
  37.         System.out.println("--------------------------------------------------------------" +
  38.                 "\nДанная программа позволяет вести учёт заработной платы сотрудников.");
  39.     }
  40.  
  41.     private static void print(int typeChoice) {
  42.         if (typeChoice == TYPE_CHOICE_FUNCTION)
  43.             System.out.println("--------------------------------------------------------------\n" +
  44.                     "Выберите действие:\n" +
  45.                     "1 - добавить данные в список сотрудников.\n" +
  46.                     "2 - редактировать данные в списке сотрудников.\n" +
  47.                     "3 - удалить данные из списка сотрудников.\n" +
  48.                     "4 - просмотр данных в списке сотрудников.\n" +
  49.                     "5 - вывод общей суммы выплат по каждому отделу.\n" +
  50.                     "6 - импорт данных из файла.\n" +
  51.                     "7 - экспорт данных в файл.\n" +
  52.                     "0 - конец работы и выключение программы.\n" +
  53.                     "--------------------------------------------------------------");
  54.         else if (typeChoice == TYPE_CHOICE_CONTINUE_OR_EXIT)
  55.             System.out.println("Повторить действие?\n" +
  56.                     "1 - да.\n" +
  57.                     "2 - нет.");
  58.     }
  59.  
  60.     private static int inputNumber(int min, int max) {
  61.         int num = 0;
  62.         boolean isNotCorrect;
  63.         do {
  64.             isNotCorrect = false;
  65.             try {
  66.                 num = Integer.parseInt(consoleScan.nextLine());
  67.             } catch (NumberFormatException e) {
  68.                 System.out.println("Вы ввели некорректные данные! Попробуйте еще:");
  69.                 isNotCorrect = true;
  70.             }
  71.             if (!isNotCorrect && (num < min || num > max)) {
  72.                 System.out.println("Введено значение не входящее в диапазон допустимых! Попробуйте еще:");
  73.                 isNotCorrect = true;
  74.             }
  75.         } while (isNotCorrect);
  76.         return num;
  77.     }
  78.  
  79.     private static boolean checkDataString(String dataString, int maxLength) {
  80.         boolean isIncorrect = false;
  81.         if (dataString.length() > maxLength) {
  82.             isIncorrect = true;
  83.             System.out.println("Вы превысили допустимую длину!");
  84.         }
  85.         if (dataString.isEmpty()) {
  86.             System.out.println("Значение не может быть пустым!");
  87.             isIncorrect = true;
  88.         }
  89.         if (!isIncorrect) {
  90.             for (int i = 0; i < dataString.length() && !isIncorrect; i++) {
  91.                 if (dataString.charAt(i) == '@') {
  92.                     isIncorrect = true;
  93.                     System.out.println("Строка не может содержать символ @!");
  94.                 }
  95.             }
  96.         }
  97.         return isIncorrect;
  98.     }
  99.  
  100.     private static String inputName() {
  101.         String name;
  102.         boolean isIncorrect;
  103.         do {
  104.             System.out.println("Введите фамилию сотрудника (до 15 символов):");
  105.             name = consoleScan.nextLine();
  106.             isIncorrect = checkDataString(name, MAX_NAME_LENGTH);
  107.         } while (isIncorrect);
  108.         return name;
  109.     }
  110.  
  111.     private static String inputdDepartmentName() {
  112.         String department;
  113.         boolean isIncorrect;
  114.         do {
  115.             System.out.println("Введите название отдела (до 15 символов):");
  116.             department = consoleScan.nextLine();
  117.             isIncorrect = checkDataString(department, MAX_DEPARTMENT_NAME_LENGTH);
  118.         } while (isIncorrect);
  119.         return department;
  120.     }
  121.  
  122.     private static String inputMonth() {
  123.         String month;
  124.         boolean isIncorrect;
  125.         do {
  126.             System.out.println("Введите название месяца (до 8 символов):");
  127.             month = consoleScan.nextLine();
  128.             isIncorrect = checkDataString(month, MAX_MONTH_LENGTH);
  129.             for (int i = 0; i < 11; i++) {
  130.                 if (!(setMonths.contains(month.toLowerCase()))) {
  131.                     isIncorrect = true;
  132.                 }
  133.             }
  134.         } while (isIncorrect);
  135.         return month;
  136.     }
  137.  
  138.     private static int inputSalary() {
  139.         int salary;
  140.         System.out.println("Введите сведения о зарплате (число в копейках от 1 до 999999):");
  141.         salary = inputNumber(MIN_SALARY, MAX_SALARY);
  142.         return salary;
  143.     }
  144.  
  145.     private static boolean checkOnSimilarRecord(String name, String department, String month) {
  146.         boolean isEqualRecords = false;
  147.         for (int i = 0; i < listOfEmployee.length - 1 && !isEqualRecords; i++)
  148.             isEqualRecords = (listOfEmployee.equals(listOfEmployee[i].name) && department.equals(listOfEmployee[i].department) && month.equals(listOfEmployee[i].month));
  149.         return isEqualRecords;
  150.     }
  151.  
  152.     private static void takeInfoFromFile() {
  153.         File file;
  154.         String path = enterInputPath();
  155.         String currentString;
  156.         boolean isCorrect;
  157.  
  158.         file = new File(path);
  159.         try (Scanner fileScan = new Scanner(file)) {
  160.             while (fileScan.hasNextLine()) {
  161.                 currentString = fileScan.nextLine();
  162.                 String[] words = currentString.split("@");
  163.                 isCorrect = !(checkOnSimilarRecord(words[0], words[1], words[2]));
  164.                 if (isCorrect) {
  165.                     saveRecord(words[0], words[1], words[2], Integer.parseInt(words[3]));
  166.                 } else
  167.                     System.out.println("В файле встречена запись, идентичная уже имеющимся данным!\n" + "Запись импортирована не будет.");
  168.             }
  169.         } catch (Exception e) {
  170.             System.out.println("Проверьте корректность данных в файле!");
  171.         }
  172.     }
  173.  
  174.     private static String enterOutputPath() {
  175.         String path;
  176.         boolean isFileIncorrect;
  177.         do {
  178.             isFileIncorrect = false;
  179.             System.out.println("Введите путь к файлу:");
  180.             path = consoleScan.nextLine();
  181.             File file = new File(path);
  182.  
  183.             if (file.isDirectory()) {
  184.                 System.out.println("Ошибка! Файл не найден!");
  185.                 isFileIncorrect = true;
  186.             } else {
  187.                 try {
  188.                     if (!file.createNewFile() && !file.canWrite()) {
  189.                         System.out.println("Ошибка! Файл доступен только для чтения!");
  190.                         isFileIncorrect = true;
  191.                     }
  192.                 } catch (IOException e) {
  193.                     System.out.println("Ошибка! Не удалось записать информацию в файл!");
  194.                     isFileIncorrect = true;
  195.                 }
  196.             }
  197.  
  198.         } while (isFileIncorrect);
  199.         return path;
  200.     }
  201.  
  202.     private static String enterInputPath() {
  203.         String path;
  204.         boolean isFileIncorrect;
  205.         do {
  206.             isFileIncorrect = false;
  207.             System.out.println("Введите путь к файлу:");
  208.             path = consoleScan.nextLine();
  209.             File file = new File(path);
  210.  
  211.             if (!file.isFile()) {
  212.                 System.out.println("Файл не найден! Пожалуйста проверьте существование файла и введите путь заново");
  213.                 isFileIncorrect = true;
  214.             }
  215.             if (!isFileIncorrect && !file.canRead()) {
  216.                 System.out.println("Файл не может быть прочитан! Пожалуйста проверьте файл и введите путь заново");
  217.                 isFileIncorrect = true;
  218.             }
  219.             if (!isFileIncorrect) {
  220.                 isFileIncorrect = checkInfInFile(path);
  221.             }
  222.         } while (isFileIncorrect);
  223.         return path;
  224.     }
  225.  
  226.     private static boolean checkInfInFile(String path) {
  227.         String currentString;
  228.         File checkFile;
  229.         boolean isNotCorrectName;
  230.         boolean isNotCorrectDepartment;
  231.         boolean isNotCorrectMonth;
  232.         boolean isNotCorrectSalary = false;
  233.         boolean isIncorrect = false;
  234.  
  235.         checkFile = new File(path);
  236.  
  237.         try (Scanner fileScan = new Scanner(checkFile)) {
  238.             while (fileScan.hasNextLine() && !isIncorrect) {
  239.                 currentString = fileScan.nextLine();
  240.                 String[] words = currentString.split("@");
  241.                 if (words.length > 5) {
  242.                     System.out.println("Некорректные данные! Убедитесь, что поля каждой записи резделены символом '@'.");
  243.                     isIncorrect = true;
  244.                 } else {
  245.                     isNotCorrectName = checkDataString(words[0], MAX_NAME_LENGTH);
  246.                     isNotCorrectDepartment = checkDataString(words[1], MAX_DEPARTMENT_NAME_LENGTH);
  247.                     isNotCorrectMonth = checkDataString(words[2], MAX_MONTH_LENGTH);
  248.                     if ((Integer.parseInt(words[3]) < MIN_SALARY) || (Integer.parseInt(words[3]) > MAX_SALARY)) {
  249.                         isNotCorrectSalary = true;
  250.                     }
  251.  
  252.                     if (isNotCorrectName || isNotCorrectDepartment || isNotCorrectMonth || isNotCorrectSalary) {
  253.                         isIncorrect = true;
  254.                     }
  255.                 }
  256.             }
  257.         } catch (Exception e) {
  258.             System.out.println("Проверьте корректность данных в файле!");
  259.             isIncorrect = true;
  260.         }
  261.         return isIncorrect;
  262.     }
  263.  
  264.     private static void saveRecord(String name, String department, String month, int salary) {
  265.         listOfEmployee[listOfEmployee.length - 1] = new employee(name, department, month, salary);
  266.         listOfEmployee = Arrays.copyOf(listOfEmployee, listOfEmployee.length + 1);
  267.         System.out.println("Запись была добавлена успешно!");
  268.     }
  269.  
  270.     private static void enterInf() {
  271.         String name;
  272.         String department;
  273.         String month;
  274.         int salary;
  275.         int choice;
  276.         boolean isEqualRecord = false;
  277.         do {
  278.             name = inputName();
  279.             department = inputdDepartmentName();
  280.             month = inputMonth();
  281.             if (listOfEmployee.length > 1)
  282.                 isEqualRecord = checkOnSimilarRecord(name, department, month);
  283.             if (!isEqualRecord) {
  284.                 salary = inputSalary();
  285.                 saveRecord(name, department, month, salary);
  286.             } else
  287.                 System.out.println("Данная запись уже присутствует в списке!");
  288.  
  289.             print(TYPE_CHOICE_CONTINUE_OR_EXIT);
  290.             choice = inputNumber(1, 2);
  291.         } while (choice != 2);
  292.     }
  293.  
  294.     private static int inputNumOfRecord(String str) {
  295.         int number;
  296.         final int MIN_NUM = 1;
  297.         lookInf();
  298.         System.out.println("Введите номер записи, которую нужно " + str + ".");
  299.         number = inputNumber(MIN_NUM, listOfEmployee.length - 1);
  300.         return number - 1;
  301.     }
  302.  
  303.     private static void correctInf() {
  304.         String name;
  305.         String department;
  306.         String month;
  307.         int salary;
  308.         int choice;
  309.         int numOfRecord;
  310.         do {
  311.             numOfRecord = inputNumOfRecord("изменить");
  312.             name = inputName();
  313.             department = inputdDepartmentName();
  314.             month = inputMonth();
  315.             salary = inputSalary();
  316.  
  317.             listOfEmployee[numOfRecord] = new employee(name, department, month, salary);
  318.             System.out.println("Запись номер " + (numOfRecord + 1) + " была успешно изменена!");
  319.  
  320.             print(TYPE_CHOICE_CONTINUE_OR_EXIT);
  321.             choice = inputNumber(1, 2);
  322.  
  323.         } while (choice != 2);
  324.     }
  325.  
  326.     private static void deleteInf() {
  327.         int numberOfRecord;
  328.         int choice = 0;
  329.         int recordsCount;
  330.         do {
  331.             numberOfRecord = inputNumOfRecord("удалить");
  332.             recordsCount = listOfEmployee.length;
  333.             listOfEmployee[numberOfRecord] = null;
  334.             for (int i = numberOfRecord + 1; i < recordsCount; i++) {
  335.                 listOfEmployee[i - 1] = listOfEmployee[i];
  336.             }
  337.             listOfEmployee[recordsCount - 1] = null;
  338.             listOfEmployee = Arrays.copyOf(listOfEmployee, recordsCount - 1);
  339.             System.out.println("Запись номер " + (numberOfRecord + 1) + " была успешно удалена!");
  340.  
  341.             if (listOfEmployee.length == 1) {
  342.                 System.out.println("Список записей пуст!");
  343.             } else {
  344.                 print(TYPE_CHOICE_CONTINUE_OR_EXIT);
  345.                 choice = inputNumber(1, 2);
  346.             }
  347.         } while ((choice != 2) && (listOfEmployee.length > 1));
  348.     }
  349.  
  350.     private static void saveToFile() {
  351.         String path = enterOutputPath();
  352.         try (PrintWriter fileOut = new PrintWriter(path)) {
  353.             for (int i = 0; i < listOfEmployee.length - 1; i++)
  354.                 fileOut.println(listOfEmployee[i].name + "@" + listOfEmployee[i].department + "@" + listOfEmployee[i].month + "@" + listOfEmployee[i].salary);
  355.         } catch (Exception e) {
  356.             System.out.println("Не удалось вывести в файл!");
  357.         }
  358.         System.out.println("Данные успешно выведены в файл!");
  359.     }
  360.  
  361.     private static void lookInf() {
  362.         for (int i = 0; i < listOfEmployee.length - 1; i++) {
  363.             System.out.println("------------------------------" + "\nЗапись №" + (i + 1) + "\nФамилия сотрудника: " + listOfEmployee[i].name + "\nОтдел: " + listOfEmployee[i].department + "\nМесяц: " + listOfEmployee[i].month + "\nЗарплата: " + listOfEmployee[i].salary + " ------------------------------");
  364.         }
  365.     }
  366.  
  367.     private static void lookCompanyInfo() {   //это еще что
  368.         for (int i = 0; i < listOfEmployee.length - 1; i++) {
  369.             //System.out.println("------------------------------" + "\nЗапись №" + (i + 1) + "\nОтде: " + listOfEmployee[i].department + "\nНазвание устройства: " + listOfEmployee[i].name + "\nЦена: " + listOfEmployee[i].salary + " BYN" + "\n------------------------------");
  370.         }
  371.     }
  372.  
  373.     private static void sortList() {
  374.         int i, k, iMin, startInd, lastInd;
  375.         employee tempEmployee;
  376.         int[] monthArr = new int[12];
  377.         for (k = 0; k < listOfEmployee.length - 2; k++) {
  378.             iMin = k;
  379.             for (i = k + 1; i < listOfEmployee.length - 1; i++) {
  380.                 if (listOfEmployee[i].department.compareTo(listOfEmployee[iMin].department) < 0) {
  381.                     iMin = i;
  382.                 }
  383.             }
  384.             tempEmployee = listOfEmployee[iMin];
  385.             listOfEmployee[iMin] = listOfEmployee[k];
  386.             listOfEmployee[k] = tempEmployee;
  387.         }
  388.         startInd = 0;
  389.         lastInd = 0;
  390.         for (i = 0; i < listOfEmployee.length - 1; i++) {
  391.             if ((i + 1 > listOfEmployee.length - 2) || (listOfEmployee[i].department.compareTo(listOfEmployee[i + 1].department) != 0)) {
  392.                 lastInd = i;
  393.                 for (k = startInd; k <= lastInd; k++) {
  394.                     if (listOfEmployee[k].month.compareTo("январь") == 0) {
  395.                         monthArr[0] += listOfEmployee[k].salary;
  396.                     }
  397.                     if (listOfEmployee[k].month.compareTo("февраль") == 0) {
  398.                         monthArr[1] += listOfEmployee[k].salary;
  399.                     }
  400.                     if (listOfEmployee[k].month.compareTo("март") == 0) {
  401.                         monthArr[2] += listOfEmployee[k].salary;
  402.                     }
  403.                     if (listOfEmployee[k].month.compareTo("апрель") == 0) {
  404.                         monthArr[3] += listOfEmployee[k].salary;
  405.                     }
  406.                     if (listOfEmployee[k].month.compareTo("май") == 0) {
  407.                         monthArr[4] += listOfEmployee[k].salary;
  408.                     }
  409.                     if (listOfEmployee[k].month.compareTo("июнь") == 0) {
  410.                         monthArr[5] += listOfEmployee[k].salary;
  411.                     }
  412.                     if (listOfEmployee[k].month.compareTo("июль") == 0) {
  413.                         monthArr[6] += listOfEmployee[k].salary;
  414.                     }
  415.                     if (listOfEmployee[k].month.compareTo("август") == 0) {
  416.                         monthArr[7] += listOfEmployee[k].salary;
  417.                     }
  418.                     if (listOfEmployee[k].month.compareTo("сентябрь") == 0) {
  419.                         monthArr[8] += listOfEmployee[k].salary;
  420.                     }
  421.                     if (listOfEmployee[k].month.compareTo("октябрь") == 0) {
  422.                         monthArr[9] += listOfEmployee[k].salary;
  423.                     }
  424.                     if (listOfEmployee[k].month.compareTo("ноябрь") == 0) {
  425.                         monthArr[10] += listOfEmployee[k].salary;
  426.                     }
  427.                     if (listOfEmployee[k].month.compareTo("декабрь") == 0) {
  428.                         monthArr[11] += listOfEmployee[k].salary;
  429.                     }
  430.                 }
  431.             }
  432.             for (k = 0; k < 12; k++) {
  433.                 if (monthArr[k] != 0) {
  434.                     System.out.println("------------------------------" + "\nОтдел: " + listOfEmployee[startInd].department + "\nМесяц: " + monthNameArr[k] + "\nВыплаты: " + monthArr[k] + " ------------------------------");
  435.                 }
  436.             }
  437.             startInd = lastInd + 1;
  438.             for (k = 0; k < 12; k++){
  439.                 monthArr[k] = 0;
  440.             }
  441.         }
  442.         /*char arr[] = .toCharArray();
  443.         char temp;
  444.  
  445.         int i = 0;
  446.         while (i < arr.length) {
  447.             int j = i + 1;
  448.             while (j < arr.length) {
  449.                 if (arr[j] < arr[i]) {
  450.                     temp = arr[i];
  451.                     arr[i] = arr[j];
  452.                     arr[j] = temp;
  453.                 }
  454.                 j += 1;
  455.             }
  456.             i += 1;
  457.         }*/
  458.     }
  459.  
  460.     private static void workWithCatalog() {
  461.         final int MIN_OPTION = 0, MAX_OPTION = 7;
  462.         int num;
  463.         do {
  464.             print(TYPE_CHOICE_FUNCTION);
  465.             num = inputNumber(MIN_OPTION, MAX_OPTION);
  466.             switch (num) {
  467.                 case 1:
  468.                     enterInf();
  469.                     break;
  470.                 case 2:
  471.                     if (listOfEmployee.length > 1)
  472.                         correctInf();
  473.                     else
  474.                         System.out.println("Для выполнения данного действия необходимо либо ввести, либо импортировать данные.");
  475.                     break;
  476.                 case 3:
  477.                     if (listOfEmployee.length > 1)
  478.                         deleteInf();
  479.                     else
  480.                         System.out.println("Для выполнения данного действия необходимо либо ввести, либо импортировать данные.");
  481.                     break;
  482.                 case 4:
  483.                     if (listOfEmployee.length > 1)
  484.                         lookInf();
  485.                     else
  486.                         System.out.println("Для выполнения данного действия необходимо либо ввести, либо импортировать данные.");
  487.                     break;
  488.                 case 5:
  489.                     if (listOfEmployee.length > 1) {
  490.                         sortList();
  491.                         //lookCompanyInfo();
  492.                     } else
  493.                         System.out.println("Для выполнения данного действия необходимо либо ввести, либо импортировать данные.");
  494.                     break;
  495.                 case 6:
  496.                     takeInfoFromFile();
  497.                     break;
  498.                 case 7:
  499.                     if (listOfEmployee.length > 1) {
  500.                         saveToFile();
  501.                     } else
  502.                         System.out.println("Для выполнения данного действия необходимо либо ввести, либо импортировать данные.");
  503.                     break;
  504.             }
  505.         } while (num != 0);
  506.     }
  507.  
  508.     public static void main(String[] args) {
  509.         writeTask();
  510.         workWithCatalog();
  511.         consoleScan.close();
  512.     }
  513. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement