Как строго разрешить ввод только одного символа с помощью сканера SCANNER со ссылкой на мой код? - PullRequest
0 голосов
/ 11 ноября 2018

Код ниже для простого калькулятора с четырьмя основными математическими операторами. Это рабочая программа, она работает как положено. Однако у меня есть несколько вопросов, чтобы понять и улучшить как мою программу, так и мое понимание Java. (Я использовал Google, но количество избыточной информации смущает меня и не нашел идеальных ответов и в StackOverflow, хотя есть десятки связанных вопросов. Поверьте, я пробовал до публикации здесь).

  1. Как я могу убедиться, что пользовательский ввод точно и строго соответствует одному символу? здесь, в моей программе, он принимает более одного символа (+ - *), но работает только с первым символом (+). Я хочу убедиться, что более одного символа не принимаются в качестве ввода.

  2. После успешного выполнения программы, как я могу как-то позволить пользователю повторить основной метод? Я имею в виду, что пользователь добавляет два числа, получает свой ответ и хочет сделать еще один расчет, возможно, умножить два числа на этот раз. Я могу попросить пользователя «да» или «нет» продолжить, но как мне вернуть его обратно в начало? (будет ли работать петля? как?)

  3. В конце программы я использовал два метода для вывода сообщения. System.out.print работает нормально, но метод JOptionPane не отображает сообщение и программа не завершает работу (я это закомментировал). Хотелось бы понять почему?

  4. Требуется ли регистр по умолчанию для коммутатора? И я следую правильной структуре кода? (расположение и использование фигурных скобок)

NB. Как я уже сказал, этот калькулятор отлично работает и может использоваться новичками, такими как я, для лучшего понимания концепции, поскольку я прокомментировал каждую деталь. Пожалуйста, поймите, что я не могу добавить все в заголовок вопроса из-за ограничений ...

package mycalculator;

import javax.swing.JOptionPane;
import java.util.*;
public class MyCalculator{
public static void main (String [] args){
        // Let us code a simple calculator//

// Variable type declarations//          
  char OP;
  int firstNum; 
  int secNum;         

// Display an explanation of what this program does//
    System.out.println("This is a simple calculator that will do basic 
    calculations such as :"
     + "\nAddition, Multiplication, Substraction and Division.");

// Create a scanner object to Read user Input.//
    Scanner input = new Scanner(System.in);

// Ask user to input any positive number and read it//
    System.out.println("Enter Any positive number followed by pressing 
    ENTER.");
    firstNum = input.nextInt();

// Ask user to input/decide his choice operator and read it //
    System.out.println("Enter a valid OPERATOR sign followed by pressing 
    ENTER.");
    OP = input.next().charAt(0);  

// Loop the below statement till one of the four (+,-,*,/) is entered.// 
    while(OP != '+' && OP != '-' && OP != '*' && OP != '/'){
        System.out.println("Please Re-enter a valid Operator (+,-*,/)");
        OP = input.next().charAt(0);}

// Ask user for any second number and read it//
   System.out.println("Enter your Second number followed by an ENTER 
   stroke.");
   secNum = input.nextInt();

// Various possible Resolution based on OP value.//
   int RSum = firstNum+secNum;
   int RSubs= firstNum-secNum;
   int RPro = firstNum*secNum;
   double DPro = firstNum/secNum;

// Conditional statements for Processing Results based on OP and display.//
    switch(OP){ 
   case '+': System.out.println("The Resulting sum is "+ RSum);
   break;
   case '-': System.out.println("The Resulting sum is "+ RSubs);
   break;
   case '*': System.out.println("The Resulting Product is "+ RPro);
   break;
   case '/': System.out.println("The Resulting Divisional product is "+ 
   DPro);
   break;
//Maybe the default case is actually not needed but is added for totality//
  default : System.out.println("Try Again");
    break;
    }

// The following code maybe deleted, it is for experimental purpose//
// Just checking if additional statements executes after a program 
   completes//
    System.out.println("Test Message ");
//  JOptionPane.showMessageDialog(null, "The Process Ends Here!");
//The test message works fine//    
//The JOptionPane statement don't work and program doesn't end. WHY?//         
   }           
 }

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Как я могу убедиться, что пользовательский ввод точно и строго обугливается? здесь, в моей программе, он принимает более одного символа (+ - *), но работает только с первым символом (+). Я хочу убедиться, что более одного символ не принимается в качестве ввода.

Если вы используете консольное приложение и Scanner, единственное, что вы можете сделать, это прочитать String и проверить его длину. Если вы используете Swing, вы можете реализовать KeyPressListener и продолжить работу сразу после нажатия пользователем кнопки (но не для консольного приложения).

После успешного выполнения программы, как я могу как-то пользователь повторил основной метод? Я имею в виду, пользователь добавляет два числа, получает его ответить, и он хочет сделать еще один расчет, может быть, умножить два номера на этот раз. Я могу попросить пользователя «да» или «нет», чтобы продолжить, но как мне вернуть его обратно в начало? (будет ли работать петля? как?)

Вы не можете повторить main метод. В Java main метод выполняется только один раз. Чтобы повторить ваш код, вы можете поместить весь контент метода main в бесконечный цикл или переместить контент в отдельный метод и вызвать его из цикла в методе main.

В конце программы я использовал два метода для вывода сообщения. system.out.print работает нормально, но метод JOptionPane не отображается сообщение и программа не завершаются (я прокомментировал это из). Хотелось бы понять почему?

JOptionPane работает только для графического приложения (Swing / AWT). Это не доступно в консоли. У вас там только стандартный ввод и вывод.

Требуется ли регистр по умолчанию для коммутатора? И следую ли я правильная структура кода? (расположение и использование фигурных скобок)

Нет, default регистр необязателен для синтаксиса JVM . Я помню, что, например, в C++ была рекомендация разместить его (событие пустое), чтобы исключить побочные эффекты компиляторов. Я не знаю, есть ли такая рекомендация в Java, но когда я использую switch, я предпочитаю всегда добавлять его, чтобы исключить логическую проблему (но это определенно необязательно в соответствии с синтаксисом case). Вы правильно используете switch.

public static void main(String[] args) {
    System.out.println("This is a simple calculator that will do basic calculations such as :"
            + "\nAddition (+)"
            + "\nMultiplication (*)"
            + "\nSubtraction (-)"
            + "\nDivision (/)");

    System.out.println();

    try (Scanner scan = new Scanner(System.in)) {
        while (true) {
            System.out.println("Enter Any positive number followed by pressing ENTER.");
            int first = scan.nextInt();

            System.out.println("Enter a valid OPERATOR (+,*,-,/) sign followed by pressing ENTER.");
            String operator = scan.next();

            while (operator.length() != 1 || !"+*-/".contains(operator)) {
                System.out.println("Please Re-enter a valid Operator (+,-*,/)");
                operator = scan.next();
            }

            scan.nextLine();
            System.out.println("Enter your Second number followed by an ENTER stroke.");
            int second = scan.nextInt();

            if ("+".equals(operator))
                System.out.println("The Resulting sum is " + (first + second));
            else if ("*".equals(operator))
                System.out.println("The Resulting mul is " + (first * second));
            else if ("-".equals(operator))
                System.out.println("The Resulting sub is " + (first - second));
            else if ("/".equals(operator))
                System.out.println("The Resulting div is " + ((double)first / second));

            System.out.println();
            System.out.println("Do you want to exit ('y' to exit)?");

            if ("y".equals(scan.next()))
                return;

            System.out.println();
        }
    }
}
0 голосов
/ 12 ноября 2018

1) вы можете проверить размер строки input.next (). Если это так, то продолжить, а затем еще раз запросить выбор оператора.

2) Я бы посоветовал лучше создать другой метод, поместить в него всю логику и назвать его столько раз, сколько вы хотите, или вызывать бесконечное количество раз.

4) Должны ли операторы switch всегда содержать предложение по умолчанию?

...