首頁 > 軟體

C++類別實現通訊錄功能

2022-06-20 22:00:39

本文範例為大家分享了C++類別實現通訊錄功能的具體程式碼,供大家參考,具體內容如下

軟體使用的是Microsoft Visual Studio

編寫通訊錄之前,先思考一下要實現什麼功能,大概的結構,要建立幾個類等等。

首先,是思考要實現什麼功能。

一般的通訊錄有新增,刪除,修改,查詢,顯示等功能,一般聯絡人的資訊包括:姓名,性別,年齡,電話號碼,家庭地址。

我們首先新建一個類,用來初始化姓名,年齡,性別,電話號碼,家庭地址,這幾個變數

#pragma once
#include<iostream>
#include<string>
//#include "MailList.hpp"
using namespace std;
class MailList
{
public:
    void setName(string);//給變數賦值函數
    void setAge(string);
    void setSex(string);
    void setTel(string);
    void setAddress(string);
    string getName();//返回變數值函數
    string getAge();
    string getSex();
    string getTel();
    string getAddress();
 
private:
    string name;//私有函數成員,定義變數
    string age;
    string sex;
    string tel;
    string address;
};
 
 
void MailList::setName(string name)
{
    this->name=name;
}
void MailList::setAge(string age)
{
    this->age=age;
}
void MailList::setSex(string sex)
{
    this->sex=sex;
}
void MailList::setTel(string tel)
{
    this->tel=tel;
}
void MailList::setAddress(string address)
{
    this->address=address;
}
string MailList::getName()
{
    return this->name;
}
string MailList::getAge()
{
    return this->age;
}
string MailList::getSex()
{
    return this->sex;
}
string MailList::getTel()
{
    return this->tel;
}
string MailList::getAddress()
{
    return this->address;
}

這裡也可以使用建構函式初始化函數成員,建構函式函數名與類名一樣。

然後,建立一個通訊錄管理類,先把總的結構搭建起來

class MailListManager//通訊錄管理類
{
public:
    MailListManager();//建構函式
    void initList();//初始化通訊錄功能,在通訊錄裡記錄為空時使用
    void insertList();//新增聯絡人功能,在通訊錄裡有記錄時使用
    void showList();//顯示聯絡人功能,顯示通訊錄中所有聯絡人的記錄
    void deleteList();//刪除聯絡人功能
    void selectList();//查詢聯絡人功能
    void updateList();//修改聯絡人功能
    void dropList();//清空通訊錄功能
    void save();//儲存到檔案,檔案的寫入
    void loading();//載入,讀出檔案
    string pw();//密碼加密(我沒能實現)
    int exiet(string);//檢查聯絡人是否存在
 
private:
 
    MailList mail[Max];//陣列,MailList型別,這屬於範例化物件
    int len;//計數器
 
};
MailListManager::MailListManager()//建構函式就是用來初始化函數成員的,未初始化的函數成員不可用。這裡初始化一下計數器
{
    len = 0;
}
int MailListManager::exiet(string name)//定義檢查函數,檢查聯絡人是否存在,以姓名的匹配為條件
{
 
}
void MailListManager::loading()//定義載入函數
{
 
}
void MailListManager::save()//定義儲存函數
{
 
}
void MailListManager::initList()//定義初始化函數
{
 
}
void MailListManager::insertList()//定義新增函數
{
 
}
void MailListManager::showList()//定義顯示函數
{
 
}
void MailListManager::updateList()//定義修改函數
{
 
}
void MailListManager::deleteList()//定義刪除函數
{
 
}
void MailListManager::selectList()//定義查詢函數
{
 
}
void MailListManager::dropList()//定義清空函數
{
 
}

總結構搭建好後,再開始編寫裡面的定義內容。

//這裡宣告部分就不顯示了,直接看定義
 
void MailListManager::loading()//載入函數的定義
{
    len = 0;//計數器len,每次呼叫載入函數的時候都要重新初始化為0,這樣做是防止之後新增聯絡人時重複載入導致儲存多次。
    string name, sex, age, tel, address;//區域性變數,每次使用都要宣告一下的
    ifstream in;//範例化檔案類「fstream」物件
    in.open("maillist/mail.txt");//開啟檔案
    if (!in)//如果檔案未開啟
    {
 
        cout << "--檔案開啟失敗--" << endl;
        system("pause");
    }
    else
    {
        while (!in.eof())//如果未達到檔案末尾
        {
            in >> name >> age >> sex >> tel >> address;
            if (in.fail())break;//ifstream類的作用是從檔案中讀出資料到控制檯上,但沒有顯示出來,這就相當於再次賦值給陣列,就是給之前宣告的MailList類的陣列,所以這裡使用陣列mail[*].***儲存資料,因為不知道到底有多少資料,所以用死迴圈來控制,跳出條件是達到檔案末尾就跳出,這樣就可以保證將檔案中的內容全部存到陣列裡
            mail[len].setName(name);
            mail[len].setAge(age);
            mail[len].setSex(sex);
            mail[len].setTel(tel);
            mail[len].setAddress(address);
            len++;
        }
    }
    in.close();
}
int MailListManager::exiet(string name)//檢驗聯絡人是否存在
{
    for (int i = 0; i < len; i++)//每當呼叫檢驗聯絡人的函數之前,一定要載入一下,讓資料全部儲存到控制檯的陣列中,且要從控制檯輸入一個名字傳給檢驗聯絡人函數,讓傳入的名字與陣列中的資料逐一對比,從而檢驗聯絡人是否存在
    {
        if (mail[i].getName() == name)
        {
            return i;//如果存在,返回陣列下標
        }
    }
    return -1;//不存在,返回-1
}
void MailListManager::save()//儲存檔案函數
{
    ofstream out;//ofstream類的作用是把控制檯上的資料寫入檔案
    out.open("maillist/mail.txt");//開啟檔案
    if (!out)//如果檔案未開啟
    {
        cout << "--檔案開啟失敗--" << endl;
    }
    else
    {
        for (int i = 0; i < len; i++)//這裡的計數器len的值來自之後定義的函數中,len的值取決於誰呼叫的儲存函數
        {
            out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl;
        }
    }
 
 
    out.close();
}
 
 
void MailListManager::initList()//初始化聯絡人。之前我先寫了新增,修改,刪除,在解決一些問題的時候發現新增功能呼叫載入函數與刪除修改功能呼叫載入函數有衝突,導致重複顯示,所以在老師的幫助下加入了這個初始化聯絡人功能,當然有更好的方法,只是我暫時還不會用(TvT)
{
    string name, age, sex, tel, address;
    cout << "請輸入聯絡人的資訊(在姓名後輸入stop停止輸入):" << endl;
    while (true)
    {
        cout << "姓名:";
        cin >> name;
        if (name == "stop") break;
        else
        {
            mail[len].setName(name);//簡單的呼叫函數,不想講了
            cout << "年齡:";
            cin >> age;
            mail[len].setAge(age);
            cout << "性別:";
            cin >> sex;
            mail[len].setSex(sex);
            cout << "電話號碼:";
            cin >> tel;
            mail[len].setTel(tel);
            cout << "家庭地址:";
            cin >> address;
            mail[len].setAddress(address);
            len++;//這個len最終的值會給到save.....emmm..說「給」好像不太準確,找不到合適的詞了,反正程式碼順著往下執,len加到最後不會再變了,save直接用它。
        }
    }
    save();
 
}
void MailListManager::insertList()//新增聯絡人函數
{
    this->loading();//載入一下初始化聯絡人的資料
    string name, age, sex, tel, address;//區域性變數要重新宣告
    cout << "請輸入插入聯絡人的數量:" << endl;
    int count = 0;//再來個計數器,控制每次想要新增的聯絡人的數量
    cin >> count;//讓使用者來指定每次新增多少人
    for (int i = 0; i < count; i++)
    {
        cout << "姓名:";
        cin >> name;
        mail[i].setName(name);//函數呼叫過程,還是說一下吧。mail[]陣列的型別是MailList,然後它是MailListManager這個類的函數成員,通過它作為橋樑來呼叫MailListManager類成員函數
        cout << "年齡:";
        cin >> age;
        mail[i].setAge(age);
        cout << "性別:";
        cin >> sex;
        mail[i].setSex(sex);
        cout << "電話號碼:";
        cin >> tel;
        mail[i].setTel(tel);
        cout << "家庭地址:";
        cin >> address;
        mail[i].setAddress(address);
    }
    ofstream out;//新增有單獨的儲存檔案定義,因為只有新增功能需要使用檔案追加
    out.open("maillist/mail.txt", ios::app);
    if (!out)
    {
        cout << "--檔案開啟失敗--" << endl;
    }
    else
    {
        for (int i = 0; i < count; i++)
        {
            out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl;
        }
        out.close();
    }
}
void MailListManager::showList()//顯示聯絡人
{
 
    loading();
    MailList temp;
    for (int j=0;j<len;j++)//這裡是給聯絡人排序,通過名字排序
    {
        for (int i = j+1; i < len; i++)
        {
            if (mail[j].getName() > mail[i].getName())
            {
                temp = mail[i];
                mail[i] = mail[j];//交換
                mail[j] = temp;    
            }
        }
        
    }
    for (int i = 0; i < len; i++)//這裡的len值來自loading()
    {
        cout << setw(10) << mail[i].getName() << "  " << setw(8) << mail[i].getAge() << "  " << setw(4) <<
            mail[i].getSex() << "  " << setw(15) << mail[i].getTel() << "  " << setw(20) << mail[i].getAddress();//setw()是格式控制函數
        cout << endl << endl;
    }
}
void MailListManager::updateList()//修改聯絡人,修改聯絡人之前要找到這個聯絡人,存在才能刪除
{
    loading();//載入一下
    string name, age, sex, tel, address;
    cout << "請輸入要修改的聯絡人姓名:";
    cin >> name;
    int ret = exiet(name);//檢驗一下是否存在,存在exiet()會返回該聯絡人所在的陣列下標,在這個陣列下標裡重新輸入一遍資料覆蓋掉原有資料就是修改聯絡人了
    if (ret != -1)
    {
        cout << "請重新輸入聯絡人資訊:" << endl;
        cout << "姓名:";
        cin >> name;
        mail[ret].setName(name);
        cout << "年齡:";
        cin >> age;
        mail[ret].setAge(age);
        cout << "性別:";
        cin >> sex;
        mail[ret].setSex(sex);
        cout << "電話號碼:";
        cin >> tel;
        mail[ret].setTel(tel);
        cout << "家庭地址:";
        cin >> address;
        mail[ret].setAddress(address);
    }
    else
        cout << "啊哦~聯絡人不存在喔(-o-)";
    save();//改完記得重新儲存一下,不然是沒有任何改動的哦
}
void MailListManager::deleteList()//刪除聯絡人,理同修改一樣,只不過是資訊的覆蓋變為了內容前移覆蓋
{
    loading();
    string name;
    int o;
    cout << "請輸入要刪除的聯絡人的姓名:  ";
    cin >> name;
    int ret = exiet(name);
    if (ret == -1)
    {
        cout << "啊哦~聯絡人不存在喔(-o-)";
    }
    else
    {
        cout << "確定要刪除嗎?" << endl << "1.確定" << "    " << "2.我再想想" << endl << "請選擇:";
        cin >> o;
        if (o == 2)
            cout << "好的~";
        else
        {
 
            for (int i = ret; i < len; i++)
            {
                mail[i] = mail[i + 1];
            }
 
 
            cout << "刪除成功!";
        }
    }
    save();
 
}
void MailListManager::selectList()//查詢聯絡人,查詢聯絡人就更簡單啦,呼叫一下檢驗存在的函數,然後根據下標直接輸出此聯絡人資訊就好
{
    loading();
    string name;
    cout << "請輸入要查詢的人的姓名:   ";
    cin >> name;
    int ret = exiet(name);
    if (ret != -1)
    {
        cout << "姓名:" << mail[ret].getName() << endl;
        cout << "年齡:" << mail[ret].getAge() << endl;
        cout << "性別:" << mail[ret].getSex() << endl;
        cout << "電話號碼:" << mail[ret].getTel() << endl;
        cout << "家庭地址:" << mail[ret].getAddress() << endl;
    }
    else
        cout << "啊哦~聯絡人不存在喔(-o-)";
}
void MailListManager::dropList()//清空通訊錄,重新寫入檔案,寫入一個空字元覆蓋之前的資料,就清空啦
{
    int n;
    cout << "確定清空嗎?" << endl << "  " << "1.YES" << "   " << "2.NO" << "請選擇:";
    cin >> n;
    if (n == 2)
    {
        cout << "好的~";
    }
    else
    {
        ofstream out;
        out.open("maillist/mail.txt");
        if (!out)
        {
            cout << "--檔案開啟失敗--" << endl;
        }
        else
        {
            out << " ";
            cout << "清除成功" << endl;
        }
        out.close();
    }
}
string MailListManager::pw()//密碼加密,未完成
{
    char psw[100] = { 0 }, c;
    int i = 0;
/*    cin >> c*/;
    while ((c = getch()) != 'r')
    {
        if (c != 'b')
        {
            cout << "*";
            psw[i++];
        }
        else
        {
            cout << "b b";
            i--;
        }
    }
    psw[i] = '';
    cout << psw;
    
}

然後再寫個登陸類

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class User
{
public:
    User();
    void loading();
    int check(string);
    int login(string, string);
    void sign(string,string);
private:
    string s[50];
    int len;
 
};
User::User()
{
    len = 0;
}
 
void User::loading()//載入函數
{
    string name, password;
    ifstream in;
    in.open("User/user.txt");
    if (!in)
    {
        cout << "錯誤!";
    }
    else
    {
        while (!in.eof())
        {
            in >> s[len];
            if (in.fail())break;
            len++;
        }
 
    }
    in.close();
}
int User::check(string name)//檢驗函數
{
    loading();
    for (int i = 0; i < len; i=i+2)
    {
        if (name == s[i])
        {
            return i;
        }
        else
        {
            return -1;
        }
    }
}
int User::login(string name, string password)//登陸函數
{
    if (check(name) == -1)
    {
        cout << "使用者根本不存在喔!";
    }
    else
    {
        if (s[check(name) + 1] == password)
        {
            return 1;
        }
        else
        {
            cout << "密碼輸入錯誤!";
        }
    }
}
void User::sign(string name,string password)//註冊函數
{
    loading();
    if (check(name) != -1)//已有使用者名稱
    {
        cout << "使用者名稱已存在!";
    }
    else
    {
        ofstream out;
        out.open("User/user.txt", ios::app);
        if (!out)
        {
            cout << "檔案開啟失敗!";
        }
        else
        {
            out <<endl<< name<<" "<< password;
        }
        out.close();
        cout << "                                            註冊成功!";
        system("pause");
    }
}

登陸類的載入函數,檢驗函數邏輯同之前管理類的一樣,登陸函數與註冊函數,實際上就是檔案讀出與寫入。

最後,寫主函數

#include"MailListManager.hpp"
#include"userl.hpp"
void menu()
{
    cout << endl << endl << endl ;
    cout << "                                            -----------(^O^)---------" << endl;
    cout << "                                            -     1、初始化聯絡人   -" << endl;
    cout << "                                            -     2、顯示聯絡人     -" << endl;
    cout << "                                            -     3、刪除聯絡人     -" << endl;
    cout << "                                            -     4、查詢聯絡人     -" << endl;
    cout << "                                            -     5、修改聯絡人     -" << endl;
    cout << "                                            -     6、清空聯絡人     -" << endl;
    cout << "                                            -     7、新增聯絡人     -" << endl;
    cout << "                                            -     0、退出通訊錄     -" << endl;
    cout << "                                            ---------(·v·)---------" << endl;
}//手動格式控制O(∩_∩)O哈哈~
int main()
{
    User u;//範例化物件
    int e;
    cout << endl << endl << endl << endl << endl << endl;
    cout << "                            ******************歡迎使用通訊錄管理系統~******************" << endl;
    cout << "                            *                                                         *" << endl;
    cout << "                            *                                                         *" << endl;
    cout << "                            *                                                         *" << endl;
    cout << "                            **********************              ***********************" << endl;
    cout << "                            **1.我已有賬戶,登入**" <<"              "<< "** 2.我沒有賬戶,註冊**" << endl;
    cout << "                            **********************              ***********************" << endl;//這是一個登陸介面,有賬戶才能管理通訊錄哦
    cout << endl<<endl;
    cout<<"                                 請選擇:";
    cin >> e;
    if (e == 1)
    {
        while (true)
        {
            MailListManager* m = new MailListManager;//來個指標指向堆區
            system("cls");
            string name, password;
            cout <<endl<<endl<< "                                            請輸入:" << endl << "                                            使用者名稱:";
            cin >> name;
            cout << endl << "                                            密碼:";
            cin >> password;
            /*password = getch();*/  //這兩段本來是用來密碼加密的,但我沒實現所以註釋掉了
            /*m->pw();*/
            /*password = putch(getch());*/
            int i = u.login(name, password);//呼叫User裡的登陸函數,並將返回值給i,i=1就證明使用者名稱密碼輸入正確,反之就是輸入錯誤
            if (i == 1)
            {
                int n;
                while (true)
                {
                    system("cls");
                    cout <<endl<<endl<< "                                            登入成功!歡迎" << name << endl;
                    cout << "                                            通訊錄管理系統功能選項" << endl;
                    menu();
                    cout << "                                            請選擇:";
                    cin >> n;
                    switch (n)
                    {
                    case 7:system("cls"); m->insertList(); system("pause"); break;
                    case 2:system("cls"); m->showList(); system("pause"); break;
                    case 3:system("cls"); m->deleteList();  system("pause"); break;
                    case 4:system("cls"); m->selectList(); system("pause"); break;
                    case 5:system("cls"); m->updateList(); system("pause"); break;
                    case 6:system("cls"); m->dropList(); system("pause"); break;
                    case 1:system("cls"); m->initList(); system("pause"); break;//呼叫各種函數
                    case 0:exit(0); break;
                    }
                }
                delete m;
                m = NULL;
            }
            else
            {
                cout<<endl<<endl << "                                            請重新輸入" << endl;
                system("pause");
            }
        }
 
    }
    else
    {
        u.loading();//呼叫User類裡的載入函數
        while (true)
        {
            system("cls");
            string name, password;
            cout <<endl<<endl<< "                                            請輸入:" << endl << "                                            使用者名稱:";
            cin >> name;
            if (u.check(name) !=-1)
            {
                cout << "                                            使用者名稱已存在!請重新輸入:"<<endl;
                system("pause");
            }
            else
            {
                MailListManager* m = new MailListManager;
                cout << endl << "                                            密碼:";
                cin >> password;
                /*m->pw();*/
                u.sign(name, password);//呼叫User類的註冊函數,儲存註冊使用者資訊
                int n;
                while (true)
                {
                    system("cls");
                    cout <<endl<<endl<< "                                            註冊成功!歡迎" << name << endl;
                    cout << "                                            通訊錄管理系統功能選項" << endl;
                    menu();
                    cout << "                                            請選擇:";
                    cin >> n;
                    switch (n)
                    {
                    case 1:system("cls"); m->insertList(); system("pause"); break;
                    case 2:system("cls"); m->showList(); system("pause"); break;
                    case 3:system("cls"); m->deleteList();  system("pause"); break;
                    case 4:system("cls"); m->selectList(); system("pause"); break;
                    case 5:system("cls"); m->updateList(); system("pause"); break;
                    case 6:system("cls"); m->dropList(); system("pause"); break;
                    case 7:system("cls"); m->initList(); system("pause"); break;//呼叫各種函數
                    case 0: exit(0); break;
                    }
                }
            }
        }
    }
    return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com