Tính khoảng cách giữa 2 ngày, tháng, năm bất kì

Thảo luận trong 'C/C++' bắt đầu bởi lyvinhr00m, 21 Tháng ba 2011.

  1. Offline

    lyvinhr00m

    • cụ lý

    Số bài viết:
    1.234
    Đã được thích:
    930
    Điểm thành tích:
    900
    Nhìn có vẻ dài dòng nhưng theo mình thì cũng rất dễ hiểu:
    Ý tưởng:
    - Nhập 2 ngày/tháng/năm bất ki
    - Lấy 1/1/1 làm mốc
    - Tính số ngày từ 1/1/1 đến 2 ngày vừa nhập
    - Trừ 2 số ngày đó sẽ được khoảng cách giữa 2 ngày/tháng/năm vừa nhập

    Đây là Code của mình...^^

    Mã:
    #include <iostream>
    using namespace std;
    struct day
    {
    	unsigned int ngay,thang,nam;
    };
    
    
    int khoangcach(day a)
    {
    	int t,t1,t2,t3,t4,t5,t6,t7,t8,t9;
    //Tru nam
    	for(int i=1; i<=a.nam; i++)
    	{	
    		if((i%4==0 && i%100!=0)||(i%400==0)) t4=t4+1; else t5=t5+1;
    		t1=t4*366+t5*365;
    	}
    //Tru thang
    	for(int j=1; j<=a.thang; j++)
    	{
    		if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) t6=t8+1;
    		else
    			if(j==4||j==6||j==9||j==11) t7=t9+1;
    			else if((j%4==0 && j%100!=0)||(j%400==0)) t8=t6+1; else t9=t7+1;
    	}
    		t2=t6*31+t7*31+t8*29+t9*28;
    
    //Tru ngay
    	for(int k=1;k<=a.ngay;k++)
    		t3=t3+1;
    //Khoang cach
    	t=t1+t2+t3;
    	return t;
    }
    
    void main()
    {
    	
    	day day1,day2;
    	cout<<"Nhap ngay thang nam 1..."<<endl;
    	cout<<"Nhap ngay...:"; cin>>day1.ngay;
    	cout<<"Nhap thang...:"; cin>>day1.thang;
    	cout<<"Nhap nam...:"; cin>>day1.nam;
    	cout<<endl;
    	cout<<"Nhap ngay thang nam 2..."<<endl;
    	cout<<"Nhap ngay...:"; cin>>day2.ngay;
    	cout<<"Nhap thang...:"; cin>>day2.thang;
    	cout<<"Nhap nam...:"; cin>>day2.nam;
    	cout<<"2 nam sau khi nhap"<<endl;
    	cout<<"Nam 1:"<<day1.ngay<<"/"<<day1.thang<<"/"<<day1.nam<<endl;
    	cout<<"Nam 2:"<<day2.ngay<<"/"<<day2.thang<<"/"<<day2.nam<<endl;
    	cout<<"Khoang cach nam 1 va nam 2 \t"<<khoangcach(day2)-khoangcach(day1)<<"ngay"<<endl;
    	
    }
    
    
    hoahongtrang, integer, pro9x1 người khác thích bài này.
  2. Offline

    pro9x

    • Thành Viên Mới

    Số bài viết:
    15
    Đã được thích:
    2
    Điểm thành tích:
    0
    p/s: Nên dùng switch sẽ gọn hơn ^^^
  3. Offline

    phuc113

    • ÔI CÁI CUỘC ĐỜI NÀY

    • HOSTING - DOMAIN - VPS - THIẾT KẾ WEB
    Số bài viết:
    623
    Đã được thích:
    277
    Điểm thành tích:
    220
    cài này mình làm ko bik có đc ko, keke, hơi dài nhưng dễ hiểu
  4. Offline

    tdhung2106

    • Thành Viên Mới

    Số bài viết:
    34
    Đã được thích:
    15
    Điểm thành tích:
    0
    đã yếu rồi còn ra gió́! lập trình không đúng thì đừng có post lên!
    sai bét nè: thử ví dụ tính 2 ngày này coi: 23/02/2011 và 31/02/2011.
  5. Offline

    lyvinhr00m

    • cụ lý

    Số bài viết:
    1.234
    Đã được thích:
    930
    Điểm thành tích:
    900
    ở đây mình chưa kiểm tra điều kiện nhập:
    Đơn giản ở đây là muốn kiểm tra cách tính số ngày giữa 2 ngày bất kì

    Đây là đoạn kiểm tra điều kiện nhập:

    Mã:
    bool kt_ngay(int nam, int thang, int ngay)
    {
    if((nam%4==0 && nam%100!=0)||(nam%400==0))
    	if(thang==2)
    		if(ngay==29) return true;
    		else return false;
    
    }
    void nhap(day d)
    {
    	cout<<"Nhap ngay"; cin>>d.ngay;
    	cout<<"Nhap thang"; cin>>d.thang;
    	cout<<"Nhap nam;"; cin>>d.nam;
    	while(d.ngay>31 || d.thang>12 || kt_ngay(d.nam, d.thang, d.ngay)==false)
    {
    	cout<<"Nhap lai..."<<endl;
     cin>>d.ngay>>d.thang>>d.nam;
    
    }
    	
    }
    void main()
    {
    	
    	day day1,day2;
    	cout<<"Nhap ngay/thang/nam 1:"<<endl;
    	nhap(day1);
    	cout<<"Nhap ngay/thang/nam 2:"<<endl;
    	nhap(day2);
    	cout<<"2 nam sau khi nhap"<<endl;
    	cout<<"Nam 1:"<<day1.ngay<<"/"<<day1.thang<<"/"<<day1.nam<<endl;
    	cout<<"Nam 2:"<<day2.ngay<<"/"<<day2.thang<<"/"<<day2.nam<<endl;
    	cout<<"Khoang cach nam 1 va nam 2 \t"<<khoangcach(day2)-khoangcach(day1)<<"ngay"<<endl;
    	
    }
    
    @tdhung2106:làm rồi thì share cho mọi người với nào ^^
  6. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    Code nên căn tab và bỏ trong thẻ [code cho dễ nhìn.

    Lấy khoảng thời gian từ đầu năm đến tháng thứ nhất trừ khoảng thời gian từ đầu năm đến tháng thứ 2 là ra khoảng cách giữa 2 tháng. Điều kiện là tháng lớn hơn mới trừ được tháng nhỏ hơn.
    xét đoạn sau:
    Mã:
    m1>m2 ? (max=m1,min=m2):(max=m2,min=m1);
    
    Tham khảo code của mình:
    Mã:
    #include <iostream>
    using namespace std;
    typedef struct
    {
        int day;
        int month;
        int year;
    } date_time;
    date_time today;
    ///kiem tra nam nhuan
    bool check_year(int year)
    {
        if((year%400==0)||(year%4==0 && year%100!=0))
            return true;
        else
            return false;
    }
    ///tra ve so ngay cua 1 nam
    int day_of_year(int year)
    {
        if(check_year(year)==true)
            return 366;
        else
            return 365;
    }
    ///tra ve so ngay cua 1 thang
    int day_of_month(int month,int year)
    {
        switch(month)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
            break;
        case 2:
        {
            if(check_year(year)==true)
                return 29;
            else
                return 28;
        }
        break;
        default:
            return 0;
            break;
        }
    }
    ///tinh so ngay da qua tu dau nam nay. Khong tinh nam
    int time_until_now(int day,int month,int year)
    {
        if(day>31 || day < 1 || month > 12 || month < 1)
            return 0;
        int sum_month=0;
        for(int i=0; i<month; i++)
            sum_month+=day_of_month(i,year);
        return sum_month+day;
        ///tra ve so ngay + so ngay cua tung thang
    }
    ///tinh khoang cach giua 2 thang
    int time_between_month()
    {
        int max,min,m1,m2;
        cout<<"Enter two months : "<<endl;
        cin>>m1>>m2;
        m1>m2 ? (max=m1,min=m2):(max=m2,min=m1);
        cout<<"Day between two month: "<<time_until_now(0,max,1)-time_until_now(0,min,1)<<endl;
    
    }
    main()
    {
        int d,m,y;
        cout<<"Enter Day Month Year: "<<endl;
        cin>>today.day>>today.month>>today.year;
    
        ///so ngay da qua tu 1/1/1 tinh dem ngay thang nam vua nhap
        cout<<"Time until now: "<<time_until_now(today.day,today.month,today.year)<<endl;
        ///
    
        ///tinh so ngay cua tung nam tu nam 1 den nam ngay nhap vao
        int sum_year=0;
        for(int i=0; i<today.year; i++)
            sum_year+=day_of_year(i);
        ///
    
        ///so ngay trong nam nay + so ngay tu ngay 1 den dau nam nay
        cout<<"Time from 1/1/1: "<<sum_year+time_until_now(today.day,today.month,today.year)<<endl;
        ///
    
        ///nhap 2 thang bat ky, tra ve so ngay giua 2 thang
        time_between_month();
        ///
    
    }
    
    
    
    lyvinhr00m thích bài này.
  7. Offline

    lyvinhr00m

    • cụ lý

    Số bài viết:
    1.234
    Đã được thích:
    930
    Điểm thành tích:
    900
    Đoạn kiểm tra điều kiện nhập chưa đủ cho lắm ^^
  8. Offline

    hoekaka

    • Windows 95

    Số bài viết:
    359
    Đã được thích:
    114
    Điểm thành tích:
    90
    Đú thêm cái ... ko có phần kiểm tra dk:
    Mã:
    void c7(ngaytn b[])
    	{	cout<<"nhap ngay: ";cin>>b[0].ngay;
    		cout<<"nhap thang: ";cin>>b[0].thang;
    		cout<<"nhap nam: ";cin>>b[0].nam;
    		cout<<"nhap ngay: ";cin>>b[1].ngay;
    		cout<<"nhap thang: ";cin>>b[1].thang;
    		cout<<"nhap nam: ";cin>>b[1].nam;
    		int ngayt=0;
    		for(int i=b[0].nam+1;i<b[1].nam;i++)
    			{ 	if((i%400==0)||((i%4==0)&&(i%100!=0)))
    					ngayt=ngayt+366; 
    				else ngayt=ngayt+365;
    			}
    		for(int i=1;i<b[1].thang;i++)
    			{	if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
    					ngayt=ngayt+31;
    				else if (i==2)
    					ngayt=ngayt+28;
    				else 
    					ngayt=ngayt+30;
    			}
    		for(int i=b[0].thang+1;i<=12;i++)
    			{	if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
    					ngayt=ngayt+31;
    				else if (i==2)
    					ngayt=ngayt+28;
    				else 
    					ngayt=ngayt+30;
    			}
    		if(((b[0].nam%400==0)||((b[0].nam%4==0)&&(b[0].nam%100!=0)))&&(b[0].thang<3))
    			ngayt=ngayt+1;
    		if(((b[1].nam%400==0)||((b[1].nam%4==0)&&(b[1].nam%100!=0)))&&(b[1].thang>2))
    			ngayt=ngayt+1;
    		if(b[0].thang==1||b[0].thang==3||b[0].thang==5||b[0].thang==7||b[0].thang==8||b[0].thang==10||b[0].thang==12)
    					ngayt=ngayt+31-b[0].ngay;
    				else if (b[0].thang==2)
    					ngayt=ngayt+28-b[0].ngay;
    				else 
    					ngayt=ngayt+30-b[0].ngay;
    		ngayt=ngayt+b[1].ngay-1;
    	}
    lyvinhr00m thích bài này.

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí