Tải bản đầy đủ (.pdf) (42 trang)

Đồ án giải thuật và lập trình quản lý vật tư

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 (502.85 KB, 42 trang )

Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 1
LỜI NÓI ĐẦU

Cấu trúc dữ liệu và Phân tích, thiết kế giải thuật là hai học phần rất quan trọng đối với
người lập trình. Học phần này được xem như nền tảng của lập trình máy tính. Nó là cơ sở vũng
chắc để giải quyết nhiều bài toán, đồng thời cung cấp cho chúng ta hiểu biết về các giải thuật tác
động lên dữ liệu, cũng như cách tổ chức dữ liệu hiệu quả để tối ưu bài toán.
Sau khi học xong học phần lí thuyết, nhóm chúng em đã nghiên cứu và thực hiện đồ án
này như là một cách để củng cố và mở rộng kiến thức. Thông qua quá trình thực hiện đồ án,
chúng em đã nắm bắt được những kỹ thuật quan trọng của việc xây dựng cấu trúc dữ liệu và
phân tích, thiết kế giải thuật sao cho tối ưu nhất.
Bài toán “Quản lý vật tư” mà nhóm chúng em nghiên cứu và trình bày trong báo cáo sau
đây là một ví dụ.
Em xin chân thành cảm ơn thầy Phan Chí Tùng đã bổ sung ý tưởng và tận tình giúp đỡ
chúng em thực hiện đồ án này. Em cũng rất mong nhận được sự góp ý từ phía thầy để bài làm
của chúng em được hoàn thiện hơn.

Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 2

ĐỀ TÀI

Quản lý vật tư.
Thực hiện các yêu cầu liên quan đến bài toán quản lý vật tư.

Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 3
MỤC LỤC

LỜI NÓI ĐẦU 1


ĐỀ TÀI 2
MỤC LỤC 3
DANH MỤC HÌNH ẢNH 5
DANH MỤC BẢNG BIỂU, SƠ ĐỒ 6
1. Sơ đồ 6
2. Bảng biểu 6
I. GIỚI THIỆU 7
1. Vật tư và vấn đề quản lý 7
2. Quản lý vật tư 7
3. Đề tài đồ án và hướng giải quyết 8
II. PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG QUẢN LÝ 8
1. Phân tích bài toán 8
a. Yêu cầu bài toán 8
b. Dữ liệu vào 9
c. Dữ liệu ra 9
2. Thiết kế cấu trúc dữ liệu và giải thuật 9
a. Cấu trúc dữ liệu 9
b. Các giải thuật tương ứng cho các yêu cầu 11
c. Các giải thuật bổ sung khác 23
3. Đánh giá độ phức tạp của thuật toán 31
a. Thuật toán sắp xếp 31
b. Thuật toán tìm kiếm 32
c. Thuật toán liên quan đến tính toán và hiển thị 33
III. CÀI ĐẶT VÀ ĐÁNH GIÁ KẾT QUẢ 34
1. Cài đặt bài toán 34
a. Nhập dữ liệu từ file 35
b. Nhập dữ liệu từ bàn phím 35
c. In danh sách thông tin của tất cả vật tư 36
d. Bổ sung thêm một mẫu tin vào cuối danh sách 36
e. Tìm kiếm mẫu tin theo nhiều tiêu chí 36

f. Sắp xếp theo thứ tự giảm dần 36
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 4
g. Sắp xếp theo thứ tự tăng dần 37
h. Chèn mẫu tin sao cho mảng vẫn được sắp xếp có thứ tự 37
i. Xóa một mẫu tin 38
j. Xóa vật tư có số lượng lớn hớn 100 38
k. Tính thành tiền 38
l. In bảng thống kê 39
m. Ghi dữ liệu vào file 39
n. Thoát khỏi chương trình 40
2. Đánh giá kết quả 40
KẾT LUẬN 41
TÀI LIỆU THAM KHẢO 42




Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 5
DANH MỤC HÌNH ẢNH

Hình 1: Giao diện khởi chạy màn hình chính 34
Hình 2: Nhập dữ liệu thành công 35
Hình 3: Nhập dữ liệu không thành công 35
Hình 4: Nhập dữ liệu từ bàn phím 35
Hình 5: In danh sách thông tin của tất cả các vật tư 36
Hình 6: Tìm kiễm mẫu tin theo nhiều tiêu chí 36
Hình 7: Sắp xếp dữ liệu theo thứ tự tăng dần Mã vật tư 36
Hình 8: Chèn mẫu tin và sắp xếp theo thứ tự tăng dần Mã vật tư 37

Hình 9: Xóa một mẫu tin theo nhiều tiêu chí 38
Hình 10: Xóa các vật tư có số lượng lớn hơn 100 38
Hình 11: Tính thành tiền 38
Hình 12: Bảng thống kê theo các cột loại vật tư, số lượng, tổng tiền 39
Hình 13: Ghi dữ liệu vào file 39
Hình 14: Thoát khỏi chương trình 40









Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 6
DANH MỤC BẢNG BIỂU, SƠ ĐỒ

1. Sơ đồ
Sơ đồ 1: Các thuật toán liên quan trong chương trình 31

2. Bảng biểu
Bảng 1: Thông tin vật tư và kiểu dữ liệu 9
Bảng 2: Danh sách các hàm bổ sung 23




Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình

GVHD: Th.S Phan Chí Tùng 7
I. GIỚI THIỆU
1. Vật tư và vấn đề quản lý
Vật tư là bộ phận cơ bản trong toàn bộ tư liệu sản xuất của xã hội, bao gồm nguyên
liệu, vật liệu, nhiên liệu, năng lượng và thiết bị máy móc.
[1]
Có thể phân loại vật tư theo các ngành nghề kinh doanh, sản xuất như sau:
- Vật tư nông nghiệp
- Vật tư y tế
- Vật tư ngành nước
- Vật tư ngành tin học
- …
Vật tư thường được cung cấp bởi các cửa hàng lớn, nhỏ khác nhau. Để kiểm soát được
lượng vật tư nhập, xuất, tồn kho và các vấn đề liên quan khác, các cửa hàng này phải có
phương pháp quản lý vật tư một cách hiệu quả để đảm bảo quá trình hoạt động được
thông suốt.
2. Quản lý vật tư
Để giải quyết bài toán quản lý vật tư, có nhiều giải pháp khác nhau đã được đưa ra và
ứng dụng trong thực tế như:
- Quản lý thông qua sổ sách
- Quản lý thông qua phần mềm đa mục đích (Microsoft Excel, Microsoft Access,…)
- Quản lý thông qua phần mềm đơn mục đích (Các phần mềm chuyên quản lý vật tư)
- …
Với mỗi phương pháp lại có nhiều hướng tiếp xúc và giải quyết vấn đề tối ưu khác
nhau.
Tuy nhiên, trong thời đại Công nghệ thông tin phát triển hiện nay, việc quản lý một
cửa hàng vật tư nói riêng hay cửa hàng buôn bán nói chung đã trở nên đơn giản hơn rất
nhiều với những phần mềm quản lý hữu hiệu và tiện lợi. Có thể kể đến các phần mềm của
các công ty nổi tiếng như sau:
 F.GMS – Công ty TNHH TM-DV tin học Tứ Huynh (FBsoft)

[2]

 BS Silver – Công ty cổ phần BlueSofts
[3]

 iBom.S – Công ty phần mềm iBom
[4]

 …
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 8
3. Đề tài đồ án và hướng giải quyết
Với mục đích tạo một phần mềm quản lý vật tư đơn giản nhưng vẫn cung cấp đầy đủ
các chức năng cơ bản của một phần mềm quản lý, nhóm chúng em đã nghiên cứu yêu cầu
bài toán đặt ra một cách kỹ lưỡng, khảo sát thực tế các giải pháp quản lý, các cửa hàng
vật tư hiện có,… và đã chọn hướng tiếp cận cụ thể vào bài toán quản lý vật tư của một
cửa hàng vật tư nông nghiệp. Để quản lý các loại vật tư khác, giải pháp của chúng em
đưa ra vẫn giải quyết ổn thỏa các yêu cầu, chỉ cần chỉnh sửa lại mã nguồn hiển thị sao
cho phù hợp với yêu cầu mới.

II. PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG QUẢN LÝ
1. Phân tích bài toán
a. Yêu cầu bài toán
Viết chương trình quản lý cửa hàng vật tư, đọc dữ liệu từ file văn bản có lưu trữ
khoảng 10-20 mẫu tin (record) và lưu vào mảng một chiều.
Cụ thể hóa đề tài: Quản lý cửa hàng vật tư nông nghiệp
Các yêu cầu liên quan đến bài toán:
 In danh sách thông tin của tất cả vật tư
 Bổ sung thêm một đối tượng vào cuối danh sách
 Tìm kiếm mẫu tin theo các tiêu chí khác nhau và hiển thị mẫu tin đó

 Sắp xếp theo thứ tự tăng dần/giảm dần
 Chèn mẫu tin sao cho mảng vẫn được sắp xếp theo thứ tự
 Xóa một mẫu tin
 Xóa các vật tư có số lượng lớn hơn 100
 Tính thành tiền
Thành tiền = Số lượng * Đơn giá
Thành tiền được giảm theo quy ước
- Giảm 25% nếu Số lượng > 200
- Giảm 10% nếu 100 < Số lượng <= 200
- Giảm 0% nếu Số lượng <= 100
 In ra bảng thống kê theo loại vật tư gồm các cột: Loại vật tư, Số lượng và Tổng
tiền

Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 9
b. Dữ liệu vào
Thông tin vật tư bao gồm các trường:
Tên trường Kiểu dữ liệu
Mã vật tư char[6]
Tên vật tư char[50]
Loại vật tư char[20]
Đơn vị tính char[4]
Ngày nhập Date
Nhà sản xuất char[30]
Số lượng float
Đơn giá float
Thành tiền double
Bảng 1: Thông tin vật tư và kiểu dữ liệu
Vật tư được quản lý theo một mảng (danh sách đặc). Dữ liệu vào được nhập từ tệp
tin có sẵn hoặc được nhập từ bàn phím

c. Dữ liệu ra
Dữ liệu ra bao gồm các yêu cầu đặt ra của bài toán, dữ liệu được xuất ra màn hình
làm việc và có thể được ghi vào tệp tin nếu cần thiết.
2. Thiết kế cấu trúc dữ liệu và giải thuật
a. Cấu trúc dữ liệu
 Ngày nhập (ngày, tháng, năm)
Cài đặt một cấu trúc gồm các trường ngày, tháng, tháng năm ở kiểu dữ liệu int.
Khai báo:
struct Date{
int day;
int month;
int year;
};
 Vật tư
Cấu trúc Vật tư với tên VatTu gồm các trường Mã vật tư (maVT), Tên vật tư
(tenVT), Loại vật tư (loaiVT), Đơn vị tính (donViTinh), Ngày nhập (ngayNhap),
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 10
Nhà sản xuất (nhaSX), Số lượng (soLuong), Đơn giá (donGia), Thành tiền
(thanhTien) theo các kiểu dữ liệu tương ứng.
Khai báo:
typedef char infor1[6];
typedef char infor2[50];
typedef char infor3[20];
typedef char infor4[6];
typedef Date infor5;
typedef char infor6[30];
typedef float infor7;
typedef float infor8;
typedef double infor9;

struct VatTu{
infor1 maVT;
infor2 tenVT;
infor3 loaiVT;
infor4 donViTinh;
infor5 ngayNhap;
infor6 nhaSX;
infor7 soLuong;
infor8 donGia;
infor9 thanhTien;
};

 Danh sách vật tư
Tạo danh sách vật tư là danh sách đặc (kiểu mảng) theo yêu cầu bài toán đặt ra.
Khai báo:
#define MAX 20
typedef VatTu List[MAX]
List VT;
 Các biến có liên quan khác:
- Biến n (int): dùng để quản lý số lượng vật tư hiện tại
Khai báo:
int n;

- Biến change (bool): dùng để kiểm soát sự thay đổi dữ liệu trong quá trình xử
lý và đưa ra nhắc nhở lưu trữ dữ liệu khi cần thiết.
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 11
Khai báo:
bool change = false;


b. Các giải thuật tương ứng cho các yêu cầu
 In danh sách thông tin của tất cả các vật tư
Hàm hiển thị thông tin của tất cả các vật tư hiện tại.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại.
Dữ liệu ra: Hiển thị lên màn hình danh sách vật tư hiện tại.
Cài đặt:
void Display(List VT, int n){
printTableTitle();
for (int i = 0; i<n;i++){
printf("| %2i | ",i+1);
printf("%6s | ",VT[i].maVT);
printf("%12s | ",VT[i].tenVT);
printf("%20s | ",VT[i].loaiVT);
printf("%11s | ",VT[i].donViTinh);
printf(" %2d/%2d/%4d |
",VT[i].ngayNhap.day,VT[i].ngayNhap.month,VT[i].ngayNhap.year
);
printf("%25s | ",VT[i].nhaSX);
printf("%10.1f | ",VT[i].soLuong);
printf("%13.0f | ",VT[i].donGia);
printf("%15.0f |\n",VT[i].thanhTien);
}
printf("

\n");
}
 Bổ sung thêm một đối tượng vào cuối danh sách
Hàm bổ sung thêm một đối tượng vào cuối danh sách.
Dữ liệu vào: Danh sách vật tư, số lượng vật tự hiện tại và thông tin đối tượng vật
tư cần thêm vào

Dữ liệu ra: Danh sách vật tư đã được bổ sung thêm đối tượng


Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 12
Cài đặt:
void InsertLast(List &VT, int &n,char const *a, char const *b,
char const *c, char const *d, int e,
int f, int g, char const *h, float k, float l){
strcpy(VT[n].maVT,a);
strcpy(VT[n].tenVT,b);
strcpy(VT[n].loaiVT,c);
strcpy(VT[n].donViTinh,d);
VT[n].ngayNhap.day = e;
VT[n].ngayNhap.month = f;
VT[n].ngayNhap.year = g;
strcpy(VT[n].nhaSX,h);
VT[n].soLuong = k;
VT[n].donGia = l;
n++;}
 Tìm kiếm mẫu tin theo các tiêu chí khác nhau và hiển thị mẫu tin đó
Các hàm tìm kiếm mẫu tin với mục đích tìm kiếm theo yêu cầu nào đó của người
sử dụng.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại và thông tin cần tìm kiếm.
Dữ liệu ra: Thông tin vật tư tìm kiếm được.
Các hàm tìm kiếm theo tiêu các tiêu chí:
- Tìm kiếm theo mã vật tư
void SearchMaVT(List VT, int n, char* a){
int t=0,i=0;
while (i<n) {

char temp[30];
strcpy(temp,VT[i].maVT);
if (strcmp(strlwr(temp),strlwr(a))==0){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 13
}
i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
- Tìm kiếm theo tên vật tư
void SearchTenVT(List VT, int n, char* b){
int t=0,i=0;
while (i<n) {
char temp[30];
strcpy(temp,VT[i].tenVT);
if (strcmp(strlwr(temp),strlwr(b))==0){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;
}

i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
- Tìm kiếm theo loại vật tư
void SearchLoaiVT(List VT, int n, char* c){
int t=0,i=0;
while (i<n) {
char temp[30];
strcpy(temp,VT[i].loaiVT);
if (strcmp(strlwr(temp),strlwr(c))==0){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 14
t=1;
}
i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
- Tìm kiếm theo ngày nhập
Tìm kiếm theo ngày nhập được chia ra thành các hàm tìm kiếm con theo các
phép so sánh =, >, >=, <, <=. Dưới đây là khai báo hàm tìm kiếm theo phép so
sánh =, các phép còn lại tương tự, chỉ khác nhau ở dấu của phép so sánh.
void SearchNgayNhap1(List VT, int n, infor5 e){
int t=0,i=0;

while (i<n) {
if (VT[i].ngayNhap.day==e.day &&
VT[i].ngayNhap.month==e.month &&
VT[i].ngayNhap.year==e.year){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;
}
i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
- Tìm kiếm theo số lượng
Tương tự như với hàm tìm kiếm theo ngày nhập. Dưới đây là hàm tìm kiếm
theo phép so sánh =.
void SearchSoLuong1(List VT, int n, infor7 g){
int t=0,i=0;
while (i<n) {
if (VT[i].soLuong==g){
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 15
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;

}
i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
- Tìm kiếm theo đơn giá
Tương tự như với hàm tìm kiếm theo ngày nhập. Dưới đây làm hàm tìm kiếm
theo phép so sánh =.
void SearchDonGia1(List VT, int n, infor8 h){
int t=0,i=0;
while (i<n) {
if (VT[i].donGia==h){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;
}
i++;
}
if(t==0) printf("\nKhong tim thay!");
}

- Tìm kiếm theo thành tiền
Tương tự với hàm tìm kiếm theo ngày nhập. Dưới đây là hàm tìm kiếm theo
phép so sánh =.
void SearchThanhTien1(List VT, int n, infor9 k){
int t=0,i=0;
Đồ án Giải thuật và lập trình Nhóm: 11

SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 16
while (i<n) {
if (VT[i].thanhTien==k){
if(t==0) {
printf("\nKetqua\n");
printTableTitle();
}
Displayi(VT,i);
t=1;
}
i++;
}
if(t==0) printf("\nKhong tim thay!\n");
}
 Sắp xếp theo thứ tự tăng dần/giảm dần
Hàm sắp xếp sử dụng danh sách vật tư hiện có, thực hiện quá trình sắp xếp và
xuất ra một danh sách mới để tránh thay đổi dữ liệu hiện có. Danh sách mới được
hiển thị lên màn hình và hỏi người dùng có muốn lưu sự sắp xếp vào dữ liệu đang
có không. Hàm tìm kiếm sẽ sử dụng đến biến change (bool) để kiểm tra có sự thay
đổi dữ liệu nguồn và đưa ra cảnh báo lưu dữ liệu lúc thoát khỏi chương trình.
Hàm được cài đặt để sắp xếp dữ liệu tăng dần, giảm dần theo nhiều tiêu chí có
trong cấu trúc dữ liệu của vật tư, bao gồm: Mã vật tư, Tên vật tư, Loại vật tư, Ngày
nhập, Nhà sản xuất, Số lượng, Đơn giá, Thành tiền.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại
Dữ liệu ra: Danh sách vật tư đã được sắp xếp theo tiêu chí định trước.
Dưới đây là hai hàm sắp xếp tăng dần, giảm dần theo tiêu chí Mã vật tư. Các
hàm khác tương tự với hàm này, chỉ thay đổi tham số truyền vào và cách thức so
sách cho các kiểu dữ liệu truyền vào.
Cài đặt:
//sap xep theo MA VAT TU _ tang dan

void SortIncMaVT(List &VT,int n){
int min,p;
List t;
CopyMang(VT,t,n,n);
if(n==0) printf("Danh Sach Trong. Thuc hien thao tac khac");
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 17
else{
for(int i=0;i<n-1;i++){
min=i;
for(int j=i+1;j<n;j++)
if(strcmp(t[min].maVT,t[j].maVT)>0) min=j;
Change(t,i,min);
}
printf("\nBan co muon luu ket qua tren?\n1. Dong y.\n0.
Khong dong y.\n");
scanf("%d",&p);
if(p==1) {
CopyMang(t,VT,n,n);
printf("\nLuu ket qua thanh cong.\n");
change = true;
}
else {
printf("\nKhong luu lai ket qua sap xep.\n");
}
}
}

//sap xep theo MA VAT TU _ giam dan
void SortDecMaVT(List &VT,int n){

int max,p;
List t;
CopyMang(VT,t,n,n);
if(n==0) printf("Danh Sach Trong. Thuc hien thao tac khac");
else{
for(int i=0;i<n-1;i++){
max=i;
for(int j=i+1;j<n;j++)
if(strcmp(t[max].maVT,t[j].maVT)<0) max=j;
Change(t,i,max);
}
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 18
printf("\nBan co muon luu ket qua tren?\n1. Dong y.\n0.
Khong dong y.\n");
scanf("%d",&p);
if(p==1) {
CopyMang(t,VT,n,n);
printf("\nLuu ket qua thanh cong.\n");
change = true;
}
else {
printf("\nKhong luu lai ket qua sap xep.\n");
}
}
}

 Chèn mẫu tin sao cho mảng vẫn được sắp xếp theo thứ tự
Hàm chèn mẫu tin sao cho mảng vẫn được sắp xếp theo thứ tự được cài đặt với
mục đích chèn dữ liệu vào mảng sao cho mảng vẫn được sắp xếp theo thứ tự tăng

dần. Dữ liệu được nhập từ bàn phím và lưu vào mảng. Sau đó, hàm sẽ đưa ra thông
báo nhắc nhở người dùng muốn lưu theo thứ tự nào với các tiêu chí: Mã vật tư,
Tên vật tư, Loại vật tư, Ngày nhập, Nhà sản xuất, Số lượng, Đơn giá. Dữ liệu sau
khi được sắp xếp sẽ có sự thay đổi và yêu cầu người dùng xác nhận có muốn lưu
sự thay đổi đó hay không.
Dữ liệu vào: Dữ liệu vật tư cần chèn được nhập từ bàn phím
Dữ liệu ra: Danh sách vật tư vẫn được sắp xếp theo thứ tự tăng dần theo tiêu
chí nào đó do người dùng lựa chọn.
Hàm được cài đặt tận dùng các hàm khác có sẵn trong chương trình, bao gồm:
- inputKeyboard() : Nhập dữ liệu từ bàn phím (Được trình bày trong phần các
giải thuật cho các yêu cầu khác)
- Các hàm sắp xếp danh sách vật tư đã được trình bày trong phần trên.
 Xóa một mẫu tin
Hàm xóa mẫu tin được cài đặt để xóa một mẫu tin theo tiêu chí nào đó, được
người dùng nhập từ bàn phím. Mỗi vật tư có rất nhiều tiêu chí để lựa chọn và xóa
theo tiêu chí đó, ở đây chỉ đưa ra ví dụ xóa theo mã vật tư. Các hàm còn lại tương
tự, chỉ thay đổi tham số truyền vào.
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 19
Khi xóa xong, chương trình sẽ hỏi người dùng có muốn lưu kết quả hay không,
nếu có thì biến
change
sẽ thay đổi thành
true
để lưu lại trạng thái đã thay đổi dữ
liệu và cảnh bảo lúc thoát khỏi chương trình mà chưa lưu lại dữ liệu vào tệp tin.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại và tiêu chí cần xóa.
Dữ liệu ra: Danh sách vật tư đã được xóa và số lượng vật tư hiện tại.
Cài đặt:
void DeleteMaVT(List &VT,int &n){

infor1 a;
List t;
CopyMang(VT,t,n,n);
int k=n,p,c = 0;
if(n==0) printf("\nDanh Sach Trong. Thuc hien thao tac
khac");
else{
printf("\nNhap Ma Vat Tu can xoa: ");
fflush(stdin); gets(a);
for(int i=0;i<n;i++){
if(strcmp(t[i].maVT,a)==0){
c = 1;
for(int j=i;j<n;j++) t[j]=t[j+1];
k ;i ;
}
}
if (c == 0) printf ("\nKhong co ma vat tu da nhap trong
danh sach\n");
else{
printf("\nBan co muon luu ket qua tren?\n1. Dong
y.\n0. Khong dong y.\n");
scanf("%d",&p);
if(p==1){
CopyMang(t,VT,k,n);
n=k;
printf("\nLuu ket qua thanh cong.\n");
Display(VT,n);
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 20
change = true;

}
else {
printf("\nKhong luu lai ket qua da
xoa.\n");
Display(VT,n);
}
}
}
}

 Xóa các vật tư có số lượng lớn hơn 100
Hàm được cài đặt với mục đích xóa tất cả các vật tư có số lượng lớn hơn 100
trong danh sách.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại.
Dữ liệu ra: Danh sách vật tư đã được xóa đi theo yêu cầu của hàm
Cài đặt:
void DeleteSoLuong100(List &VT,int &n){
infor7 e;
List t;
CopyMang(VT,t,n,n);
int k=n,p,i,c;
if(n==0) printf("\nDanh Sach Trong. Thuc hien thao tac
khac");
for(i=0;i<n;i++){
if(t[i].soLuong > 100){
c = 1;
for(int j=i; j<n;j++) t[j] = t[j+1];
k ;i ;
}
}

if (c == 0) printf ("\nKhong co vat tu co so luong > 100 da
nhap trong danh sach\n");
else{
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 21
printf("\nKet qua sau khi xoa.");
Display(t,k);
printf("\nBan co muon luu ket qua tren?\n1. Dong y.\n0.
Khong dong y.\n");
scanf("%d",&p);
if(p==1){
CopyMang(t,VT,k,n);
n=k;
printf("\nLuu ket qua thanh cong.\n");
change = true;
}
else {
printf("\nKhong luu lai ket qua da xoa.\n");
}
}
}
 Tính thành tiền
Hàm tính thành tiền được cài đặt để tính thành tiền các vật tư đã có trong danh
sách được nhập từ tệp tin/bàn phím. Cách tính thành tiền như theo yêu cầu của bài
toán.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại.
Dữ liệu ra: Danh sách vật tư đã được tính thành tiền.
Cài đặt:
void tinhThanhTien(List &VT, int n){
for (int i = 0; i<n; i++){

if(VT[i].donGia == 0) printf("\nChua nhap don
gia\n");
if(VT[i].soLuong<=100){
VT[i].thanhTien = VT[i].soLuong*VT[i].donGia;
}
else if (VT[i].soLuong>100 && VT[i].soLuong<=200){
VT[i].thanhTien =
VT[i].soLuong*VT[i].donGia*0.9;
}
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 22
else {
VT[i].thanhTien =
VT[i].soLuong*VT[i].donGia*0.75;
}
}
}

 In ra bảng thống kê theo loại vật tư gồm các cột: Loại vật tư, Số lượng và Tổng
tiền.
Hàm được cài đặt nhằm in ra một danh sách tổng hợp, thống kê loại vật tư hiện
có theo các cột loại vật tư, số lượng và tổng tiền.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư hiện tại.
Dữ liệu ra: In ra bản thống kê theo yêu cầu trên màn hình.
Cài đặt:
void DisplayList(List &VT, int n){
List sumList;
int k = 0,max;
for(int i=0;i<n-1;i++){
max=i;

for(int j=i+1;j<n;j++)
if(strcmp(VT[max].loaiVT,VT[j].loaiVT)<0) max=j;
Change(VT,i,max);
}
printf("
\n|STT| Loai Vat tu\t| So luong
|\tTong tien(VND)|");
sumList[0] = VT[0];
for (int i = 1; i<n; i++){
if(strcmp(sumList[k].loaiVT,VT[i].loaiVT) == 0){
sumList[k].soLuong += VT[i].soLuong;
sumList[k].thanhTien += VT[i].thanhTien;
}
else {
k += 1;
sumList[k] = VT[i];
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 23
}
}
for (int i = 0; i < (k+1) ; i++){
printf("\n|
|\n");
printf("| %d
|%20s\t|\t%5.1f\t|\t%14.0f|",i+1,sumList[i].loaiVT,sumList[i]
.soLuong,sumList[i].thanhTien);
}
printf("\n
\n");
}


c. Các giải thuật bổ sung khác
STT Tên hàm Ý nghĩa
1 checkDate() Kiểm tra ngày nhập
2 Create() Tạo danh sách đặc lưu vật tư
3 Change() Hoán đổi vị trí hai vật tư
4 inputFile() Nhập dữ liệu từ file
5 inputKeyboard() Nhập dữ liệu từ bàn phím
6 outputFile() Xuất dữ liệu ra tệp tin .txt
7 Displayi() Hiển thị phần tử thứ i trong danh sách
8 CopyMang() Sao chép danh sách vật tư
9 InsertLast() Thêm vật tư vào cuối danh sách
10 InsertVT() Chèn vật tư liên tiếp vào danh sách
11 printTitle() In tiêu đề của giao diện chương trình
12 printTableTitle() In tiêu đề bảng hiển thị danh sách
13 updateSourceData() Cập nhật dữ liệu nguồn khi lưu dữ liệu

Bảng 2: Danh sách các hàm bổ sung
 Hàm kiểm tra ngày nhập
Hàm được cài đặt để kiểm tra ngày nhập vào.
Dữ liệu vào: Ngày (ngày, tháng, năm).
Dữ liệu ra: true nếu là ngày hợp lệ, false nếu không hợp lệ.
Đồ án Giải thuật và lập trình Nhóm: 11
SVTH: Ngô Trường Phạm Quang - 12T2, Nguyễn Thị Xuân Huệ - 12T2 24
Cài đặt:
bool checkDate(Date date){
int maxDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if ((date.year%400 == 0)||(date.year%4 == 0 &&
date.year%100 != 0))
maxDay[2]=29;

if(date.day>=1&&date.month<=12&&date.year>1900&&
date.day<=maxDay[date.month]){
return true;
}
else{
return false;
}
}
 Hàm tạo danh sách đặc để lưu vật tư
Hàm được tạo ra để tạo danh sách đặc và lưu các vật tư được nhập từ bàn
phím/tệp tin.
Dữ liệu vào: Danh sách vật tư, số lượng vật tư.
Dữ liệu ra: Danh sách rỗng, sẵn sang cho việc lưu dữ liệu.
Cài đặt:
void Create(List VT, int &n){
n = 0;
}
 Hàm hoán đổi vị trí của hai vật tư trong danh sách
Hàm được cài đặt để hoán đổi vị trí của hai vật tư trong danh sách
Dữ liệu vào: Danh sách vật tư, vị trí nguồn, vị trí đích.
Dữ liệu ra: Danh sách vật tư có hai phần tử ở vị trí nguồn và đính đã được hoán
đổi.
Cài đặt:
void Change(List &VT, int i, int j){
VatTu tam;
tam = VT[i];
VT[i] = VT[j];
VT[j] = tam;
Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
GVHD: Th.S Phan Chí Tùng 25

}
 Hàm nhập dữ liệu từ file
Hàm được cài đặt để nhập dữ liệu từ tệp tin SData.txt trong cùng thư mục tệp
tin mã nguồn, tiện lợi và đỡ tốn công nhập từ bàn phím lúc thực hiện chương trình
mà vẫn đảm bảo hiệu quả.
Dữ liệu vào: Tệp tin dữ liệu, danh sách vật tư rỗng.
Dữ liệu ra: Danh sách vật tư đã được nhập và số lượng vật tư hiện tại.
Cài đặt:
void inputFile(){
char a[100];
char b[100];
char c[100];
char d[100];
char e[100];
char f[100];
char g[100];
char h[100];
char k[100];
char l[100];
FILE *fi = fopen("SData.txt","r");
if (fi == NULL) printf("Khong tim thay tap tin du lieu
""Data.txt"", vui long kiem tra lai.\n");
for (int i = 0;i<=20;i++){
if(fgets(a,100,fi) == NULL) break; a[strlen(a)-
1]='\0';
fgets(b,100,fi); b[strlen(b)-1]='\0';
fgets(c,100,fi); c[strlen(c)-1]='\0';
fgets(d,100,fi); d[strlen(d)-1]='\0';
fgets(e,100,fi); e[strlen(e)-1]='\0';
fgets(f,100,fi); f[strlen(f)-1]='\0';

fgets(g,100,fi); g[strlen(g)-1]='\0';
fgets(h,100,fi); h[strlen(h)-1]='\0';
fgets(k,100,fi); k[strlen(k)-1]='\0';
fgets(l,100,fi); l[strlen(l)-1]='\0';

×