Kiểm tra giá trị nhập vào của mảng, báo lỗi và bắt nhập lại

Đề bài là nhập vào 1 mảng, với số phần tử nhập vào bắt buộc là 1 số dương rồi sắp xếp

Đây là hàm check input được nhập vào và nó phải là giá trị dương


Ban đầu mình có dùng hàm checkEnteredInput cho cả các giá trị phần tử của array (Nếu nó ngoài giá trị của int thì in ra ko hợp lệ). Nhưng giờ mình muốn là nếu nhập giá trị của phần tử không hợp lệ, thì nó sẽ in ra là mình cần nhập lại phần tử nào nên mình đã viết hàm checkEnteredElements.

image

Thế nhưng khi mình nhập sai arr[1] thì nó vẫn in ra “Invalid input! Please enter again arr[0]”
Mình muốn hỏi rằng code mình sai ở đâu và nếu không dùng cách này thì còn cách nào khác để giải quyết việc nhập lại phần tử không ạ? Mình xin cảm ơn!

mục đích của hàm checkEnteredElements là gì? vòng for trong hàm đó để làm gì, câu về ngữ nghĩ thì câu if bên trong đó có ý nghĩa gì?
bạn giải thích ý định của bạn trong từng dòng lệnh xem?
khi bạn code mà bạn không giải thích được thì làm sao người khác giúp bạn được?

3 Likes

Mục đích của hàm checkEnteredElement là check giá trị nhập vào của từng phần tử
Mình định dùng vòng for để ví dụ nhập sai, nó sẽ bắt mình phải nhập lại phần tử thứ i đó
Câu if với minLimit và maxLimit để mình cho nó chạy trong khoảng của Int (dòng 137 ở hàm main)

Yêu cầu: Bạn nên chép mã lên thay vì chụp hình.

Có phải tất cả các phương thức đó đều nằm cùng 1 tập tin phải không?

2 Likes

Tất cả các phương thức đó đều nằm trong 1 class ạ

public class SelectionSort {

    /**
     * Declare a final variable LOGGER to use logging for (@code SelectionSort)
     * class
     *
     */
    private static final Logger LOGGER = Logger.getLogger(SelectionSort.class.getName());

    /**
     * This method is Selection Sort Algorithm
     *
     * @param array
     */
    private static int[] sortSelection(int array[]) {
        for (int i = 0; i < array.length - 1; i++) {
            //Find the minimum element in unsorted array
            int minIndex = i;
            for (int j = i + 1; j < array.length; j++) {
                if (array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            //Swap the found minimum element with i-th element
            int tempValue = array[minIndex];
            array[minIndex] = array[i];
            array[i] = tempValue;
        }
        return array;
    }

    /**
     * This method checks the input that the user enters from the keyboard and
     * input must be positive decimal number
     *
     * @param string
     * @param maxLimit
     * @param minLimit
     * @return input
     */
    private int checkEnteredInput(String string, int maxLimit, int minLimit) {
        Scanner sc = new Scanner(System.in);
        System.out.print(string);
        int input = 0;
        while (true) {
            try {
                input = Integer.parseInt(sc.nextLine().trim());
                if (input > minLimit || input < maxLimit) {
                    LOGGER.warning("Invalid input! Please enter again: ");
                } else {
                    return input;
                }
            } catch (NumberFormatException e) {
                LOGGER.warning("Invalid input! Please enter again: ");
            }
        }
    }

    private int checkEnteredElements(String string, int maxLimit, int minLimit, int arr[]){
        Scanner sc = new Scanner(System.in);
        System.out.print(string);
        int enteredElement = 0;
      
        for (int i = 0; i < arr.length; i++) {
            try {
                enteredElement = Integer.parseInt(sc.nextLine().trim());
                
                if (enteredElement > minLimit || enteredElement < maxLimit) {
                    LOGGER.log(Level.WARNING, "Invalid input! Please enter again arr[{0}]", i);

                } else {
                    return enteredElement;
                
                }
            } catch (NumberFormatException e) {
                LOGGER.log(Level.WARNING, "Invalid input! Please enter again arr[{0}]", i);

            }
        }
        return enteredElement;
    
    }
    
    
    /**
     * This method print elements of array before and after using Selection Sort
     * Algorithm
     *
     * @param arr
     */
    private void printArray(int arr[]) {
        
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {  
            if (i == arr.length - 1) {
                
                System.out.print(arr[i] + "]");
            } else {
                System.out.print(arr[i] + ", ");
            }
        }
    }

    /**
     * This is main method
     *
     * @param args
     */
    public static void main(String[] args) {
        SelectionSort selectionSort = new SelectionSort();
        System.out.print("Enter number of array: ");
        int inputArray = selectionSort.checkEnteredInput("", 1, Integer.MAX_VALUE);
        int array[] = new int[inputArray];  //Creat an array
        for (int i = 0; i < array.length; i++) {
//            array[i] = selectionSort.checkEnteredInput("arr[" + i + "]= ", Integer.MIN_VALUE, Integer.MAX_VALUE);
            
array[i] = selectionSort.checkEnteredElements("arr[" + i + "] = ", Integer.MIN_VALUE, Integer.MAX_VALUE, array);
            
            
        }
        System.out.print("Unsorted array: ");
        selectionSort.printArray(array);  //Print all elements of array before sorting
        array = sortSelection(array);  
        System.out.println("");
        System.out.print("Sorted Array: "); //Print all elements of array after sorting
        selectionSort.printArray(array);
    }

}

Vấn đề khá lớn khi bạn “ôm” Scanner vào tất cả các phương thức không liên quan đến việc nhập, phương thức đó chỉ làm công việc của nó là kiểm tra và trả về kết quả ĐÚNG - SAI.
Sai nữa là thay vì kiểm tra từng phần tử thì bạn lại yêu cầu nhập từ đầu:

Có phải là i bắt đầu từ 0 phải không? Đang kiểm tra một phần tử đang nhập mà lại phải chạy từ đầu là sao?
Rõ, ý định của bạn là “nhập đến đâu, kiểm tra đến đó”. Tức là cái nào đã kiểm tra rồi và cho qua nghĩa là nó đã hợp lệ. Thế thì việc gì phải kiểm tra từ 0?

B không cần biết đó là phần tử thứ bao nhiêu, việc của B chỉ là kiểm tra giá trị hợp lệ.

2 Likes
  1. Theo như lời bạn giải thích thì chẳng ăn nhập gì với nội dung của hàm mà bạn viết cả, ngay cả lời giải thích check giá trị nhập vào của từng phần tử cũng đã nhập nhằng
  2. Vậy i ở trong vòng lặp for của hàm checkEnteredElement thì có ý nghĩa gì? Tham số arr của hàm checkEnteredElement có ý nghĩa gì? vì sao lại là i < arr.length? và khi bạn ghi log thì i có ý nghĩa gì?
    giá trị của phần tử phải thỏa điều kiện nàothì được chấp nhận, nếu được chấp nhận thì chuyện gì sẽ xảy ra tiếp theo?

câu điều kiện trong câu if này, nếu đúng thì có nghĩa là gì, sai thì có nghĩa là gì?

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?