Я пишу программу, которая принимает команды от пользователя и выводит соответственно.Программа продолжает запрашивать ввод, пока пользователь не введет «Quit» в качестве команды.
Команды:
Factorial # (принимает в качестве аргумента одно число)
Вывод факториала числа, напр.
Factorial 5
5! == 120
GCD # # (принимает в качестве аргументов 2 числа)
выводит наибольший общий делитель между 2 числами(Рекурсивно.) Пример.
gcd 5 10
gcd(5, 10) == 5
Sorted # # ... (Принимает столько чисел, сколько хочет пользователь) проверяет, находятся ли числа после команды в порядке.Пример.
sorted 1 2 3 4 5
That list is sorted.
sorted 1 2 3 5 4
Out of order: 4 after 5.
Теперь все это работает довольно хорошо.нет ничего плохого на данный момент, с чем я борюсь, когда пользователь вводит букву вместо числа, он должен попытаться поймать InputMismatchException , этот вид работ.например.
если пользователь введет букву, он скажет это.
Factorial j
Not a number: For input string: j
НО
Factorial 5 j
5! == 120
это будет продолжаться какобычно это происходит, но в качестве следующей команды используется буква «j», так что если я введу Factorial 5 quit, он напечатает факториал, а затем завершится, я не знаю, почему это происходит.
другойДело в том, что я хочу выдать и поймать исключение, если аргументов слишком много для команды, поэтому пользователь не может ввести Factorial 5 10, и он просто вычислит факториал 5, выведет сообщение об ошибке, я не знаю, какчтобы достичь этого.
Вот мой код на данный момент.A09.java
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
/**
*
*
* @author Amr Ghoneim (A00425709)
*
*/
public class A09 {
static int counter = 0;
@SuppressWarnings("resource")
public static void main(String[] args) {
String command;
String[] commands = { "sorted", "factorial", "gcd", "help", "quit" };
Scanner scnr = new Scanner(System.in);
intro();
help();
System.out.println("Please type in your command below.");
boolean isValid = true;
while (isValid) {
System.out.print(">>> ");
command = scnr.next().toLowerCase();
// FACTORIAL
if (commands[1].startsWith(command)
&& commands[1].contains(command)) {
try {
int num = scnr.nextInt();
if (num >= 0) {
System.out.println(num + "! == " + factorial(num));
} else {
System.out.println("Error: " + num + "! undefined");
}
} catch (InputMismatchException ime) {
System.out.println(
"Not a number: For input string: " + scnr.next());
}
// GCD
} else if (commands[2].startsWith(command)
&& commands[2].contains(command)) {
try {
int numA, numB;
numA = scnr.nextInt();
numB = scnr.nextInt();
System.out.println("gcd(" + numA + ", " + numB + ") == "
+ GCD(numA, numB));
} catch (InputMismatchException ime) {
System.out.println(
"Not a number: For input string: " + scnr.next());
}
// SORTED
} else if (commands[0].startsWith(command)
&& commands[0].contains(command)) {
try {
List<Integer> nums = new ArrayList<Integer>();
StringTokenizer st = new StringTokenizer(scnr.nextLine(),
" ");
while (st.hasMoreTokens()) {
nums.add(Integer.parseInt(st.nextToken()));
}
sorted(nums);
} catch (NumberFormatException nfe) {
System.out.println("Not a number: For input string: ");
}
// QUIT
} else if (commands[4].startsWith(command)
&& commands[4].contains(command)) {
isValid = false;
quit();
// HELP
} else if (commands[3].startsWith(command)
&& commands[3].contains(command)) {
help();
}
}
}
public static void intro() {
System.out.println("This program can calculate factorials, "
+ "\nGCD, and check to see if a list of numbers are in order"
+ "\n-----------------------------------"
+ "\nMade by Amr Ghoneim (A00425709)"
+ "\n-----------------------------------");
}
public static int factorial(int n) {
if (n == 0) {
return 1;
} else {
int num = 1;
for (int i = 1; i <= n; i++) {
num *= i;
}
return num;
}
}
public static int GCD(int a, int b) {
if (b == 0) {
return a;
} else {
return GCD(b, a % b);
}
}
public static void help() {
System.out.println("Valid commands are:" + "\n - factorial #"
+ "\n The product of all numbers from 1 to #."
+ "\n (The argument must not be negative.)" + "\n - gcd # #"
+ "\n The greatest common divisor of the two numbers."
+ "\n The biggest number that divides evenly into both of
them."
+ "\n - sorted #..."
+ "\n Whether the numbers are in order from smallest to
largest."
+ "\n If not, then where the first out-of-order number is."
+ "\n - help" + "\n This help message." + "\n - quit"
+ "\n End the program.");
}
public static boolean sorted(List<Integer> nums) {
for (int i = 1; i < nums.size(); i++) {
if (nums.get(i - 1) > nums.get(i)) {
System.out.println("Out of order: " + nums.get(i) + " after "
+ nums.get(i - 1));
return false;
}
}
System.out.println("That list is sorted.");
return true;
}
public static void quit() {
System.out.println("Good-bye.");
System.exit(0);
}
}
Чего мне не хватает, так это выяснить, сколько аргументов выставляет пользователь, если слишком много печатать сообщение, и для отсортированной команды я не могу заставить его напечатать письмо, которое помещает пользователь,и по какой-то причине при вводе «Factorial 5 5» будет напечатано «>>>» дважды, а не один раз.есть кое-какие ошибки здесь и там, кто-то может подсказать мне, как мне подходить к этому, или показать несколько примеров?
Спасибо!