Advertisement
SmnVadik

Lab 6.2 (Java)

Sep 9th, 2023
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.25 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.List;
  6. import java.util.ArrayList;
  7. import java.util.*;
  8.  
  9. class Point{
  10.     public double X;
  11.     public double Y;
  12. }
  13.  
  14. class Line
  15. {
  16.     public double K;
  17.     public double B;
  18. }
  19.  
  20. public class Main {
  21.     static Scanner scanner = new Scanner(System.in);
  22.     static List<Point> points = new ArrayList<>();
  23.     static int[] arrayOfPoint = new int[10];
  24.  
  25.     public static void main(String[] args) throws IOException {
  26.  
  27.         task();
  28.         int num;
  29.         do {
  30.             getInfo();
  31.             num = getNum();
  32.             getUserChoice(num);
  33.         } while (num != 0);
  34.  
  35.         scanner.close();
  36.     }
  37.  
  38.     private static void task() {
  39.         System.out.println("На плоскости заданы n точек своими координатами.\n" +
  40.                 "Найти уравнение прямой, которой принадлежит наибольшее число данных точек. ");
  41.     }
  42.  
  43.     private static void getInfo() {
  44.         System.out.println("""
  45.                1 - Добавить точки\s
  46.                2 - Показать уравнение\s
  47.                3 - Сохранить уравнение в файл\s
  48.                4 - Загрузить данные из файла\s
  49.                0 - Нажмите чтобы выйти""");
  50.     }
  51.  
  52.     static Line FindLineWithMostPoints(List<Point> points) {
  53.         Line resultLine = new Line();
  54.         int maxPointsCount = 0;
  55.  
  56.         for (int i = 0; i < points.size(); i++) {
  57.             for (int j = i + 1; j < points.size(); j++) {
  58.                 double k = (points.get(j).Y - points.get(i).Y) / (points.get(j).X - points.get(i).X);
  59.                 double b = points.get(i).Y - k * points.get(i).X;
  60.  
  61.                 int pointsOnLine = 2; // Две уже минимум есть
  62.  
  63.                 for (int p = 0; p < points.size(); p++) {
  64.                     if (p != i && p != j && Math.abs(points.get(p).Y - (k * points.get(p).X + b)) < 0.0001)
  65.                         pointsOnLine++;
  66.                 }
  67.  
  68.                 if (pointsOnLine > maxPointsCount) {
  69.                     maxPointsCount = pointsOnLine;
  70.                     resultLine.K = k;
  71.                     resultLine.B = b;
  72.                 }
  73.             }
  74.         }
  75.         return resultLine;
  76.     }
  77.  
  78.     private static int getNum() {
  79.         int num = 0;
  80.         boolean isCorrect;
  81.         do {
  82.             isCorrect = true;
  83.             System.out.print("Введите число: ");
  84.             try {
  85.                 num = Integer.parseInt(scanner.nextLine());
  86.             } catch (NumberFormatException e) {
  87.                 isCorrect = false;
  88.                 System.out.println("Проверьте корректность введенных данных");
  89.             }
  90.             if (isCorrect && (num < 0 || num > 4)) {
  91.                 isCorrect = false;
  92.                 System.out.println("Диапазон ввода размера от 0 до 4");
  93.             }
  94.         } while (!isCorrect);
  95.         return num;
  96.     }
  97.  
  98.     private static int getPoint(String str, int i) {
  99.         int num = 0;
  100.         boolean isCorrect;
  101.         do {
  102.             isCorrect = true;
  103.             System.out.print("Введите координату " + str + ", " + i + " точки: ");
  104.             try {
  105.                 num = Integer.parseInt(scanner.nextLine());
  106.             } catch (NumberFormatException e) {
  107.                 isCorrect = false;
  108.                 System.out.println("Проверьте корректность введенных данных");
  109.             }
  110.             if (isCorrect && (num < 0 || num > 99)) {
  111.                 isCorrect = false;
  112.                 System.out.println("Диапазон ввода числа [0; 99]");
  113.             }
  114.         } while (!isCorrect);
  115.         return num;
  116.     }
  117.  
  118.     private static int getSize() {
  119.         int size = 0;
  120.         boolean isCorrect;
  121.         do {
  122.             isCorrect = true;
  123.             System.out.print("Введите количество n от 2 до 20: ");
  124.             try {
  125.                 size = Integer.parseInt(scanner.nextLine());
  126.             } catch (NumberFormatException e) {
  127.                 isCorrect = false;
  128.                 System.out.println("Проверьте корректность введенных данных");
  129.             }
  130.             if (isCorrect && (size < 2 || size > 20)) {
  131.                 isCorrect = false;
  132.                 System.out.println("Диапазон ввода размера [2; 20]");
  133.             }
  134.         } while (!isCorrect);
  135.         return size;
  136.     }
  137.  
  138.     private static void addPoint() {
  139.         int size = getSize();
  140.         for (int i = 0; i < size; i++) {
  141.             int NumX = getPoint("X", i + 1);
  142.             int NumY = getPoint("Y", i + 1);
  143.             points.add(new Point() {{
  144.                 X = NumX;
  145.                 Y = NumY;
  146.             }});
  147.         }
  148.     }
  149.  
  150.     private static void add(int NumX, int NumY) {
  151.         points.add(new Point() {{X = NumX; Y = NumY; }});
  152.     }
  153.  
  154.     private static void outputPoint() {
  155.         if (points.size() < 2) {
  156.             System.out.println("Недостаточно точек. Минимальное количетсво 2!");
  157.             return;
  158.         }
  159.         Line lineWithMostPoints = FindLineWithMostPoints(points);
  160.         System.out.println("Уравнение прямой с большинством точек: y = " + lineWithMostPoints.K + "x + " + lineWithMostPoints.B);
  161.     }
  162.  
  163.     private static String inputPath() {
  164.         String path;
  165.         boolean isCorrect;
  166.         do {
  167.             isCorrect = true;
  168.             System.out.println("Введите полный путь к файлу");
  169.             path = scanner.nextLine();
  170.             File file = new File(path);
  171.             if (!file.exists()) {
  172.                 isCorrect = false;
  173.                 System.out.println("Неверно введен путь");
  174.             }
  175.             if (isCorrect && !file.canRead()) {
  176.                 System.out.println("Невозможно считать данные с файла");
  177.             }
  178.             if (isCorrect && !file.canWrite()) {
  179.                 System.out.println("Невозможно записать данные в файл");
  180.             }
  181.         } while (!isCorrect);
  182.         return path;
  183.     }
  184.  
  185.     private static void saveData() throws IOException {
  186.         if (points.size() < 2) {
  187.             System.out.println("Недостаточно точек. Минимальное количетсво 2!");
  188.             return;
  189.         }
  190.         String path = inputPath();
  191.         Line lineWithMostPoints = FindLineWithMostPoints(points);
  192.         FileWriter writer = new FileWriter(path);
  193.         writer.write("Уравнение прямой с большинством точек: y = " + lineWithMostPoints.K + "x + " + lineWithMostPoints.B);
  194.         writer.close();
  195.     }
  196.  
  197.     private static boolean checkDataCorrectness(String path) {
  198.         boolean isCorrect = true;
  199.         boolean isNum;
  200.         int num = 0;
  201.         int size = 0;
  202.         try {
  203.             Scanner fileReader = new Scanner(new File(path));
  204.             while(fileReader.hasNext()) {
  205.                     isNum = true;
  206.                     try {
  207.                         num = fileReader.nextInt();
  208.                     } catch (Exception e) {
  209.                         isNum = false;
  210.                     }
  211.                     if (isNum && (num >= 0 && num < 100)) {
  212.                         size++;
  213.                     }
  214.             }
  215.             if (size < 2) {
  216.                 isCorrect = false;
  217.             } else {
  218.                 arrayOfPoint = new int[size];
  219.             }
  220.         } catch (Exception q) {
  221.             System.out.println("Проверьте корректность данных в файле.");
  222.             isCorrect = false;
  223.         }
  224.         return isCorrect;
  225.     }
  226.  
  227.     private static void openData() throws FileNotFoundException {
  228.         String path = inputPath();
  229.         boolean IsCorrect = checkDataCorrectness(path);
  230.         if (IsCorrect) {
  231.             System.out.println("Данные были успешно считаны.");
  232.         } else {
  233.             return;
  234.         }
  235.  
  236.         boolean isNum;
  237.         int num = 0;
  238.         int size = 0;
  239.         Scanner fileReader = new Scanner(new File(path));
  240.         while(fileReader.hasNext()) {
  241.             isNum = true;
  242.             try {
  243.                 num = fileReader.nextInt();
  244.             } catch (Exception e) {
  245.                 isNum = false;
  246.             }
  247.             if (isNum && (num >= 0 && num < 100)) {
  248.                 arrayOfPoint[size] = num;
  249.                 size++;
  250.             }
  251.         }
  252.  
  253.         size = arrayOfPoint.length - arrayOfPoint.length % 2;
  254.         for (int i = 0; i < size; i++) {
  255.             add(arrayOfPoint[i], arrayOfPoint[i + 1]);
  256.             i++;
  257.         }
  258.     }
  259.  
  260.     private static void getUserChoice(int num) throws IOException {
  261.         switch (num) {
  262.             case 1 -> addPoint();
  263.             case 2 -> outputPoint();
  264.             case 3 -> saveData();
  265.             case 4 -> openData();
  266.         }
  267.     }
  268.  
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement