[C++] Chương trình quản lý danh sách xe ô tô – Nhập, xoá, tìm kiếm

Tạo ra một chương trình quản lý danh sách các xe ô tô c++ cho phép nhập thông tin về các chiếc xe ô tô, hiển thị danh sách đã nhập, tìm kiếm các xe theo tiêu chí số chỗ ngồi và giá thuê, xoá bỏ các xe đã qua thời gian sản xuất cố định và tăng giá cho các xe cụ thể.

Xem thêm:

1. Bài toán quản lý danh sách xe ô tô c++

Bài 33 (TH-CSLT-01). Viết các chương trình con thực hiện các công việc sau

– Nhập danh sách các xe ô tô với các thông tin của từng ô tô như sau: tên xe, màu xe, số chỗ ngồi, năm sản xuất, giá thuê theo ngày.

– Hiện danh sách vừa nhập ra màn hình theo khuôn dạng sau:

STT Tên xe Màu xe Số chỗ ngồi Năm SX Giá cho thuê
1 Mazda Đỏ 5 2009 540000
2

– Tìm và hiển thị thông tin các xe có 5 chỗ ngồi với giá cho thuê theo ngày từ X đến Y. Danh sách hiển thị theo chiều giảm dần của giá cho thuê theo ngày.

– Xoá bỏ các xe đã được sản xuất cách N (nhập từ bàn phím) năm so với năm hiện tại.

– Tăng giá thêm 10% cho các xe sản xuất vào năm Y (nhập từ bàn phím) và có 5 chỗ ngồi.

Chú ý: Sử dụng menu để việc gọi các chương trình con được thuận tiện.

2. Ý tưởng bài toán

2.1 Tìm xe có 5 chỗ ngồi với giá cho thuê theo ngày từ X đến Y

Thực hiện tìm kiếm các xe trong danh sách xe đã cho, với các tiêu chí sau đây:

  • Số chỗ ngồi của xe là 5.
  • Giá cho thuê của xe nằm trong khoảng giá đã nhập từ bàn phím.

Nếu có xe phù hợp với các tiêu chí trên, chúng sẽ được lưu vào mảng xe mới bắt đầu từ chỉ số n, trong đó n là số lượng xe trong danh sách xe ban đầu. Sau đó, danh sách xe mới này sẽ được sắp xếp theo thứ tự giảm dần của giá thuê. Cuối cùng, nếu danh sách xe mới không trống, nó sẽ được in ra màn hình với các thông tin chi tiết của từng xe, bao gồm tên xe, màu xe, số chỗ ngồi, năm sản xuất và giá cho thuê. Nếu danh sách xe mới trống, chương trình sẽ in ra thông báo “Không tìm thấy”.

Xem thêm: [C++] Tìm kiếm và thay thế ký tự trong chuỗi

2.2 Xoá bỏ các xe đã được sản xuất cách N (nhập từ bàn phím) năm so với năm hiện tại

Hàm xoaXe được sử dụng để xóa các xe trong danh sách xe ds đã cho, với điều kiện là năm sản xuất của xe đó phải bằng với năm được nhập vào từ bàn phím. Các bước cụ thể để thực hiện việc xóa xe như sau:

  • Nhập năm được chỉ định từ bàn phím bằng câu lệnh cout<<"Nhap so nam: "; cin>>nam;.
  • Duyệt qua danh sách xe để tìm các xe thỏa mãn điều kiện:
    • Nếu năm sản xuất của xe đó bằng với năm được chỉ định, xe đó sẽ bị xóa khỏi danh sách xe. Biểu thức (1900 + t->tm_year) được sử dụng để lấy năm hiện tại tính từ năm 1900, bởi vì trường tm_year trong cấu trúc tm chứa số năm tính từ năm 1900. Sau đó, với mỗi phần tử của mảng ds, biểu thức (1900 + t->tm_year) - ds[i].namSX tính số năm đã trôi qua kể từ năm sản xuất của xe.
  • Xóa xe khỏi danh sách xe:
    • Duyệt vòng lặp for dịch chuyển các xe trong danh sách xe, bắt đầu từ vị trí của xe bị xóa. Mỗi xe sau đó sẽ được di chuyển lên một vị trí để lấp đầy vị trí của xe bị xóa. Cuối cùng, số lượng xe trong danh sách xe cũng sẽ giảm đi 1.

Đọc thêm: [C++] Xoá phần tử trong mảng tại vị trí lẻ dễ hiểu nhất

