[C++] Xoá bỏ các xe đã được sản xuất cách N năm – Chương trình con

1. Bài toán

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”.

Cụ thể, đây là các tham số đầu vào của hàm:

  • Mảng xe ds[]: một mảng các đối tượng xe được khai báo trước đó, chứa thông tin chi tiết về các xe.
  • Số nguyên n: số lượng xe hiện có trong danh sách xe.

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:

  1. Nhập năm được chỉ định từ bàn phím bằng câu lệnh cout<<"Nhap so nam: "; cin>>nam;. Biến nam sẽ được sử dụng để tìm các xe có năm sản xuất bằng với năm này.
  2. Duyệt qua danh sách xe để tìm các xe thỏa mãn điều kiện trên: Điều này được thực hiện bằng cách sử dụng một vòng lặp for và kiểm tra năm sản xuất của mỗi xe trong danh sách xe. Nếu năm sản xuất của xe đó bằng với năm được chỉ định, xe đó sẽ được 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.
  3. Xóa xe khỏi danh sách xe: Khi một xe được tìm thấy thỏa mãn điều kiện, xe đó sẽ được xóa khỏi danh sách xe. Để làm điều này, một vòng lặp for khác được sử dụng để 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.
  • 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() đượ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

#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

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