2 Lớp `NhanVien` Đoạn mã này định nghĩa một lớp NhanVien Nhân Viên trong C++ với các thuộc tính chính được khai báo ở phạm vi private.. Đây là phần chi tiết và giải thích từng thuộc tính
Trang 1TRƯỜNG ĐIỆN -ĐIỆN TỬ
BÁO CÁO BÀI TẬP LỚN KỸ THUẬT LẬP TRÌNH
Nhóm 9 - Lớp: CTTN Điện tử - Viễn thông
Giảng viên hướng dẫn : TS.Nguyễn Thị Kim Thoa
Hà Nội, 06/2024
Trang 21 Khai báo thư viện và hằng số 3
1.1 Định nghĩa một số thư viện 4
2 Lớp `NhanVien` 5
2.1 Các thuộc tính của lớp NhanVien 5
2.2 Giải thích các thuộc tính 6
2.3 Lý do sử dụng kiểu dữ liệu cụ thể 6
3 Các phương thức của Lớp `NhanVien` 7
3.1 Phương thức `nhap()` 7
3.2 Phương thức `xuat() const` 7
3.3 Các phương thức getter 7
3.4 Phương thức `static` `readFile` và `writeFile` 8
4 Các hàm quản lý danh sách nhân viên 9
4.1 Hàm `nhapds` 9
4.2 Hàm `xuatds` 10
4.3 Hàm `TKMaNV` 10
4.4 Hàm `TKCCCD` 11
4.5 Hàm `TKTen` 11
4.6 Hàm `sapxep` 12
4.7 Hàm `tongluong` 12
4.8 Hàm `thucLinhmax` 13
4.9 Hàm `timphucap` 13
4.10 Hàm `xoa` 14
4.11 Hàm `them` 14
4.12 Hàm `sua` 15
5 Hàm `Menu` 16
5.1 Chi tiết về hàm `menu` 17
5.1.1 Khai báo các biến cục bộ: 17
5.1.2 Vòng lặp do-while: 17
5.1.3 Hiển thị menu: 17
5.1.4 Xử lý lựa chọn của người dùng (switch-case): 18
Trang 31 Khai báo thư viện và hằng số
Khai báo các thư viện cần thiết để xử lý luồng nhập/xuất, đọc/ghi file, chuỗi, và các phép toán
Định nghĩa hằng số MAX_SIZE là 1000, là số lượng nhân viên tối đa có thể quản lý
1.1 Định nghĩa một số thư viện
- iostream: Thư viện cung cấp các đối tượng, hàm và toán tử để thực hiện các hoạt động
vào ra với luồng dữ liệu (input/output) Trong đoạn code này, iostream được sử dụng để làm việc với đầu vào và đầu ra từ bàn phím hoặc console
- fstream: Thư viện cung cấp các lớp để thực hiện các hoạt động đầu vào và đầu ra với
file Cụ thể, ifstream và ofstream là các lớp con của fstream, được sử dụng để đọc và ghi
dữ liệu vào file trong đoạn code
- sstream: Thư viện này cung cấp lớp stringstream để xử lý chuỗi như một luồng
stringstream cho phép đọc và ghi vào chuỗi dưới dạng như luồng dữ liệu Trong đoạn code, stringstream được sử dụng để phân tích cú pháp và xử lý dữ liệu từng dòng trong file
- iomanip: Thư viện này cung cấp các hàm để điều chỉnh định dạng dữ liệu như
setprecision để xác định số lượng chữ số thập phân cho các giá trị số Trong đoạn code, setprecision được sử dụng để định dạng lại lương của nhân viên khi ghi vào file
Trang 4- Windows.h: Đây là một thư viện dành riêng cho hệ điều hành Windows, cung cấp các
hàm và định nghĩa cho việc điều khiển giao diện và đầu ra trong console Windows Trong đoạn code, Windows.h được sử dụng để điều khiển màu sắc của văn bản trên console
2 Lớp `NhanVien`
Đoạn mã này định nghĩa một lớp NhanVien (Nhân Viên) trong C++ với các thuộc tính chính được khai báo ở phạm vi private Đây là phần chi tiết và giải thích từng thuộc tính của lớp:
2.1 Các thuộc tính của lớp NhanVien
long long maNV
o Mã nhân viên: Đây là một số duy nhất để xác định từng nhân viên trong hệ (kiểu
o Phụ cấp: Đây là khoản phụ cấp thêm vào lương cơ bản mà nhân viên có thể nhận
được (kiểu ` float `)
long long CCCD
Trang 5o Số căn cước công dân: Đây là số nhận dạng cá nhân của nhân viên theo căn cước
công dân (kiểu ` long long `)
o Thực lĩnh: Đây là tổng lương thực nhận của nhân viên sau khi cộng lương cơ bản
và phụ cấp ThucLinh được tính bằng công thức ThucLinh = LuongCB + Phucap (kiểu `float`)
2.2 Giải thích các thuộc tính
Mục đích của các thuộc tính là để lưu trữ thông tin cá nhân và lương của nhân viên
trong một công ty hoặc tổ chức Các thuộc tính này giúp quản lý và theo dõi thông tin nhân viên một cách chi tiết và có hệ thống
Trang 6 Phạm vi truy cập private đảm bảo rằng các thuộc tính này chỉ có thể được truy cập từ
bên trong lớp NhanVien Điều này giúp bảo vệ dữ liệu và duy trì tính toàn vẹn của thông tin nhân viên
2.3 Lý do sử dụng kiểu dữ liệu cụ thể
long long được sử dụng cho maNV và CCCD vì các giá trị này có thể rất lớn, đặc biệt
trong các hệ thống lớn với nhiều nhân viên
float được sử dụng cho các thuộc tính liên quan đến lương (LuongCB, Phucap,
ThucLinh) để lưu trữ các giá trị có phần thập phân
string được sử dụng cho các thuộc tính chứa thông tin văn bản như họ tên, địa chỉ, giới
tính, ngày sinh, email và số điện thoại
Bằng cách sử dụng các thuộc tính này, lớp NhanVien có thể lưu trữ và quản lý thông tin chi tiết về nhân viên một cách hiệu quả Các phương thức trong lớp sẽ được sử dụng để nhập, xuất, và xử lýthông tin này
3 Các phương thức của Lớp `NhanVien`
3.1 Phương thức `nhap()`
Sử dụng `cin` và `getline(cin, )` để nhập dữ liệu từ người dùng
Trang 7 `cin.ignore()` được sử dụng để bỏ qua ký tự newline còn sót lại trong bộ đệm sau khi sử dụng cin.
Sau khi nhập tất cả thông tin, `ThucLinh`(thực lĩnh) được tính bằng cách cộng
`LuongCB` (lương cơ bản) và Phucap (phụ cấp)
3.2 Phương thức `xuat() const`
Phương thức `xuat()` dùng để xuất thông tin của nhân viên ra màn hình
`setw()` định dạng độ rộng của cột khi xuất dữ liệu, giúp hiển thị dữ liệu có trật tự và dễ đọc
Phương thức này được đánh dấu `const`, có nghĩa là nó không thay đổi trạng thái của đối tượng
Trang 83.4 Phương thức `static` `readFile` và `writeFile`
3.4.1 Phương thức `readFile` và các tham số:
~code~
static void readFile(const string& filename, NhanVien employees[], int& size)
Trang 9 `static void readFile`: Khai báo một phương thức tĩnh (static method) có kiểu trả
về là `void`
filename`: Tham số
`filename` là một chuỗi hằng (constant string) tham chiếu, đại diện cho tên tệp tin cần đọc
`if (!file)`: Kiểm tra xem tệp tin có mở thành công hay không
`cout << "Khong mo duoc file." << endl; `Nếu tệp tin không mở được, in ra thông báo lỗi
và thoát khỏi phương thức
a. Khởi tạo kích thước mảng và đọc từng dòng của tệp tin:
Trang 10 string line: Khai báo một biến line kiểu chuỗi để lưu trữ từng dòng của tệp tin.
size = 0;: Đặt kích thước ban đầu của mảng employees là 0
while (getline(file, line) && size < MAX_SIZE): Đọc từng dòng của tệp tin cho đến khi hết dòng hoặc đạt kích thước tối đa MAX_SIZE
3.4.3 Xử lý từng dòng và gán giá trị cho các thuộc tính của đối tượng NhanVien:
iss là một đối tượng của lớp istringstream, được sử dụng để phân tích cú pháp một chuỗi dòng
(line) từ tệp tin Lớp istringstream thuộc thư viện <sstream> và cung cấp các phương thức để đọc
dữ liệu từ chuỗi theo cách tương tự như đọc từ ifstream (dòng nhập từ tệp tin) hoặc cin (dòng nhập từ bàn phím)
istringstream iss(line): Tạo một đối tượng istringstream từ chuỗi line để phân tích cú pháp
NhanVien& nv = employees[size]: Tham chiếu đến phần tử NhanVien tại vị trí size trongmảng employees
iss >> nv.maNV >> nv.LuongCB >> nv.Phucap >> nv.CCCD: Đọc các giá trị thuộc tính maNV, LuongCB, Phucap, và CCCD từ dòng hiện tại
iss.ignore(): Bỏ qua ký tự phân cách
Trang 11 getline(iss, nv.HovaTen, ','): Đọc giá trị của thuộc tính HovaTen từ dòng hiện tại, sử dụngdấu phẩy , làm ký tự phân cách.
getline(iss, nv.DiaChi, ','): Đọc giá trị của thuộc tính DiaChi từ dòng hiện tại, sử dụng dấuphẩy , làm ký tự phân cách
getline(iss, nv.GioiTinh, ','): Đọc giá trị của thuộc tính GioiTinh từ dòng hiện tại, sử dụngdấu phẩy , làm ký tự phân cách
getline(iss, nv.NgaySinh, ','): Đọc giá trị của thuộc tính NgaySinh từ dòng hiện tại, sử dụng dấu phẩy , làm ký tự phân cách
getline(iss, nv.Email, ','): Đọc giá trị của thuộc tính Email từ dòng hiện tại, sử dụng dấu phẩy , làm ký tự phân cách
getline(iss, nv.SoDT, ','): Đọc giá trị của thuộc tính SoDT từ dòng hiện tại, sử dụng dấu phẩy , làm ký tự phân cách
3.4.4 Đóng tệp tin:
Đóng tệp tin sau khi hoàn thành việc đọc dữ liệu
Trang 124 Các hàm quản lý danh sách nhân viên
`size`: Tham chiếu đến biến lưu kích thước hiện tại của mảng
Các bước thực hiện:
1 Nhập số lượng nhân viên mới `n`
2 Kiểm tra nếu n vượt quá giới hạn MAX_SIZE của mảng thì thông báo lỗi và thoát
3 Dùng vòng lặp để nhập thông tin cho từng nhân viên mới và cập nhật kích thước size
4.2 Hàm `xuatds`
Trang 13
Tham số:
Trang 14 nv[]: Mảng chứa danh sách nhân viên.
Trang 151 Sử dụng hàm sort với lambda function để sắp xếp.
2 Xuất danh sách nhân viên sau khi sắp xếp
Trang 16 size: Tham chiếu đến biến lưu kích thước hiện tại của mảng.
Trang 17 size: Tham chiếu đến biến lưu kích thước hiện tại của mảng.
Trang 185 Hàm `Menu`
Trang 205.1 Chi tiết về hàm `menu`
5.1.1 Khai báo các biến cục bộ:
5.1.2 Vòng lặp do-while:
- Vòng lặp này sẽ tiếp tục chạy cho đến khi người dùng chọn thoát chương trình (choice == 15)
5.1.3 Hiển thị menu:
Trang 21- Yêu cầu người dùng nhập lựa chọn từ 1 đến 15.
5.1.4 Xử lý lựa chọn của người dùng (switch-case):
- Dựa vào giá trị của choice, thực hiện các thao tác tương ứng:
1 Nhập danh sách nhân viên: Gọi hàm nhapds để nhập danh sách nhân
viên, sau đó ghi danh sách này ra file "NhanVien.txt"
2 Hiển thị danh sách nhân viên: Gọi hàm xuatds để xuất danh sách nhân
viên ra màn hình
3 Tìm kiếm nhân viên theo mã nhân viên: Gọi hàm TKMaNV để tìm
kiếm và xuất thông tin nhân viên theo mã
4 Tìm kiếm nhân viên theo CCCD: Gọi hàm TKCCCD để tìm kiếm và
xuất thông tin nhân viên theo số CCCD
5 Tìm kiếm nhân viên theo tên: Gọi hàm TKTen để tìm kiếm và xuất
thông tin nhân viên theo tên
6 Sắp xếp lương nhân viên tăng dần: Gọi hàm sapxep để sắp xếp và
xuất danh sách nhân viên theo lương thực lĩnh tăng dần
7 Tính tổng lương nhân viên: Gọi hàm tongLuong để tính và xuất tổng
lương của tất cả nhân viên
8 Tìm kiếm nhân viên có thu nhập cao nhất: Gọi hàm thucLinhmax để
tìm và xuất thông tin nhân viên có thu nhập cao nhất
9 Tìm kiếm nhân viên có phụ cấp > 100.000: Gọi hàm timphucap để
tìm và xuất thông tin nhân viên có phụ cấp lớn hơn 100.000
10 Xóa nhân viên: Gọi hàm xoa để xóa nhân viên theo mã và ghi danh
sách nhân viên còn lại ra file "NhanVien.txt"
11 Thêm nhân viên: Gọi hàm them để thêm nhân viên mới vào danh
sách và ghi danh sách này ra file "NhanVien.txt"
12 Sửa thông tin một nhân viên: Gọi hàm sua để sửa thông tin nhân
viên theo mã và ghi danh sách nhân viên đã sửa ra file "NhanVien.txt"
13 Ghi danh sách nhân viên ra file khác: Yêu cầu người dùng nhập tên
file mới và ghi danh sách nhân viên vào file đó
Trang 22 14 Quay lại menu chính: Gán backToMenu = true để quay lại menu
Chờ người dùng tiếp tục: Sau khi thực hiện xong một thao tác (trừ khi
người dùng chọn quay lại menu hoặc thoát), yêu cầu người dùng nhấn ENTER để tiếp tục