Hàm time()

Hàm time() trả về thời gian hiện tại tính bằng giây kể từ ngày 1 tháng 1 năm 1970. Nó nhận một con trỏ đến một đối tượng time_t làm đối số, đối tượng này sẽ được điền vào thời gian hiện tại. Trong trường hợp này, đối tượng time_t được khởi tạo thành 0, có nghĩa là nó sẽ được điền bằng thời gian hiện tại.

Hàm localtime()

Hàm localtime() được sử dụng để chuyển đổi thời gian tính bằng giây thành định dạng dễ đọc hơn. Nó nhận một con trỏ đến một đối tượng time_t làm đối số và trả về một con trỏ đến một cấu trúc tm chứa thời gian và ngày giờ hiện tại được phân tách thành các thành phần của nó (ví dụ: năm, tháng, ngày, giờ, phút, giây). Cấu trúc tm được định nghĩa trong tệp tiêu đề time.h.

Trong đoạn mã này, biến now được thiết lập thành thời gian hiện tại và con trỏ t được thiết lập thành cấu trúc tm tương ứng với thời gian và ngày giờ địa phương hiện tại.

2.3 Tăng giá thêm 10% cho các xe sản xuất vào năm Y và có chỗ ngồi

– Xây dựng hàm tangGia có chức năng là tăng giá thuê xe 5 chỗ sản xuất trong năm được nhập vào lên 110% so với giá thuê hiện tại.

Cụ thể, đầu vào của hàm là một mảng ds gồm n phần tử kiểu xe. Đầu tiên, hàm yêu cầu người dùng nhập năm sản xuất xe muốn tăng giá thuê. Sau đó, hàm duyệt qua từng phần tử trong mảng ds, nếu xe có năm sản xuất bằng với năm được nhập vào và có số chỗ ngồi là 5, thì giá thuê xe đó sẽ được tăng lên 110% bằng cách nhân giá thuê hiện tại với hằng số 1.1.

Cuối cùng, hàm gọi lại hàm xuatDS để in ra danh sách các xe sau khi đã tăng giá thuê.

3. Code quản lý danh sách ô tô c++

#include<iostream>
#include<string>
#include<iomanip>
#include<ctime>
using namespace std;

struct xe{
    string tenXe;
    string mauXe;
    int choNgoi;
    int namSX;
    float giaThue;
};

void nhapDS(xe ds[], int n){

    for(int i=0;i<n;i++){
        cin.ignore();
        cout<<"Nhap ten xe: "; getline(cin, ds[i].tenXe);
        cout<<"Nhap mau xe: "; getline(cin,ds[i].mauXe);
        cout<<"Nhap so cho ngoi: "; cin>>ds[i].choNgoi;
        cout<<"Nhap nam san xuat: "; cin>>ds[i].namSX;
        cout<<"Nhap gia cho thue: "; cin>>ds[i].giaThue;
        cout<<endl;
    }
}

void xuatDS(xe ds[], int n){

    cout<<setw(7)<<left<<"STT";
    cout<<setw(15)<<left<<"Ten xe";
    cout<<setw(15)<<left<<"Mau xe";
    cout<<setw(15)<<left<<"Cho ngoi";
    cout<<setw(15)<<left<<"Nam sx";
    cout<<setw(15)<<right<<"Gia thue";
    cout<<endl;

    for(int i=0;i<n;i++){
        cout<<setw(7)<<left<<i+1;
        cout<<setw(15)<<left<<ds[i].tenXe;
        cout<<setw(15)<<left<<ds[i].mauXe;
        cout<<setw(15)<<left<<ds[i].choNgoi;
        cout<<setw(15)<<left<<ds[i].namSX;
        cout<<setw(15)<<right<<ds[i].giaThue<<endl;
    }

}

