Advertisement
gguuppyy

лаба41

Mar 19th, 2024
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.88 KB | Source Code | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. record Workers (String name, String otdel, int a,int b,int c) {
  5.     @Override
  6.     public String toString() {
  7.         return String.format("| %-20s | %-20s | %-5d | %-5d | %-5d |",
  8.                 this.name, this.otdel, this.a, this.b, this.c);
  9.     }
  10. }
  11. record Department (String otdel, int zp, int sum, int count) {
  12.  
  13.     public Department withCount(int i) {
  14.         return new Department(this.otdel(), this.zp(), this.sum() , i);
  15.     }
  16.  
  17.     public Department withSum(int i) {
  18.         return new Department(this.otdel(), this.zp(), i, this.count());
  19.     }
  20.  
  21.     public Department withZp(int i) {
  22.         return new Department(this.otdel, i, this.sum, this.count);
  23.     }
  24. }
  25. public class Main {
  26.  
  27.     enum ErrCode {
  28.         SUCCESS,
  29.         INCORRECT_DATA,
  30.         INCORRECT_NAME,
  31.         EMPTY_LINE,
  32.         NO_SUCH_REC,
  33.         IO_EXCEPTION,
  34.         TO_MUCH_RECORDS,
  35.     }
  36.  
  37.     enum Choice {
  38.         addRec("Добавить"),
  39.         deleteRec("Удалить"),
  40.         changeRec("Изменить"),
  41.         save("Сохранить изменения"),
  42.         findByName("Найти по фамилии"),
  43.         findByOtdel("Найти по цеху"),
  44.         middRec("Получить сводку"),
  45.         close("Закрыть");
  46.  
  47.  
  48.         private final String inf;
  49.         Choice (String infLine) {
  50.             this.inf = infLine;
  51.         }
  52.         private String getInf(){return this.ordinal() + ") " + this.inf;}
  53.     }
  54.  
  55.     static final int MIN_COUNT = 0,
  56.             MAX_COUNT = 2000000000,
  57.             MIN_KOL = 0,
  58.             MAX_KOL = 200000,
  59.             MAX_REC_COUNT = 999;
  60.  
  61.     static final String[] ERRORS = {"Удача",
  62.             "Некорректные данные(введите число от %d до %d)\n",
  63.             "Имя должно быть максимум 20 символов в длину",
  64.             "Строка пустая, будьте внимательны",
  65.             "Записи с таким номером нет в списке!",
  66.             "Ошибка чтения/записи файла",
  67.             "Записей не может быть больше, чем %d\n"};
  68.     static final String STORAGE_FILE_PATH = "StorageFile.txt",
  69.             BUFFER_FILE_PATH = "BufferFile.txt",
  70.             CORRECTION_FILE_PATH = "CorrectionFile.txt",
  71.             INFORMATION_TEXT = """
  72.                        Завод.
  73.                        Инструкция:
  74.                            1) Фамилия и цех ограничены 20 символами
  75.                             2) Количество изделий может принимать значения от 0 до                 200000
  76.                             3) Чтобы внесенные изменения остались, требуется                   сохраниться
  77.                               или выйти через кнопку
  78.                4) Стоимость единицы товара: A-50, B-100, C-150
  79.                        """,
  80.             START_GRID_LINE = """
  81.            
  82.             ----------------------------------------------------------------------------
  83.             |  №  |        Фамилия       |         Цех        |   A   |   B   |   C   |
  84.             ----------------------------------------------------------------------------
  85.             """;
  86.  
  87.     static void printInf(Scanner input) {
  88.         System.out.println(INFORMATION_TEXT);
  89.         System.out.println("Нажмите enter чтобы продолжить");
  90.         input.nextLine();
  91.     }
  92.  
  93.     static DataOutputStream openFileToWrite(String fileName) throws IOException{
  94.         File file = new File(fileName);
  95.         if (!file.exists())
  96.             file.createNewFile();
  97.         return new DataOutputStream(new FileOutputStream(fileName));
  98.     }
  99.  
  100.     static DataInputStream openFileToRead(String fileName) throws IOException{
  101.         File file = new File(fileName);
  102.         if (!file.exists()) {
  103.             file.createNewFile();
  104.         }
  105.         return new DataInputStream(new FileInputStream(fileName));
  106.     }
  107.  
  108.     static Workers readRec(DataInputStream file) throws IOException{
  109.         String name,otdel;
  110.         int a,b,c;
  111.         name = file.readUTF();
  112.         otdel = file.readUTF();
  113.         a = file.readInt();
  114.         b = file.readInt();
  115.         c = file.readInt();
  116.         return new Workers(name, otdel, a, b, c);
  117.     }
  118.  
  119.     static void writeRec(DataOutputStream file, Workers workers) throws IOException{
  120.         file.writeUTF(workers.name());
  121.         file.writeUTF(workers.otdel());
  122.         file.writeInt(workers.a());
  123.         file.writeInt(workers.b());
  124.         file.writeInt(workers.c());
  125.     }
  126.  
  127.     static void renameFileTo(String oldName, String newName) {
  128.         File oldFile = new File(newName);
  129.         oldFile.delete();
  130.         File newFile = new File(oldName);
  131.         newFile.renameTo(oldFile);
  132.     }
  133.  
  134.     static void copyFile(String destFilePath, String soursFilePath) {
  135.         try(DataInputStream inputFile = openFileToRead(soursFilePath);
  136.             DataOutputStream outputFile = openFileToWrite(destFilePath)) {
  137.             while (inputFile.available() > 0)
  138.                 writeRec(outputFile, readRec(inputFile));
  139.         } catch (IOException e) {
  140.             System.err.println(ERRORS[ErrCode.IO_EXCEPTION.ordinal()]);
  141.         }
  142.     }
  143.     static void addRecToFile(String fileName, Workers workers) {
  144.         int countRec = 0;
  145.         try(DataOutputStream outputFile = openFileToWrite(BUFFER_FILE_PATH);
  146.             DataInputStream inputFile = openFileToRead(fileName)) {
  147.             while (inputFile.available() > 0) {
  148.                 writeRec(outputFile, readRec(inputFile));
  149.                 countRec++;
  150.             }
  151.             if (countRec < MAX_REC_COUNT)
  152.                 writeRec(outputFile, workers);
  153.             else
  154.                 System.err.printf(ERRORS[ErrCode.TO_MUCH_RECORDS.ordinal()],                MAX_REC_COUNT);
  155.         } catch (IOException e) {
  156.             System.err.println(ERRORS[ErrCode.IO_EXCEPTION.ordinal()]);
  157.         }
  158.         renameFileTo(BUFFER_FILE_PATH, fileName);
  159.     }
  160.  
  161.     static void printFile(String fileName) {
  162.         Workers workers;
  163.         String line;
  164.         int count = 0;
  165.         try(DataInputStream file = openFileToRead(fileName)) {
  166.             System.out.printf(START_GRID_LINE);
  167.             while (file.available() > 0) {
  168.                 count++;
  169.                 workers = readRec(file);
  170.                 line = String.format("| %-3d " + workers, count);
  171.                 System.out.printf(line + "\n");
  172.                 System.out.println("-".repeat(line.length()));
  173.  
  174.             }
  175.         } catch (IOException e) {
  176.             System.err.println(ERRORS[ErrCode.IO_EXCEPTION.ordinal()]);
  177.         }
  178.     }
  179.  
  180.     static ErrCode deleteRec(int index) {
  181.         ErrCode err = ErrCode.NO_SUCH_REC;
  182.         try (DataInputStream inputFile = openFileToRead(CORRECTION_FILE_PATH);
  183.              DataOutputStream outputFile = openFileToWrite(BUFFER_FILE_PATH)) {
  184.             for (int i = 1; inputFile.available() > 0; i++)
  185.                 if (i != index)
  186.                     writeRec(outputFile, readRec(inputFile));
  187.                 else {
  188.                     err = ErrCode.SUCCESS;
  189.                     readRec(inputFile);
  190.                 }
  191.         } catch (IOException e) {
  192.             err = ErrCode.IO_EXCEPTION;
  193.         }
  194.         renameFileTo(BUFFER_FILE_PATH, CORRECTION_FILE_PATH);
  195.         return err;
  196.     }
  197.  
  198.     static ErrCode enterOneNum(int[] numberArr, Scanner input, final int MIN, final int MAX) {
  199.         int number = 0;
  200.         ErrCode err = ErrCode.SUCCESS;
  201.         try {
  202.             number = Integer.parseInt(input.nextLine());
  203.         } catch (NumberFormatException e) {
  204.             err = ErrCode.INCORRECT_DATA;
  205.         }
  206.         if ((err == ErrCode.SUCCESS) && (number < MIN || number > MAX))
  207.             err = ErrCode.INCORRECT_DATA;
  208.         numberArr[0] = err == ErrCode.SUCCESS ? number : 0;
  209.         return err;
  210.     }
  211.  
  212.     static ErrCode enterNameConsole(String[] nameArr, Scanner input) {
  213.         ErrCode err = ErrCode.SUCCESS;
  214.         nameArr[0] = input.nextLine();
  215.         if (nameArr[0].length() > 20)
  216.             err = ErrCode.INCORRECT_NAME;
  217.         if (nameArr[0].isEmpty())
  218.             err = ErrCode.EMPTY_LINE;
  219.         return err;
  220.     }
  221.  
  222.     static String getName(Scanner input) {
  223.         String[] nameArr = {""};
  224.         ErrCode err;
  225.         do {
  226.             err = enterNameConsole(nameArr, input);
  227.             if (err != ErrCode.SUCCESS) {
  228.                 System.err.println(ERRORS[err.ordinal()]);
  229.                 System.err.println("Повторите ввод");
  230.             }
  231.         } while (err != ErrCode.SUCCESS);
  232.         return nameArr[0];
  233.     }
  234.  
  235.     static int getNumConsole(Scanner input, final int MIN, final int MAX) {
  236.         ErrCode err;
  237.         int[] numberArr = {0};
  238.         do {
  239.             err = enterOneNum(numberArr, input, MIN, MAX);
  240.             if (err != ErrCode.SUCCESS) {
  241.                 System.err.printf(ERRORS[err.ordinal()], MIN, MAX);
  242.                 System.err.println("Повторите ввод");
  243.             }
  244.         } while (err != ErrCode.SUCCESS);
  245.         return numberArr[0];
  246.     }
  247.  
  248.     static Workers enterNewWorkersFromConsole(Scanner input) {
  249.         String name;
  250.         String otdel;
  251.         int a, b, c;
  252.  
  253.         System.out.println("Введите фамилию:");
  254.         name = getName(input);
  255.  
  256.         System.out.println("Введите цех:");
  257.         otdel = getName(input);
  258.  
  259.         System.out.println("Введите кол-во изделий категории A:");
  260.         a = getNumConsole(input, MIN_KOL, MAX_KOL);
  261.  
  262.         System.out.println("Введите кол-во изделий категории B:");
  263.         b = getNumConsole(input, MIN_KOL, MAX_KOL);
  264.  
  265.         System.out.println("Введите кол-во изделий категории C:");
  266.         c = getNumConsole(input, MIN_KOL, MAX_KOL);
  267.  
  268.         return new Workers(name, otdel, a, b ,c);
  269.     }
  270.  
  271.     static ErrCode changeRec(int index, Scanner input) {
  272.         ErrCode err = ErrCode.NO_SUCH_REC;
  273.         try (DataInputStream inputFile = openFileToRead(CORRECTION_FILE_PATH);
  274.              DataOutputStream outputFile = openFileToWrite(BUFFER_FILE_PATH)) {
  275.             for (int i = 1; inputFile.available() > 0; i++)
  276.                 if (i != index)
  277.                     writeRec(outputFile, readRec(inputFile));
  278.                 else {
  279.                     err = ErrCode.SUCCESS;
  280.                     readRec(inputFile);
  281.                     writeRec(outputFile, enterNewWorkersFromConsole(input));
  282.                 }
  283.         } catch (IOException e) {
  284.             err = ErrCode.IO_EXCEPTION;
  285.         }
  286.         renameFileTo(BUFFER_FILE_PATH, CORRECTION_FILE_PATH);
  287.         return err;
  288.     }
  289.  
  290.     static void printMenu() {
  291.         Choice[] choices = Choice.values();
  292.         for (Choice choice : choices) {
  293.             System.out.println(choice.getInf());
  294.         }
  295.     }
  296.  
  297.     static Choice getChoice(Scanner input) {
  298.         int choice;
  299.         int maxChoice = Choice.values().length - 1;
  300.         choice = getNumConsole(input, 0, maxChoice);
  301.         return Choice.values()[choice];
  302.     }
  303.  
  304.     static void findRec(Choice choice, String criteria) {
  305.         Workers workers;
  306.         try (DataInputStream inputFile = openFileToRead(CORRECTION_FILE_PATH);
  307.              DataOutputStream outputFile = openFileToWrite(BUFFER_FILE_PATH)) {
  308.             while (inputFile.available() > 0) {
  309.                 workers = readRec(inputFile);
  310.                 boolean isValid = false;
  311.                 if (choice.equals(Choice.findByName)) {
  312.                     if (workers.toString().contains(criteria)) {
  313.                         isValid = true;
  314.                     }
  315.                 } else {
  316.                     if (workers.toString().contains(criteria)) {
  317.                         isValid = true;
  318.                     }
  319.                 }
  320.                 if (isValid) {
  321.                     writeRec(outputFile, workers);
  322.                 }
  323.             }
  324.         } catch (IOException e) {
  325.             System.err.println(ERRORS[ErrCode.IO_EXCEPTION.ordinal()]);
  326.         }
  327.         printFile(BUFFER_FILE_PATH);
  328.         new File(BUFFER_FILE_PATH).delete();
  329.     }
  330.  
  331.     public static void middRec() {
  332.         Workers [] workers;
  333.         int sA = 50;
  334.         int sB = 100;
  335.         int sC = 150;
  336.         try {
  337.             DataInputStream inputFile = openFileToRead(CORRECTION_FILE_PATH);
  338.             workers = readAllRec(inputFile);
  339.             inputFile.close();
  340.             int departmentCount = 0;
  341.             Department[] departments = new Department[0];
  342.  
  343.             for (int i = 0; i < workers.length; i++) {
  344.                 Workers currentWorker = workers[i];
  345.                 boolean found = false;
  346.                 for (int j = 0; j < departmentCount; j++) {
  347.                     if (currentWorker.otdel().equals(departments[j].otdel())) {
  348.                         departments[j] = departments[j].withSum(departments[j].sum()            + currentWorker.a() + currentWorker.b() +           currentWorker.c());
  349.                         departments[j] = departments[j].withZp(departments[j].zp() +                    (currentWorker.a() * sA) +                  (currentWorker.b() * sB) +                  (currentWorker.c() * sC));
  350.                         departments[j] =                                departments[j].withCount(departments[j].count() + 1);
  351.                         found = true;
  352.                     }
  353.                 }
  354.                 if (!found) {
  355.                     Department[] newDepartments = new Department[departmentCount +                                      1];
  356.                     System.arraycopy(departments, 0, newDepartments, 0,             departmentCount);
  357.                     departments = newDepartments;
  358.                     departments[departmentCount] = new                              Department(currentWorker.otdel(), (currentWorker.a() * sA) +            (currentWorker.b() * sB) + (currentWorker.c() * sC),                         currentWorker.a() + currentWorker.b() + currentWorker.c(), 1);
  359.                     departmentCount++;
  360.                 }
  361.             }
  362.  
  363.             System.out.println("Сводка:");
  364.             for (int i = 0; i < departmentCount; i++) {
  365.                 System.out.println("Цех: " + departments[i].otdel());
  366.                 System.out.println("Кол-во изделий: " + departments[i].sum());
  367.                 System.out.println("Зп: " + departments[i].zp());
  368.                 double averageSalary;
  369.                 if (departments[i].count() > 0) {
  370.                     averageSalary = (double) departments[i].zp() /          departments[i].count();
  371.                 } else {
  372.                     averageSalary = 0;
  373.                 }
  374.                 System.out.println("Средняя зп: " + averageSalary);
  375.                 System.out.println();
  376.             }
  377.         } catch (IOException e) {
  378.             e.printStackTrace();
  379.         }
  380.     }
  381.  
  382.     private static Workers[] readAllRec(DataInputStream inputFile) throws IOException {
  383.         int initialCapacity = 10;
  384.         Workers[] workersArray = new Workers[initialCapacity];
  385.         int size = 0;
  386.  
  387.         try {
  388.             while (true) {
  389.                 String name, otdel;
  390.                 int a, b, c;
  391.  
  392.                 name = inputFile.readUTF();
  393.                 otdel = inputFile.readUTF();
  394.                 a = inputFile.readInt();
  395.                 b = inputFile.readInt();
  396.                 c = inputFile.readInt();
  397.  
  398.                 Workers worker = new Workers(name, otdel, a, b, c);
  399.  
  400.                 if (size == workersArray.length) {
  401.                     int newCapacity = size * 2;
  402.                     Workers[] newArray = new Workers[newCapacity];
  403.                     System.arraycopy(workersArray, 0, newArray, 0, size);
  404.                     workersArray = newArray;
  405.                 }
  406.  
  407.                 workersArray[size] = worker;
  408.                 size++;
  409.             }
  410.         } catch (EOFException e) {
  411.         }
  412.  
  413.         Workers[] finalArray = new Workers[size];
  414.         System.arraycopy(workersArray, 0, finalArray, 0, size);
  415.         return finalArray;
  416.     }
  417.     static boolean doFunction(Scanner input) {
  418.         Choice choice = getChoice(input);
  419.         ErrCode err;
  420.         boolean isClose = false;
  421.         switch (choice) {
  422.             case addRec -> {
  423.                 Workers workers = enterNewWorkersFromConsole(input);
  424.                 addRecToFile(CORRECTION_FILE_PATH, workers);
  425.             }
  426.             case deleteRec -> {
  427.                 System.out.print("Введите номер записи, которую хотите удалить: ");
  428.                 int index = getNumConsole(input, 0, MAX_COUNT);
  429.                 err = deleteRec(index);
  430.                 if (err != ErrCode.SUCCESS) {
  431.                     System.err.println(ERRORS[err.ordinal()]);
  432.                 }
  433.             }
  434.             case changeRec -> {
  435.                 System.out.print("Введите номер записи, которую хотите изменить: ");
  436.                 int index = getNumConsole(input, 0, MAX_COUNT);
  437.                 err = changeRec(index, input);
  438.                 if (err != ErrCode.SUCCESS) {
  439.                     System.err.println(ERRORS[err.ordinal()]);
  440.                 }
  441.             }
  442.             case save -> {
  443.                 copyFile(STORAGE_FILE_PATH, CORRECTION_FILE_PATH);
  444.             }
  445.             case findByName -> {
  446.                 System.out.print("Введите фамилию , по которой хотите найти : ");
  447.                 String name = getName(input);
  448.                 findRec(choice, name);
  449.                 System.out.println("Нажмите enter чтобы продолжить");
  450.                 input.nextLine();
  451.             }
  452.             case findByOtdel -> {
  453.                 System.out.print("Введите цех , по которому хотите найти: ");
  454.                 String otdel = getName(input);
  455.                 findRec(choice, otdel);
  456.                 System.out.println("Нажмите enter чтобы продолжить");
  457.                 input.nextLine();
  458.             }
  459.             case middRec -> {
  460.                 middRec();
  461.                 System.out.println("Нажмите enter чтобы продолжить");
  462.                 input.nextLine();
  463.             }
  464.             case close -> {
  465.                 renameFileTo(CORRECTION_FILE_PATH, STORAGE_FILE_PATH);
  466.                 isClose = true;
  467.             }
  468.         }
  469.         return isClose;
  470.     }
  471.  
  472.     public static void main(String[] args) {
  473.         Scanner input = new Scanner(System.in);
  474.         printInf(input);
  475.         copyFile(CORRECTION_FILE_PATH, STORAGE_FILE_PATH);
  476.  
  477.         boolean isClose;
  478.         do {
  479.             printFile(CORRECTION_FILE_PATH);
  480.             printMenu();
  481.             isClose = doFunction(input);
  482.         } while (!isClose);
  483.         input.close();
  484.     }
  485. }
  486.  
  487.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement