[C++] Chương trình quản lý danh sách thuê bao điện thoại

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:

  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.
  2. 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
  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.
  2. Cho biết số thuê bao nào có tiền cước phí cao nhất.
  3. 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.
  4. 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ảng dstb.
  • 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ảng dstb.

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ảng dstb.
  • Nếu cước phí của thuê bao tại vị trí i trong mảng dstb nhỏ hơn 10000, vòng lặp for 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ảng dstb từ vị trí j=i đến n-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ậ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 thuê bao điện thoại Sắp xếp danh sách giảm dần của tiền cước phí 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 Thực hiện xóa các thuê bao có số tiền cước phí dưới 10.000

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

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