Advertisement
ksyshshot

Lab_4.1

Mar 3rd, 2023
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.94 KB | Source Code | 0 0
  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. import java.io.*;
  4.  
  5. public class Main {
  6.  
  7.     static Scanner scan = new Scanner(System.in);
  8.     static final int MAX_LENGTH = 15;
  9.     static final int MIN_LENGTH = 1;
  10.     static final int MAX_FORMAT = 6;
  11.     static final int MIN_FORMAT = 1;
  12.     static final int MAX_COST_RUB = 1000;
  13.     static final int MAX_COST_COP = 99;
  14.     static final int MIN_COST = 0;
  15.     static final int MAX_OPERATION_COUNT = 5;
  16.     static final int MIN_OPERATION_COUNT = 0;
  17.  
  18.     public static void main(String[] args) {
  19.         boolean isContinue = true;
  20.         writeTask();
  21.         System.out.println("Получить записи из файла? 1 - да, 2 - нет");
  22.         int choice = chooseInputOutputMethod();
  23.         if (choice == 1) {
  24.             openFileWithRecords();
  25.         }
  26.         do {
  27.             choice = chooseOperation();
  28.             switch (choice) {
  29.                 case 1:
  30.                     addNewRecordOperation();
  31.                     break;
  32.                 case 2:
  33.                     changeRecordOperation();
  34.                     break;
  35.                 case 3:
  36.                     deleteRecordOperation();
  37.                     break;
  38.                 case 4:
  39.                     seeRecordsOperation();
  40.                     break;
  41.                 case 5:
  42.                     taskSearch();
  43.                     break;
  44.                 case 0:
  45.                     isContinue = false;
  46.                     break;
  47.             }
  48.         } while (isContinue);
  49.         System.out.println("Сохранить записи в файл? 1 - да, 2 - нет");
  50.         choice = chooseInputOutputMethod();
  51.         if (choice == 1) {
  52.             saveToFile();
  53.         }
  54.         scan.close();
  55.     }
  56.  
  57.     public static void writeTask() {
  58.         System.out.println("Данная программа позволяет работать с записями со сведениями о принтерах");
  59.         System.out.println("Список возможных функций: 1. Добавление новых записей.");
  60.         System.out.println("                          2. Коррекция записей.");
  61.         System.out.println("                          3. Удаление записи.");
  62.         System.out.println("                          4. Просмотр записей.");
  63.         System.out.println("                          5. Вывести среднюю цену и общее количество принтеров формата X.");
  64.         System.out.println("                          0. Завершение работы.");
  65.     }
  66.  
  67.     static class Printers {
  68.         String brand;
  69.         int type;
  70.         int format;
  71.         int costRub;
  72.         int costCop;
  73.  
  74.         public Printers(String brand, int type, int format, int costRub, int costCop) {
  75.             this.brand = brand;
  76.             this.type = type;
  77.             this.format = format;
  78.             this.costRub = costRub;
  79.             this.costCop = costCop;
  80.         }
  81.     }
  82.  
  83.     static Printers[] Records = new Printers[1];
  84.  
  85.     public static String takeBrandFromConsole() {
  86.         boolean isNotCorrect;
  87.         String brand = "";
  88.         do {
  89.             isNotCorrect = false;
  90.             try {
  91.                 brand = scan.nextLine();
  92.             } catch (Exception e) {
  93.                 isNotCorrect = true;
  94.                 System.out.println("Некорректно введена строка");
  95.             }
  96.             if ((brand.length() > MAX_LENGTH) || (brand.length() < MIN_LENGTH)) {
  97.                 isNotCorrect = true;
  98.                 System.out.println("Длина марки бренда должна быть от " + MIN_LENGTH + " до " + MAX_LENGTH);
  99.             }
  100.         } while (isNotCorrect);
  101.         return brand;
  102.     }
  103.  
  104.     public static int takeTypeFromConsole() {
  105.         boolean isNotCorrect;
  106.         int type = 0;
  107.         do {
  108.             isNotCorrect = false;
  109.             try {
  110.                 type = Integer.parseInt(scan.nextLine());
  111.             } catch (NumberFormatException e) {
  112.                 isNotCorrect = true;
  113.                 System.out.println("Номер вида введён некорректно");
  114.             }
  115.             if ((!isNotCorrect) && ((type != 1) && (type != 2) && (type != 3))) {
  116.                 isNotCorrect = true;
  117.                 System.out.println("Необходимо ввести либо 1, либо 2, либо 3");
  118.             }
  119.         } while (isNotCorrect);
  120.         return type;
  121.     }
  122.  
  123.     public static int takeFormatFromConsole() {
  124.         boolean isNotCorrect;
  125.         int format = 0;
  126.         do {
  127.             isNotCorrect = false;
  128.             try {
  129.                 format = Integer.parseInt(scan.nextLine());
  130.             } catch (NumberFormatException e) {
  131.                 isNotCorrect = true;
  132.                 System.out.println("Некорректно введено число");
  133.             }
  134.             if ((!isNotCorrect) && (format < MIN_FORMAT || format > MAX_FORMAT)) {
  135.                 isNotCorrect = true;
  136.                 System.out.println("Номер формата должен быть от " + MIN_FORMAT + " до " + MAX_FORMAT);
  137.             }
  138.         } while (isNotCorrect);
  139.         return format;
  140.     }
  141.  
  142.     public static int takeCostFromConsole(boolean isRub) {
  143.         int cost = 0;
  144.         boolean isNotCorrect;
  145.         do {
  146.             isNotCorrect = false;
  147.             try {
  148.                 cost = Integer.parseInt(scan.nextLine());
  149.             } catch (NumberFormatException e) {
  150.                 isNotCorrect = true;
  151.                 System.out.println("Некорректно введено значение цены");
  152.             }
  153.             if ((!isNotCorrect) && (isRub) && (cost > MAX_COST_RUB || cost < MIN_COST)) {
  154.                 isNotCorrect = true;
  155.                 System.out.println("Цена (рубли) должна быть от " + MIN_COST + " до " + MAX_COST_RUB);
  156.             }
  157.             if ((!isNotCorrect) && (!isRub) && (cost > MAX_COST_COP || cost < MIN_COST)) {
  158.                 isNotCorrect = true;
  159.                 System.out.println("Цена (копейки) должна быть от " + MIN_COST + " до " + MAX_COST_COP);
  160.             }
  161.         } while (isNotCorrect);
  162.         return cost;
  163.     }
  164.  
  165.     public static void addingNewRecord(String brand, int type, int format, int rub, int cop) {
  166.         Records[Records.length - 1] = new Printers(brand, type, format, rub, cop);
  167.         int newLength = Records.length + 1;
  168.         Records = Arrays.copyOf(Records, newLength);
  169.     }
  170.  
  171.     public static String takePathToFile() {
  172.         String path;
  173.         boolean isNotCorrect;
  174.         do {
  175.             isNotCorrect = false;
  176.             System.out.println("Введите путь к файлу: ");
  177.             path = scan.nextLine();
  178.             File file = new File(path);
  179.             if (!file.exists()) {
  180.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  181.                 isNotCorrect = true;
  182.             }
  183.         } while (isNotCorrect);
  184.         return path;
  185.     }
  186.  
  187.     public static int chooseInputOutputMethod() {
  188.         boolean isNotCorrect;
  189.         int choice = 0;
  190.         do {
  191.             isNotCorrect = false;
  192.             try {
  193.                 choice = Integer.parseInt(scan.nextLine());
  194.             } catch (NumberFormatException e) {
  195.                 System.out.println("Число введено некорректно. Повторите попытку...");
  196.                 isNotCorrect = true;
  197.             }
  198.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  199.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  200.                 isNotCorrect = true;
  201.             }
  202.         } while (isNotCorrect);
  203.         return choice;
  204.     }
  205.  
  206.     public static int chooseOperation() {
  207.         int choice = 0;
  208.         boolean isNotCorrect;
  209.         do {
  210.             System.out.println("Введите номер операции, которую необходимо выполнить.");
  211.             isNotCorrect = false;
  212.             try {
  213.                 choice = Integer.parseInt(scan.nextLine());
  214.             } catch (NumberFormatException e) {
  215.                 isNotCorrect = true;
  216.                 System.out.println("Некорректно введён номер операции. Повторите попытку.");
  217.             }
  218.             if ((!isNotCorrect) && (choice > MAX_OPERATION_COUNT || choice < MIN_OPERATION_COUNT)) {
  219.                 isNotCorrect = true;
  220.                 System.out.println("Введён неправильный номер операции. Он должен быть от " + MIN_OPERATION_COUNT + " до " + MAX_OPERATION_COUNT + ". Повторите попытку.");
  221.             }
  222.         } while (isNotCorrect);
  223.         return choice;
  224.     }
  225.  
  226.     public static int chooseNumberOfRecord() {
  227.         int choice = 0;
  228.         boolean isNotCorrect;
  229.         do {
  230.             isNotCorrect = false;
  231.             try {
  232.                 choice = Integer.parseInt(scan.nextLine());
  233.             } catch (NumberFormatException e) {
  234.                 isNotCorrect = true;
  235.                 System.out.println("Некорректно введён номер записи. Повторите попытку.");
  236.             }
  237.             if ((!isNotCorrect) && (choice < 1 || choice > Records.length)) {
  238.                 isNotCorrect = true;
  239.                 System.out.println("Записи с таким номером не существует! Повторите попытку.");
  240.             }
  241.         } while (isNotCorrect);
  242.         choice -= 1;
  243.         return choice;
  244.     }
  245.  
  246.     public static void addRecordFromConsole() {
  247.         String brand;
  248.         int type;
  249.         int rub, cop, format, choice;
  250.         boolean isRub = true;
  251.         do {
  252.             System.out.println("Введите название марки принтера.");
  253.             brand = takeBrandFromConsole();
  254.             System.out.println("Введите тип принтера: 1 - матричный, 2 - струйный, 3 - лазерный.");
  255.             type = takeTypeFromConsole();
  256.             System.out.println("Введите номер формата печати принтера (значение от " + MIN_FORMAT + " до " + MAX_FORMAT + ").");
  257.             format = takeFormatFromConsole();
  258.             System.out.println("Введите цену (рубли) принтера.");
  259.             rub = takeCostFromConsole(isRub);
  260.             System.out.println("Введите цену (копейки) принтера.");
  261.             cop = takeCostFromConsole(!isRub);
  262.             addingNewRecord(brand, type, format, rub, cop);
  263.             System.out.println("Хотите ли вы добавить ещё одну запись? 1 - да, 2 - нет");
  264.             choice = chooseInputOutputMethod();
  265.         } while (choice != 2);
  266.     }
  267.  
  268.     public static Printers addRecordFromFile() {
  269.         String path = takePathToFile();
  270.         boolean isNotCorrect;
  271.         String brand = "";
  272.         int typeNumber = 0;
  273.         int rub = 0, cop = 0, format = 0;
  274.         do {
  275.             isNotCorrect = false;
  276.             try (Scanner fileReader = new Scanner(new File(path))) {
  277.                 try {
  278.                     brand = fileReader.nextLine();
  279.                     typeNumber = Integer.parseInt(fileReader.nextLine());
  280.                     format = Integer.parseInt(fileReader.nextLine());
  281.                     rub = Integer.parseInt(fileReader.nextLine());
  282.                     cop = Integer.parseInt(fileReader.nextLine());
  283.                 } catch (NumberFormatException e) {
  284.                     isNotCorrect = true;
  285.                     System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
  286.                 }
  287.                 if ((brand.length() > MAX_LENGTH) || (brand.length() < MIN_LENGTH)) {
  288.                     isNotCorrect = true;
  289.                     System.out.println("Длина марки бренда должна быть от " + MIN_LENGTH + " до " + MAX_LENGTH);
  290.                 }
  291.                 if ((!isNotCorrect) && ((typeNumber != 1) && (typeNumber != 2) && (typeNumber != 3))) {
  292.                     isNotCorrect = true;
  293.                     System.out.println("Необходимо ввести для типа принтера либо 1, либо 2, либо 3");
  294.                 }
  295.                 if ((!isNotCorrect) && (format < MIN_FORMAT || format > MAX_FORMAT)) {
  296.                     isNotCorrect = true;
  297.                     System.out.println("Номер формата должен быть от " + MIN_FORMAT + " до " + MAX_FORMAT);
  298.                 }
  299.                 if ((!isNotCorrect) && (rub > MAX_COST_RUB || rub < MIN_COST)) {
  300.                     isNotCorrect = true;
  301.                     System.out.println("Цена (рубли) должна быть от " + MIN_COST + " до " + MAX_COST_RUB);
  302.                 }
  303.                 if ((!isNotCorrect) && (cop > MAX_COST_COP || cop < MIN_COST)) {
  304.                     isNotCorrect = true;
  305.                     System.out.println("Цена (копейки) должна быть от " + MIN_COST + " до " + MAX_COST_COP);
  306.                 }
  307.             } catch (IOException e) {
  308.                 isNotCorrect = true;
  309.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  310.                 path = takePathToFile();
  311.             }
  312.         } while (isNotCorrect);
  313.         Printers print = new Printers(brand, typeNumber, format, rub, cop);
  314.         System.out.println("Запись из файла записана");
  315.         return print;
  316.     }
  317.  
  318.     public static void addNewRecordOperation() {
  319.         System.out.println("Выберите способ получения новой записи (1 - консоль, 2 - файл): ");
  320.         int choice = chooseInputOutputMethod();
  321.         if (choice == 1) {
  322.             addRecordFromConsole();
  323.         } else {
  324.             Printers print = addRecordFromFile();
  325.             addingNewRecord(print.brand, print.type, print.format, print.costRub, print.costCop);
  326.         }
  327.     }
  328.  
  329.     public static void changeRecordFromConsole(int number) {
  330.         String brand;
  331.         int type;
  332.         int rub, cop, format;
  333.         boolean isRub = true;
  334.         System.out.println("Введите название марки принтера.");
  335.         brand = takeBrandFromConsole();
  336.         System.out.println("Введите тип принтера: 1 - матричный, 2 - струйный, 3 - лазерный.");
  337.         type = takeTypeFromConsole();
  338.         System.out.println("Введите номер формата печати принтера (значение от " + MIN_FORMAT + " до " + MAX_FORMAT + ").");
  339.         format = takeFormatFromConsole();
  340.         System.out.println("Введите цену (рубли) принтера.");
  341.         rub = takeCostFromConsole(isRub);
  342.         System.out.println("Введите цену (копейки) принтера.");
  343.         cop = takeCostFromConsole(!isRub);
  344.         Records[number] = new Printers(brand, type, format, rub, cop);
  345.     }
  346.  
  347.     public static void changeRecordOperation() {
  348.         if (Records.length > 1) {
  349.             System.out.println("Введите номер записи, которую желаете отредактировать.");
  350.             int number = chooseNumberOfRecord();
  351.             System.out.println("Выберите способ получения новой записи (1 - консоль, 2 - файл): ");
  352.             int choice = chooseInputOutputMethod();
  353.             if (choice == 1) {
  354.                 changeRecordFromConsole(number);
  355.             } else {
  356.                 Printers print = addRecordFromFile();
  357.                 Records[number] = print;
  358.             }
  359.         } else {
  360.             System.out.println("На данный момент не существует записей, чтобы их редактировать.");
  361.         }
  362.     }
  363.  
  364.     public static int numberForDeleteFromFile() {
  365.         int number = 0;
  366.         String path = takePathToFile();
  367.         boolean isNotCorrect;
  368.         do {
  369.             isNotCorrect = false;
  370.             try (Scanner fileReader = new Scanner(new File(path))) {
  371.                 try {
  372.                     number = Integer.parseInt(fileReader.nextLine());
  373.                 } catch (NumberFormatException e) {
  374.                     isNotCorrect = true;
  375.                     System.out.println("Некорректно введён номер записи. Повторите попытку.");
  376.                 }
  377.                 if ((!isNotCorrect) && (number < 1 || number > Records.length)) {
  378.                     isNotCorrect = true;
  379.                     System.out.println("Записи с таким номером не существует! Повторите попытку.");
  380.                 }
  381.             } catch (IOException e) {
  382.                 isNotCorrect = true;
  383.                 System.out.println("Ошибка считывания с файла. Попробуйте ещё раз.");
  384.                 path = takePathToFile();
  385.             }
  386.         } while (isNotCorrect);
  387.         number -= 1;
  388.         return number;
  389.     }
  390.  
  391.     public static void deletingRecord(int number) {
  392.         Records[number] = null;
  393.         for (int i = 1; i < Records.length; i++) {
  394.             Records[i - 1] = Records[i];
  395.             Records[i] = null;
  396.         }
  397.             int newLength = Records.length - 1;
  398.             Records = Arrays.copyOf(Records, newLength);
  399.     }
  400.  
  401.     public static void deleteRecordOperation() {
  402.         if (Records.length > 1) {
  403.             int number;
  404.             System.out.println("Выберите способ получения номера удаляемой записи (1 - консоль, 2 - файл): ");
  405.             int choice = chooseInputOutputMethod();
  406.             if (choice == 1) {
  407.                 System.out.println("Введите номер записи, которую желаете удалить.");
  408.                 number = chooseNumberOfRecord();
  409.             } else {
  410.                 number = numberForDeleteFromFile();
  411.             }
  412.             deletingRecord(number);
  413.         } else {
  414.             System.out.println("На данный момент не существует записей, чтобы их удалять.");
  415.         }
  416.     }
  417.  
  418.     public static void seeRecordsOperation() {
  419.         String type = "";
  420.         if (Records.length > 1) {
  421.             for (int i = 0; i < (Records.length - 1); i++) {
  422.                 System.out.println("Запись №" + (i + 1));
  423.                 System.out.println("Марка принтера: " + Records[i].brand);
  424.                 switch (Records[i].type) {
  425.                     case 1:
  426.                         type = "Матричный";
  427.                         break;
  428.                     case 2:
  429.                         type = "Струйный";
  430.                         break;
  431.                     case 3:
  432.                         type = "Лазерный";
  433.                         break;
  434.                 }
  435.                 System.out.println("Тип принтера: " + type);
  436.                 System.out.println("Формат печати: A" + Records[i].format);
  437.                 System.out.println("Цена: " + Records[i].costRub + " руб. " + Records[i].costCop + "коп.");
  438.             }
  439.         } else {
  440.             System.out.println("Введено недостаточно записей для просмотра.");
  441.         }
  442.     }
  443.  
  444.     public static double takeAveragePrice(int count, int rub, int cop) {
  445.         int allRub = rub + (cop / 100);
  446.         double newCop = cop & 100;
  447.         double allPrice = (newCop / 100) + allRub ;
  448.         return (allPrice / count);
  449.     }
  450.  
  451.     public static void taskSearch() {
  452.         int count = 0;
  453.         int rub = 0;
  454.         int cop = 0;
  455.         if (Records.length > 1) {
  456.             System.out.println("Введите искомый формат: ");
  457.             int searchedFormat = takeFormatFromConsole();
  458.             for (int i = 0; i < (Records.length - 1); i++) {
  459.                 if ((Records[i].type == 1) && (Records[i].format == searchedFormat)) {
  460.                     count++;
  461.                     rub += Records[i].costRub;
  462.                     cop += Records[i].costCop;
  463.                 }
  464.             }
  465.             if (count > 0) {
  466.                 double averagePrice = takeAveragePrice(count, rub, cop);
  467.                 System.out.println("Общее количество матричных принтеров с заданным форматом печати: " + count);
  468.                 System.out.println("Средняя цена на них: " + averagePrice);
  469.             }
  470.         } else {
  471.             System.out.println("Введено недостаточно записей для выполения задания.");
  472.         }
  473.     }
  474.  
  475.     public static void saveToFile() {
  476.         boolean isNotCorrect;
  477.         String path = takePathToFile();
  478.         do {
  479.             isNotCorrect = false;
  480.             try (PrintWriter fileWriter = new PrintWriter(path)) {
  481.                 for (int i = 0; i < (Records.length - 1); i++) {
  482.                     fileWriter.println(Records[i].brand + " " + Records[i].type + " " + Records[i].format + " " + Records[i].costRub + " " + Records[i].costCop);
  483.                 }
  484.                 fileWriter.println();
  485.             } catch (IOException e) {
  486.                 isNotCorrect = true;
  487.                 System.out.println("Не удалось вывести в файл.");
  488.                 path = takePathToFile();
  489.             }
  490.         } while (isNotCorrect);
  491.     }
  492.  
  493.     public static void openFileWithRecords() {
  494.         boolean isNotCorrect;
  495.         String path = takePathToFile();
  496.         String endFile = " ";
  497.         String brand;
  498.         int type;
  499.         int format;
  500.         int costRub;
  501.         int costCop;
  502.         do {
  503.             isNotCorrect = false;
  504.             try (Scanner fileReader = new Scanner(new File(path))) {
  505.                 try {
  506.                     while ((!endFile.equals(""))) {
  507.                         endFile = fileReader.nextLine();
  508.                         if (!endFile.equals("")) {
  509.                             String[] print = endFile.split(" ");
  510.                             brand = print[0];
  511.                             type = Integer.parseInt(print[1]);
  512.                             format = Integer.parseInt(print[2]);
  513.                             costRub = Integer.parseInt(print[3]);
  514.                             costCop = Integer.parseInt(print[4]);
  515.                             if ((!isNotCorrect) && ((brand.length() > MAX_LENGTH) || (brand.length() < MIN_LENGTH))) {
  516.                                 isNotCorrect = true;
  517.                                 System.out.println("Длина марки бренда должна быть от " + MIN_LENGTH + " до " + MAX_LENGTH);
  518.                             }
  519.                             if ((!isNotCorrect) && ((type != 1) && (type != 2) && (type != 3))) {
  520.                                 isNotCorrect = true;
  521.                                 System.out.println("Необходимо ввести для типа принтера либо 1, либо 2, либо 3");
  522.                             }
  523.                             if ((!isNotCorrect) && (format < MIN_FORMAT || format > MAX_FORMAT)) {
  524.                                 isNotCorrect = true;
  525.                                 System.out.println("Номер формата должен быть от " + MIN_FORMAT + " до " + MAX_FORMAT);
  526.                             }
  527.                             if ((!isNotCorrect) && (costRub > MAX_COST_RUB || costRub < MIN_COST)) {
  528.                                 isNotCorrect = true;
  529.                                 System.out.println("Цена (рубли) должна быть от " + MIN_COST + " до " + MAX_COST_RUB);
  530.                             }
  531.                             if ((!isNotCorrect) && (costCop > MAX_COST_COP || costCop < MIN_COST)) {
  532.                                 isNotCorrect = true;
  533.                                 System.out.println("Цена (копейки) должна быть от " + MIN_COST + " до " + MAX_COST_COP);
  534.                             }
  535.                             addingNewRecord(brand, type, format, costRub, costCop);
  536.                         }
  537.                     }
  538.                 } catch (Exception e) {
  539.                     isNotCorrect = true;
  540.                     System.out.println("Обнаружены некорректные данные в файле. Выберите дальнейшее действие.");
  541.                     System.out.println("1 - ввести путь заново, 2 - продолжить без получения исходных данных из файла.");
  542.                     int choice = chooseInputOutputMethod();
  543.                     if (choice == 1) {
  544.                         path = takePathToFile();
  545.                     } else {
  546.                         isNotCorrect = false;
  547.                     }
  548.                 }
  549.             } catch (IOException e) {
  550.                 isNotCorrect = true;
  551.                 System.out.println("Ошибка считывания с файла. Выберите дальнейшее действие.");
  552.                 System.out.println("1 - ввести путь заново, 2 - продолжить без получения исходных данных из файла.");
  553.                 int choice = chooseInputOutputMethod();
  554.                 if (choice == 1) {
  555.                     path = takePathToFile();
  556.                 } else {
  557.                     isNotCorrect = false;
  558.                 }
  559.             }
  560.         } while (isNotCorrect);
  561.     }
  562. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement