[C++] Chương trình quản lý tài xế tổ chức dạng file

Để giải quyết bài toán quản lý danh sách tài xế c++, chúng ta cần thực hiện các thao tác như nhập thông tin, lưu trữ vào file, đọc file và hiển thị danh sách tài xế, chỉnh sửa thông tin và cập nhật vào file, sắp xếp danh sách theo Họ và tên, và trích xuất thông tin của tài xế có giới tính nữ.

Trong bài viết dưới đây, chúng ta sẽ triển khai các hàm để thực hiện các yêu cầu đã nêu trong đề bài.

Xem thêm:

1. Bài toán quản lý danh sách tài xế dạng file

Bài 40 (TH-CSLT-07): Nhập danh sách n tài xế từ bàn phím. Mỗi tài xế có các thông tin sau: Mã tài xế, Họ và tên, Giới tính, Năm sinh, Biển số xe, Lương. Viết các hàm thực hiện các yêu cầu sau đây:
1. Lưu danh sách tài xế vào file “Taixe.txt”.
2. Đọc file “Taixe.txt” và hiển thị danh sách tài xế ra màn hình.
3. Nhập từ bàn phím mã tài xế, chỉnh sửa lương của tài xế đó và cập nhật vào file. Đọc file “Taixe.txt” và hiển thị danh sách tài xế sau khi cập nhật ra màn hình.
4. Sắp xếp danh sách tài xế theo Họ và tên và lưu vào file “Taixesx.txt”.
5. Trích lọc thông tin của các tài xế có giới tính nữ và lưu vào file “Taixenu.txt”.
Lưu ý: Tổ chức các file dưới dạng file nhị phân.

2. Ý tưởng thuật toán

2.1Lưu danh sách tài xế vào file “Taixe.txt”

– Mở tệp với chế độ ios::binary (chế độ nhị phân) để ghi dữ liệu.

– Sau đó, kiểm tra xem việc mở tệp có thành công hay không bằng cách kiểm tra trạng thái của ofs. Nếu không thành công, hiển thị thông báo lỗi và kết thúc hàm.

– Sử dụng hàm write ghi n tài xế vào danh sách.

– Sau đó, ghi thông tin của từng tài xế trong mảng dstx được ghi vào tệp.

– Cuối cùng, hiển thị thông báo “Lưu file thành công!” và đóng tệp bằng cách gọi phương thức close trên đối tượng ofs.

2.2 Đọc file “Taixe.txt” và hiển thị danh sách tài xế ra màn hình

– Mở file để đọc dữ liệu nhị phân bằng cách sử dụng phương thức open. Sau đó, ta sẽ kiểm tra xem file đã được mở thành công chưa bằng cách sử dụng ifs.is_open(). Nếu file chưa được mở thành công, ta sẽ thông báo về lỗi và kết thúc hàm bằng cách sử dụng return.

– Đọc số lượng tài xế được lưu trong file bằng cách sử dụng phương thức read. Đọc giá trị được lưu dưới dạng binary và lưu giá trị này vào biến read_n.

– Khai báo một mảng ds có kích thước là read_n để lưu trữ thông tin về các tài xế được đọc từ file. Ta sử dụng vòng lặp để đọc dữ liệu từ file và lưu giá trị vào từng phần tử của mảng ds.

– Xuất thông tin về từng tài xế từ mảng ds ra màn hình và đóng tệp.

2.3 Chỉnh sửa lương của tài xế đó và cập nhật vào file

– Hàm timKiem nhận vào một mảng dstx chứa danh sách tài xế, số lượng phần tử n và mã tài xế ma_taixe cần tìm. Hàm sử dụng một vòng lặp để duyệt qua từng phần tử của mảng và kiểm tra nếu mã tài xế của phần tử hiện tại bằng với ma_taixe. Thì hàm trả về chỉ số của phần tử đó. Nếu không tìm thấy, hàm trả về -1.

– Hàm suaLuongTX nhận vào một chuỗi ten_tep đại diện cho tên tệp cần mở để thực hiện việc sửa đổi lương của một tài xế. Đầu tiên, hàm mở tệp bằng cách sử dụng đối tượng ifstream. Nếu việc mở tệp không thành công, hàm hiển thị thông báo lỗi và kết thúc.

– Sau đó, hàm đọc số lượng tài xế từ tệp và khởi tạo mảng ds với kích thước tương ứng. Tiếp theo, hàm đọc thông tin về từng tài xế từ tệp và lưu trữ vào mảng ds.

– Hàm yêu cầu người dùng nhập mã tài xế cần sửa và lương mới. Sau đó, hàm gọi hàm timKiem để tìm kiếm vị trí của tài xế trong mảng ds. Nếu tìm thấy, hàm cập nhật lương mới cho tài xế tại vị trí đó trong mảng ds, sau đó gọi hàm luuDS để lưu lại danh sách tài xế đã được cập nhật vào tệp. Cuối cùng, hàm thông báo thành công. Nếu không tìm thấy tài xế, hàm thông báo không tìm thấy.

– Cuối cùng, hàm đóng tệp đã mở bằng cách sử dụng phương thức close() của đối tượng ifstream.

2.4 Sắp xếp danh sách tài xế theo họ và tên và lưu vào file “Taixesx.txt”

– Đọc số lượng tài xế từ tệp và khởi tạo mảng ds với kích thước tương ứng. Hàm sau đó đọc thông tin về từng tài xế từ tệp và lưu trữ vào mảng ds.

– Hàm sử dụng thuật toán sắp xếp nổi bọt để sắp xếp danh sách theo tên tài xế. Hai vòng lặp lồng nhau được sử dụng để so sánh các phần tử liên tiếp trong mảng ds. Nếu tên tài xế tại vị trí i lớn hơn tên tài xế tại vị trí j, thì các phần tử đó được hoán đổi vị trí để đảm bảo thứ tự tăng dần của tên tài xế.

– Danh sách tài xế đã được sắp xếp sau đó được lưu vào tệp “Taixesx.txt” bằng cách gọi hàm luuDS. Cuối cùng, hàm gọi hàm docDS để đọc và hiển thị danh sách tài xế đã được sắp xếp từ tệp “Taixesx.txt”.

2.5 Trích lọc thông tin của các tài xế có giới tính nữ và lưu vào file “Taixenu.txt”

– Mở tệp và đọc số lượng tài xế từ tệp và khởi tạo mảng ds với kích thước tương ứng. Hàm sau đó đọc thông tin về từng tài xế từ tệp và lưu trữ vào mảng ds.

– Sau đó, một mảng dstx_nu được khởi tạo để lưu trữ danh sách tài xế nữ. Biến index được sử dụng để theo dõi số lượng tài xế nữ đã được thêm vào mảng dstx_nu. Hàm duyệt qua mảng ds và kiểm tra nếu giới tính tài xế tại vị trí i là “Nu”, thì tài xế đó được thêm vào mảng dstx_nu và biến index được tăng lên.

– Sau khi danh sách tài xế nữ đã được trích xuất và lưu trữ trong mảng dstx_nu, tệp được đóng lại bằng cách sử dụng phương thức close() của đối tượng ifstream. Danh sách tài xế nữ sau đó được lưu vào tệp “Taixenu.txt” bằng cách gọi hàm luuDS. Cuối cùng, hàm gọi hàm docDS để đọc và hiển thị danh sách tài xế nữ từ tệp “Taixenu.txt”.

3. Code chương trình quản lý tài xế c++

#include<iostream>
#include<fstream>
#include<iomanip>
#include<string.h>
using namespace std;

struct taiXe{

    int maTX;
    char hoTen[255];
    char gioiTinh[6];
    int namsinh;
    char bienSo[50];
    float luong;
};

//1. Ham nhap danh sach
void nhapDSTX( taiXe dstx[], int &n){

    cout<<" Nhap sanh sach n tai xe: "; cin>>n;

    for(int i=0;i<n;i++){

    cout<<" Nhap ma tai xe: "; cin>>dstx[i].maTX;
    cin.ignore(); //xoá bỏ ký tự thừa
    cout<<" Nhap ho ten tai xe: "; cin.getline(dstx[i].hoTen, 255);
    cout<<" Nhap gioi tinh: "; cin.getline(dstx[i].gioiTinh, 6);
    cout<<" Nhap nam sinh: "; cin>>dstx[i].namsinh;
    cin.ignore();
    cout<<" Nhap bien so xe: "; cin.getline(dstx[i].bienSo, 50);
    cout<<" Nhap luong: "; cin>>dstx[i].luong;

    cout<<endl;
    }
}

void xuat(){

    cout<<" Danh sach tai xe: "<<endl;
    cout<<setw(7)<<left<<"STT";
    cout<<setw(15)<<left<<"Ma TX";
    cout<<setw(25)<<left<<"Ho ten tai xe";
    cout<<setw(15)<<left<<"Gioi tinh";
    cout<<setw(15)<<left<<"Nam sinh";
    cout<<setw(15)<<left<<"Bien so";
    cout<<setw(15)<<left<<"Luong";
    cout<<endl;
}

//2. luu danh sach
void luuDS(taiXe dstx[], int n, string ten_tep){

    ofstream ofs;

    ofs.open(ten_tep, ios::binary); // mo tep

    //kiem tra tep
    if(!ofs.is_open()){
        cout<<" Loi khi mo tep!"<<endl;
        return;
    }

    ofs.write((char*)&n, sizeof(int)); //ghi so luong tai xe vao tep

    for(int i=0;i<n;i++){

        ofs.write((char*)&dstx[i].maTX, sizeof(int));
        ofs.write(dstx[i].hoTen, sizeof(dstx[i].hoTen));
        ofs.write(dstx[i].gioiTinh, sizeof(dstx[i].gioiTinh));
        ofs.write((char*)&dstx[i].namsinh, sizeof(int));
        ofs.write(dstx[i].bienSo, sizeof(dstx[i].bienSo));
        ofs.write((char*)&dstx[i].luong, sizeof(float));
    }

    cout<<" Luu file thanh cong!"<<endl;
    ofs.close();
}
//3, doc danh sach
void docDS(string ten_tep){

    ifstream ifs;

    ifs.open(ten_tep, ios::binary); //mo file

    // kiem tra mo tep
    if(!ifs.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return;
    }

    int read_n;

    ifs.read((char*)&read_n, sizeof(int));
    taiXe ds[read_n];
    for(int i=0;i<read_n;i++){
        ifs.read((char*)&ds[i].maTX, sizeof(int));
        ifs.read(ds[i].hoTen, sizeof(ds[i].hoTen));
        ifs.read(ds[i].gioiTinh, sizeof(ds[i].gioiTinh));
        ifs.read((char*)&ds[i].namsinh, sizeof(int));
        ifs.read(ds[i].bienSo, sizeof(ds[i].bienSo));
        ifs.read((char*)&ds[i].luong, sizeof(float));
    }

    xuat();
    for(int i=0;i<read_n;i++){
        cout<<setw(7)<<left<<i+1;
        cout<<setw(15)<<left<<ds[i].maTX;
        cout<<setw(25)<<left<<ds[i].hoTen;
        cout<<setw(15)<<left<<ds[i].gioiTinh;
        cout<<setw(15)<<left<<ds[i].namsinh;
        cout<<setw(15)<<left<<ds[i].bienSo;
        cout<<setw(15)<<left<<fixed<<setprecision(2)<<ds[i].luong;
        cout<<endl;
    }
    ifs.close();
}

//4. Tim kiem

int timKiem(taiXe dstx[], int n, int ma_taixe){
    for(int i=0;i<n;i++){
        if(dstx[i].maTX==ma_taixe){
            return i;
        }
    }
    return -1;
}

void suaLuongTX(string ten_tep){

    ifstream ifs;

    ifs.open(ten_tep, ios::binary);

    if(!ifs.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return;
    }

    int read_n;
    //doc so luong tai xe
    ifs.read((char*)&read_n, sizeof(int));
    // doc tung phan tu
    taiXe ds[read_n];
    for(int i=0;i<read_n;i++){
        ifs.read((char*)&ds[i].maTX, sizeof(int));
        ifs.read(ds[i].hoTen, sizeof(ds[i].hoTen));
        ifs.read(ds[i].gioiTinh, sizeof(ds[i].gioiTinh));
        ifs.read((char*)&ds[i].namsinh, sizeof(int));
        ifs.read(ds[i].bienSo, sizeof(ds[i].bienSo));
        ifs.read((char*)&ds[i].luong, sizeof(float));
    }

    int ma_TX, pos=0;
    float luong;
    cout<<" Nhap ma tai xe: "; cin>>ma_TX;

    pos = timKiem(ds,read_n,ma_TX);
    if(pos!=-1){
        cout<<"Nhap luong moi: "; cin>>luong;
        ds[pos].luong=luong;
        luuDS(ds,read_n,"Taixe.txt");
        cout<<"Sua thanh cong!"<<endl;

    }else{
        cout<<"Khong tim thay tai xe!"<<endl;
    }

    ifs.close();
}

//5. sap xep

void sapXep_Hoten(string ten_tep){

    ifstream ifs;

    ifs.open(ten_tep, ios::binary);

    if(!ifs.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return;
    }

    int read_n;
    //doc so luong tai xe
    ifs.read((char*)&read_n, sizeof(int));
    // doc tung phan tu
    taiXe ds[read_n];
    for(int i=0;i<read_n;i++){
        ifs.read((char*)&ds[i].maTX, sizeof(int));
        ifs.read(ds[i].hoTen, sizeof(ds[i].hoTen));
        ifs.read(ds[i].gioiTinh, sizeof(ds[i].gioiTinh));
        ifs.read((char*)&ds[i].namsinh, sizeof(int));
        ifs.read(ds[i].bienSo, sizeof(ds[i].bienSo));
        ifs.read((char*)&ds[i].luong, sizeof(float));
    }

    for(int i=0;i<read_n-1;i++){
        for(int j=i+1;j<read_n;j++){
            if(strcmp(ds[i].hoTen,ds[j].hoTen)>0){
                taiXe tg = ds[i];
                ds[i] = ds[j];
                ds[j] = tg;
            }
        }
    }
    ifs.close();
    luuDS(ds,read_n,"Taixesx.txt");
    docDS("Taixesx.txt");
}


//6. Trich loc nhan vien nu

void trichloc_taixenu(string ten_tep){

    ifstream ifs;

    ifs.open(ten_tep, ios::binary);

    if(!ifs.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return;
    }

    int read_n;
    //doc so luong tai xe
    ifs.read((char*)&read_n, sizeof(int));
    // doc tung phan tu
    taiXe ds[read_n];
    for(int i=0;i<read_n;i++){
        ifs.read((char*)&ds[i].maTX, sizeof(int));
        ifs.read(ds[i].hoTen, sizeof(ds[i].hoTen));
        ifs.read(ds[i].gioiTinh, sizeof(ds[i].gioiTinh));
        ifs.read((char*)&ds[i].namsinh, sizeof(int));
        ifs.read(ds[i].bienSo, sizeof(ds[i].bienSo));
        ifs.read((char*)&ds[i].luong, sizeof(float));
    }

    taiXe dstx_nu[50];
    int index=0;
    for(int i=0;i<read_n-1;i++){
        if(strcmp(ds[i].gioiTinh, "Nu")==0){
            dstx_nu[index]=ds[i];
            index++;
        }
    }

    ifs.close();
    luuDS(dstx_nu,index,"Taixenu.txt");
    docDS("Taixenu.txt");
}

int main(){
    int chon,n;
    taiXe dstx[200];

    do{
        cout<<" |1. Nhap danh sach tai xe"<<endl;
        cout<<" |2. Luu file danh sach tai xe"<<endl;
        cout<<" |3. Doc file danh sach tai xe"<<endl;
        cout<<" |4. Sua luong tai xe"<<endl;
        cout<<" |5. Sap danh sach tai xe theo ho ten va luu file Taixesx.txt"<<endl;
        cout<<" |6. Trich loc tai xe co gioi tinh nu va luu file Taixenu.txt"<<endl;
        cout<<" |0. Thoat"<<endl;
        cout<<"Lua chon: "; cin>>chon;

        switch(chon){
            case 1: {
                nhapDSTX(dstx,n);
                break;
            }

            case 2: {
                luuDS(dstx,n,"TaiXe.txt");
                break;
            }
            case 3: {
                docDS("Taixe.txt");
                break;
            }
            case 4:{
                suaLuongTX("Taixe.txt");
                break;
            }
             case 5:{
                sapXep_Hoten("Taixe.txt");
                break;
            }
            case 6:{
                trichloc_taixenu("Taixe.txt");
                break;
            }

            default: break;

        }
    }while(chon!=0);

}

4. Kết quả

Nhập danh sách n tài xế từ bàn phím Sắp xếp danh sách tài xế theo Họ và tên và lưu vào file “Taixesx.txt” chỉnh sửa lương của tài xế đó và cập nhật vào file. Đọc file “Taixe.txt” Đọc file “Taixe.txt” và hiển thị danh sách

Trong bài toán này, chúng ta đã xây dựng thành công một chương trình quản lý danh sách tài xế. Chương trình cho phép người dùng nhập danh sách tài xế từ bàn phím, lưu danh sách vào file “Taixe.txt”, đọc danh sách từ file và hiển thị ra màn hình. Chúng ta cũng có thể chỉnh sửa lương của một tài xế dựa trên mã tài xế và cập nhật thông tin này vào file. Ngoài ra, chương trình cũng có khả năng sắp xếp danh sách tài xế theo Họ và tên và lưu vào file “Taixesx.txt”, cũng như trích lọc thông tin của các tài xế nữ và lưu vào file “Taixenu.txt”. Cảm ơn các bạn đã theo dõi trên ttnguyen.net.

Tải full bài tập thực hành lập trình C/C++ có lời giải:

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em