30/09/2018, 20:50

Mọi người cho e hỏi đoạn code này sai ở đâu ạ

e chạy đc mà nó cứ đến đoạn Lietke là dừng chương trình ạ , e cảm ơn .

#include<iostream>
#include <conio.h>
#include <string.h>
#include<fstream>
using namespace std;



 struct Dausach{
    string TenSach,TacGia,TheLoai;
    int SoTrang,NamSx ,ISBN;
};

 struct node{
    Dausach d;
    node *next;
};

struct List{
    
    node *First ;
    node *Last ;
};
 void KhoiTao(List & l){
     l.First =l.Last =NULL;
     
     
}    
 node * getNode(Dausach &ds ){
     node *p =new node ;
     if(p==NULL){
         return NULL ;
     }
     
     p->d=ds;
     p->next=NULL;
     return p ;
 }    




node * Search(List l, int x)
{
    for (node * p = l.First;  p  != NULL ; p=p->next )
              if ( p->d.ISBN == x  ) return p;
    return NULL;
}

void NhapDs (Dausach & ds)  {
    
    List l;
    node * p ;
    
                NhapLai:
                cout<<"Nhap ISBN :";
                cin>>ds.ISBN;
                if(ds.ISBN<=0){
                    cout <<"Ma ISBN khong hop le ! Xin nhap lai"<<endl ;
                    goto NhapLai ;
                }
                if(Search(l ,ds.ISBN)){
                    cout<<"Ma ISBN bi trung .Xin nhap lai !";
                    cout<<endl;
                    goto NhapLai ;
                }
                fflush (stdin);
                cout << "
Ten sach :" ;
                fflush (stdin);
                getline(cin,ds.TenSach);
                
                cout << "
Tac gia :" ;
                fflush (stdin);
                getline(cin,ds.TacGia);
                
                cout << "
The Loai :" ;
                fflush (stdin);
                getline(cin,ds.TheLoai);
                
                cout<<"
Nhap So Trang :";
                cin>>ds.SoTrang;
                
                cout<<"
Nhap Nam San Xuat :";
                cin>>ds.NamSx;        
                
                p = new node ;
                p->d = ds ; p->next=NULL;
            
            
              }
    
    
    


void LietKe (List l ) {
    
    node * r = l.First ;
    int dem =1 ; 
    
    if (r==NULL){
        cout<<"danh sach rong ! ";
    }
    else while(r!=NULL){
            cout<<"
 ------------------------------------------";
            cout<<"
 |        Sach thu: "<<dem ++<<"          |";
            cout<<"
 ------------------------------------------";

            cout<<"
 Ma ISBN : "<<r->d.ISBN ;
            cout<<"
 Ten Sach: "<<r->d.TenSach;
            cout<<"
 Tac Gia : "<<r->d.TacGia;
            cout<<"
 The Loai: "<<r->d.TheLoai;
            cout<<"
 SO Trang: "<<r->d.SoTrang;
            cout<<"
 Nam Xuat Ban: "<<r->d.NamSx;
        
            r=r->next;
            cout<<"
 ------------------------------------------";
    }
}

int Menu(){
    int c ;
    cout<<endl<<endl <<endl <<"       Chuc nang cua chuong trinh "<<endl;
    cout<<"      ----------------------------------------------------------------"<<endl;
    cout<<"      |     0 : Thoat.                                               |"<<endl;
    cout<<"      |     1 : Nhap doc gia.                                        |"<<endl;
    cout<<"      |     2 : Xuat danh sach doc gia .                             |"<<endl;
    cout<<"      |     3 : Nhap dau sach.                                       |"<<endl;
    cout<<"      |     4 : Xuat danh sach sach.                                 |"<<endl;
    cout<<"      |     5 : Tim Sach.                                            |"<<endl;
    cout<<"      |     6 : Muon sach.                                           |"<<endl;
    cout<<"      |     7 : Tra sach.                                            |"<<endl;
    cout<<"      |     8 : Danh sach sach doc gia dang muon.                    |"<<endl;
    cout<<"      |     9 : Danh sach doc gia muon sach qua han.                 |"<<endl;
    cout<<"      |     10: 10 cuon sach co nhieu nguoi muon nhat.               |"<<endl;
    cout<<"      ----------------------------------------------------------------"<<endl;
    cout<<"Ban chon : ";
    cin>>c;
    
    return c;
}
    
int  main() {
    
    List l ;
    Dausach ds;
    

    NhapDs (ds) ;
    
    LietKe(l);
    return 0 ;
}
Nguyễn Anh Khoa viết 22:53 ngày 30/09/2018

bạn đóng khung lai đoạn code đi nhìn thế này rời rạc quá

tuan viết 22:59 ngày 30/09/2018

mình mới tham ra lên k bít . bạn xem cho mình chỗ hàm liet ke có sai k ?

Nguyễn Anh Khoa viết 22:53 ngày 30/09/2018

trước include phải có dấu “#”, và return 0; chứ ko phải return 0 ; cơ bản là các dấu ; phải sát vào cuối câu chứ stynax error chắc ở đó rùi

tuan viết 22:54 ngày 30/09/2018

k .mấy cái đó mình làm đúng hết rồi .mà k hiu sao copy qua đây nó ra vậu . mình chỉ hỏi bạn chỗ hàng liệt kê sao ct chạy đến đó nó lại dừng lại

Nguyễn Anh Khoa viết 22:58 ngày 30/09/2018

r=r->next;

bạn bỏ đoạn code này và thử lại nhé

tuan viết 22:53 ngày 30/09/2018

hàm liệt kê đó nó chỉ chạy đc đến
Sach thu: “<<dem ++<<”
còn khúc sau nó k chạy vào đc

Nguyễn Anh Khoa viết 22:54 ngày 30/09/2018

cout<<"\n ------------------------------------------";
cout<<"\n | Sach thu: “<<dem ++<<” |";
cout<<"\n ------------------------------------------";

khúc code này bạn thêm 2 đoạn trên dưới làm gì vậy và sao khoảng

cout<<"\n ------------------------------------------";
cout<<"\n | Sach thu: “<<dem ++<<” |";
cout<<"\n ------------------------------------------";

    cout<<"\n Ma ISBN : "<<r->d.ISBN ;
    cout<<"\n Ten Sach: "<<r->d.TenSach;
    cout<<"\n Tac Gia : "<<r->d.TacGia;
    cout<<"\n The Loai: "<<r->d.TheLoai;
    cout<<"\n SO Trang: "<<r->d.SoTrang;
    cout<<"\n Nam Xuat Ban: "<<r->d.NamSx;

xa ghế

Nguyễn Anh Khoa viết 22:52 ngày 30/09/2018

trình biên dịch bị hiểu nhầm nên nó mới chạy đến sachthu đó

tuan viết 22:52 ngày 30/09/2018

thế là sai ở đâu bạn . bạn sửa lại cái

Nguyễn Anh Khoa viết 22:54 ngày 30/09/2018
      '" 
    cout<<"\n ------------------------------------------";
    cout<<"\n |        Sach thu: "<<dem ++<<"          |";
    cout<<"\n ------------------------------------------";
    cout<<"\n Ma ISBN : "<<r->d.ISBN;
    cout<<"\n Ten Sach: "<<r->d.TenSach;
    cout<<"\n Tac Gia : "<<r->d.TacGia;
    cout<<"\n The Loai: "<<r->d.TheLoai;
    cout<<"\n SO Trang: "<<r->d.SoTrang;
    cout<<"\n Nam Xuat Ban: "<<r->d.NamSx;
    cout<<"\n ------------------------------------------";
    r=r->next;

“”

tuan viết 22:56 ngày 30/09/2018

mình đã khai báo d đâu bạn .

Nguyễn Anh Khoa viết 23:06 ngày 30/09/2018

mình sửa lại rùi

tuan viết 23:04 ngày 30/09/2018

sai j thế bạn . bạn sửa lại cho m cái

I am Z viết 22:51 ngày 30/09/2018

Bài này sai khá nhiều chỗ. Mình sẽ chỉ ra vấn đề, bạn tự sửa rồi có gì hỏi lại mình sau.

 void KhoiTao(List & l){
     l.First =l.Last =NULL;
}  

Hàm này không cần thiết, có thể khởi tạo NULL cho hai member của struct list ngay trong lúc khởi tạo list.

List l = {NULL, NULL};

Lỗi thứ 2 xuất phát từ việc nắm không kĩ khái niệm scope, local variable.

void NhapDs (Dausach & ds)  {
    
    List l;
    ...
}
.
.
.
int  main() {
    
    List l ;
    ...
}

Hai List l trong hai đoạn code trên khác nhau hoàn toàn.

if(Search(l ,ds.ISBN)){
    cout<<"Ma ISBN bi trung .Xin nhap lai !";
    cout<<endl;
    goto NhapLai ;
}

Đoạn này thì hàm Search gọi vào List l có 2 member (.First, .Last) chưa được khởi tạo dẫn đến Undefined Behavior.

LietKe(l);

Vì hai member của List l strong hàm main chưa được khởi tạo nêncũng sẽ dẫn đến Undefined Behavior (Có thể crash chương trình hoặc không).

Còn khá nhiều lỗi khác trong chương trình này:

  • Chưa sử dụng linked list đúng cách.
  • Sau hàm NhapDs(); gíá trị các member của List l không đổi (không cho trỏ vào bất cứ đâu).
  • Nên xem lại cách clear buffer trong C++.
  • Các hàm còn lại không thực hiện bất cứ chức năng gì trong chương trình này nên mình không nhận xét.
I am Z viết 22:52 ngày 30/09/2018

Cái đó là khai báo node của linked list, hoàn toàn k sai gì hết.

Bài liên quan
0