#java #java.util.scanner #binary-search
#java #java.util.scanner #двоичный поиск
Вопрос:
Когда я помещаю значение, которого нет в if
инструкции в строке 23, мой код перестает работать. Я хочу знать, как сделать эту if
часть кода доказательством ошибки. Я знаю, что это исправление будет включать цикл for, но я не знаю, с чего начать. У меня есть if
цикл, сообщающий коду, что если order
равно 1, то выполняется поиск в порядке возрастания ( expensesAscending
); если order
равно 2, то выполняется поиск в порядке убывания ( expensedescending
).
package project;
import java.io.*;
import java.util.*;
import java.util.Scanner;
public class project {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int Size;//size of the array
int order; // ascending or descending order
int value;//this is for the value that you are looking for
System.out.println("Put in the amount of expenses you have");
Size = sc.nextInt();//User input for the amount of expenses
System.out.println("put in all your expenses");
int userInput[] = new int[Size];// what the users expenses are
for (int i = 0; i < userInput.length; i )//This loop is for if the i value is smaller than user input then put in more values to complete the array
userInput[i] = sc.nextInt();
System.out.println("do you want it ascending or descending order. If you want it in ascending press 1 or if you want descending press 2");
order = sc.nextInt();// select if they wanted it in ascending or descending order
System.out.print("expenses not sorted : ");
printExpenses(userInput);//this is the method that prints out all the expenses
if (order == 1) {
expensesAscending(userInput);// If order is equal to one then sort in ascending else if it is equal to 2 then order it descending
} else if (order == 2) {
expensedescending(userInput);
}
System.out.println("what value are you looking for");
value = sc.nextInt();
if (order == 1) {int ans = binarySearchAscending(userInput, 0, Size-1, value);//use the binary search ascending method
if(ans == -1)
System.out.println("value not found");
else
System.out.println("your expense is found at " ans " and the value of the array is " userInput[ans]);
}else if (order==2) {int ans = binarySearchDescending(userInput, 0, Size-1, value);//use the binary search descending method
if(ans == -1)
System.out.println("value not found");
else
System.out.println("your expense is found at " ans "and the value of the array is " userInput[ans]);
}}
public static void printExpenses(int[] arr) {
// this is were it is printed
for (int i = 0; i < arr.length; i ) {//loops when i = to 0 and i is less than the length of the array then you should add one to the i value so that it could print out the entire array
System.out.println(arr[i] "$");
}
}
public static void expensedescending(int arr[]) {
// This is were the selection sort starts
int N = arr.length;
for (int i = 0; i < N; i ) {
int small = arr[i];
int pos = i;
for (int j = i 1; j < N; j ) {
if (arr[j] > small) {
small = arr[j];
pos = j;
}
}
int temp = arr[pos];
arr[pos] = arr[i];
arr[i] = temp;
System.out.println(": ");
// Printing array after pass
printExpenses(arr);
}
}
public static void expensesAscending(int arr[]) {
//insertion sort
int N = arr.length;
for (int i = 1; i < N; i ) {
int j = i - 1;
int temp = arr[i];
while (j >= 0 amp;amp; temp < arr[j]) {
arr[j 1] = arr[j];
j--;
;
}
arr[j 1] = temp;
System.out.println(": ");
// Printing array after pass
printExpenses(arr);
}
}
static int binarySearchAscending(int[] array, int left, int right, int key) {
if (left > right) {
return -1;
}
int mid = (left right) / 2;
if (array[mid] == key) {
return mid;
}
if (array[mid] > key) {
return binarySearchAscending(array, left, mid - 1, key);
}
return binarySearchAscending(array, mid 1, right, key);
}
static int binarySearchDescending(int[] array, int left, int right, int key) {
if (left > right) {
return -1;
}
int mid = (left right) / 2;
if (array[mid] == key) {
return mid;
}
if (array[mid] > key) {
return binarySearchDescending(array, mid 1, right, key);
}
return binarySearchDescending(array, left, mid - 1, key);
}
}
Ответ №1:
Вы получите, InputMismatchException
если вы это сделаете sc.nextInt()
и укажете нецелое число (в вашем случае, скажем, какой-нибудь символ).
Чтобы сделать это доказательством ошибки, вам нужно будет перехватить исключение с try-catch
блоком.
Вы можете сделать что-то подобное для sc.nextInt()
части.
try {
order = sc.nextInt();
//other lines
} catch (InputMismatchException e) {
// do required processing here
}
Теперь это касается нецелых чисел. Для проверки, являются ли числа просто 1 и 2, вы можете использовать цикл while / do-while.
do {
try {
order = sc.nextInt();
//other lines
} catch (InputMismatchException e) {
// do required processing here
}
} while (1 != order amp;amp; 2 != order);
Комментарии:
1. как бы мне добавить это в свой код, потому что, когда я добавляю его, у меня возникает та же проблема, когда он просто останавливается и позволяет мне вводить бесконечное количество пользовательских данных
2. Пожалуйста, отредактируйте свой вопрос, чтобы отразить, что это не доказательство ошибки, которое вы ищете. Ошибка обычно означает выдачу исключения.
Ответ №2:
Поместите это в do-while:
do {
System.out.println("do you want it ascending or descending order. If you want it in ascending press 1 or if you want descending press 2");
order = sc.nextInt();
} while (order != 1 amp;amp; order != 2);