Trong bài toán này, chúng ta sẽ tạo một chương trình quản lý danh sách thuê bao điện thoại. Chương trình sẽ cho phép nhập thông tin thuê bao, hiển thị danh sách đã nhập, sắp xếp danh sách theo cước phí giảm dần, tìm thuê bao có cước phí cao nhất, thêm mới thuê bao vào danh sách và xóa các thuê bao có cước phí dưới 10.000.
Mời bạn theo dõi các phần code dưới đây để thực hiện từng yêu cầu của bài toán.
Xem thêm:
1. Bài toán quản lý danh sách thuê bao điện thoại c++
Bài 37 (TH-CSLT-06): Để quản lý thuê bao điện thoại, với mỗi thuê bao người ta cần lưu Số thuê bao, Họ tên khách hàng, Cước phí phải trả, Ngày lập. Hãy viết chương trình thực hiện các yêu cầu sau:
- Nhập danh sách thuê bao điện thoại cho đến khi nhập số thuê bao là “0” và lưu vào mảng.
- Hiện danh sách đã nhập dưới dạng bảng
STT | Số thuê bao | Họ tên | Cước phí | Ngày lập | |
1 | … | … | … | … |
- Sắp xếp danh sách giảm dần của tiền cước phí và hiện danh sách ra màn hình.
- Cho biết số thuê bao nào có tiền cước phí cao nhất.
- Thực hiện thêm mới một số thuê bao vào danh sách với vị trí thêm vào cuối danh sách, hiện danh sách sau khi thêm.
- Thực hiện xóa các thuê bao có số tiền cước phí dưới 10.000 và hiện danh sách sau khi xóa.
2. Ý tưởng thuật toán quản lý điện thoại c++
2.1 Nhập danh sách thuê bao điện thoại cho đến khi nhập số thuê bao là “0” và lưu vào mảng
- Vòng lặp
do-while
sẽ được thực hiện ít nhất một lần và tiếp tục lặp cho đến khi người dùng nhập vào số điện thoại là “0”. - Trong mỗi vòng lặp, hàm sẽ yêu cầu người dùng nhập số điện thoại, tên, cước phí và ngày lập. Các thông tin được lưu trữ vào mảng
dstb
tại vị tríi
. - Biến
n
được tăng lên 1 sau mỗi lần lặp để đếm số lượng phần tử trong mảngdstb
. - Biến
i
cũng được tăng lên 1 sau mỗi lần lặp để đánh dấu vị trí tiếp theo trong mảngdstb
.
2.2 Xóa các thuê bao có số tiền cước phí dưới 10.000
- Vòng lặp
for
ngoài cùng sẽ duyệt qua từng phần tử trong mảngdstb
. - Nếu cước phí của thuê bao tại vị trí
i
trong mảngdstb
nhỏ hơn 10000, vòng lặpfor
bên trong sẽ được thực hiện. - Trong vòng lặp
for
bên trong, các phần tử trong mảngdstb
từ vị tríj=i
đếnn-1
sẽ được dịch sang trái một vị trí (thứ tự giảm dần). - Biến
n
sẽ được giảm đi 1 để bỏ qua phần tử cuối cùng trong mảng (vì nó đã được dịch sang trái). - Biến
i
cũng được giảm đi 1 để duyệt lại phần tử vừa được dịch sang trái.
3. Code
#include<iostream> #include<iomanip> #include<cstring> using namespace std; struct tb{ string sdt; string hoTen; float cuocPhi; string ngayLap; }; void nhapDSTB(tb dstb[], int &n){ int i=0; do{ cout<<"Nhap so thue bao: "; getline(cin,dstb[i].sdt); if (dstb[i].sdt == "0") { break; } cout<<"Nhap ho ten: "; getline(cin,dstb[i].hoTen); cout<<"Nhap cuoc phi: "; cin>>dstb[i].cuocPhi; cin.ignore(); cout<<"Nhap ngay lap: "; getline(cin,dstb[i].ngayLap); n++; i++; cout<<endl; }while(true); } void xuatDSTB( tb dstb[], int n){ cout<<" Danh sach thue bao: "<<endl; cout<<setw(7)<<left<<"STT"; cout<<setw(15)<<left<<"So thue bao"; cout<<setw(25)<<left<<"Ho ten thue bao"; cout<<setw(15)<<left<<"Cuoc phi"; cout<<setw(15)<<left<<"Ngay lap"; cout<<endl; for(int i=0;i<n;i++){ cout<<setw(7)<<left<<i+1; cout<<setw(15)<<left<<dstb[i].sdt; cout<<setw(25)<<left<<dstb[i].hoTen; cout<<setw(15)<<left<<dstb[i].cuocPhi; cout<<setw(15)<<left<<dstb[i].ngayLap; cout<<endl; } } void sapXepCuocPhi(tb dstb[], int n){ for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(dstb[i].cuocPhi<dstb[j].cuocPhi){ tb tg= dstb[i]; dstb[i]=dstb[j]; dstb[j]=tg; } } } xuatDSTB(dstb,n); } void cuocPhi_max(tb dstb[], int n){ float cuocPhi = dstb[0].cuocPhi; for(int i=0;i<n;i++){ if(dstb[i].cuocPhi>cuocPhi){ cuocPhi=dstb[i].cuocPhi; } } for(int i=0;i<n;i++){ if(dstb[i].cuocPhi==cuocPhi){ xuatDSTB(dstb+i,1); } } } void themMoi(tb dstb[], int &n){ do{ cout<<"Nhap so thue bao: "; getline(cin,dstb[n].sdt); if (dstb[n].sdt == "0") { break; } cout<<"Nhap ho ten: "; getline(cin,dstb[n].hoTen); cout<<"Nhap cuoc phi: "; cin>>dstb[n].cuocPhi; cin.ignore(); cout<<"Nhap ngay lap: "; getline(cin,dstb[n].ngayLap); n++; cout<<endl; }while(true); xuatDSTB(dstb,n); } void xoaThueBao(tb dstb[], int &n){ int j; for(int i=0;i<n;i++){ if(dstb[i].cuocPhi<10000){ for(int j=i;j<n;j++){ dstb[j]=dstb[j+1]; } n--; i--; } } xuatDSTB(dstb, n); } int main(){ int n, chon; tb dstb[20]; do{ cout<<"-------------------"<<endl; cout<<"|1. Nhap danh sach thue bao dien thoai"<<endl; cout<<"|2. Xuat danh sach khach hang"<<endl; cout<<"|3. Sap xep danh sach giam dan theo cuoc phi"<<endl; cout<<"|4. Cho biet thue bao co cuoc phi cao nhat"<<endl; cout<<"|5. Them moi thue bao vao cuoi danh sach"<<endl; cout<<"|6. Xoa cac thue bao co so tien cuoc duoi 10.000"<<endl; cout<<"|0. Thoat"<<endl; cout<<"Moi lua chon: "; cin>>chon; cin.ignore(); switch(chon){ case 1: { nhapDSTB(dstb,n); break; } case 2: { xuatDSTB(dstb,n); break; } case 3: { sapXepCuocPhi(dstb,n); break; } case 4: { cuocPhi_max(dstb,n); break; } case 5: { themMoi(dstb, n); break; } case 6: { xoaThueBao(dstb,n); break; } } }while(chon!=0); return 0; }
4. Kết quả
Như vậy, chúng ta đã hoàn thành chương trình quản lý danh sách thuê bao điện thoại. Bằng cách sử dụng các hàm như nhập thông tin thuê bao, hiển thị danh sách, sắp xếp danh sách và tìm thuê bao có cước phí cao nhất. Cảm ơn các bạn đã tham khảo trên ttnguyen.net