Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.*;
- class Point{
- public double X;
- public double Y;
- }
- class Line
- {
- public double K;
- public double B;
- }
- public class Main {
- static Scanner scanner = new Scanner(System.in);
- static List<Point> points = new ArrayList<>();
- static int[] arrayOfPoint = new int[10];
- public static void main(String[] args) throws IOException {
- task();
- int num;
- do {
- getInfo();
- num = getNum();
- getUserChoice(num);
- } while (num != 0);
- scanner.close();
- }
- private static void task() {
- System.out.println("На плоскости заданы n точек своими координатами.\n" +
- "Найти уравнение прямой, которой принадлежит наибольшее число данных точек. ");
- }
- private static void getInfo() {
- System.out.println("""
- 1 - Добавить точки\s
- 2 - Показать уравнение\s
- 3 - Сохранить уравнение в файл\s
- 4 - Загрузить данные из файла\s
- 0 - Нажмите чтобы выйти""");
- }
- static Line FindLineWithMostPoints(List<Point> points) {
- Line resultLine = new Line();
- int maxPointsCount = 0;
- for (int i = 0; i < points.size(); i++) {
- for (int j = i + 1; j < points.size(); j++) {
- double k = (points.get(j).Y - points.get(i).Y) / (points.get(j).X - points.get(i).X);
- double b = points.get(i).Y - k * points.get(i).X;
- int pointsOnLine = 2; // Две уже минимум есть
- for (int p = 0; p < points.size(); p++) {
- if (p != i && p != j && Math.abs(points.get(p).Y - (k * points.get(p).X + b)) < 0.0001)
- pointsOnLine++;
- }
- if (pointsOnLine > maxPointsCount) {
- maxPointsCount = pointsOnLine;
- resultLine.K = k;
- resultLine.B = b;
- }
- }
- }
- return resultLine;
- }
- private static int getNum() {
- int num = 0;
- boolean isCorrect;
- do {
- isCorrect = true;
- System.out.print("Введите число: ");
- try {
- num = Integer.parseInt(scanner.nextLine());
- } catch (NumberFormatException e) {
- isCorrect = false;
- System.out.println("Проверьте корректность введенных данных");
- }
- if (isCorrect && (num < 0 || num > 4)) {
- isCorrect = false;
- System.out.println("Диапазон ввода размера от 0 до 4");
- }
- } while (!isCorrect);
- return num;
- }
- private static int getPoint(String str, int i) {
- int num = 0;
- boolean isCorrect;
- do {
- isCorrect = true;
- System.out.print("Введите координату " + str + ", " + i + " точки: ");
- try {
- num = Integer.parseInt(scanner.nextLine());
- } catch (NumberFormatException e) {
- isCorrect = false;
- System.out.println("Проверьте корректность введенных данных");
- }
- if (isCorrect && (num < 0 || num > 99)) {
- isCorrect = false;
- System.out.println("Диапазон ввода числа [0; 99]");
- }
- } while (!isCorrect);
- return num;
- }
- private static int getSize() {
- int size = 0;
- boolean isCorrect;
- do {
- isCorrect = true;
- System.out.print("Введите количество n от 2 до 20: ");
- try {
- size = Integer.parseInt(scanner.nextLine());
- } catch (NumberFormatException e) {
- isCorrect = false;
- System.out.println("Проверьте корректность введенных данных");
- }
- if (isCorrect && (size < 2 || size > 20)) {
- isCorrect = false;
- System.out.println("Диапазон ввода размера [2; 20]");
- }
- } while (!isCorrect);
- return size;
- }
- private static void addPoint() {
- int size = getSize();
- for (int i = 0; i < size; i++) {
- int NumX = getPoint("X", i + 1);
- int NumY = getPoint("Y", i + 1);
- points.add(new Point() {{
- X = NumX;
- Y = NumY;
- }});
- }
- }
- private static void add(int NumX, int NumY) {
- points.add(new Point() {{X = NumX; Y = NumY; }});
- }
- private static void outputPoint() {
- if (points.size() < 2) {
- System.out.println("Недостаточно точек. Минимальное количетсво 2!");
- return;
- }
- Line lineWithMostPoints = FindLineWithMostPoints(points);
- System.out.println("Уравнение прямой с большинством точек: y = " + lineWithMostPoints.K + "x + " + lineWithMostPoints.B);
- }
- private static String inputPath() {
- String path;
- boolean isCorrect;
- do {
- isCorrect = true;
- System.out.println("Введите полный путь к файлу");
- path = scanner.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- isCorrect = false;
- System.out.println("Неверно введен путь");
- }
- if (isCorrect && !file.canRead()) {
- System.out.println("Невозможно считать данные с файла");
- }
- if (isCorrect && !file.canWrite()) {
- System.out.println("Невозможно записать данные в файл");
- }
- } while (!isCorrect);
- return path;
- }
- private static void saveData() throws IOException {
- if (points.size() < 2) {
- System.out.println("Недостаточно точек. Минимальное количетсво 2!");
- return;
- }
- String path = inputPath();
- Line lineWithMostPoints = FindLineWithMostPoints(points);
- FileWriter writer = new FileWriter(path);
- writer.write("Уравнение прямой с большинством точек: y = " + lineWithMostPoints.K + "x + " + lineWithMostPoints.B);
- writer.close();
- }
- private static boolean checkDataCorrectness(String path) {
- boolean isCorrect = true;
- boolean isNum;
- int num = 0;
- int size = 0;
- try {
- Scanner fileReader = new Scanner(new File(path));
- while(fileReader.hasNext()) {
- isNum = true;
- try {
- num = fileReader.nextInt();
- } catch (Exception e) {
- isNum = false;
- }
- if (isNum && (num >= 0 && num < 100)) {
- size++;
- }
- }
- if (size < 2) {
- isCorrect = false;
- } else {
- arrayOfPoint = new int[size];
- }
- } catch (Exception q) {
- System.out.println("Проверьте корректность данных в файле.");
- isCorrect = false;
- }
- return isCorrect;
- }
- private static void openData() throws FileNotFoundException {
- String path = inputPath();
- boolean IsCorrect = checkDataCorrectness(path);
- if (IsCorrect) {
- System.out.println("Данные были успешно считаны.");
- } else {
- return;
- }
- boolean isNum;
- int num = 0;
- int size = 0;
- Scanner fileReader = new Scanner(new File(path));
- while(fileReader.hasNext()) {
- isNum = true;
- try {
- num = fileReader.nextInt();
- } catch (Exception e) {
- isNum = false;
- }
- if (isNum && (num >= 0 && num < 100)) {
- arrayOfPoint[size] = num;
- size++;
- }
- }
- size = arrayOfPoint.length - arrayOfPoint.length % 2;
- for (int i = 0; i < size; i++) {
- add(arrayOfPoint[i], arrayOfPoint[i + 1]);
- i++;
- }
- }
- private static void getUserChoice(int num) throws IOException {
- switch (num) {
- case 1 -> addPoint();
- case 2 -> outputPoint();
- case 3 -> saveData();
- case 4 -> openData();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement