Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [ Solved ]Quản lí học sinh ( sắp xếp theo điểm )

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    54

    Wink [ Solved ]Quản lí học sinh ( sắp xếp theo điểm )

    Code:
    // quan li hoc sinh
    # include<iostream.h>
    # include<stdio.h>
    class hs
     {   private:
    		 char ten[50];
    		 int diem;
    	  public:
    		 void nhap_diem()
    			{  cout<<"Nhap diem:";
    				cin>>diem;
    			}
    		  void nhap_ten()
    			{  cout<<"Nhap ten:";
    				gets(ten);
    			}
    		 int xuat_diem()
    			{   cout<<diem;
    			}
    		 void xuat_ten()
    			{ puts(ten);
    			}
    
    };
    class danh_sach
    {    private:
    		  hs *list;
    		  int n;
    	  public:
    		  void nhap();
    		  void sap_xep();
    };
    void danh_sach::nhap()
    {     cout<<"Nhap so hoc sinh la :";
    		cin>>n;
    		list=new hs[n];
    		for(int i=0;i<n;i++)
    		  {   cout<<"Nhap du lieu cho hoc sinh :"<<i<<endl;
    				list[i].nhap_ten();
    				list[i].nhap_diem();
    		  }
    }
    void danh_sach::sap_xep()
    {      int A[100];
    		 for(int i=0;i<n;i++)
    			A[i]=list[i].xuat_diem();
    		 for (i=0;i<n-1;i++)
    			for(int j=i+1;j<n;j++)
    			  if(A[i]>A[j])
    				  {   int t=A[i];
    					  A[i]=A[j];
    					  A[j]=t;
    				  }
    		 for( i=0;i<n;i++)
    		  cout<<A[i]<<' ';
    }
    void main()
    {    danh_sach p;
    	  p.nhap();
    	  p.sap_xep();
    }
    Bài này có tớ đang còn sai mong mọi người giúp .
    Nếu mình định sắp xếp theo tên thì phải làm thế nào
    Nếu mình khai báo hs *danh sach trong class hs có được ko
    Rất mong được mọi người giúp đỡ :

    Kiến thức mình biết chỉ là hạt cát trên sa mạc

  2. #2
    Ngày gia nhập
    09 2008
    Bài viết
    328

    PHP Code:
    // quan li hoc sinh
    # include<iostream.h>
    # include<stdio.h>
    class hs
     
    {   private:
             
    char ten[50];
             
    int diem;
          public:
             
    void nhap_diem()
                {
                    
    cout<<"Nhap diem:";
                    
    cin>>diem;
                }
              
    void nhap_ten()
                {
                    
    cout<<"Nhap ten:";
                    
    gets(ten);
                }
             
    int xuat_diem()
                {
                    
    cout<<diem;
                    return (
    diem);
                }
             
    void xuat_ten()
                {
                    
    puts(ten);
                }

    };
    class 
    danh_sach
    {
          private:
              
    hs *list;
              
    int n;
          public:
              
    void nhap();
              
    void sap_xep();
    };
    void danh_sach::nhap()
    {
            
    cout<<"Nhap so hoc sinh la :";
            
    cin>>n;
            list=new 
    hs[n];
            for(
    int i=0;i<n;i++)
              {
                    
    cout<<"Nhap du lieu cho hoc sinh :"<<i<<endl;
                    list[
    i].nhap_ten();
                    list[
    i].nhap_diem();
              }
    }
    void danh_sach::sap_xep()
    {      
    int A[100];
             for(
    int i=0;i<n;i++)
                
    A[i]=list[i].xuat_diem();
             for (
    int i=0;i<n-1;i++)
                for(
    int j=i+1;j<n;j++)
                  if(
    A[i]>A[j])
                      {   
    int t=A[i];
                          
    A[i]=A[j];
                          
    A[j]=t;
                      }
                      
    cout<<"\nSAU KHI SAP XEP:";
             for( 
    int i=0;i<n;i++)
              
    cout<<"\n"<<A[i]<<' ';
    }
    void main()
    {    
    danh_sach p;
          
    p.nhap();
          
    p.sap_xep();

    cậu sai khi không return diem

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    54

    uh , nhưng nó vẫn in thừa 1 dòng ,ai sửa giúp mình với .
    Mọi người bổ sung code của mình làm sao mà sau khi sắp xếp điểm nó in ra tên của người đó nữa . ví dụ: sau khi sắp xếp in ra
    lan : 8
    Nam : 9
    Hoa : 10
    Rất mong được mọi người giúp đỡ :

    Kiến thức mình biết chỉ là hạt cát trên sa mạc

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    724

    code mình đã sửa cho bạn rùi.
    bạn xem lại nhé.

    C Code:
    1. # include<iostream.h>
    2. # include<stdio.h>
    3. #include "conio.h"
    4. #include <string.h>
    5.  
    6. class hs
    7.  {   private:
    8.          char ten[50];
    9.          int diem;
    10.      
    11.       public:
    12.          void Xuat()
    13.          {
    14.              cout<<ten << "\t";
    15.              cout<<diem << endl;
    16.          }
    17.          void Nhap()
    18.          {
    19.              cout<<"Nhap diem:";
    20.              cin>>diem;          
    21.              cout<<"Nhap ten:";
    22.              flushall();
    23.              gets(ten);
    24.          }
    25.          // ham hoan vi thong tin 2 hoc sinh.
    26.          // ham nay dang ra de o ngoai nhung minh bo vao day cho tien(vi luoi).
    27.         void HoanVi(hs &hocsinh1, hs &hocsinh2)
    28.         {
    29.             hs hsTemp;
    30.             //gan hsTemp = hocsinh1;
    31.             hsTemp.diem = hocsinh1.diem;
    32.             strcpy(hsTemp.ten,hocsinh1.ten);
    33.  
    34.             //gan hocsinh1 = hocsinh2;
    35.             hocsinh1.diem = hocsinh2.diem;
    36.             strcpy(hocsinh1.ten,hocsinh2.ten);
    37.             //gan hocsinh2 = hsTmp;
    38.             hocsinh2.diem = hsTemp.diem;
    39.             strcpy(hocsinh2.ten,hsTemp.ten);
    40.         }
    41.        
    42.         //cai nay neu ban hoc operator roi thi nen dinh nghia mot operator cho no luon.
    43.         //khong biet ban hoc chua nen minh dung ham taczang vay.
    44.         int SoSanhTen(hs hocsinh) // neu ten cua hs1 > ten cua hs2 theo chuan thi tra ve 1
    45.                                     // khong thi tra ve 0(zero).
    46.         {
    47.             return strcmp(this->ten,hocsinh.ten);
    48.         }
    49.  
    50. };
    51. class danh_sach
    52. {    private:
    53.           hs *list;
    54.           int n;
    55.       public:
    56.           danh_sach();
    57.           ~danh_sach();
    58.           void Xuat();
    59.           void nhap();
    60.           void sap_xep();
    61.           void SapXepTen();      
    62. };
    63.  
    64.  
    65. danh_sach::danh_sach()
    66. {
    67.     ;
    68. }
    69. danh_sach::~danh_sach()
    70. {
    71.     if(list != NULL)
    72.         delete[]list;
    73. }
    74.  
    75. void danh_sach::SapXepTen()
    76. {
    77.     for(int i=0;i<n; i++)
    78.     {
    79.         for(int j=0; j<n; j++)
    80.         {      
    81.             if(list[i].SoSanhTen(list[j]) > 0)
    82.                 //neu ma ten thang list[i] lon hon ten thang list[j] thi lam
    83.                 list[i].HoanVi(list[i],list[j]);
    84.                
    85.         }
    86.     }
    87. }
    88.  
    89. void danh_sach::Xuat()
    90. {
    91.     for(int iIndex=0; iIndex<n; iIndex++)
    92.         list[iIndex].Xuat();
    93. }
    94. void danh_sach::nhap()
    95. {   cout<<"Nhap so hoc sinh la :";
    96.     cin>>n;
    97.     list=new hs[n];
    98.     for(int i=0;i<n;i++)
    99.     {  
    100.         cout<<"Nhap du lieu cho hoc sinh :"<<i<<endl;
    101.         list[i].Nhap();
    102.     }
    103.           //delete list; -- khong nen de no o day, chi delete no trong ham "huy"(detractor) thoi.
    104. }
    105. void danh_sach::sap_xep()
    106. {      
    107.     /*
    108.     int A[100];
    109.         for(int i=0;i<n;i++)
    110.             A[i]=list[i].xuat_diem();
    111.              for (i=0;i<n-1;i++)
    112.                 for(int j=i+1;j<n;j++)
    113.                   if(A[i]>A[j])
    114.                       {   int t=A[i];
    115.                           A[i]=A[j];
    116.                           A[j]=t;
    117.                       }
    118.              for( i=0;i<n;i++)
    119.               cout<<A[i]<<' ';*/
    120.    
    121. }
    122. void main()
    123. {
    124.     danh_sach p;
    125.     p.nhap();
    126.     cout<<endl<<"truoc khi xuat"<<endl;
    127.     p.Xuat();
    128.     p.SapXepTen();
    129.     cout<<"sau khi xuat"<<endl;
    130.     p.Xuat();
    131.  
    132.     getch();
    133. }


    chúc bạn thành công.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Chương trình trên của cậu zkday tui thấy có khá nhiều problems :
    - Trong C++ không có header iostream.h, standard C++ không có void main()
    - Cậu viết C++ mà lại dùng pure char[] thì thật là lãng phí. Dùng std::string.
    - gets() là "1 evil function" của C, vì sao thì chắc cậu cũng hiểu được. Dùng getline.
    - Hàm HoanVi quá nhiều chỗ thừa, dùng std::swap của STL hoặc viết 1 template version code sẽ đơn giản hơn nhiều.
    - Thiếu tính "const" cho rất nhiều hàm.
    - Không nên dùng input và output cùng nhau, code sẽ rất khó reuse.
    - class danh_sach dùng cấp phát động lại thiếu copy constructor và operator =, và đây là logic error. Nếu cậu không muốn client dùng nó, bắt buộc tạo definition và bỏ nó vào private.
    - Hàm bubble sort đó quá ư là tốn kém, có rất nhiều hàm sort có thể thay thế chỗ đó, hoặc nếu có dùng bubble cũng có thể dễ dàng viết lại 1 version tốt hơn.
    - Hàm này void danh_sach::nhap() là tiềm năng sinh bug. Về ý nghĩa design nó quá tồi, giả nếu tui gọi 2 lần nhập thì destructor chẳng bao giờ được gọi. Tên hàm cũng chẳng mang ý nghĩa là nên nhập cả danh sách hay 1 phần tử. Giả nếu cậu đưa interface cho user thì họ làm sao biết dùng nó thế nào. Chỗ này nên chỉ để client thêm từng học sinh vào danh sách thì mang rõ ý nghĩa hơn.
    - Tại sao lớp hocsinh lại không có constructor với 2 tham số mà chỉ để nhập vào ?
    - Dùng cout và cin trực tiếp trong hàm có 1 bất lợi là chi output ra được kết quả, dùng ostream và istream code sẽ uyển chuyển hơn ( ghi thẳng vào file chẳng hạn ).
    ->
    - Nếu muốn tốt hơn nữa có thể cho tất cả method của lớp danhsach là virtual vì nếu sau này nếu muốn kế thừa 1 danh sách khác cũng có thể dễ dàng hơn. Hoặc dùng generic template cho list* cũng là 1 good choice.
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3.  
    4. using namespace std;
    5.  
    6. template< typename T >
    7. void HoanVi( T& lhs, T& rhs )
    8. {
    9.     T temp = rhs;
    10.     rhs    = lhs;
    11.     lhs    = temp;
    12. }
    13.  
    14. void xuatThongDiep( const string& td )
    15. {
    16.     cout << td;
    17. }
    18.  
    19. const string thong_diep[ 10 ] =
    20. {
    21.     "Nhap Ten : "
    22.     ,
    23.     "Nhap Diem : "
    24.     ,
    25.     "Danh sach cac hoc sinh : \n"
    26. };
    27.  
    28.  
    29. class HocSinh
    30. {  
    31. private :
    32.     string m_ten;
    33.     int    m_diem;
    34.  
    35. public :
    36.     HocSinh( string ten = "", int diem = 0 )
    37.         :m_ten( ten ), m_diem( diem )
    38.     {   }
    39. public :
    40.     ostream& Xuat( ostream& out ) const
    41.     {
    42.         return out << m_ten << "\t" << m_diem << endl;
    43.     }
    44.    
    45.     istream& Nhap( istream& in )
    46.     {
    47.         xuatThongDiep( thong_diep[ 0 ] );
    48.         getline( in, m_ten );
    49.         xuatThongDiep( thong_diep[ 1 ] );
    50.         in >> m_diem;
    51.         in.ignore( '\n', 80 );
    52.  
    53.         return in;
    54.     }
    55.  
    56. public :
    57.     bool operator ==( const HocSinh& rhs ) const
    58.     {
    59.         return m_ten == rhs.m_ten;
    60.     }
    61.  
    62.     bool operator !=( const HocSinh& rhs ) const
    63.     {
    64.         return !( *this == rhs );
    65.     }
    66.  
    67.     bool operator <( const HocSinh& rhs ) const
    68.     {
    69.         return m_ten < rhs.m_ten;
    70.     }
    71.  
    72.     bool operator >( const HocSinh& rhs ) const
    73.     {
    74.         return !( *this < rhs );
    75.     }
    76.  
    77. public :
    78.     friend
    79.     ostream& operator <<( ostream& out, const HocSinh& rhs )
    80.     {
    81.         return rhs.Xuat( out );
    82.     }
    83.  
    84.     friend
    85.     istream& operator >>( istream& in, HocSinh& rhs )
    86.     {
    87.         return rhs.Nhap( in );
    88.     }
    89. };
    90.  
    91.  
    92. class DanhSachHocSinh
    93. {    
    94. private:
    95.     HocSinh* m_danh_sach;
    96.     int      m_so_hocsinh;
    97.  
    98. public:
    99.     DanhSachHocSinh()
    100.         :m_so_hocsinh( 0 ), m_danh_sach( NULL )
    101.     {   }
    102.    
    103.     ~DanhSachHocSinh()
    104.     {
    105.          if( m_danh_sach != NULL )
    106.             delete[] m_danh_sach;
    107.                  m_danhsach = NULL;
    108.     }
    109.  
    110.     DanhSachHocSinh( const DanhSachHocSinh& rhs )
    111.     {
    112.         *this = rhs;
    113.     }
    114.  
    115. public :
    116.     ostream& XuatDanhSach( ostream& out ) const
    117.     {
    118.         xuatThongDiep( thong_diep[ 2 ] );
    119.         for( int i = 0; i < m_so_hocsinh; ++i )
    120.         {
    121.             out << m_danh_sach[ i ];
    122.         }
    123.        
    124.         return out;
    125.     }
    126.  
    127.     void ThemMotHocSinhVaoDanhSach( const HocSinh& hoc_sinh_moi )
    128.     {
    129.         DanhSachHocSinh hien_thoi;
    130.  
    131.         if( this != NULL )
    132.         {
    133.             hien_thoi = *this;
    134.             delete[] m_danh_sach;
    135.         }
    136.        
    137.         m_danh_sach = new HocSinh[ m_so_hocsinh + 1 ];
    138.         for( int i = 0; i < m_so_hocsinh; ++i )
    139.         {
    140.             m_danh_sach[ i ] = hien_thoi.m_danh_sach[ i ];
    141.         }
    142.        
    143.         m_danh_sach[ m_so_hocsinh ] = hoc_sinh_moi;
    144.         m_so_hocsinh                = m_so_hocsinh + 1;
    145.     }
    146.  
    147.     void SapXepHocSinhTheoTen()
    148.     {
    149.         bool dau_hieu = false;
    150.         for( int i = 1; ( i < m_so_hocsinh ) && !dau_hieu; ++i )
    151.         {
    152.             dau_hieu = true;
    153.             for( int j = 0; j < m_so_hocsinh - i; ++j )
    154.             {
    155.                 if( m_danh_sach[ j ] > m_danh_sach[ j + 1 ] )
    156.                 {
    157.                     HoanVi( m_danh_sach[ j ], m_danh_sach[ j + 1 ] );
    158.                     dau_hieu = false;
    159.                 }
    160.             }
    161.         }
    162.     }
    163.  
    164. public :
    165.     const DanhSachHocSinh& operator =( const DanhSachHocSinh& rhs )
    166.     {
    167.         if( this != &rhs )
    168.         {
    169.             m_so_hocsinh = rhs.m_so_hocsinh;
    170.  
    171.             delete[] m_danh_sach;
    172.            
    173.             m_danh_sach = new HocSinh[ m_so_hocsinh ];
    174.             for( int i = 0; i < m_so_hocsinh; ++i )
    175.             {
    176.                 m_danh_sach[ i ] = rhs.m_danh_sach[ i ];
    177.             }
    178.         }
    179.  
    180.         return *this;
    181.     }
    182.  
    183. public :
    184.     friend ostream& operator <<( ostream& out, const DanhSachHocSinh& rhs )
    185.     {
    186.         return rhs.XuatDanhSach( out );
    187.     }
    188. };
    189.  
    190.  
    191. int main()
    192. {
    193.     DanhSachHocSinh o;
    194.    
    195.     HocSinh a( "Lang", 88 );
    196.     HocSinh b( "Bao", 100 );
    197.     HocSinh c( "Tien", 93 );
    198.     HocSinh d( "Uyen", 97 );
    199.  
    200.  
    201.     o.ThemMotHocSinhVaoDanhSach( a );
    202.     o.ThemMotHocSinhVaoDanhSach( b );
    203.     o.ThemMotHocSinhVaoDanhSach( c );
    204.     o.ThemMotHocSinhVaoDanhSach( d );
    205.    
    206.     o.SapXepHocSinhTheoTen();
    207.  
    208.     cout << o << "\n";
    209.  
    210.     return 0;
    211. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 21-09-2008 lúc 06:44 AM.

  6. #6
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Mặc định [ Solved ]Quản lí học sinh ( sắp xếp theo điểm )

    hihi. giải thích cho bài viết của mình một xíu.

    Do zkday nghĩ là thangit chưa học đến phần operator, và phần template nên không viết nó vào.(ở trong code zkday cũng có ghi chú rõ cho các đoạn đó.) và ở đây do với tư tưởng chỉ sửa bài nên zkday sẽ cố gắng giữ được càng nhiều code của tác giả càng tốt.(vì ngày xưa lúc mới học các thầy TA của mình đều giúp mình như vậy cả. và zkday hiểu ý của họ là từ những cái mình viết và ý tưởng của mình thì mình sẽ dễ dàng nắm bắt được vấn đề hơn là đưa cho họ một đoạn code xa lạ. và sau này họ sẽ tiếp cận được với mấy cái đó một cách thích thú chứ không phải là sợ nó.[zkday có quen một vài anh khóa trước(giờ đã đi làm trái nghề) thậm chí là tránh học các môn có đụng đến code. do họ sợ code(cái này thì zkday không hiểu tại sao??? ) ])


    đây chỉ là ý kiến cá nhân của zkday thôi. có gì mong anh em góp ý nhé.


    ok. thank r2 đã góp ý. những bài sau zkday sẽ cố gắng viết theo chuẩn.
    quả thực là khi đọc bài của r2 mình thấy bài của mình có rất nhiều vấn đề trong OOP.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 21-09-2008 lúc 09:27 PM.

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - r2 hiểu zkday biết, nhưng ở phương diện 1 coder thì thực sự đọc code kiểu chắp vá như thế là rất khó chịu ! Nhất là cái kiểu void main() và iostream.h.
    - Với lại 1 phần học coder không phải là cao siêu gì nhưng nó đòi hỏi tính cẩn thẩn và để ý cao độ, vì những chi tiết tưởng chừng nhưng không có gì mà lại sinh bug thì thật sự rất đau đầu.
    - Mình cảm giác các cậu ở VN học rất sướng, yêu cầu đề bài chỉ cần code chạy là được không cần style, design gì hết. Project ở đây mình viết đa phần từ 3000-5000 dòng, + report chắc cũng phải ít nhất là 2 tờ A4, những bài dài thì những cả 6000-7000. Đầu tiên là exe run thứ 2 là nội dung design... Cho nên project nào mình cũng viết rất cẩn thận !
    - Mình khó chịu với mấy bạn newbie ở đây như vậy thứ 1 là để họ biết là khi học phải cố gắng, để sau này học lên mà cứ mơ mơ màng màng không biết C++, C có những điểm mạnh nào thì làm sao ! Với lại rèn từ đầu sau này sẽ hay hơn.
    - Và quả thật có rất nhiều bạn viết đến cả VC++, C#... nhưng đọc code C++ của họ cứ như cực hình vậy ! Họ chỉ biết viết để cho mục tiêu của đề bài, design idea, identifier... họ đều không cần biết đến, cứ chắp và cho run là GOOD !!!

  8. #8
    Ngày gia nhập
    09 2007
    Bài viết
    724

    ừ cảm ơn r2 đã góp ý. Nghe r2 nói zkday mới thực sự nhận ra là tới giờ zkday vẫn còn là newbie đối với C++ mặc dù đã tiếp cận với nó từ gần 2 năm trước, đã làm nhiều đồ án môn học mang tiếng là c++ nhưng thiệt ra chỉ là phép lai giữa C++ và C thôi.
    OK. từ nay các bài viết trên 4rum của zkday trên box C++ zkday sẽ cố viết theo style chuẩn. (cho nó quen )

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    No problem !

Các đề tài tương tự

  1. Chương trình quản lí sinh viên viết trong visual c++ 2010. Lỗi không chạy khi in danh sách sinh viên theo năm
    Gửi bởi hikaru1015 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 9
    Bài viết cuối: 03-06-2011, 09:31 AM
  2. Cài đặt chương trình quản lí sinh viên kí túc xá theo Hướng Đối Tượng
    Gửi bởi kenthien trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 14-04-2010, 05:36 PM
  3. Chương trình quản lý sinh viên viết bằng C. Làm sao tìm kiếm sinh viên theo tên và sắp xếp?
    Gửi bởi linhdong24 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 24-06-2009, 12:53 AM
  4. BT Quản lý sinh viên C++. Lỗi hàm sắp xếp theo Hoten
    Gửi bởi bkhamvn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 14-04-2009, 10:35 PM
  5. [ Solved ]Chương trình quản lí sinh viên
    Gửi bởi nakaru_snow trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 16
    Bài viết cuối: 19-09-2008, 01:55 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn