Trong chương trình sử dụng mảng struct struct vatlieu để lưu trữ cái phần tử nhập vào, sau khi nhập vào các phần tử vật liệu xong thì chương trình có các chức năng sau có thể chọn để xử
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
KHOA CÔNG NGHỆ THÔNG
QUẢN LÝ XE Ô TÔ
Giảng viên hướng dẫn:
Thầy Nguyễn Hữu Luân-Thầy Lại Mạnh Dũng
Trang 2Lớp: CNTT1 – K64
Hà Nội - 2024
MỤC LỤC NỘI
LUẬN 10
Trang 3NỘI DUNG
********************
I Giới thiệu đề tài
Với một lượng vật liệu xây dựng lớn, sinh ra nhu cầu quản lý những vật liệu
được đặt ra, nên chương trình quản lý xây dựng được tạo ra
II. Phân tích
Chương trình sử dụng ngôn ngữ C là nền tảng xây dựng Trong chương trình sử
dụng mảng struct (struct vatlieu) để lưu trữ cái phần tử nhập vào, sau khi nhập vào các
phần tử vật liệu xong thì chương trình có các chức năng sau có thể chọn để xử lý:
Tạo và thêm một vật liệu mới vào danh sách:
Cho phép người dung nhập thông tin về vật liệu: Id của vật liệu, Tên vật
liệu (50 kí tự), giá cả của vật liệu
In ra danh sách:
In ra danh sách tất cả các vật liệu đã nhập và lưu trong mảng, bao gồm
file có sẵn
Trang 4Tìm kiếm vật liệu:
Cho phép người dùng tìm kiếm vật liệu theo một trong hai phương thức:
tìm theo Id hoặc tìm vật liệu có giá dưới một giá trị nhất định (mặc định là 1.000.000)
Đếm và sắp xếp vật liệu:
Cho phép người dùng đếm số lượng của một vật liệu và chức năng sắp
sếp vật liệu theo giá từ nhỏ tới lớn
Tính tổng số tiền toàn bộ:
Lựa chọn cho phép tính tổng số tiền đã nhập trong chương trình
Xoá và cập nhật lại một vật liệu theo Id:
Lựa chọn cho phép xoá một vật liệu được nhập sẵn theo Id Lựa chọn
còn lại cho phép cập nhật lại tên, số lượng và giá tiền của một vật liệu theo Id
Trang 5Lưu và thoát khỏi chương trình:
Sau khi chọn thì sẽ lưu những thông tin đã nhập cho vật liệu thành một
file khác để lần sau khởi động chương trình thì sẽ hiển thị thông tin vật liệu đã
lưu
III Thiết kế
Để hoàn thiện những chức năng trên các thành viên đã sử dụng nhiều hàm để ghép lại
thành một chương trình hoàn chỉnh Bắt đầu bằng khai báo thư viện sử dụng và mảng
Trang 6 vatlieu* taoVatLieu(int id, char* ten, int so_luong, float gia): Đây là hàm để
tạo một vật liệu mới với các thông số như ID, tên, số lượng và giá
vat_lieu_moi->id = id:
strcpy(vat_lieu_moi->ten, ten):
vat_lieu_moi->so_luong = so_luong:
vat_lieu_moi->gia = gia:
vat_lieu_moi->next = NULL: Thiết lập next của vật liệu mới là “NULL”, vì
khi tạo mới, nó chưa được liên kết với các vật liệu khác
return vat_lieu_moi: Trả về con trỏ tới vật liệu mới được tạo.
Hàm thêm vật liệu vào danh sách:
void themVatLieu(vatlieu** dau, int id, char* ten, int so_luong, float gia):
Hàm này nhận đầu vào là một con trỏ đến con trỏ vatlieu (dau) và các thông tin về
vật liệu cần thêm
*vatlieu vat_lieu_moi = taoVatLieu(id, ten, so_luong, gia)**: Gọi hàm
taoVatLieu để tạo một vật liệu mới với các thông số được truyền vào
*vat_lieu_moi->next = dau: Liên kết vật liệu mới với vật liệu đầu tiên
Trang 7*dau = vat_lieu_moi: Cập nhật đầu danh sách (dau) để trỏ đến vật liệu mới
được thêm vào
Hàm hiển thị danh sách vật liệu:
*void hienThiVatLieu(vatlieu dau)**: Hàm này nhận đầu vào là con trỏ đến
vật liệu đầu danh sách (dau) và in ra tất cả các vật liệu trong danh sách
printf("\n%-10s%-20s%-10s%-10s\n", "ID", "Tên", "Số lượng", "Giá"): while (hien_tai != NULL): Vòng lặp để duyệt qua các vật liệu trong danh sách
Tiếp theo là hàm tìm kiếm vật liệu theo Id:
con trỏ đến vật liệu đầu danh sách (dau) và ID của vật liệu cần tìm
vatlieu hien_tai = dau*
Trang 8while (hien_tai != NULL)
if (hien_tai->id == id)
return hien_tai: Trả về con trỏ tới vật liệu hiện tại.
hien_tai = hien_tai->next: Di chuyển hien_tai sang vật liệu kế tiếp trong danh
sách
return NULL: Nếu không tìm thấy vật liệu có ID tương ứng trong danh sách,
hàm sẽ trả về NULL
Hàm xóa vật liệu khỏi danh sách:
void xoaVatLieu(vatlieu **dau, int id): Hàm này nhận đầu vào là con trỏ đến
con trỏ “dau” (con trỏ đầu danh sách) và ID của vật liệu cần xóa
vatlieu hien_tai = dau: Khởi tạo con trỏ hien_tai để duyệt qua danh sách từ
đầu
vatlieu truoc_do = NULL*: Khởi tạo con trỏ truoc_do để lưu vị trí của vật liệu
ngay trước vật liệu cần xóa
if (hien_tai != NULL && hien_tai->id == id): Kiểm tra nếu vật liệu cần xóa
là vật liệu đầu tiên trong danh sách
*dau = hien_tai->next: Cập nhật đầu danh sách để bỏ qua vật liệu đầu tiên free(hien_tai): Giải phóng bộ nhớ của vật liệu đầu tiên.
Trang 9return: Kết thúc hàm sau khi xóa vật liệu.
while (hien_tai != NULL && hien_tai->id != id): Duyệt danh sách để tìm vật
if (hien_tai == NULL) return: Nếu không tìm thấy vật liệu cần xóa (đã duyệt
hết danh sách mà không có vật liệu nào có ID là id)
truoc_do->next = hien_tai->next: Gắn kết vật liệu trước vật liệu cần xóa
(truoc_do->next) với vật liệu sau vật liệu cần xóa (hien_tai->next)
free(hien_tai): Giải phóng bộ nhớ của vật liệu cần xóa sau khi đã xóa nó khỏi
danh sách
Hàm nhập thông tin vật liệu từ bàn phím:
void nhapVatLieu(vatlieu **dau): Hàm này nhận đầu vào là con trỏ đến con
trỏ “dau” (con trỏ đầu danh sách) để thêm vật liệu mới vào danh sách
int id
Trang 10themVatLieu(dau, id, ten, so_luong, gia): Gọi hàm themVatLieu để thêm vật
liệu mới vào danh sách “dau” với các thông tin đã nhập từ người dùng
Trang 11Hàm sắp xếp danh sách liên kết theo giá của mỗi nút vatlieu:
void sapxep(vatlieu** dau)
if (*dau == NULL) return
//Nếu danh sách rỗng (*dau == NULL), hàm trả về ngay lập tức
vatlieu* hien_tai
vatlieu* tiep_theo
int td
//hien_tai trỏ tới nút hiện tại, tiep_theo trỏ tới nút kế tiếp, và td là một cờ báo
hiệu nếu có sự hoán đổi xảy ra
do
td = 0
hien_tai = *dau
//Vòng lặp do-while tiếp tục cho đến khi không còn sự hoán đổi nào xảy ra (td == 0)
while (hien_tai->next != NULL)
tiep_theo = hien_tai->next
if (hien_tai->gia > tiep_theo->gia)
float temp_gia = hien_tai->gia
Trang 13hien_tai = hien_tai->next //Cập nhật hien_tai để tiếp tục kiểm
tra nút tiếp theo
vatlieu* vat_lieu = timVatLieuTheoID(dau, id): hàm timVatLieuTheoID để
tìm kiếm vật liệu có mã ID tương ứng
Trang 14scanf("%d", &(vat_lieu->so_luong))
printf("Nhap gia moi (hien tai: %.2f): ", vat_lieu->gia)
scanf("%f", &(vat_lieu->gia))
printf("Thong tin vat lieu da duoc cap nhat!\n")
Hàm demvatlieu đếm tổng số vật liệu trong danh sách liên kết
int demvatlieu(vatlieu* dau)
int d = 0
vatlieu* hien_tai = dau
while (hien_tai != NULL)
float tong_gia_tri = 0 //đặt tổng giá trị bằng 0
while (hien_tai != NULL) //thực hiện chức năng vòng lặp tính tổng với
điều kiện khác NULL
Trang 15Tong_gia_tri +=
Trang 16hien_tai->so_luong * hien_tai->gia //hàm toán tích nhân số lượng
while( if() ) // hàm thực hiện chức năng vòng lặp để hiện thị vật liệu dưới
1000000 điều kiện giá dưới 1000000
Hàm lưu các vật liệu thành 1 file để lưu trữ dữ liệu:
void luuVaoFile(vatlieu* dau)
FILE *file = fopen(FILENAME, "wb") //mở file có tên “ ”
(mặc định là FILENAME) chế độ gho nhị phân Nếu không có file thì tạo mới
if (file == NULL)
perror("Không the mo file")
return;
Trang 17 vatlieu* hien_tai = dau
while (hien_tai != NULL) //duyệt từ phần phần của danh sách
fwrite(hien_tai, sizeof(vatlieu), 1, file) //ghi dữ liệu vào file, ghi dữ
liệu kích thước (sizeof())
//Nếu không thể mở file, hiển thị thông báo lỗi và kết thúc chương trình
vatlieu temp //khai báo biến temp
while (fread(&temp, sizeof(vatlieu), 1, f)) //đọc dữ liệu kích thước
sizeof() vào biếntemp
Trang 18themVatLieu(dau, temp.id, temp.ten, temp.so_luong, temp.gia) //sẽ
sử dụng các giá trị id, ten, so_luong, và gia từ temp để tạo và thêm một nút mới
vào danh sách liên kết
fclose(f) //Đóng file
Hàm main: Thực hiện toàn bộ các hàm trên với vòng lặp while:
while (1)
//printf("\n Quan ly vat lieu xay dung -\n");
printf("\n1 Them vat lieu\n");
printf("2 Hien thi danh sach vat lieu\n");
printf("3 Tim vat lieu theo ID\n");
printf("4 Sap xep vat lieu theo gia\n");
printf("5 Tim vat lieu co gia duoi 1000000\n");
printf("6 dem so vat lieu trong kho\n");
printf("7 Tinh tong so gia tri kho\n");
printf("8 Xoa vat lieu theo ID\n");
Trang 19printf("9 cap nhat lai vat lieu\n");
printf("10 Save and exit\n");
printf("Nhap lua chon cua ban: ");
scanf("%d", &lua_chon); while (1)
switch (lua_chon) { } //sử dụng cấu trúc switch để thực hiện từng lựa
chọn
IV Phân công công việc
Cả nhóm cùng suy nghĩ để dựng ý tưởng ban đầu về chương trình
Các thành viên phân chia các hàm thực hiện từng chức năng khác nhau rồi ghép
lại thành 1 chương trình
Thời gian rảnh nhóm trao đổi và bắt đầu phần viết code Đồng thời cách
thành viên sẽ dử dụng các công cụ sẵn(như internet, có để phát triển và hoàn
thiện yêu cầu được giao
Người viết báo cáo: Cao Vũ Minh Quang
Trang 20V Phương pháp thực hiện
- Hoạt động và trao đổi kiến thức, tài liệu qua tin nhắn
- Tham khảo các hướng dẫn code trên mạng
VI Chấm điểm thành viên
Cao Vũ Minh Quang 231220875 9
Nhóm trưởng, làm báo
cáo, hỗ trợ
Lê Văn Linh 231230822 8.5 Làm chương trìnhNguyễn Văn Bắc 231230717 9.5 Làm chương trìnhMai Phương Nam 232030323 8.5 Làm chương trìnhNguyễn Trung Hiếu 231230777 8.5 Làm chương trình
KẾT LUẬN
********************
Trang 21Nhóm đã hoàn thành đầy đủ phần công việc được giao Chương trình vẫn còn
nhiều thiếu sót nhưng nó đã đáp ứng Khi chạy chương trình đôi khi vẫn gặp lỗi
hiển thị Nhóm đã hoàn thành đầy đủ phần công việc được giao
Bài tập này đã giúp nâng cao kĩ năng và trình độ của từng cá nhân các thành viên
về môn lập trình