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

Đề tài: LT Hướng đối tượng??

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    0

    Post LT Hướng đối tượng??

    Em đang làm bài tập LT Hướng đối tượng.
    Đề bài là:
    Code:
    Xây dựng lớp Sinh viên  gồm có
    	-Dữ liệu: Masv, họ tên, nơi sinh, năm sinh
    	- Phương thức: nhập, in, so sánh (nhỏ hơn) theo họ tên
    Hàm main: nhập mảng A(n) các sinh viên, sắp xếp A theo thứ tự tăng dần theo họ tên, in mảng A ra màn hình, mỗi đối tượng trên 1 dòng.
    Em làm như sau:
    Code:
    #include <iostream>
    using namespace std;
    class sv {
          private:
                 char ten[20], noisinh[30];
                 int masv,namsinh;
          public:
                 void nhap();
                 void in();
          		 int sosanh(sv);
             };
    
    int main(){
        int n,i,j;
        sv *A,t;
        cout<<"Nhap so sv: "; cin>>n;
        A=new sv[n];
        for(i=1;i<=n;i++){
    					   cout<<"---Sinh vien thu "<<i<<endl;
    					   A[i].nhap();
    	   				  }
        for(i=1;i<=n;i++)
    		  for(j=0;j<=n-i;j++)
    		        if(A[j].sosanh(A[j+1])>0)
    		           {t=A[j];A[j]=A[j+1];A[j+1]=t;}
        cout<<"===================================\n";
    	cout<<"Danh sach sv xep theo Ho ten:\n";
    	cout<<"===================================\n";
     	cout<<"Ma sv\tTen sv\tNam sinh\tNoi sinh\n";
    	for(i=1;i<=n;i++) A[i].in();
    	system("pause");
            delete A;
    	return 0;
    }
    
    void sv::nhap(){
    	 cout<<"Nhap ma sv: "; cin>>masv;  cin.ignore(1);
    	 cout<<"Nhap ten sv: "; cin.getline(ten,30); 
    	 cout<<"Nhap nam sinh: "; cin>>namsinh; cin.ignore(1);
    	 cout<<"Nhap noi sinh: "; cin.getline(noisinh,60);
    }
    
    void sv::in()
    {cout<<masv<<"\t"<<ten<<"\t"<<namsinh<<"\t\t"<<noisinh<<endl;}
    
    int sv::sosanh(sv b){
    	int k;
    	k=strcmp(ten,b.ten);
    	return k;
    }
    Chương trình sắp xếp đc, in ra đc, nhưng sau đó Stop working... ngay lập tức. :((
    Mọi người giúp đỡ em với ạ, gà C quá.

  2. #2
    Ngày gia nhập
    11 2011
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi duongkimngoc Xem bài viết
    Chương trình sắp xếp đc, in ra đc, nhưng sau đó Stop working... ngay lập tức. :((
    Mình không hiểu ý bạn muốn nói gì? Có phải trên màn hình console sau khi in ra thì màn hình tự động exit làm bạn không xem được kết quả đúng không?
    Nếu đúng là ý này thì bạn có thể dùng lệnh để dừng màn hình hoặc tại trước dòng return, bạn dùng lệnh nhập vào 1 ký tự bất kỳ để thoát
    Ví dụ:
    int main()
    {

    //...

    //int Temp;
    //printf("Nhập bất kì ký tự để exit");
    //scanf("%d", &Temp);

    return 0;
    }

  3. #3
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    bạn có nhập cho phần tử a[0] ko.bắt đầu từ 1 lại so sánh vs 0
    HT117-5277

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

    Trích dẫn Nguyên bản được gửi bởi treatmaster Xem bài viết
    bạn có nhập cho phần tử a[0] ko.bắt đầu từ 1 lại so sánh vs 0
    Ôi viết lung tung quá, chỗ 0, chỗ 1.
    Em đã sửa đc rồi ạ.
    Code cuối cùng đây

    #include <iostream>
    using namespace std;
    class sv {
    private:
    char ten[20], noisinh[30];
    int masv,namsinh;
    public:
    void nhap();
    void in();
    int sosanh(sv);
    };

    int main(){
    int n,i,j;
    sv *A,t;
    cout<<"Nhap so sv: "; cin>>n;
    A=new sv[n];
    for(i=0;i<n;i++){
    cout<<"---Sinh vien thu "<<i+1<<endl;
    A[i].nhap();
    }
    for(i=0;i<=n-2;i++)
    for(j=0;j<=n-2-i;j++)
    if(A[j].sosanh(A[j+1])>0)
    {t=A[j];A[j]=A[j+1];A[j+1]=t;}
    cout<<"===================================\n";
    cout<<"Danh sach sv xep theo Ho ten:\n";
    cout<<"===================================\n";
    cout.setf(ios::left);
    cout.width(6); cout<<"Ma sv"; cout.width(20); cout<<"Ten sv";
    cout.width(10); cout<<"Nam sinh"; cout.width(30); cout<<"Noi sinh"<<endl;
    for(i=0;i<n;i++) A[i].in();
    system("pause");
    delete A;
    return 0;
    }

    void sv::nhap(){
    cout<<"Nhap ma sv : "; cin>>masv; cin.ignore(1);
    cout<<"Nhap ten sv : "; cin.getline(ten,30);
    cout<<"Nhap nam sinh: "; cin>>namsinh; cin.ignore(1);
    cout<<"Nhap noi sinh: "; cin.getline(noisinh,60);
    }

    void sv::in()
    {
    cout.width(6); cout<<masv; cout.width(20); cout<<ten;
    cout.width(10); cout<<namsinh; cout.width(30); cout<<noisinh<<endl;
    }

    int sv::sosanh(sv b) {return strcmp(ten,b.ten);}

  5. #5
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Một số cái sai trong bài của bạn như sau:
    1. Chỉ số của mảng bắt đầu từ 0, tức là nếu mảng chứ n phần tử thì chúng được đánh số từ 0 đến n - 1 chứ không phải từ 1 đến n. Vì vậy, đoạn này
    C++ Code:
    1.     for(i=1;i<=n;i++){
    2.                        cout<<"---Sinh vien thu "<<i<<endl;
    3.                        A[i].nhap();
    4.                       }
    phải sửa lại thành
    C++ Code:
    1.     for(int i = 0; i < n; ++i) // lưu ý chỉ số của mảng bắt đầu từ 0
    2.     {
    3.         cout<<"---Sinh vien thu "<< i + 1 << endl;
    4.         A[i].nhap();
    5.     }
    2. Phương pháp sắp xếp của bạn bị sai, và trong đấy có cái sai về cách đánh số (hay chỉ số) các phần tử của mảng
    Đoạn này
    C++ Code:
    1.     for(i=1;i<=n;i++)
    2.           for(j=0;j<=n-i;j++)
    3.                 if(A[j].sosanh(A[j+1])>0)
    4.                    {t=A[j];A[j]=A[j+1];A[j+1]=t;}
    phải đổi thành
    C++ Code:
    1.     for(int i = 0;i < n-1; ++i)
    2.           for(int j = i; j < n; ++j)
    3.                 if (A[j].sosanh(A[j+1]) > 0)
    4.                  {
    5.                        t=A[j];
    6.                        A[j]=A[j+1];
    7.                        A[j+1]=t;
    8.                 }
    3. Toán tử new và delete
    - sử dụng new đi kèm với delete
    - sử dụng new [] đi kèm với delete []
    Có nghĩa là trong bài của bạn, dòng này
    C++ Code:
    1. delete A;
    phải thay bằng
    C++ Code:
    1. delete [] A;
    4.* Cái này không phải là lỗi, nhưng nó mang tính chất ANSI-C và pascal chứ không phải đặc trưng của C++. Việc sử dụng biến linh động ở chỗ là ta khai báo khi cần dùng chứ không cần khai báo trước. Vì thế, thay vì việc khai báo trước
    C Code:
    1.     int n,i,j;
    2. // ...
    3.     for(i=1;i<=n;i++){
    4.                        cout<<"---Sinh vien thu "<<i<<endl;
    5.                        A[i].nhap();
    chúng ta khai báo khi cần
    C++ Code:
    1.     for(int i = 0; i < n; ++i) // lưu ý chỉ số của mảng bắt đầu từ 0
    2.     {
    3.         cout<<"---Sinh vien thu "<< i + 1 << endl;
    4.         A[i].nhap();
    5.     }
    5. Thay vào việc dùng cin.ignore(1); để loại các kí tự dư thừa từ dòng nhập thì bạn có thể dùng cin.sync(); sẽ an toàn hơn
    6.* Và dưới đây là bài viết của bạn, đã được sửa lại theo ý tưởng code của bạn để bạn tham khảo.
    C++ Code:
    1. #include <iostream>
    2. class sv {
    3.       private:
    4.              char ten[20], noisinh[30];
    5.              int masv,namsinh;
    6.       public:
    7.              void nhap();
    8.              void in();
    9.              int sosanh(sv);
    10.          };
    11.  
    12. using namespace std;
    13.  
    14. int main(){
    15.     int n;//,i,j;
    16.     sv *A;
    17.     sv t;
    18.     cout<<"Nhap so sv: ";
    19.     cin>>n;
    20.     A=new sv[n];
    21. /*    for(i=1;i<=n;i++){
    22.                        cout<<"---Sinh vien thu "<<i<<endl;
    23.                        A[i].nhap();
    24.                   }*/
    25.     for(int i = 0; i < n; ++i) // lưu ý chỉ số của mảng bắt đầu từ 0
    26.     {
    27.         cout<<"---Sinh vien thu "<< i + 1 << endl;
    28.         A[i].nhap();
    29.     }
    30.  
    31.     //for(i=1;i<=n;i++)
    32.           //for(j=0;j<=n-i;j++)
    33.           //      if(A[j].sosanh(A[j+1])>0)
    34.           //         {t=A[j];A[j]=A[j+1];A[j+1]=t;}
    35.     for(int i = 0; i < n-1; ++i)
    36.           for(int j = i; j < n; ++j)
    37.                 if (A[j].sosanh(A[j+1]) > 0)
    38.                  {
    39.                        t=A[j];
    40.                        A[j]=A[j+1];
    41.                        A[j+1]=t;
    42.                 }
    43.    
    44.     cout<<"===================================\n";
    45.  
    46.     cout<<"Danh sach sv xep theo Ho ten:\n";
    47.     cout<<"===================================\n";
    48.     cout<<"Ma sv\tTen sv\tNam sinh\tNoi sinh\n";
    49.  
    50.     for(int i = 0; i < n; i++)
    51.         A[i].in();
    52.  
    53.     system("pause");
    54.     delete [] A; // new [] <-> delete []
    55.                      // new    <-> delete
    56.     return 0;
    57. }
    58.  
    59. void sv::nhap(){
    60.      cout<<"Nhap ma sv: "; cin>>masv; //  cin.ignore(1);
    61.      cin.sync();
    62.      cout<<"Nhap ten sv: "; cin.getline(ten,30);
    63.      cin.sync();
    64.      cout<<"Nhap nam sinh: "; cin>>namsinh; // cin.ignore(1);
    65.      cin.sync();
    66.      cout<<"Nhap noi sinh: "; cin.getline(noisinh,60);
    67.      cin.sync();
    68. }
    69.  
    70. void sv::in()
    71. {cout<<masv<<"\t"<<ten<<"\t"<<namsinh<<"\t\t"<<noisinh<<endl;}
    72.  
    73. int sv::sosanh(sv b){
    74.     int k;
    75.     k=strcmp(ten,b.ten);
    76.     return k;
    77. }
    Mời các bạn ghé thăm blog cá nhân của tôi

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Mặc định LT Hướng đối tượng??

    Trích dẫn Nguyên bản được gửi bởi mp121209 Xem bài viết
    5. Thay vào việc dùng cin.ignore(1); để loại các kí tự dư thừa từ dòng nhập thì bạn có thể dùng cin.sync(); sẽ an toàn hơn
    Góp ý đoạn này tí, theo chuẩn thì std::istream::sync() không bắt buộc phải là làm sạch buffer, tùy từng bộ thư viện mà có tác dụng khác nhau. Cụ thể là trên Linux, với gcc 4.6.2 và icc 12.1 thì nó không có tác dụng. Chạy đoạn code ở đây thì kí tự '\n' của lần nhập trước vẫn không bị xoá khỏi buffer: http://www.cplusplus.com/reference/i.../istream/sync/

  7. #7
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Cái link mà bạn dẫn ra có chỗ nào nói giống như bạn nói đâu nhỉ :-/ Bạn nói điêu nó vừa phải thôi!
    Mời các bạn ghé thăm blog cá nhân của tôi

  8. #8
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi mp121209 Xem bài viết
    Cái link mà bạn dẫn ra có chỗ nào nói giống như bạn nói đâu nhỉ :-/ Bạn nói điêu nó vừa phải thôi!
    Mình có bảo là cái link kia nói như vậy đâu, chỉ bảo là đoạn code trong link kia không phải khi nào cũng hoạt động như ý muốn (ít nhất là với g++ và icc trên Linux).
    Còn link nói về vấn đề này ở đây: http://stdcxx.apache.org/doc/stdlibug/35-2.html
    Input streams define the sync() member function. It forces the stream to access the external device and refill its buffer, beginning with the current file position. In the case of input streams, the behavior of sync() is implementation-defined, that is, not standardized.

  9. #9
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Mình có bảo là cái link kia nói như vậy đâu, chỉ bảo là đoạn code trong link kia không phải khi nào cũng hoạt động như ý muốn (ít nhất là với g++ và icc trên Linux).
    Còn link nói về vấn đề này ở đây: http://stdcxx.apache.org/doc/stdlibug/35-2.html
    Tôi dùng Linux bao nhiêu năm nay chẳng bao giờ gặp vấn đề với sync() cả. Nếu bạn ý kiến về việc dùng sync(), vậy bạn có đưa ra giải pháp nào hữu hiệu hơn? Sử dụng ignore() chăng?
    Mời các bạn ghé thăm blog cá nhân của tôi

  10. #10
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi mp121209 Xem bài viết
    Tôi dùng Linux bao nhiêu năm nay chẳng bao giờ gặp vấn đề với sync() cả. Nếu bạn ý kiến về việc dùng sync(), vậy bạn có đưa ra giải pháp nào hữu hiệu hơn? Sử dụng ignore() chăng?
    Đây là cách tôi vẫn thường dùng: http://www.daniweb.com/software-deve...utorials/90228
    Đúng là dùng ignore, nhưng phải kiểm tra xem trong input stream buffer có thực sự tồn tại kí tự nào không trước đã.

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