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:
- 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ếnnam
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. - 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ườngtm_year
trong cấu trúctm
chứa số năm tính từ năm 1900. Sau đó, với mỗi phần tử của mảngds
, 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: 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ượngtime_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ượngtime_t
được khởi tạo thành0
, 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ượngtime_t
làm đối số và trả về một con trỏ đến một cấu trúctm
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úctm
đượ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úctm
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ả