Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Scanner;
- import java.io.*;
- public class Main {
- static Scanner scan = new Scanner(System.in);
- static final int MAX_PRICE = 1000;
- static final int MIN_PRICE = 1;
- static final int MAX_LENGTH = 200;
- static final int MIN_LENGTH = 1;
- public static void main(String[] args) {
- writeTask();
- int price = getMinPrice();
- outputAnswer(price);
- scan.close();
- }
- public static void writeTask() {
- System.out.println("Данная программа находит наименьшую стоимость преобразования одной строки в другую. " +
- "Стоимость операций вводится пользователем.");
- }
- public static int takeOperationPriceFromConsole() {
- int price = 0;
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- try {
- price = Integer.parseInt(scan.nextLine());
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.print("Значение введённой цены некорректно.");
- }
- if ((!isNotCorrect) && ((price > MAX_PRICE) || (price < MIN_PRICE))) {
- isNotCorrect = true;
- System.out.println("Значение введённой цены не входит в диапазон допустимых значений (от " +
- MIN_PRICE + " до " + MAX_PRICE + ").");
- }
- } while (isNotCorrect);
- return price;
- }
- public static String takeStrFromConsole() {
- String str = "";
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- try {
- str = scan.nextLine();
- } catch (Exception e) {
- isNotCorrect = true;
- System.out.println("Ошибка считывания строки.");
- }
- if ((!isNotCorrect) && ((str.length() < MIN_LENGTH) || (str.length() > MAX_LENGTH))) {
- isNotCorrect = true;
- System.out.println("Длина строки должна быть от " + MIN_LENGTH + " до " + MAX_LENGTH +".");
- }
- } while (isNotCorrect);
- return str;
- }
- public static String takePathToFile() {
- String path;
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- System.out.println("Введите путь к файлу: ");
- path = scan.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return path;
- }
- public static int chooseInputOutputMethod() {
- boolean isNotCorrect;
- int choice = 0;
- do {
- isNotCorrect = false;
- try {
- choice = Integer.parseInt(scan.nextLine());
- } catch (NumberFormatException e) {
- System.out.println("Число введено некорректно. Повторите попытку...");
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
- System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return choice;
- }
- public static int delAndInsert(String x, String y, int i, int count, int del, int ins, int price) {
- if (i < count) {
- if (!x.substring(i).equals(y.substring(i))) {
- x = x.replace(x.substring(i - 1, i), y.substring(i - 1, i));
- price += del + ins;
- }
- price = delAndInsert(x, y, (i + 1), count, del, ins, price);
- }
- if ((i == count) && (!x.substring(i).equals(y.substring(i)))) {
- x = x.replace(x.substring(i - 1), y.substring(i - 1));
- price += del + ins;
- }
- return price;
- }
- public static int changeElement(String x, String y, int i, int count, int change, int price) {
- if (i < count) {
- if (!x.substring(i).equals(y.substring(i))) {
- x = x.replace(x.substring(i - 1, i), y.substring(i - 1, i));
- price += change;
- }
- price = changeElement(x, y, (i + 1), count, change, price);
- }
- if ((i == count) && (!x.substring(i).equals(y.substring(i)))) {
- x = x.replace(x.substring(i - 1), y.substring(i - 1));
- price += change;
- }
- return price;
- }
- public static int findInterimPrice(int delete, int insert, int change, int count, String source, String desired) {
- int price = 0;
- if (delete + insert < change) {
- return delAndInsert(source, desired, 1, count, delete, insert, price);
- } else {
- return changeElement(source, desired, 1,count, change, price);
- }
- }
- public static int calculateFinalPrice(int delete, int insert, int change, String source, String desired) {
- int finalPrice = 0;
- if (source.length() == desired.length()) {
- int count = desired.length();
- finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
- } else if (source.length() < desired.length()) {
- int count = source.length();
- finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
- finalPrice += insert * (desired.length() - source.length());
- } else {
- int count = desired.length();
- finalPrice = findInterimPrice(delete, insert, change, count, source, desired);
- finalPrice += delete * (source.length() - desired.length());
- }
- return finalPrice;
- }
- public static int getMinPrice() {
- int insertCost = 0;
- int deleteCost = 0;
- int changeCost = 0;
- String sourceStr = "";
- String desiredStr = "";
- String path = "";
- boolean isNotCorrect;
- System.out.print("Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ");
- int choice = chooseInputOutputMethod();
- if (choice == 1) {
- System.out.print("Введите стоимость удаления элемента из строки: ");
- deleteCost = takeOperationPriceFromConsole();
- System.out.print("Введите стоимость вставки элемента в строку: ");
- insertCost = takeOperationPriceFromConsole();
- System.out.print("Введите стоимость замены элемента в троке: ");
- changeCost = takeOperationPriceFromConsole();
- System.out.print("Введите исходную строку: ");
- sourceStr = takeStrFromConsole();
- System.out.print("Введите желаемую строку: ");
- desiredStr = takeStrFromConsole();
- }
- else {
- path = takePathToFile();
- do {
- isNotCorrect = false;
- try (Scanner fileReader = new Scanner(new File(path))) {
- try {
- deleteCost = Integer.parseInt(fileReader.nextLine());
- insertCost = Integer.parseInt(fileReader.nextLine());
- changeCost = Integer.parseInt(fileReader.nextLine());
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.println("Одно из значений цены введено некорректно. ");
- }
- if ((!isNotCorrect) && ((deleteCost < MIN_PRICE) || (deleteCost > MAX_PRICE) || (insertCost <
- MIN_PRICE) || (insertCost > MAX_PRICE) || (changeCost < MIN_PRICE) ||
- (changeCost > MAX_PRICE))) {
- isNotCorrect = true;
- System.out.println("Одно из значений цены не входит в диапазон допустимых значений (от "
- + MIN_PRICE + " до " + MAX_PRICE + ").");
- }
- try {
- sourceStr = fileReader.nextLine();
- desiredStr = fileReader.nextLine();
- } catch (Exception e) {
- isNotCorrect = true;
- System.out.println("Ошибка при считывании одной из строк в файле.");
- }
- if ((!isNotCorrect) && ((sourceStr.length() < MIN_LENGTH) || (sourceStr.length() > MAX_LENGTH) ||
- (desiredStr.length() < MIN_LENGTH) || (desiredStr.length() > MAX_LENGTH))) {
- isNotCorrect = true;
- System.out.println("Длина одной из строк не входит в допустимы диапазон (от " +
- MIN_LENGTH + " до " + MAX_LENGTH + ").");
- }
- } catch (IOException e) {
- isNotCorrect = true;
- System.out.println("Произошла ошибка при чтении из файла.");
- }
- if (isNotCorrect) {
- System.out.print("Повторите попытку с самого начала. ");
- path = takePathToFile();
- }
- } while (isNotCorrect);
- }
- int finalPrice = 0;
- finalPrice = calculateFinalPrice(deleteCost, insertCost, changeCost, sourceStr, desiredStr);
- return finalPrice;
- }
- public static void outputFinalPriceInFile(int price) {
- System.out.print("Требуется файл для записи ответа. ");
- String path = takePathToFile();
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- try (FileWriter fileWriter = new FileWriter(new File (path))) {
- fileWriter.write("Полученная минимальная стоимость: " + price);
- } catch (IOException ex) {
- isNotCorrect = true;
- System.out.print("Произошла ошибка записи в файл. ");
- }
- if (isNotCorrect) {
- System.out.println("Повторите попытку...");
- path = takePathToFile();
- }
- } while(isNotCorrect);
- System.out.println("Ответ записан в файл!");
- }
- public static void outputAnswer(int price) {
- System.out.print("Выберите способ вывода полученной цены (1 - с помощью консоли, 2 - с помощью файлов): ");
- int choice = chooseInputOutputMethod();
- if (choice == 1) {
- System.out.print("Полученная минимальная стоимость: " + price);
- }
- else {
- outputFinalPriceInFile(price);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement