01/10/2018, 14:41

Không thế nhập lại tháng khi nhập sai

Khi mình nhập ngày sai tháng đúng , năm đúng thì cho mình nhập lại
còn mình nhập ngày đúng , tháng sai thì nó báo lỗi
mình tìm mãi ko biết lỗi

import java.util.Scanner;

public class Ngay_Thang_Nam
{
	private int ngay, thang , nam ;
	public Ngay_Thang_Nam( int NGAY, int THANG , int NAM)
	{
		this.ngay = NGAY ;
		this.thang = THANG ;
		this.nam = NAM ;
	}
	public Ngay_Thang_Nam()
	{
		this.ngay = 1 ;
		this.thang = 1 ;
		this.nam = 1 ;
	}
	
	public Ngay_Thang_Nam(Ngay_Thang_Nam a)
	{
		this.ngay = a.ngay ;
		this.thang = a.thang ;
		this.nam = a.nam ;
	}

	
    public boolean HopLe()
    {
    	boolean dk = true;
        int dayMax[] = {-1,31,28,31,30,31,30,31,30,31,30,31,30};
        if(( nam % 4 ) == 0 &&( nam % 100 ) != 0 && (nam % 400) == 0)
        	dayMax[2]=29;
        if( ngay < 1 || ngay > dayMax[thang] || thang < 1 || thang > 12 || nam < 1)
        {
        return	dk = false ;
        }
		return dk;
        
    }
    
    
    public Ngay_Thang_Nam ngayhomsau()
    {
    	Ngay_Thang_Nam d = new Ngay_Thang_Nam(this);
    	d.ngay++;
    	if(d.HopLe() == false)
    	{
    		d.ngay = 1 ;
    		d.thang = d.thang + 1 ;
    	}
    	if(d.HopLe() == false)
    	{
 
    		d.thang = 1;
    		d.nam++ ;
    		
    	}
    	return d ;	
    	
    }
    public void set1()
    {
    	Scanner sc = new Scanner(System.in);
    	do
    	{
    		System.out.println("Nhap vao ngay ");
    		ngay = sc.nextInt();
   
    		System.out.println("Nhap vao thang ");
    		thang = sc.nextInt();
    		
    		System.out.println("Nhap vao nam ");
    		nam = sc.nextInt();
    		
    		
    				
    	}
    	while(HopLe()==false);
    	
    }
    public void get1()
    {
    	System.out.println(ngay+"/"+thang+"/"+nam);
    }
  
}

Đây là hàm main

public class test_contructor
{
   public  static void main(String[] args)
   {
	   Ngay_Thang_Nam Date = new Ngay_Thang_Nam();
	   Date.set1();
	   Date.get1();
	   
	   Date = Date.ngayhomsau();
	   Date.get1();
	   

	  
	  
	
   }


}
Đoàn Trọng Hiếu viết 16:54 ngày 01/10/2018

Nhập sai mà không cho nhập lại thì có lẽ là hàm HopLe() sai logic.
Để dễ dàng check hơn mình nghĩ bạn nên cho thêm data input đúng và sai.
*** Không biết đây là style code của bạn hay là ai hướng dẫn bạn code, nhưng bạn nên tìm hiểu thêm về coding convention của Java, bạn đặt tên class/biến/hàm quá nguy hiểm =))

Vĩ Huỳnh viết 16:42 ngày 01/10/2018

style code của mình đang sửa dần cảm ơn bạn. còn vấn đề hàm HopLe() Minh hok tìm thấy lỗi

Đoàn Trọng Hiếu viết 16:53 ngày 01/10/2018

Có phải lỗi ArrayIndexOutOfBoundsException không bác ?
Lần sau hỏi thì bác nói rõ là lỗi gì nhé

Vĩ Huỳnh viết 16:53 ngày 01/10/2018

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 25
at Ngay_Thang_Nam.HopLe(Ngay_Thang_Nam.java:33)
at Ngay_Thang_Nam.set1(Ngay_Thang_Nam.java:78)
at test_contructor.main(test_contructor.java:7)
đây bác lỗi đây ,

Đoàn Trọng Hiếu viết 16:46 ngày 01/10/2018

Bây giờ tớ phân tích từ từ cho bác nhé:
Bác có hiểu cái lỗi nó bảo gì không ?

Quân viết 16:45 ngày 01/10/2018

Dòng số 33: ngay > dayMax[thang] || thang < 1 || thang > 12

Bạn thấy sai lầm của mình chưa, giả sử tháng = -1 thì dayMax[-1] sẽ ra cái gì

Vĩ Huỳnh viết 16:47 ngày 01/10/2018

đây là xét điều kiện mà bạn nếu nó sai nó trả về false , nếu tháng ko hợp lệ thì daymax cũng ko hợp lệ

Quân viết 16:55 ngày 01/10/2018

bạn xem kĩ lại đi, không thể nói tháng k hợp lệ thì dayMax cũng k hợp lệ được, vì làm gì có phần tử ở vị trí -1 cho mà get

Vĩ Huỳnh viết 16:49 ngày 01/10/2018

ok bạn mình sửa được rùi lỗi ở cái để cái tháng chung câu điều kiện thì ko được tách ra một cái điều kiện khác thì ok

Đoàn Trọng Hiếu viết 16:44 ngày 01/10/2018

chốt lại vấn đề là hãy đọc kỹ lỗi mà nó ném vào mặt mình nhé bạn.
Hãy cảm thấy may mắn vì nó đã ném lỗi ra cho mình =))

Vĩ Huỳnh viết 16:52 ngày 01/10/2018

sr . được rùi cậu
vấn đề là trong câu điều kiện mình gộp chung thì ko được tách ra thì được

Đoàn Trọng Hiếu viết 16:54 ngày 01/10/2018

Bạn tách như nào thế, post lên mình xem chút được không ?

Vĩ Huỳnh viết 16:52 ngày 01/10/2018
if( ngay < 1 || ngay > dayMax[thang] || thang < 1 || thang > 12 || nam < 1)
        {
        return	dk = false ;
        }

thay đổi thành

if ( thang < 1 || thang > 12  )
return dk  = false ;
if(ngay < 1 || ngay > dayMax[thang] ||  nam < 1 )
return dk = false ;
HK boy viết 16:43 ngày 01/10/2018

Thực ra bạn viết ghép cũng được.

if (nam < 1 || thang < 1 || thang > 12 || ngay < 1 || ngay > dayMax[thang])
    return dk = false;

Các biểu thức điều kiện sẽ thực hiện từ phải sang trái, nếu gặp cái nào true thì coi như kết quả của cả biểu thức lớn là true luôn -> câu lệnh trong if được thực thi -> những trường hợp sau sẽ không thực hiện nữa.

Bài liên quan
0