Announcement

Collapse
No announcement yet.

nhờ các anh chị giúp, co thuat toán so sánh ngày tháng nào gọn hơn ko??

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] nhờ các anh chị giúp, co thuat toán so sánh ngày tháng nào gọn hơn ko??

    Ví dụ e có 2 lớp ChuyenBay và DSCB như sau.. trong lớp ChuyenBay co hàm so sánh ngày thang để su dụng trong hàm SapXep trong lớp DSCB, e nghi hoài chưa ra dc cach nao de so sanh dc nên phải dùng đại cach so sanh dễ hiểu nhất, có a chị nào biết code nào ngắn hơn thì chỉ e voi
    Code:
    #include <iostream.h>
    struct Ngay {
    	int d, m, y; //Ngày, tháng, n?m
    };
    struct Gio {
    	int h, m, s; //Gi?, phút, giây
    };
    
    class ChuyenBay
    {
    private:
    Ngay ngay_bay; 	//Ngày bay
    Gio gio_bay;		//Gi? bay
    char Noi_di[30];	//N?i ?i
    char Noi_den[30];	//N?i ??n
    public:
    	ChuyenBay ();	//Hàm thi?t l?p không ??i s?
    	void Nhap();		//Nh?p m?t chuy?n bay
    	void Xuat(); 		//Xu?t m?t chuy?n bay
    	int SoSanh(const ChuyenBay &u); //So sánh ngày bay c?a hai chuy?n bay
    };
    class DSCB //L?p danh sách chuy?n bay
    {
    private:
    	int n;			//S? chuy?n bay
    	ChuyenBay *p; 	//Con tr? t?i vùng nh? ch?a danh sách chuy?n bay
    public:
    	DSCB (); 		//Hàm thi?t l?p không ??i s?
    	DSCB (int nn); 	//Hàm thi?t l?p m?t ??i s?
    	DSCB (const DSCB &u);			//Hàm thi?t l?p sao chép
    	DSCB & operator=(const DSCB &u); 	//Hàm toán t? gán
    	~ DSCB (); 		//Hàm hu? b?
    	void Nhap(); 		//Hàm nh?p danh sách chuy?n bay
    	void Xuat();		//Hàm xu?t danh sách chuy?n bay
    	void SapXep();  //S?p x?p danh sách chuy?n bay t?ng d?n theo ngày bay
    };
    int ChuyenBay::SoSanh(const ChuyenBay &u)
    {
    	int ret;
    	if (ngay_bay.y > u.ngay_bay.y)
    		ret = 1;
    	else
    	{
    		if(ngay_bay.y < u.ngay_bay.y)
    			ret = 0;
    		else
    		{
    			if(ngay_bay.m > u.ngay_bay.m)
    				ret = 1;
    			else
    			{
    				if(ngay_bay.m < u.ngay_bay.m)
    					ret = 0;
    				else
    				{
    					if(gio_bay.h > u.gio_bay.h)
    						ret = 1;
    					else
    					{
    						if(gio_bay.h < u.gio_bay.h)
    							ret = 0;
    						else
    						{
    							if(gio_bay.m > u.gio_bay.m)
    								ret = 1;
    							else
    							{
    								if(gio_bay.m < u.gio_bay.m)
    									ret = 0;
    								else
    								{
    									if(gio_bay.s > u.gio_bay.s)
    										ret = 1;
    									else
    									{
    										if(gio_bay.s < u.gio_bay.s)
    											ret = 0;
    										else ret = -1;
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}[QUOTE][/QUOTE]
    	return ret;
    }
    void DSCB::SapXep()
    {
    	for(int i=0;i<n-1;i++)
    		for(int j=i+1;j<n;j++)
    			if(p[i].SoSanh(p[j]) == 1)
    			{
    				ChuyenBay tam = p[i];
    				p[i] = p[j];
    				p[j] = tam;
    			}
    }
    Last edited by 11520213; 08-03-2012, 22:36.
    Tôi là một cơn gió. Và gió thì phải được tự do

  • #2
    Nếu bạn overload các toán tử so sánh ở các cấu trúc Ngay và Gio riêng biệt thì code so sánh thời gian sẽ gọn hơn rất nhiều, đồng thời cũng dễ nhìn hơn.
    Chưa....

    Comment


    • #3
      nghia la sao anh noi rõ them cho em dc ko, em chua hieu lam
      Tôi là một cơn gió. Và gió thì phải được tự do

      Comment


      • #4
        Nghĩa là bạn định nghĩa lại dấu >, <, =,... thì code đơn giản hơn nhiều ^_^
        Có thể đại học không là cánh cửa duy nhất để vào đời, nhưng trước khi bạn đủ lớn để biết mình muốn gì thì đại học là "tấm vé" bảo đảm rằng bạn có ít nhất một giá trị.

        Comment


        • #5
          Em có thể làm thế này. Chuyển ngày sang một định dạng kiểu số nguyên (int chẳng hạn : 31/12/1991 -> 19911231) thứ tự, như thế thì việc so sánh sẽ đơn giản hơn nhiều,
          20111231 > 19911231, vậy há,
          Phạm Minh Tâm
          Phone: 01643-652-922
          Skype ID: tampham47@live.com

          Comment


          • #6
            Bình mới rượu cũ
            Code:
            	if (ngay_bay.y > u.ngay_bay.y) ret = 1; else
            	if(ngay_bay.y < u.ngay_bay.y) ret = 0; else
            	if(ngay_bay.m > u.ngay_bay.m) ret = 1; else
            	if(ngay_bay.m < u.ngay_bay.m) ret = 0; else
            	if(gio_bay.h > u.gio_bay.h) ret = 1; else
            	if(gio_bay.h < u.gio_bay.h) ret = 0; else
            	if(gio_bay.m > u.gio_bay.m) ret = 1; else
            	if(gio_bay.m < u.gio_bay.m) ret = 0; else
            	if(gio_bay.s > u.gio_bay.s) ret = 1;	else
            	if(gio_bay.s < u.gio_bay.s) ret = 0;	else ret = -1;
            	return ret;
            Bình mới rượu hơi cũ
            Code:
            long long int candidate1,candidate2;
            candidate1 = gio_bay.s + gio_bay.m * 100 + gio_bay.h * 10000 + ngay_bay.h * 1000000 + ngay_bay.y * 100000000;
            candidate1 = u.gio_bay.s + u.gio_bay.m * 100 + u.gio_bay.h * 10000 + u.ngay_bay.h * 1000000 + u.ngay_bay.y * 100000000;
            if (candidate1 > candidate2) ret = 1; else
            if (candidate1 < candidate2) ret = 0; else ret = -1;
            Originally posted by 09520434 View Post
            Em có thể làm thế này. Chuyển ngày sang một định dạng kiểu số nguyên (int chẳng hạn : 31/12/1991 -> 19911231) thứ tự, như thế thì việc so sánh sẽ đơn giản hơn nhiều,
            20111231 > 19911231, vậy há,
            chỉ chậm hơn 1 phút thôi sao (
            Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

            Comment


            • #7
              ok em lam dc roi, hieu roi, cam on may anh Trần Xuân Chiến, Nguyễn Đăng Châu, Phạm Minh Tâm nhiu lam
              Tôi là một cơn gió. Và gió thì phải được tự do

              Comment

              LHQC

              Collapse
              Working...
              X