BÁO CÁO BÀI TẬP LỚN NGÔN NGỮ LẬP TRÌNHNhóm sinh viên thực hiện: Ý tưởng của nhóm : Tạo ra một chương trình phần mềm dạng giống như một cuốn sổ ghi chép để người dùng có thể nhập thông t
Trang 1BÁO CÁO BÀI TẬP LỚN NGÔN NGỮ LẬP TRÌNH
Nhóm sinh viên thực hiện:
Ý tưởng của nhóm :
Tạo ra một chương trình phần mềm dạng giống như một cuốn sổ ghi chép để người dùng có thể nhập thông tin, bố sung thông tin , ghi chép lại các hàng hóa đã mua hàng ngày Ngoài ra , người dùng có thể thống kê danh sách hàng hóa đã nhập theo từng mục đích như thông tin hàng hóa xuất ra được sắp xếp theo tên hàng hóa, theo thời gian nhập hoặc theo giá tiền sản phẩm
Phương án thực hiện :
Sử dụng lập trình hướng đối tượng, tạo ra một class hanghoa với các dữ liệu của
một hàng hóa (tên, thời gian mua, giá tiền ) và các thao tác đối với nó Thiết kế cấu trúc
dữ liệu dạng danh sách móc nối để lưu thông tin về các hàng hóa đã mua, mỗi phần tử của danh sách là một hàng hóa Sử dụng thao tác với tệp để lưu và đọc thông tin khi cần
Các thao tác của người dùng sẽ được thiết kế dạng MENU
Các kiến thức được sử dụng trong chương trình :
+ Kiến thức về đối tượng (dữ liệu , hàm , chế độ riêng tư ,định nghĩa lại toán
tử, )
+ Cấu trúc dữ liệu (danh sách móc nối) , LIFO, FIFO
+ Các thuật toán tìm kiếm, sắp xếp
+ Thao tác vào , ra tệp
Từ sự chuẩn bị trên nhóm chúng em tiến hành viết chương trình như sau :
Chương trình có 3 đối tượng là:
class lich
class hanghoa
class soghichep
Trang 2Các lớp quan hệ với nhau thông qua quá trình gửi thông báo , được minh họa bằng sơ đồ sau :
Sơ đồ quan hệ giữa các nhóm
Chương trình :
Tao ra đối tượng “lich” để thể hiện thời gian một cách dễ dàng và hiệu quả
class lich { //lớp ngày tháng năm
public: unsigned int d,m,y;
public:
lich(unsigned int n=0,unsigned int t=0,unsigned int nam=0){ //hàm tạo
d=n;m=t;y=nam; }
void xuat(){ //hàm xuất thời gian ra màn hình
cout<<setw(2)<<d<<"/"<<setw(2)<<m<<"/"<<setw(4)<<y;}
void vao(){ /hàm nhập thời gian từ bàn phím
char a,b;
do{cin>>d>>a>>m>>b>>y;
if((d>31)||(m>12)) cout<<"Nhap sai -> nhap lai"<<endl;
}while((d>31)||(m>12));}
};
int operator ==(lich &a,lich &b) { /*định nghĩa toán tử bằng giữa 2 đối tượng của lop lich*/
if (a.y==b.y&&a.m==b.m&&a.d==b.d) return 1;
else return 0;
};
Tạo đối tượng “hàng hóa “ với các hàm nhập, xuất :
class hanghoa { //khai báo lớp hàng hóa
char* ten;
lich time;
int giatien;
public :
void nhapinfo() { //hàm nhập thong tin về hàng hóa
cout<<endl<<"ten hang hoa : ";
Trang 3cin.getline(ten,'\n');
cout<<endl<<"thoi gian mua : ";
time.vao();
cout<<endl<<"gia tien : ";
cin>>giatien;
}
void xuatinfo() { //hàm xuất thông tin về hàng hóa ra màn hình
cout.setf(ios::left);
cout<<setw(20)<<ten<<" ";
time.xuat();
cout<<" "<<setw(8)<<giatien<<endl;
}
friend class soghichep; // cho class soghichep la class bạn của class hang hoa // làm như thế để có thể truy cập vào các thành phần riêng tư của class “hanghoa”
};
Cài đặt cấu trúc móc nối để lưu trữ thông tin về danh sách hàng hóa:
struct Node { //khai báo cấu trúc danh sách
hanghoa value;
Node* next;
};
Tạo ra đối tượng soghichep để lưu và thực hiện thao tác với danh sách hàng hóa, lớp này
là lớp chính của chương trình , nó gồm các hàm để xử lí dữ liệu :
class soghichep { //khai báo lớp so ghi chep
PNode H; //con trỏ danh sách
char ch;
public:
void nhapds(); //hàm nhập thông tin cho danh sách móc nối các hàng hóa
void bosung(); //hàm bổ sung thông tin cho danh sách móc nối các hàng hóa
int size(); //hàm lấy số lượng hàng hóa có trong danh sách
void xuatds() ; //hàm xuất danh sách ra màn hình
void sapxepgiatien() ; //hàm sắp xếp danh sách theo thứ tự giảm dần của giá tiền
void sapxepten() ; //hàm sắp xếp danh sách theo tên
void sapxeptime(); //hàm sắp xếp danh sách theo thời gian trước sau
void muatrongngay(); //tìm kiếm các hàng hóa mua trong ngày được nhập từ bàn //phím
void ghitep(char *ttep); //hàm ghi danh sách vào một tệp
void doctep(char *ttep); //đọc từ tệp có sẵn
};
Định nghĩa các hàm trong lớp soghichep
Trang 4//Phần định nghĩa hàm trong class soghichep
void soghichep::nhapds() { //hàm nhập thông tin cho danh sách móc nối các hàng hóa PNode A,B;
A=new Node;
A->value.nhapinfo();
A->next=NULL;
H=A;
do{
cout<<endl<<"Nhan c/k (c-Co hoac k-Khong) "<<endl;cin>>ch;cin.ignore();
if(ch=='k') break;
B= new Node;
B->value.nhapinfo();
A->next=B;
B->next=NULL;
A=B;}while (1);
}
//nhập DS theo kiểu FIFO (vào trước ra trước) và bổ sung dần các phần tử vào cuối DS
void soghichep::bosung() {//hàm bổ sung thông tin cho danh sách móc nối các hàng hóa
PNode A;
A=new Node;
A->value.nhapinfo();
A->next=H;
H=A;
}
//Mỗi lần bổ sung sẽ có một phần tử được thêm vào đầu danh sách
int soghichep::size() { //hàm lấy số lượng hàng hóa có trong danh sách
PNode A=H;;
int n=0;
while (A!= NULL) {
n++;
A=A->next;}
return n;
} //sử dụng thuật toán duyệt danh sách
void soghichep::xuatds() { //hàm xuất danh sách ra màn hình
PNode A;
A=H;
cout<<"Danh sach hang hoa co trong so ghi chep : "<<endl;
if (H!=NULL)
do
{
A->value.xuatinfo();
A=A->next;
}while (A!= NULL);
} //Sử dụng thuật toán duyệt danh sách
Trang 5void soghichep::sapxepgiatien() { //hàm sắp xếp danh sách theo thứ tự giảm dần của giá //tiền
PNode A,B;
hanghoa td;
for(int i=0;i<size()-1;i++) { //Sử dụng thuật toán sắp xếp nổi bọt
//có size()-1 lần duyệt DS
A=H;
for (int j=0;j<size()-1-i;j++) { //mỗi lần duyệt qua danh sách, phần tử MIN về //cuối danh sách
B=A->next;
if (A->value.giatien < B->value.giatien) {
td=A->value;
A->value=B->value;
B->value=td;
};
A=B;
}; // sắp xếp theo thứ tự giảm dần
};
}
void soghichep::sapxepten() { //hàm sắp xếp danh sách theo tên
PNode A,B; // tương tự như sapxepgiatien()
hanghoa td;
for(int i=0;i<size()-1;i++) {
A=H;
for (int j=0;j<size()-1-i;j++) {
B=A->next;
if (strcmp(A->value.ten,B->value.ten)>0) {
td=A->value;
A->value=B->value;
B->value=td;
};
A=B;
}; //săp xếp theo ABC
};
}
void soghichep::sapxeptime() { //hàm sắp xếp danh sách theo thời gian trước sau
PNode A,B; // tương tự như sapxepgiatien()
hanghoa td;
for(int i=0;i<size()-1;i++) {
A=H;
for (int j=0;j<size()-1-i;j++) {
B=A->next;
int d=0;
if (A->value.time.y<B->value.time.y)d=1;
else if(A->value.time.y==B->value.time.y)
if (A->value.time.m<B->value.time.m) d=1;
Trang 6else if(A->value.time.m==B->value.time.m)
if (A->value.time.d<B->value.time.d) d=1;
if (d==1) {
td=A->value;
A->value=B->value;
B->value=td;
};
A=B;
}; //hàng hóa nào mua sớm nhất xếp trước
};
}
void soghichep::muatrongngay(){ //tìm kiếm các hàng hóa mua trong ngày được nhập
từ //bàn phím
lich ngay;int k=0;
PNode A;
A=H;
cout<<endl<<" nhap ngay de tim san pham: "<<endl;
ngay.vao();
cout<< " san pham " << endl;
if (H!=NULL) //Duyệt lần lượt từng phần tử cho đến hết danh sách
do {
if ( A->value.time == ngay ) {A->value.xuatinfo();k++;}
A=A->next;
} while (A!= NULL);
cout <<endl<< " co " << k << " san pham mua trong ngay"<<" ";ngay.xuat();
//in số lượng hàng hóa mua trong ngày đó ra màn hình
}
void soghichep::ghitep(char *ttep) { //hàm ghi danh sách vào một tệp
ofstream f(ttep);
PNode A;
A=H;
int n=size();
f <<n<<endl ; //dòng đầu là số lượng phần tử của danh sách
for (int i=1; i<=n;++i) { //ghi vào tệp mỗi phần tử chiếm 3 dòng
f.setf(ios::left);
f <<A->value.ten<<endl;
f<<A->value.time.d<<"/"<<A->value.time.m<<"/"<<A->value.time.y<<endl; f<<A->value.giatien<<endl;
A=A->next;
}
f.close();
cout<<"Da ghi tep xong";
}
void soghichep::doctep(char *ttep) { //hàm đọc từ tệp có sẵn
ifstream f;
f.open(ttep);
Trang 7if (f.bad()) { //nếu không mở được tệp thì dừng tất cả việc đọc tệp
cout << "\nTep " << ttep << " khong ton tai";
getch();
exit(1);
}
char ch1,ch2;
int n;
f>>n;
f.ignore();
PNode A,B;
A=new Node; //nếu mở thành công thì đọc danh sách như nhập dữ liệu cho các biến
f.getline(A->value.ten,'\n');
f>>A->value.time.d;
f>>ch1>>A->value.time.m;
f>>ch2>>A->value.time.y;
f>>A->value.giatien;
A->next=NULL;
H=A;
for (int i=1;i<n;i++) {
B=new Node;
f.ignore();
f.getline(B->value.ten,'\n');
f>>B->value.time.d;
f>>ch1>>B->value.time.m;
f>>ch2>>B->value.time.y;
f>>B->value.giatien;
A->next=B;
B->next=NULL;
A=B;
}
f.close();
cout<<"Da load xong" ;
};
Những thao tác trong hàm main() :
- Khai báo một đối tượng kiểu soghichep
- In MENU ra màn hình
while(1) {
cout.setf(ios::left); //in MENU ra màn hình
cout<<endl<<"Nhan cac so tuong ung de chon cac muc tuong ung "<<endl;
cout<<"1.Nhap danh sach hang hoa da mua vao so ghi chep"<<endl;
cout<<"2.Bo sung them hang hoa vua mua vao so ghi chep"<<endl;
Trang 8cout<<"3.Lay so luong hang hoa co trong danh sach"<<endl;
cout<<"4.Xuat nhung hang hoa da ghi trong SGC ra man hinh"<<endl;
cout<<"5.Sap xep cac hang hoa theo ten"<<endl;
cout<<"6.Sap xep cac hang hoa theo thoi gian"<<endl;
cout<<"7.Sap xep cac hang hoa theo gia tien"<<endl;
cout<<"8.Tim nhung HH mua trong ngay cho truoc"<<endl;
cout<<"9.Ghi DS hang hoa vao tep"<<endl;
cout<<"10.Load noi dung tu tep co san"<<endl;
cout<<"0.Thoat khoi chuong trinh"<<endl;
cin>>x; //nhập x –số thứ tự của thao tác
cout.unsetf(ios::left);
switch(x) {
case 1: cout<<"Nhap danh sach Hang hoa ; "<<endl; cin.ignore() ; a.nhapds();
a.ghitep("Soghichep.txt") ;
cout<<endl<<" Danh sach duoc luu vao file Soghichep.txt"<<endl;
cout<<"an phim bat ki de tiep tuc"; getch(); break;
case 2: a.doctep("Soghichep.txt") ; cin.ignore(); a.bosung();
cout<<"Neu muon luu lai thi hay dung thao tac 9"<<endl;
cout<<"an phim bat ki de tiep tuc";getch(); break;
case 3: cout<<"So luong phan tu cua danh sach la: "<<a.size();
cout<<endl<<"an phim bat ki de tiep tuc";
getch(); break;
case 4: a.xuatds(); cout<<"an phim bat ki de tiep tuc"; getch();break;
case 5: a.sapxepten(); cout<<"Danh sach sau khi sap xep : "<<endl; a.xuatds(); cout<<"an phim bat ki de tiep tuc"; getch(); break;
case 6: a.sapxeptime() ; cout<<"Danh sach sau khi sap xep : "<<endl; a.xuatds(); cout<<"an phim bat ki de tiep tuc"; getch();break;
case 7: a.sapxepgiatien(); cout<<"Danh sach sau khi sap xep : "<<endl;
a.xuatds();
cout<<"an phim bat ki de tiep tuc"; getch(); break;
case 8: a.muatrongngay(); cout<<endl<<"an phim bat ki de tiep tuc";
getch();break;
case 9: a.ghitep("Soghichep.txt"); cout<<endl<<"an phim bat ki de tiep
tuc"<<endl; getch();break;
case 10: a.doctep("Soghichep.txt"); cout<<endl<<"an phim bat ki de tiep
tuc"<<endl; getch();break;
default: cout<<"thoat";
}
if(x==0) break;}
//nếu x trùng với số của thao tác nào thì sẽ thực hiện các hàm tương ứng
//x=0 thì dừng chương trình và thoát
Trang 9****************HẾT***************