Chương trình quản lý vật tư nông nghiệp Bài toán giải quyết khá đầy đủ các chức năng cơ bản và bổ sung thêm các chức năng khác nhằm tối ưu hệ thống, đem lại một phần mềm cơ bản đáp ứng đầy đủ yêu cầu của người sử dụng. Các caais trúc dữ liệu và thuật toán đã được phân tích và lựa chọn kỹ lưỡng nhằm đem lại hiệu quả xử lý và tài nguyên bộ nhớ.
Trang 1Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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
Trang 3Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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
Trang 4Đồ án Giải thuật và lập trình Nhóm: 11
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
Trang 5Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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
Trang 7Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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
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ư)
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]
…
Trang 8Đồ án Giải thuật và lập trình Nhóm: 11
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
Trang 9Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
b Dữ liệu vào
Thông tin vật tư bao gồm các trường:
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
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
Trang 10Đồ án Giải thuật và lập trình Nhóm: 11
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;
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
Trang 11Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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++){
}
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
Trang 12 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){
Trang 13Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
} 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){
}
- Tìm kiếm theo loại vật tư
void SearchLoaiVT(List VT, int n, char* c){
Trang 14}
- 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){
}
- 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) {
Trang 15Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
}
- 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){
}
- 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;
Trang 16}
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
Trang 17Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
Khong dong y.\n");
//sap xep theo MA VAT TU _ giam dan void SortDecMaVT(List &VT,int n){
Trang 18Đồ án Giải thuật và lập trình Nhóm: 11
Khong dong y.\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
Trang 19Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
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
y.\n0 Khong dong y.\n");
Trang 20 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){
Trang 21Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
Khong dong y.\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++){
Trang 22 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
Trang 23Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
} for (int i = 0; i < (k+1) ; i++){
printf("\n| -|\n");
|%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
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
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ệ
Trang 24} }
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
Trang 25Đề tài: Quản lý vật tư Đồ án Giải thuật và lập trình
}
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
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; 1]='\0';