void timXe(xe ds[], int n){

    float x,y;
    int index=n;
    cout<<"Nhap gia cho thue x: "; cin>>x;
    cout<<"Nhap gia cho thue y: "; cin>>y;
    for(int i=0;i<n;i++){
        if(ds[i].choNgoi==5 && ds[i].giaThue>=x && ds[i].giaThue<=y){
            ds[index]=ds[i];
            index++;
        }
    }

    if(index>0){

        for(int i=n;i<index;i++){
            for(int j=i+1;j<index;j++){
                if(ds[i].giaThue<ds[j].giaThue){
                    xe temp = ds[i];
                    ds[i]=ds[j];
                    ds[j]=temp;
                }
            }
        }
        cout<<setw(7)<<left<<"STT";
        cout<<setw(15)<<left<<"Ten xe";
        cout<<setw(15)<<left<<"Mau xe";
        cout<<setw(15)<<left<<"Cho ngoi";
        cout<<setw(15)<<left<<"Nam sx";
        cout<<setw(15)<<right<<"Gia thue";
        cout<<endl;

        for(int i=n;i<index;i++){
            cout<<setw(7)<<left<<i+1;
            cout<<setw(15)<<left<<ds[i].tenXe;
            cout<<setw(15)<<left<<ds[i].mauXe;
            cout<<setw(15)<<left<<ds[i].choNgoi;
            cout<<setw(15)<<left<<ds[i].namSX;
            cout<<setw(15)<<right<<ds[i].giaThue<<endl;
        }
    }else{
        cout<<"Khong tim thay"<<endl;
    }
}

void xoaXe(xe ds[], int n){
    int nam;
    time_t now = time(0);
    tm* t = localtime(&now);
    cout<<"Nhap so nam: "; cin>>nam;
    for(int i=0; i<n; i++){
        if((1900 + t->tm_year) - ds[i].namSX == nam){
            for(int j=i; j<n-1; j++){
                ds[j]=ds[j+1];
            }
            n--;
            i--;
        }
    }
    xuatDS(ds, n);
}

void tangGia(xe ds[], int n){
    int y;
    cout<<"Nhap nam san xuat Y: "; cin>>y;
    for(int i=0;i<n;i++){
        if(ds[i].namSX==y && ds[i].choNgoi==5){
            ds[i].giaThue=ds[i].giaThue*1.1;
        }
    }

    xuatDS(ds,n);
}


int main(){
    xe ds[10];
    int n,i,chon;
    cout<<"Nhap so xe n: "; cin>>n;
    do{
        cout<<"-------------------"<<endl;
        cout<<"|1. Nhap danh sach xe"<<endl;
        cout<<"|2. Xuat danh sach xe"<<endl;
        cout<<"|3. Tim va hien thi thong tin xe co 5 cho ngoi voi gia cho thue theo ngay tu X den Y"<<endl;
        cout<<"|4. Xoa bo xe da duoc san xuat cach N nam"<<endl;
        cout<<"|5. Tang gia xe 10% cho xe san xuat vao nam Y"<<endl;
        cout<<"|0. Thoat"<<endl;
        cout<<"Moi lua chon: "; cin>>chon;

        switch(chon){
            case 1: {
                nhapDS(ds,n);
                break;
            }

            case 2: {
                xuatDS(ds,n);
                break;
            }

            case 3: {
                timXe(ds,n);
                break;
            }

            case 4: {
                xoaXe(ds,n);
                break;
            }

            case 5: {
                tangGia(ds,n);
                break;
            }

        }

    }while(chon!=0);
    return 0;

}

4. Kết quả

Nhập danh sách các xe ô tô với các thông tin của từng ô tô như sau: tên xe, màu xe, số chỗ ngồi, năm sản xuất, giá thuê theo ngày Hiển thị danh sách các xe ô tô với các thông tin của từng ô tô như sau: tên xe, màu xe, số chỗ ngồi, năm sản xuất, giá thuê theo ngày Tìm và hiển thị thông tin các xe có 5 chỗ ngồi với giá cho thuê theo ngày từ X đến Y. Danh sách hiển thị theo chiều giảm dần của giá cho thuê theo ngày Xoá bỏ các xe đã được sản xuất cách N (nhập từ bàn phím) năm so với năm hiện tại Tăng giá thêm 10% cho các xe sản xuất vào năm Y (nhập từ bàn phím) và có 5 chỗ ngồi

Lời kết

Trong bài viết này, chúng ta đã tạo ra một chương trình quản lý danh sách các xe ô tô với những chức năng quan trọng như nhập danh sách xe ô tô, hiển thị danh sách, tìm kiếm theo tiêu chí số chỗ ngồi và giá thuê, xoá bỏ các xe đã qua thời gian sản xuất cố định, và tăng giá cho các xe cụ thể.

Qua việc sử dụng menu trong chương trình, chúng ta đã tạo ra một giao diện thuận tiện cho người dùng để lựa chọn các chức năng một cách dễ dàng giúp tiết kiệm thời gian và nâng cao hiệu quả. Cảm ơn các bạn đã theo dõi trên ttnguyen.net

Bài tiếp theo: quản lý danh sách khách hàng c++

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