Advertisement
Vernon_Roche

Задание 3 Java (Лабораторная работа 3)

Nov 21st, 2023
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.20 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.util.Scanner;
  6. import java.io.FileReader;
  7.  
  8. public class Lab3 {
  9.     final static int INPUT = 1,
  10.                      OUTPUT = 2,
  11.                      MIN_QUANTITY = 1,
  12.                      MAX_QUANTITY = 100000,
  13.                      FILE_CHOICE = 1,
  14.                      CONSOLE_CHOICE = 2;
  15.  
  16.     public static void main(String[] args) {
  17.         double[] sortableArr;
  18.         int choice;
  19.         Scanner scan = new Scanner(System.in);
  20.         System.out.println("Программа сортирует массив методом простых вставок.");
  21.         choice = chooseFileOrConsole(INPUT, scan);
  22.         sortableArr = inputArr(choice, scan);
  23.         sortableArr = sortArr(sortableArr);
  24.         choice = chooseFileOrConsole(OUTPUT, scan);
  25.         outputArr(sortableArr, choice, scan);
  26.         scan.close();
  27.     }
  28.  
  29.     public static double[] sortArr(double[] sortableArr) {
  30.         System.out.println("Исходный массив:");
  31.         outputInConsole(sortableArr);
  32.         System.out.println();
  33.         int position;
  34.         double checkNum;
  35.         for (int checkPosition = sortableArr.length - 2; checkPosition > -1; checkPosition--) {
  36.             position = sortableArr.length - 1;
  37.             while ((position > checkPosition) && (sortableArr[position] >= sortableArr[checkPosition]))
  38.                 position--;
  39.             checkNum = sortableArr[checkPosition];
  40.             for (int moveNumPosition = checkPosition; moveNumPosition < position; moveNumPosition++)
  41.                 sortableArr[moveNumPosition] = sortableArr[moveNumPosition + 1];
  42.             sortableArr[position] = checkNum;
  43.             System.out.print("Массив на " + (sortableArr.length - checkPosition - 1) + "-м шаге сортировки:");
  44.             outputInConsole(sortableArr);
  45.             System.out.println();
  46.         }
  47.         return sortableArr;
  48.     }
  49.  
  50.     public static void outputInConsole(double[] sortedArr) {
  51.         for (int i = 0; i < sortedArr.length; i++)
  52.             System.out.print(sortedArr[i] + " ");
  53.     }
  54.  
  55.     public static double[] inputArr(int choice, Scanner scan) {
  56.         double[] inputArr = new double[0];
  57.         switch (choice) {
  58.             case FILE_CHOICE: {
  59.                 String fileName;
  60.                 boolean isCorrect;
  61.                 do {
  62.                     fileName = inputInFileName(scan);
  63.                     isCorrect = checkFile(fileName);
  64.                 } while (!isCorrect);
  65.                 inputArr = inputFromFile(fileName);
  66.                 break;
  67.             }
  68.             case CONSOLE_CHOICE:
  69.                 inputArr = inputFromConsole(scan);
  70.                 break;
  71.         }
  72.         return inputArr;
  73.     }
  74.  
  75.     public static String inputInFileName(Scanner scan) {
  76.         String fileName;
  77.         System.out.println("Введите имя файла, из которого будут вводиться данные:");
  78.         do {
  79.             fileName = scan.nextLine();
  80.             if (fileName.endsWith(".txt")) {
  81.                 File file = new File(fileName);
  82.                 if (file.exists())
  83.                     if (file.canRead())
  84.                         return fileName;
  85.                     else
  86.                         System.out.println("Невозможно открыть для чтения файл с таким именем! Повторите ввод имени файла:");
  87.                 else
  88.                     System.out.println("Файл с таким именем не существует! Повторите ввод имени файла:");
  89.             }
  90.             else
  91.                 System.out.println("Файл должен иметь расширение .txt! Повторите ввод имени файла:");
  92.         } while (true);
  93.     }
  94.  
  95.     public static boolean checkFile(String fileName) {
  96.         boolean isCorrect;
  97.         int arrLength, i;
  98.         double arrNumber;
  99.         isCorrect = true;
  100.         arrLength = 0;
  101.         FileReader reader = null;
  102.         try {
  103.             reader = new FileReader(fileName);
  104.         } catch (FileNotFoundException err) {
  105.             System.out.println("Невозможно прочитать данные из файла! Повторите ввод его имени.");
  106.             isCorrect = false;
  107.         }
  108.         Scanner scanFile = new Scanner(reader);
  109.         if (isCorrect && scanFile.hasNext()) {
  110.             try {
  111.                 arrLength = Integer.parseInt(scanFile.next());
  112.             } catch (NumberFormatException err) {
  113.                 System.out.println("В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.");
  114.                 isCorrect = false;
  115.             }
  116.             if (isCorrect && ((arrLength < MIN_QUANTITY) || (arrLength > MAX_QUANTITY))) {
  117.                 System.out.println("В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.");
  118.                 isCorrect = false;
  119.             }
  120.             else {
  121.                 i = 0;
  122.                 while (isCorrect && (i < arrLength)) {
  123.                     try {
  124.                         arrNumber = Double.parseDouble(scanFile.next());
  125.                     } catch (NumberFormatException err) {
  126.                         System.out.println("В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.");
  127.                         isCorrect = false;
  128.                     }
  129.                     i++;
  130.                 }
  131.                 if (scanFile.hasNext()) {
  132.                     System.out.println("В файле содержатся лишние данные! Измените содержание файла и повторите ввод его имени.");
  133.                     isCorrect = false;
  134.                 }
  135.             }
  136.         }
  137.         else {
  138.             System.out.println("В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.");
  139.             isCorrect = false;
  140.         }
  141.         scanFile.close();
  142.         try {
  143.             reader.close();
  144.         } catch (IOException err) {
  145.             System.out.println("Невозможно закрыть файл! Повторите ввод его имени.");
  146.             isCorrect = false;
  147.         }
  148.         return isCorrect;
  149.     }
  150.  
  151.     public static void outputArr(double[] sortedArr, int choice, Scanner scan) {
  152.         switch (choice) {
  153.             case 1: {
  154.                 String fileName;
  155.                 boolean isCorrect;
  156.                 do {
  157.                     fileName = inputOutFileName(scan);
  158.                     isCorrect = outputInFile(fileName, sortedArr);
  159.                 } while (!isCorrect);
  160.                 System.out.print("Искомые данные выведены в файл ");
  161.                 System.out.println(fileName);
  162.                 break;
  163.             }
  164.             default:
  165.                 System.out.println("Отсортированный массив:");
  166.                 outputInConsole(sortedArr);
  167.         }
  168.     }
  169.  
  170.     private static String inputOutFileName(Scanner scan) {
  171.         String fileName;
  172.         System.out.println("Введите имя файла, в который будут выводиться полученные данные:");
  173.         do {
  174.             fileName = scan.nextLine();
  175.             File file = new File(fileName);
  176.             if (file.exists()) {
  177.                 if (file.canWrite())
  178.                     return fileName;
  179.                 else
  180.                     System.out.println("Невозможно открыть для записи файл с таким именем! Повторите ввод имени файла:");
  181.             }
  182.             else
  183.                 System.out.println("Файл с таким именем не существует! Повторите ввод имени файла:");
  184.         } while(true);
  185.     }
  186.  
  187.     public static boolean outputInFile(String fileName, double[] sortedArr) {
  188.         FileWriter writer;
  189.         boolean isCorrect;
  190.         isCorrect = true;
  191.         try {
  192.             writer = new FileWriter(fileName);
  193.             for (int i = 0; i < sortedArr.length; i++) {
  194.                 writer.write(Double.toString(sortedArr[i]));
  195.                 writer.write(' ');
  196.             }
  197.             writer.close();
  198.         } catch (IOException err) {
  199.             System.out.println("Невозможно записать данные в введенный файл. Повторите ввод имени файла.");
  200.             isCorrect = false;
  201.         }
  202.         return isCorrect;
  203.     }
  204.  
  205.     public static int chooseFileOrConsole(final int InOrOutput, Scanner scan) {
  206.         int choice;
  207.         boolean isNotCorrect;
  208.         choice = 0;
  209.         switch (InOrOutput) {
  210.             case INPUT:
  211.                 System.out.println("Выберите вариант ввода:");
  212.                 System.out.println("1.Данные вводятся из текстового файла.");
  213.                 System.out.println("2.Данные вводятся через консоль.");
  214.                 break;
  215.             default:
  216.                 System.out.println("Выберите вариант вывода:");
  217.                 System.out.println("1.Данные выводятся в текстовый файл.");
  218.                 System.out.println("2.Данные выводятся в консоль.");
  219.         }
  220.         do {
  221.             isNotCorrect = false;
  222.             try {
  223.                 choice = Integer.parseInt(scan.nextLine());
  224.             }
  225.             catch (NumberFormatException err) {
  226.                 System.out.println("Ошибка ввода. Выберите вариант 1 или 2.");
  227.                 isNotCorrect = true;
  228.             }
  229.             if (!isNotCorrect && (choice < 1) || (choice > 2)) {
  230.                 System.out.println("Ошибка ввода. Выберите вариант 1 или 2.");
  231.                 isNotCorrect = true;
  232.             }
  233.         } while (isNotCorrect);
  234.         return choice;
  235.     }
  236.  
  237.     public static double[] inputFromConsole(Scanner scan) {
  238.         int arrLength;
  239.         double[] inputArr;
  240.         boolean isNotCorrect;
  241.         arrLength = 0;
  242.         System.out.println("Введите длину массива:");
  243.         do {
  244.             isNotCorrect = false;
  245.             try {
  246.                 arrLength = Integer.parseInt(scan.nextLine());
  247.             }
  248.             catch (NumberFormatException err) {
  249.                 System.out.println("Ошибка ввода. Введите натуральное число в диапазоне [" + MIN_QUANTITY + ";" +  MAX_QUANTITY + "]");
  250.                 isNotCorrect = true;
  251.             }
  252.             if (!isNotCorrect && (arrLength < MIN_QUANTITY || arrLength > MAX_QUANTITY)) {
  253.                 System.out.println("Ошибка ввода. Введите натуральное число в диапазоне [" + MIN_QUANTITY + ";" +  MAX_QUANTITY + "]");
  254.                 isNotCorrect = true;
  255.             }
  256.         } while (isNotCorrect);
  257.         inputArr = new double[arrLength];
  258.         System.out.println("Введите элементы массива:");
  259.         for (int i = 0; i < arrLength; i++)
  260.             do {
  261.                 isNotCorrect = false;
  262.                 try{
  263.                     inputArr[i] = Double.parseDouble(scan.nextLine());
  264.                 }
  265.                 catch (NumberFormatException err) {
  266.                     System.out.println("Ошибка ввода. Введите действительное число.");
  267.                     isNotCorrect = true;
  268.                 }
  269.             } while (isNotCorrect);
  270.         return inputArr;
  271.     }
  272.  
  273.     public static double[] inputFromFile(String fileName) {
  274.         boolean isCorrect;
  275.         FileReader reader = null;
  276.         double[] inputArr = null;
  277.         int arrLength;
  278.         isCorrect = true;
  279.         try {
  280.             reader = new FileReader(fileName);
  281.         } catch (FileNotFoundException err) {
  282.             System.out.println("Невозможно прочитать данные из файла! Повторите ввод его имени.");
  283.             isCorrect = false;
  284.         }
  285.         if (isCorrect) {
  286.             Scanner scanFile = new Scanner(reader);
  287.             arrLength = Integer.parseInt(scanFile.next());
  288.             inputArr = new double[arrLength];
  289.             for (int i = 0; i < arrLength; i++)
  290.                 inputArr[i] = Double.parseDouble(scanFile.next());
  291.             scanFile.close();
  292.             try {
  293.                 reader.close();
  294.             } catch (IOException err) {
  295.                 System.out.println("Невозможно закрыть файл! Повторите ввод его имени.");
  296.                 inputArr = null;
  297.             }
  298.         }
  299.         return inputArr;
  300.     }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement