Advertisement
THOMAS_SHELBY_18

4_1 JAVA

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