Advertisement
ksyshshot

Lab.4.2

Mar 3rd, 2023
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.53 KB | Source Code | 0 0
  1. import java.util.Scanner;
  2. import java.io.*;
  3.  
  4. public class Main {
  5.  
  6.     static Scanner scan = new Scanner(System.in);
  7.     static final int MAX_PRICE = 1000;
  8.     static final int MIN_PRICE = 1;
  9.     static final int MAX_LENGTH = 200;
  10.     static final int MIN_LENGTH = 1;
  11.  
  12.  
  13.     public static void main(String[] args) {
  14.         writeTask();
  15.         int price = getMinPrice();
  16.         outputAnswer(price);
  17.         scan.close();
  18.     }
  19.  
  20.     public static void writeTask() {
  21.         System.out.println("Данная программа находит наименьшую стоимость преобразования одной строки в другую. " +
  22.                 "Стоимость операций вводится пользователем.");
  23.     }
  24.  
  25.     public static int takeOperationPriceFromConsole() {
  26.         int price = 0;
  27.         boolean isNotCorrect;
  28.         do {
  29.             isNotCorrect = false;
  30.             try {
  31.                 price = Integer.parseInt(scan.nextLine());
  32.             } catch (NumberFormatException e) {
  33.                 isNotCorrect = true;
  34.                 System.out.print("Значение введённой цены некорректно.");
  35.             }
  36.             if ((!isNotCorrect) && ((price > MAX_PRICE) || (price < MIN_PRICE))) {
  37.                 isNotCorrect = true;
  38.                 System.out.println("Значение введённой цены не входит в диапазон допустимых значений (от " +
  39.                         MIN_PRICE + " до " + MAX_PRICE + ").");
  40.             }
  41.         } while (isNotCorrect);
  42.         return price;
  43.     }
  44.  
  45.     public static String takeStrFromConsole() {
  46.         String str = "";
  47.         boolean isNotCorrect;
  48.         do {
  49.             isNotCorrect = false;
  50.             try {
  51.                 str = scan.nextLine();
  52.             } catch (Exception e) {
  53.                 isNotCorrect = true;
  54.                 System.out.println("Ошибка считывания строки.");
  55.             }
  56.             if ((!isNotCorrect) && ((str.length() < MIN_LENGTH) || (str.length() > MAX_LENGTH))) {
  57.                 isNotCorrect = true;
  58.                 System.out.println("Длина строки должна быть от " + MIN_LENGTH + " до " + MAX_LENGTH +".");
  59.             }
  60.         } while (isNotCorrect);
  61.         return str;
  62.     }
  63.  
  64.     public static String takePathToFile() {
  65.         String path;
  66.         boolean isNotCorrect;
  67.         do {
  68.             isNotCorrect = false;
  69.             System.out.println("Введите путь к файлу: ");
  70.             path = scan.nextLine();
  71.             File file = new File(path);
  72.             if (!file.exists()) {
  73.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  74.                 isNotCorrect = true;
  75.             }
  76.         } while (isNotCorrect);
  77.         return path;
  78.     }
  79.  
  80.     public static int chooseInputOutputMethod() {
  81.         boolean isNotCorrect;
  82.         int choice = 0;
  83.         do {
  84.             isNotCorrect = false;
  85.             try {
  86.                 choice = Integer.parseInt(scan.nextLine());
  87.             } catch (NumberFormatException e) {
  88.                 System.out.println("Число введено некорректно. Повторите попытку...");
  89.                 isNotCorrect = true;
  90.             }
  91.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  92.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  93.                 isNotCorrect = true;
  94.             }
  95.         } while (isNotCorrect);
  96.         return choice;
  97.     }
  98.  
  99.     public static int delAndInsert(String x, String y, int i, int count, int del, int ins, int price) {
  100.         if (i < count) {
  101.             if (!x.substring(i).equals(y.substring(i))) {
  102.                 x = x.replace(x.substring(i - 1, i), y.substring(i - 1, i));
  103.                 price += del + ins;
  104.             }
  105.             price = delAndInsert(x, y, (i + 1), count, del, ins, price);
  106.         }
  107.         if ((i == count) && (!x.substring(i).equals(y.substring(i)))) {
  108.             x = x.replace(x.substring(i - 1), y.substring(i - 1));
  109.             price += del + ins;
  110.         }
  111.         return price;
  112.     }
  113.  
  114.     public static int changeElement(String x, String y, int i, int count, int change, int price) {
  115.         if (i < count) {
  116.             if (!x.substring(i).equals(y.substring(i))) {
  117.                 x = x.replace(x.substring(i - 1, i), y.substring(i - 1, i));
  118.                 price += change;
  119.             }
  120.             price = changeElement(x, y, (i + 1), count, change, price);
  121.         }
  122.         if ((i == count) && (!x.substring(i).equals(y.substring(i)))) {
  123.             x = x.replace(x.substring(i - 1), y.substring(i - 1));
  124.             price += change;
  125.         }
  126.         return price;
  127.     }
  128.  
  129.     public static int findInterimPrice(int delete, int insert, int change, int count, String source, String desired) {
  130.         int price = 0;
  131.         if (delete + insert < change) {
  132.             return delAndInsert(source, desired, 1, count, delete, insert, price);
  133.         } else {
  134.             return changeElement(source, desired, 1,count, change, price);
  135.         }
  136.     }
  137.  
  138.     public static int calculateFinalPrice(int delete, int insert, int change, String source, String desired) {
  139.         int finalPrice = 0;
  140.         if (source.length() == desired.length()) {
  141.             int count = desired.length();
  142.             finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
  143.         } else if (source.length() < desired.length()) {
  144.             int count = source.length();
  145.             finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
  146.             finalPrice += insert * (desired.length() - source.length());
  147.         } else {
  148.             int count = desired.length();
  149.             finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
  150.             finalPrice += delete * (source.length() - desired.length());
  151.         }
  152.         return finalPrice;
  153.     }
  154.  
  155.     public static int getMinPrice() {
  156.         int insertCost = 0;
  157.         int deleteCost = 0;
  158.         int changeCost = 0;
  159.         String sourceStr = "";
  160.         String desiredStr = "";
  161.         String path = "";
  162.         boolean isNotCorrect;
  163.         System.out.print("Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ");
  164.         int choice = chooseInputOutputMethod();
  165.         if (choice == 1) {
  166.             System.out.print("Введите стоимость удаления элемента из строки: ");
  167.             deleteCost = takeOperationPriceFromConsole();
  168.             System.out.print("Введите стоимость вставки элемента в строку: ");
  169.             insertCost = takeOperationPriceFromConsole();
  170.             System.out.print("Введите стоимость замены элемента в троке: ");
  171.             changeCost = takeOperationPriceFromConsole();
  172.             System.out.print("Введите исходную строку: ");
  173.             sourceStr = takeStrFromConsole();
  174.             System.out.print("Введите желаемую строку: ");
  175.             desiredStr = takeStrFromConsole();
  176.         }
  177.         else {
  178.             path = takePathToFile();
  179.             do {
  180.                 isNotCorrect = false;
  181.                 try (Scanner fileReader = new Scanner(new File(path))) {
  182.                     try {
  183.                         deleteCost = Integer.parseInt(fileReader.nextLine());
  184.                         insertCost = Integer.parseInt(fileReader.nextLine());
  185.                         changeCost = Integer.parseInt(fileReader.nextLine());
  186.                     } catch (NumberFormatException e) {
  187.                         isNotCorrect = true;
  188.                         System.out.println("Одно из значений цены введено некорректно. ");
  189.                     }
  190.                     if ((!isNotCorrect) && ((deleteCost < MIN_PRICE) || (deleteCost > MAX_PRICE) || (insertCost <
  191.                             MIN_PRICE) || (insertCost > MAX_PRICE) || (changeCost < MIN_PRICE) ||
  192.                             (changeCost > MAX_PRICE))) {
  193.                         isNotCorrect = true;
  194.                         System.out.println("Одно из значений цены не входит в диапазон допустимых значений (от "
  195.                         + MIN_PRICE + " до " + MAX_PRICE + ").");
  196.                     }
  197.                     try {
  198.                         sourceStr = fileReader.nextLine();
  199.                         desiredStr = fileReader.nextLine();
  200.                     } catch (Exception e) {
  201.                         isNotCorrect = true;
  202.                         System.out.println("Ошибка при считывании одной из строк в файле.");
  203.                     }
  204.                     if ((!isNotCorrect) && ((sourceStr.length() < MIN_LENGTH) || (sourceStr.length() > MAX_LENGTH) ||
  205.                             (desiredStr.length() < MIN_LENGTH) || (desiredStr.length() > MAX_LENGTH))) {
  206.                         isNotCorrect = true;
  207.                         System.out.println("Длина одной из строк не входит в допустимы диапазон (от " +
  208.                                 MIN_LENGTH + " до " + MAX_LENGTH + ").");
  209.                     }
  210.                 } catch (IOException e) {
  211.                     isNotCorrect = true;
  212.                     System.out.println("Произошла ошибка при чтении из файла.");
  213.                 }
  214.                 if (isNotCorrect) {
  215.                     System.out.print("Повторите попытку с самого начала. ");
  216.                     path = takePathToFile();
  217.                 }
  218.             } while (isNotCorrect);
  219.         }
  220.         int finalPrice = 0;
  221.         finalPrice = calculateFinalPrice(deleteCost, insertCost, changeCost, sourceStr, desiredStr);
  222.         return finalPrice;
  223.     }
  224.  
  225.     public static void outputFinalPriceInFile(int price) {
  226.         System.out.print("Требуется файл для записи ответа. ");
  227.         String path = takePathToFile();
  228.         boolean isNotCorrect;
  229.         do {
  230.             isNotCorrect = false;
  231.             try (FileWriter fileWriter = new FileWriter(new File (path))) {
  232.                 fileWriter.write("Полученная минимальная стоимость: " + price);
  233.             } catch (IOException ex) {
  234.                 isNotCorrect = true;
  235.                 System.out.print("Произошла ошибка записи в файл. ");
  236.             }
  237.             if (isNotCorrect) {
  238.                 System.out.println("Повторите попытку...");
  239.                 path = takePathToFile();
  240.             }
  241.         } while(isNotCorrect);
  242.         System.out.println("Ответ записан в файл!");
  243.     }
  244.  
  245.     public static void outputAnswer(int price) {
  246.         System.out.print("Выберите способ вывода полученной цены (1 - с помощью консоли, 2 - с помощью файлов): ");
  247.         int choice = chooseInputOutputMethod();
  248.         if (choice == 1) {
  249.             System.out.print("Полученная минимальная стоимость: " + price);
  250.         }
  251.         else {
  252.             outputFinalPriceInFile(price);
  253.         }
  254.     }
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement