Tải bản đầy đủ (.doc) (54 trang)

bài tập lớn môn cấu trúc dữ liệu và giải thuật đề tài xây dựng bài toán quản lý kinh doanh điện thoại sử dụng danh sách liên kết đơn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.74 MB, 54 trang )

VIỆN ĐẠI HỌC MỞ HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN
----------------------

BÁO CÁO BÀI TẬP LỚN
MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

ĐỀ TÀI
XÂY DỰNG BÀI TOÁN QUẢN LÝ KINH DOANH
ĐIỆN THOẠI SỬ DỤNG DANH SÁCH LIÊN KẾT ĐƠN

Giáo viên hướng dẫn: Ths. Trịnh Thị Xuân
Sinh viên thực hiện : Nguyễn Đức Đại
Lớp
: 13A2

Hà Nội, năm 2015


MỤC LỤC
1.
2.

Giới thiệu đề tài...................................................................................................................3
Phân tích đề tài.....................................................................................................................3
2.1.
Dữ liệu cần lưu trữ trong đề tài.................................................................3
2.2.
Các chức năng cần thực hiện...................................................................4
2.3.


Thiết kế menu......................................................................................5
3. Phân tích chương trình.........................................................................................................6
3.1.
Thao tác khai báo thư viện:.....................................................................6
3.2.
Thao tác khai báo cấu trúc dữ liệu:............................................................6
3.3.
Thao tác khởi tạo Node:.........................................................................7
3.4.
Thao tác nhập dữ liệu:...........................................................................7
3.5.
Thao tác hiện toàn bộ danh sách đã nhập:..................................................10
3.6.
Thao tác chèn thêm vào đầu danh sách một điện thoại mới:...........................12
3.7.
Thao tác chèn thêm điện thoại vào cuối danh sách:......................................14
3.8.
Thao tác chèn thêm điện thoại vào sau một điện thoại theo mã:.......................16
3.9.
Thao tác xóa điện thoại theo mã:............................................................18
3.10. Thao tác xóa điện thoại mới được thêm:...................................................21
3.11. Thao tác xóa điện thoại theo tên điện thoại:...............................................23
3.12. Thao tác đếm số lượng điện thoại trong danh sách:......................................26
3.13. Thao tác đếm số lượng điện thoại có đơn giá < = 1000.000:...........................27
3.14. Thao tác đếm số lượng điện thoại có đơn giá <= 2000.000:............................28
3.15. Thao tác đếm số lượng điện thoại có đơn giá trên 2000.000:..........................30
3.16. Thao tác sắp xếp danh sách tăng dần theo đơn giá:......................................31
3.17. Thao tác sắp xếp danh sách điện thoại giảm dần theo đơn giá:........................32
3.18. Thao tác hiển thị toàn bộ danh sách điện thoại với tính trạng “Db”:.................34
3.19. Thao tác tìm kiếm theo mã:...................................................................35

3.20. Thao tác tìm kiếm điện thoại theo tên:......................................................36
3.21. Thao tác tìm kiếm điện thoại có đơn giá trong một khoảng:...........................38
3.22. Thao tác tìm kiếm điện thoại theo loại:.....................................................40
3.23. Thao tác tìm kiếm điện thoại theo hãng sản xuất:........................................41
3.24. Thao tác ghi danh sách điện thoại đã nhập vào file LIST_DT.........................43
3.25. Thao tác lấy thông tin danh sách điện thoại từ file đã ghi:..............................45
3.26. Thao tác hiển thị thông tin của điện thoại có đơn giá thấp nhất:.......................47
3.27. Thao tác hiển thị thông tin của điện thoại có đơn giá cao nhất:........................48
3.28. Thao tác tính tổng thành tiền của đơn giá tất cả điện thoại trong danh sách:.......50
3.29. Chức năng tính trung bình cộng của đơn giá tất cả điện thoại trong danh sách:....51
3.30. Thao tác thoát khỏi chương trình:...........................................................52
3.31. Code của chương trình chính:................................................................53

2


1. Giới thiệu đề tài
- Đề tài: Bài toán quản lý kinh doanh điện thoại.
- Cùng với sự phát triển mạnh mẽ của Khoa học – Kỹ thuật – Công nghệ, thị

trường điện thoại di động hiện nay cũng phát triển mạnh mẽ không kém với nhiều
loại mẫu mã sản phẩm khác nhau từ các loại điển thoại phổ biến dòng đen trắng như
nokia 1280, nokia 110i, .... cho đến các dòng điện thoại cao cấp như vertu, iphone,
samsung galaxy , …. Và để thuận tiện cho việc quản lý kinh doanh điện thoại thì
cần một phần mềm tối ưu hoa nhất.

2. Phân tích đề tài
2.1.Dữ liệu cần lưu trữ trong đề tài
-


Các dữ liệu cần quản lý:
 Mã điện thoại – kiểu: int
 Tên điện thoại – kiểu: char


Phân loại – kiểu: char

 Hãng sản xuất – kiểu: char
 Tình trạng – kiểu: char


Mã ĐT
1
2
3
4
5

Đơn giá – kiểu: long

Bộ dữ liệu đã nhập: (dữ liệu từ file)
Tên ĐT
Samsung Galaxy s6
Iphone 6
Lumia 535
BlackBerry Q5
Sony Xperia Z3

Phân loại
Hãng SX Tình trạng

Android
Samsung
Db
iOS
Apple
Cb
Windowsphone
Nokia
Db
BlackBerry 10 BlackBerry
Db
Android
Sony
Cb

Đơn giá
16500000
16000000
3500000
1100000
15000000

3


2.2.Các chức năng cần thực hiện
-

Các chức năng của chương trình:
 Thoát chương trình

 Thêm một điện thoại mới vào đầu danh sách
 Thêm một điện thoại vào cuối danh sách
 Thêm một điện thoại vào sau một điện thoại có mã “x”
 Thêm một danh sách điện thoại
 Import danh sách từ file
 Xóa một điện thoại theo mã
 Xóa một điện thoại theo tên
 Xóa điện thoại vừa mới được thêm vào
 Đếm số lượng điện thoại trong danh sách
 Đếm số lượng điện thoại có đơn giá <=1000.000
 Đếm số lượng điện thoại có đơn giá <=2000.000
 Đếm số lượng điện thoại có đơn giá >2000.000
 Sắp xếp tăng dần theo đơn giá
 Sắp xếp giảm dần theo đơn giá
 Hiện toàn bộ danh sách điện thoại
 Hiện toàn bộ danh sách điện thoại đã bán
 Tìm kiếm theo mã điện thoại
 Tìm kiếm theo tên điện thoại
 Tìm kiếm theo đơn giá trong khoảng từ a đến b
 Tìm kiếm theo loại điện thoại
 Tìm kiếm theo hãng sản xuất
 Ghi vào file danh sách đã nhập
 Hiện điện thoại có đơn giá thấp nhất
 Hiện điện thoại có đơn giá cao nhất
 Tổng thành tiền của tất cả điện thoại
 Trung bình đơn giá của một điện thoại

4



2.3.Thiết kế menu
__________CAC CHUC NANG CUA CHUONG TRINH_________
0. Thoat Chuong Trinh
1. Them Mot Dien Thoai Moi Vao Dau Danh Sach
2. Them Mot Dien Thoai Vao Cuoi Danh Sach
3. Them Mot Dien Thoai Vao Sau Mot Dien Thoai Co Ma 'x'
4. Them Mot Danh Sach Dien Thoai
5. Import Danh Sach Dien Thoai Tu File
6. Xoa Mot Dien Thoai Theo Ma
7. Xoa Dien Thoai Vua Moi Duoc Them Vao
8. Xoa Dien Thoai Theo Ten Dien Thoai
9. Dem So Luong Dien Thoai Trong Danh Sach
10. Dem So Luong Dien Thoai Co Don Gia <= 1000.000
11. Dem So Luong Dien Thoai Co Don Gia <= 2000.000
12. Dem So Luong Dien Thoai Co Don Gia > 2000.000
13. Sap Xep Tang Dan Theo Don Gia Dien Thoai
14. Sap Xep Giam Dan Theo Don Gia Dien Thoai
15. Hien Toan Bo Danh Sach Dien Thoai
16. Hien Toan Bo Danh Sach Co Tinh Trang 'da ban'
17. Tim Kiem Theo Ma Dien Thoai
18. Tim Kiem Theo Ten Dien Thoai
19. Tim Kiem Theo Don Gia Trong Khoang [a->b]
20. Tim Kiem Theo Loai Dien Thoai
21. Tim Kiem Theo Hang San Xuat
22. Ghi Vao FILE Danh Sach Dien Thoai
23. Dua Ra Thong Tin Dien Thoai Co Don Gia Thap Nhat
24. Dua Ra Thong Tin Dien Thoai Co Don Gia Cao Nhat
25. Tong Thanh Tien Cua Tat Ca Dien Thoai
26. Trung Binh Cong Don Gia Dien Thoai
Moi Chon Mot Chuc Nang:_


5


3. Phân tích chương trình
3.1.Thao tác khai báo thư viện:
Để thực hiện được toàn bộ chức năng cũng như các thao tác đối với yêu cầu
bài toán thì cần phải có đầy đủ bộ thư viện cần thiết. Bộ thư viện cần khai báo gồm:
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<iomanip>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<fstream>

3.2.Thao tác khai báo cấu trúc dữ liệu:
Cấu trúc cần khai báo trong bài toán gồm:
struct dienthoai
{
int madt;
char tendt[40];
char phanloai[15];
char hangsx[20];
char tinhtrang[10];
long dongia;
};
struct Node_DT
{

dienthoai info;
struct Node_DT *Next;
};
struct LIST_DT
{
Node_DT *Head;
6


Node_DT *Tail;
};

3.3.Thao tác khởi tạo Node:
Tạo danh sách rỗng và các nút rỗng
Node_DT *get_Node( dienthoai x )
{
Node_DT *p;
p = new Node_DT;
if( p == NULL )
{
cout<<"\n========> CAP PHAT KHONG THANH CONG!";
exit(1);
}
else
{
p->info=x;
p->Next=NULL;
}
return p;
}

void khoitaoDT( LIST_DT &DSDT)
{
DSDT.Head=NULL;
DSDT.Tail=NULL;
}

3.4.Thao tác nhập dữ liệu:
- Để quản lý kinh doanh điện thoại thì công việc cần thiết là ghi lại tất cả
thông tin của tất cả các mẫu điện thoại đang được bán và đã được bán.
- Các thông tin cần lưu trữ gồm:
7


 Mã điện thoại
 Tên điện thoại
 Phân loại
 Hãng sản xuất
 Tình trạng
 Đơn giá
- Ta có hàm nhập vào danh sách điện thoại:
int nhapDT( dienthoai &x, LIST_DT DSDT )
{
int s;
cout<<"\nMa Dien Thoai: ";
cin>>s;
if(quetmaDT(s,DSDT))
{
return 1;
}
else

{
fflush(stdin);
x.madt=s;
cout<<"\nTen Dien Thoai: ";
fflush(stdin);
gets(x.tendt);
chuanhoa(x.tendt);
cout<<"\nPhan Loai Dien Thoai: ";
fflush(stdin);
gets(x.phanloai);
chuanhoa(x.phanloai);
cout<<"\nHang San Xuat: ";
fflush(stdin);
gets(x.hangsx);
8


chuanhoa(x.hangsx);
cout<<"\nTinh Trang: ";
fflush(stdin);
gets(x.tinhtrang);
chuanhoa(x.tinhtrang);
cout<<"\nDon Gia: ";
fflush(stdin);
cin>>x.dongia;
return 0;
}
}
 Gọi hàm nhập trong main:
case 4:

{
system("cls");
cout<<"\nMoi nhap so luong dien thoai can nhap: ";
cin>>k;
for(int i=0; i{
system("cls");
cout<<"\n========> Bat dau nhap "<if(nhapDT(x,DSDT))
{
cout<<"\nKhong thanh cong!\n";
system("pause");
system("cls");
}
else
{
p=get_Node(x);
chendau(DSDT,p);
cout<<"\n\n";
system("pause");
system("cls");
}
}
break;
}

9


-


Kết quả khi chạy:

3.5.Thao tác hiện toàn bộ danh sách đã nhập:
Sau khi nhập một hoặc một danh sách điện thoại thì danh sách đó cần được
in ra màn hình.
- Code:
void hienDT( dienthoai x )
{
cout<<"\n";
cout<}
void hienDSDT( LIST_DT DSDT )
{
Node_DT *p;
p=DSDT.Head;
tieude();
while(p!=NULL)
{
hienDT( p-> info );
p=p->Next;
}
}

10


 Gọi hàm nhập trong main:
case 15:

{
system("cls");
if(DSDT.Head==NULL)
{
cout<<"\n========> Du lieu trong!...\n";
cout<<"\n\n";
system("pause");
system("cls");
break;
}
else
{
system("cls");
cout<<"\n========> Danh sach dien thoai\n";
hienDSDT(DSDT);
cout<<"\n\n";
system("pause");
system("cls");
break;
}
}
-

Kết quả khi chạy:

11


3.6.Thao tác chèn thêm vào đầu danh sách một điện thoại mới:
-


Code:
void chendau( LIST_DT &DSDT, Node_DT *p)
{
if(DSDT.Head==NULL)
{
DSDT.Head=p;
DSDT.Tail=p;
}
else
{
p->Next=DSDT.Head;
DSDT.Head=p;
}
}
 Gọi hàm nhập trong main:
case 1:
{
system("cls");
cout<<"\n________Nhap dien thoai moi vao dau danh
sach________\n";
if(nhapDT(x,DSDT))
{
cout<<"\nKhong thanh cong!\n\n";
system("pause");
system("cls");
break;
}
else
{

p=get_Node(x);
chendau(DSDT,p);
cout<<"\n\n";
system("pause");
system("cls");
break;
}
}

12


-

Kết quả khi chạy:

Danh sách điện thoại sau khi thêm vào một điện thoại mới

13


3.7.Thao tác chèn thêm điện thoại vào cuối danh sách:
-

Code:
void chencuoi( LIST_DT &DSDT, Node_DT *p)
{
if(DSDT.Head==NULL)
{
DSDT.Head=p;

DSDT.Tail=p;
}
else
{
DSDT.Tail->Next=p;
DSDT.Tail=p;
}
}
 Gọi hàm nhập trong main:
case 2:
{
system("cls");
cout<<"\n________Nhap dien thoai moi vao cuoi danh
sach________\n";
if(nhapDT(x,DSDT))
{
cout<<"\nKhong thanh cong!\n\n";
system("pause");
system("cls");
break;
}
else
{
p=get_Node(x);
chencuoi(DSDT,p);
cout<<"\n\n";
system("pause");
system("cls");
break;
}

}

14


-

Kết quả khi chạy:

Danh sách điện thoại sau khi thêm vào một điện thoại mới

15


3.8.Thao tác chèn thêm điện thoại vào sau một điện thoại theo mã:
Khi muốn thêm một điện thoại với mã nào đó vào sau một vị trí có sẵn
- Code:
Node_DT *timmadt(LIST_DT DSDT, int b)
{
Node_DT *p;
p=DSDT.Head;
while(p!=NULL)
{
if(p->info.madt==b)
break;
p=p->Next;
}
if(p!=NULL)
return p;
else return NULL;

}
void chensauma( LIST_DT &DSDT, Node_DT *p, Node_DT *q)
{
if(q!=NULL)
{
p->Next=q->Next;
q->Next=p;
if(q==DSDT.Tail)
{
DSDT.Tail=p;
}
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;
cout<<"\n========> Khong co du lieu!\n";
}
}
}
 Gọi hàm nhập trong main:

case 3:
{
int b;
system("cls");
cout<<"\n________Nhap dien thoai moi vao sau mot ma dien
thoai________\n";
cout<<"\nMoi nhap ma dien thoai truoc dien thoai can bo sung: ";
cin>>b;
q=timmadt(DSDT,b);


16


if(q!=NULL)
{
nhapDT(x,DSDT);
p=get_Node(x);
chensauma(DSDT,p,q);
cout<<"\n\n";
system("pause");
system("cls");
break;
}
}
-

Kết quả khi chạy:

Danh sách điện thoại sau khi thêm điện thoại mới

17


3.9.Thao tác xóa điện thoại theo mã:
Nếu không muốn một phần tử nào đó tồn tại trong danh sách ta thực hiện
chức năng xóa.
- Code:
int xoamadt( LIST_DT &DSDT )
{
int timma;

short int kt=0;
fflush(stdin);
system("cls");
cout<<"\nMoi Nhap Vao Mot Ma Dien Thoai Can Xoa: ";
cin>>timma;
Node_DT *p,*q=NULL;
p=DSDT.Head;
while(p!=NULL)
{
if(p->info.madt==(timma))
{
kt++;
break;
}
p=p->Next;
}
if(kt==0)
{
return 0;
}
else
{
if((p==DSDT.Head)&&(p==DSDT.Tail))
{
DSDT.Head=NULL;
DSDT.Tail=NULL;
free(p);
return 1;
}
else if(p==DSDT.Head)

{
DSDT.Head=DSDT.Head->Next;
free(p);
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;
cout<<"\n========> Khong co du lieu!\n";

18


}
}
else if(p==DSDT.Tail)
{
q=DSDT.Head;
while(q!=NULL)
{
if(q->Next==DSDT.Tail)
{
break;
}
q=q->Next;
}
DSDT.Tail=q;
DSDT.Tail->Next=NULL;
free(p);
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;

cout<<"\n========> Khong co du lieu!\n";
}
}
else
{
q=DSDT.Head;
while(q!=NULL)
{
if(q->Next==p)
{
break;
}
q=q->Next;
}
q->Next=p->Next;
free(p);
}
}
}

 Gọi hàm nhập trong main
case 6:
{
system("cls");
if(DSDT.Head==NULL)
{
cout<<"\n========> Du lieu trong!...\n";
cout<<"\n\n";
system("pause");
19



system("cls");
break;
}
else
{
int xoa=xoamadt(DSDT);
if(xoa==0)
{
cout<<"\nKhong tim thay ma!...\n";
system("pause");
system("cls");
break;
}
else if(xoa==1)
{
cout<<"\n========>Toan bo danh sach da duoc xoa!...\n";
system("pause");
system("cls");
break;
}
else
{
system("cls");
cout<<"\n========> Danh sach sau khi xoa\n";
hienDSDT(DSDT);
cout<<"\n\n";
system("pause");
system("cls");

break;
}
}
-

}
Kết quả khi chạy:

20


Danh sách điện thoại sau khi xóa

3.10. Thao tác xóa điện thoại mới được thêm:
-

Code:
int xoadtmoi( LIST_DT &DSDT )
{
Node_DT *p;
p=DSDT.Head;
if((p==DSDT.Head)&&(p==DSDT.Tail))
{
{
DSDT.Head=NULL;
DSDT.Tail=NULL;
free(p);
return 1;
}
}

else if(DSDT.Head!=NULL)
{
p=DSDT.Head;
DSDT.Head=DSDT.Head->Next;
free(p);
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;
}
}
}

21


-

 Gọi hàm nhập trong main
case 7:
{
system("cls");
if(DSDT.Head==NULL)
{
cout<<"\n========> Du lieu trong!...\n";
cout<<"\n\n";
system("pause");
system("cls");
break;
}
else

{
system("cls");
if(xoadtmoi(DSDT)==1)
{
cout<<"\n========> Toan bo danh sach da duoc xoa!...\n";
system("pause");
system("cls");
break;
}
else
{
cout<<"\n========> Danh sach sau khi xoa phan tu moi
them\n";
hienDSDT(DSDT);
cout<<"\n\n";
system("pause");
system("cls");
break;
}
}
}
Kết quả khi chạy:

22


3.11. Thao tác xóa điện thoại theo tên điện thoại:
Có thể xóa phẩn tử bằng thông tin về tên phần tử đó.
- Code:
int xoatheoten( LIST_DT &DSDT )

{
char timten[40];
short int kt=0;
system("cls");
cout<<"\nMoi nhap ten dien thoai can xoa: ";
fflush(stdin);
gets(timten);
chuanhoa(timten);
Node_DT *p, *q=NULL;
p=DSDT.Head;
while(p!=NULL)
{
if(strcmp(p->info.tendt,timten)==0)
{
kt++;
break;
}
p=p->Next;
}
if(kt==0)
{
cout<<" Khong ton tai ten: "<cout<<"\n";
}
else
{
if((p==DSDT.Head)&&(p==DSDT.Tail))
{
DSDT.Head=NULL;
DSDT.Tail=NULL;

free(p);
return 1;
}
else if(p==DSDT.Head
{
DSDT.Head=DSDT.Head->Next;
free(p);
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;

23


cout<<"\n========> Khong co du lieu!\n";
}
}
else if(p==DSDT.Tail
{
q=DSDT.Head;
while(q!=NULL)
{
if(q->Next==DSDT.Tail)
{
break;
}
q=q->Next;
}
DSDT.Tail=q;
DSDT.Tail->Next=NULL;

free(p);
if(DSDT.Head==NULL)
{
DSDT.Tail=NULL;
cout<<"\n========> Khong co du lieu!\n";
}
}
else
{
q=DSDT.Head;
while(q!=NULL)
{
if(q->Next==p)
{
break;
}
q=q->Next;
}
q->Next=p->Next;
free(p);
}
}
}
 Gọi hàm nhập trong main
case 8:
{
system("cls");
if(DSDT.Head==NULL)
{
24



cout<<"\n========> Du lieu trong!...\n";
cout<<"\n\n";
system("pause");
system("cls");
break;
}
else
{
xoatheoten(DSDT);
system("cls");
cout<<"\n========> Danh sach sau khi xoa\n";
hienDSDT(DSDT);
cout<<"\n\n";
system("pause");
system("cls");
break;
}
-

}
Kết quả khi chạy:

Danh sách điện thoại sau khi xóa

25



×