Как попросить пользователя ввести строковые данные? (если они хотят ввести центр и радиус или конечные точки диаметра?) (Читать ввод) - PullRequest
1 голос
/ 25 февраля 2020

// это драйвер, и существуют классы ресурсов, которые называются / используются

игнорировать эту линию письма
игнорировать эту строку письма игнорировать эту строку письма
игнорировать эту строку письма

    import java.util.Scanner;
    public class KI23CriclesDriver
    {
       public static void main (String[] args)
       {
          //Declare Variables
          int x1, y1, x2, y2;
          String print;
          double center;
          double center2;
          String radius;
          int validLength = 1;
          int validLength2 = 2;

          //Instantiate Objects
          KI23GetC gc = new KI23GetC();
          KI23GetCircles gs = new KI23GetCircles();
          KI23PrintC p = new KI23PrintC();
          System.out.println("Do you want to enter (Option 1) center and radius or (Option 2) end points of diameter?");
          x1 = 0;
          y1 = 0;
          x2 = 0;
          y2 = 0;
          Scanner scanner = new Scanner(System.in);
          radius = scanner.nextLine();
          if( radius.length() == validLength )
          {
             System.out.println("Please enter the center and radius");
             x2 = gc.getX();
             y2 = gc.getY();
             x1 = gc.getX();
             y1 = gc.getY();
             center = gs.getCenter(x1, y1, x2, y2);
             center2 = gs.getCenter2(x1, y1, x2, y2);  
             p.print(x1, y1, x2, y2, center, center2);
          }

          if( radius.length() == validLength2) // doesnt work since validlength2 is the same as validlength
          {
             System.out.println("Please enter the end points of diameter");
             x1 = gc.getX();
             y1 = gc.getY();
             x2 = gc.getX();
             y2 = gc.getY();
             center = gs.getCenter(x1, y1, x2, y2);
             center2 = gs.getCenter2(x1, y1, x2, y2);  
             p.print(x1, y1, x2, y2, center, center2);

          }
          else
          {
             System.out.println("Please enter 1 or 2");
             x1 = 0;
             y1 = 0;
             x2 = 0;
             y2 = 0;
             radius = scanner.nextLine();  
          }
    // 

// Я хочу лучший способ принимать входные данные и принимать различные решения и расчеты после этого}}

1 Ответ

1 голос
/ 25 февраля 2020

Вы явно не показали весь свой код для этого и других классов, поэтому приведенный ниже примерный код в основном использует то, что вы предоставили ... в некоторой степени. Подсказки разбиты и предоставлены в определенных c методах класса. Метод main () вызывает только другой метод, который фактически начинает вращение шара (так сказать). Это сделано, чтобы избежать необходимости в статике.

Метод startApp () вызывает метод mainMenu () , который, в свою очередь, отображает главное меню для этого консольного приложения. , Меню содержится в пределах oop, чтобы гарантировать, что пользователь правильно сделал запись.

Параметр, выбранный в главном меню, возвращается из метода mainMenu () как целочисленное значение, которое затем попадает в управление блоком switch / case , который в свою очередь определяет, должны ли быть указаны центр и радиус (пункт меню 1 ) или должны быть указаны конечные точки окружности (пункт меню 2 ).

Если необходимо указать Центр и Радиус, то вызывается метод getCenterAndRadius () , который предлагает пользователю указать значение Центра и Радиуса.

Если a Конечные точки круга должны быть предоставлены, затем вызывается метод getCircleEndPoints () , который предлагает пользователю ввести все четыре значения (x1, y1, x2, y2), чтобы составить две требуемые конечные точки для кружок.

Доступен также дополнительный метод с именем getCenterAndRadius_2 () , который демонстрирует еще один способ предоставления пользователю значения конечной точки. Используйте тот, который подходит вам лучше всего, или создайте свои собственные методы на основе некоторых идей, приведенных в коде.

Использование Регулярные выражения используются в предоставленном коде. Методы String # match () , String # split () и методы String # replaceAll () используют эти регулярные выражения.

import java.util.Scanner;

public class KI23CriclesDriver {

    // KI23GetC gc = new KI23GetC();
    // KI23GetCircles gs = new KI23GetCircles();
    // KI23PrintC p = new KI23PrintC();

    private final Scanner userInput = new Scanner(System.in);
    private final String ls = System.lineSeparator();
    private int x1 = 0, y1 = 0, x2 = 0, y2 = 0;

    public static void main(String[] args) {
        // Done this way to avoid statics
        new KI23CriclesDriver().startApp(args);
    }

    private void startApp(String[] args) {
        int menuOption = mainMenu();
        switch (menuOption) {
            case 1:
                getCenterAndRadius();
                break;
            case 2:
                getCircleEndPoints();
                // getCircleEndPoints_2();
                break;
        }
    }

    private int mainMenu() {
        int menuChoice = 0;
        while (menuChoice == 0) {
            System.out.println("Supply a circle creation option:");
            System.out.println("  1) Based on Center and Radius." + ls
                             + "  2) Based on Diameter End Points.");
            System.out.print("Choice: --> ");
            String choice = userInput.nextLine().trim();
            if (choice.toLowerCase().startsWith("q")) {
                // Quit appplication
                System.exit(0);
            }
            if (!choice.matches("[12]")) {
                System.err.println("Invalid menu choice! Try again..." + ls);
                continue;
            }
            menuChoice = Integer.parseInt(choice);
        }
        return menuChoice;
    }

    private void getCenterAndRadius() {
        System.out.println("Please enter the Center and Radius:");
        String center = "", radius = "";
        // Center
        while (center.equals("")) {
            System.out.print("Center Value: --> ");
            center = userInput.nextLine();
            if (!center.matches("\\d+")) {
                System.err.println("Invalid entry for CENTER! Try again...");
                center = "";
            }
        }
        // Radius
        while (radius.equals("")) {
            System.out.print("Radius Value: --> ");
            radius = userInput.nextLine();
            if (!radius.matches("\\d+")) {
                System.err.println("Invalid entry for RADIUS! Try again...");
                radius = "";
            }
        }

        System.out.println(new StringBuffer("").append("Center = ").append(center)
                           .append("  |  Radius = ").append(radius));

        /* Do what you want here with the numerical values
           contained within the String variables center and 
           radius. 
        */
    }

    private void getCircleEndPoints() {
        System.out.println("Please enter the Circle End Points:");
        String xx1 = "", yy1 = "", xx2 = "", yy2 = "";
        // x1
        while (xx1.equals("")) {
            System.out.print("x1 Value: --> ");
            xx1 = userInput.nextLine();
            if (!xx1.matches("\\d+")) {
                System.err.println("Invalid entry for x1! Try again...");
                xx1 = "";
            }
        }
        // y1
        while (yy1.equals("")) {
            System.out.print("y1 Value: --> ");
            yy1 = userInput.nextLine();
            if (!yy1.matches("\\d+")) {
                System.err.println("Invalid entry for y1! Try again...");
                yy1 = "";
            }
        }
        // x2
        while (xx2.equals("")) {
            System.out.print("x2 Value: --> ");
            xx2 = userInput.nextLine();
            if (!xx2.matches("\\d+")) {
                System.err.println("Invalid entry for x2! Try again...");
                xx2 = "";
            }
        }
        // y2
        while (yy2.equals("")) {
            System.out.print("y2 Value: --> ");
            yy2 = userInput.nextLine();
            if (!yy2.matches("\\d+")) {
                System.err.println("Invalid entry for y2! Try again...");
                yy2 = "";
           }
        }

        System.out.println(new StringBuffer("").append("Circle End Points Suplied: (")
                           .append(xx1).append(",").append(yy1).append("), (")
                           .append(xx2).append(",").append(yy2).append(")"));

        /* Do what you want here with the numerical values
           contained within the String variables xx1, yy1, 
           xx2, and yy2.
        */
    }

    private void getCircleEndPoints_2() {
        System.out.println("Please enter the Circle End Points:" + ls
                         + "Example Entries: 50 50 65 72 or" + ls
                         + "                 50,50,65,72 or" + ls
                         + "                 50, 50, 65, 72");

        int xx1, yy1, xx2, yy2;
        String endPoints = "";
        while (endPoints.equals("")) {
            System.out.print("End Points: --> ");
            endPoints = userInput.nextLine();
            if (!endPoints.replaceAll("[ ,]","").matches("\\d+") || 
                            endPoints.contains(",") ? endPoints.split("\\s{0,},\\s{0,}").length != 4 
                            : endPoints.split("\\s+").length != 4) {
                System.err.println("Invalid End Points Entry! Try again...");
                endPoints = "";
            }
        }
        String[] points = endPoints.contains(",") ? 
                          endPoints.split("\\s{0,},\\s{0,}") : 
                          endPoints.split("\\s+");
        xx1 = Integer.parseInt(points[0]);
        yy1 = Integer.parseInt(points[1]);
        xx2= Integer.parseInt(points[2]);
        yy2 = Integer.parseInt(points[3]);

        System.out.println(new StringBuffer("").append("Circle End Points Suplied: (")
                           .append(xx1).append(",").append(yy1).append("), (")
                           .append(xx2).append(",").append(yy2).append(")"));

        /* Do what you want here with the numerical values
           contained within the int type variables xx1, yy1, 
           xx2, and yy2.
        */
    }
}

Регулярные выражения, используемые в коде:

if (!choice.matches("[12]")) {

Выражение "[12]", содержащееся здесь в методе match () это если условие в основном означает следующее: если предоставленная строка, содержащаяся в переменной choice , равна , а не , либо "1", либо "2", введите if code block.


if (!center.matches("\\d+")) {

Выражение "\\d+", содержащееся здесь в методе match () этого условия if в основном означает this: Если предоставленная строка, содержащаяся в переменной center , равна , а не строковым представлением одной или нескольких цифр (от 0 до 9), введите код , если блок.

Это выражение используется в нескольких местах.


endPoints.replaceAll("[ ,]", "")

Выражение "[ ,]", содержащееся здесь в методе replaceAll () , означает замену все пробелы ("") и запятые (,) из строки, содержащейся в строковой переменной endPoints .


endPoints.split("\\s+") 

Содержимое выражения "\\s+" здесь в методе split () означает: разбить строку, содержащуюся в переменной endPoints , в массив строк на основе одного или нескольких разделителей пробелов ("")


endPoints.split("\\s{0,},\\s{0,}")

Выражение "\\s{0,},\\s{0,}", содержащееся здесь в методе split () , означает: разбить строку, содержащуюся в переменной endPoints , в массив строк на основе запятой (" , ") разделители ИЛИ любой разделитель запятой / пробела (например:", "или", "или", "или", ") независимо от количества пробелов (если есть) по обе стороны от запятая Он в основном охватывает все основы использования запятых.


Измените код по своему усмотрению.

...