Lỗi khai báo biến trong Java

Mọi người cho mình hỏi, mình khai báo m ngoài vòng while mà không khởi tạo giá trị cho nó, nhưng vào vòng while mình gán giá trị cho m, khi ra khỏi vòng while thì mình gọi đến m bị lỗi là chưa khởi tạo giá trị cho nó. Tại sao lại như vậy ạ, trong khi vào vòng while mình đã gán giá trị cho nó rồi

int k;
        System.out.println("nhap so nguyen can tim: ");
        k=sc.nextInt();
        int h=b-1,l=0,m;
        while(l<h){
            m=(l+h)/2;
            if(a[m]==k){
                System.out.println("thay roi ne"); break;
            }
            else if(k>a[m]){
                l=m+1;
            }
            else h=m-1;
        }
        System.out.println(m);

What happen if at the first loop l >= h? then what is value of m?

1 Like

I tried to initialize ( l<h ) , but it still makes that error.

So me all the code, what’s value of b?

1 Like
import java.io.InputStream;
import java.util.Scanner;

public class hello
{   public static final int x=10;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int b;
        System.out.println("nhap b: ");
        b=sc.nextInt();
        int []a=new int[b];
        for(int i=0;i<b;i++){
            a[i]=sc.nextInt();
        }
        for(int i=0;i<b;i++){
            for(int j=i+1;j<b-1;j++){
                if(a[i]>a[j]){
                    int t=a[i]; a[i]=a[j];a[j]=t;
                }
            }
        }
        int k;
        System.out.println("nhap so nguyen can tim: ");
        k=sc.nextInt();
        int h=b-1,l=0,m;
        while(l>=h){
            m=(l+h)/2;
            if(a[m]==k){
                System.out.println("thay roi ne"); break;
            }
            else if(k>a[m]){
                l=m+1;
            }
            else h=m-1;
        }
        System.out.println(m);
    }
}

u can input all values (l<h)

anh người việt à :smiley: tưởng người nước ngoài, mất công viết t.a :(((

Đây là lỗi compile time bạn nhé. Nghĩa là ở thời điểm này code của bạn không hề được chạy mà chỉ đánh giá các khả năng. m ở trong đoạn code của bạn có thể không được gán nếu l < h nên trình biên dịch đập lỗi vào mặt bạn.

4 Likes

ok bạn, mình hiểu rồi, đập phát tỉnh luôn :smiley: thank you

Thật ra bạn ở trên đã nêu ra theo cách gián tiếp rồi, mình chỉ nói lại theo cách trực tiếp thôi

3 Likes

Compiler can’t know future variables, it just compile all the code at the present and it throw the error because it doesn’t know value of b exactly at this moment, you can try by assign a possible value to b for further testing.

1 Like

okay, I have understood your explanation, thanks bro.

1 Like

phần code của bạn lổi vài chổ mà hình như bạn đang tính dùng thuật toán sắp xếp sau đó tìm kiếm nhị phân thì phải .Chỉ là phần thuật toán tìm kiêm của bạn chua đúng , :face_with_hand_over_mouth: cho nên mình thử lại kèm kq từng bước cho bạn tham khảo

import java.util.Scanner;

public class timsn {
		//    public static final int x=10;
	    public static void main(String[] args) {
	        Scanner sc= new Scanner(System.in);
	        int b;
	        System.out.print("nhap b: ");
	        b=sc.nextInt();
	        int[] a=new int[b];
	        for(int i=0;i<b;i++){
	            a[i]=sc.nextInt();
	        }
	        for(int i=0;i<b;i++){
	            for(int j=i+1;j<b;j++){
	                if(a[i]>a[j]){
	                int t=a[i]; 
	                    a[i]=a[j];
	                    a[j]=t;
	                }
	             }
	          }
	        for(int i=0;i<b;i++){
	        	 System.out.println ("Mảng đã sắp xếp   ");

	        	 System.out.println (a[i]+"  ");
	        }
	        
	        int k;
	        System.out.println("nhap so nguyen can tim: ");
	        k=sc.nextInt();
	       int result=   binarySearch(a,0,b-1,k);
	       if (result == -1) 
	            System.out.println("Element not present"); 
	        else
	            System.out.println("Element found at index " + result); 
	    }
	    
	    static int binarySearch(int arr[], int l, int r, int x) 
	    { 
	        if (r >= l) { 
	            int mid = l + (r - l) / 2; 
	  
	            // If the element is present at the 
	            // middle itself 
	            if (arr[mid] == x) 
	                return mid; 
	  
	            // If element is smaller than mid, then 
	            // it can only be present in left subarray 
	            if (arr[mid] > x) 
	                return binarySearch(arr, l, mid - 1, x); 
	  
	            // Else the element can only be present 
	            // in right subarray 
	            return binarySearch(arr, mid + 1, r, x); 
	        } 
	  
	        // We reach here when element is not present 
	        // in array 
	        return -1; 
	    } 
}  

bạn có thể tham khảo thuật toán ở đây

1 Like

Mình hiểu ý tưởng thuật toán bạn đang dùng đệ quy nhưng mình dùng cách khác và không dùng đệ quy. Mình chạy thuật toán mình viết ở trên thì vẫn ra kết quả đúng, không biết bạn bảo sai chỗ nào :((

Well nếu bạn nói vậy ta thử chạy code cua bạn |
Đầu tiên chưa compile thì dòng

System.out.println(m); //  warning The local variable m may not have been initialized 

Chĩ dòng này thôi thì code của bạn sao mà compile dc ? cái này lạ !!! Sr phần sx bác làm đúng gồi :hot_face:

À đoạn đấy bị lỗi mọi người ở trên cũng nói rồi mà, mình bị sai chỗ đấy nên code không chạy được, lệnh in ra m đấy mình chỉ thêm cho vui thôi, ai ngờ nó bị lỗi chứ không có ý nghĩa gì đâu.

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