源码没备注,亲测可用,应该是没什么大问题,记得在放源码的目录中添加一个“Tel_Book.txt”的文本文件,不然程序就会打不开这个文本文件而终止。记得在放源码的目录中添加一个“Tel_Book.txt”的文本文件,接下来就是源码了。
tel_book.h
#ifndef TEL_BOOK_H_
#define TEL_BOOK_H_
#include<string>
class Tel_Book
{
private:
const std::string Type[4] = { "亲人","朋友","同学","同事" };
class Name_PhoneNum
{
public:
std::string name;
std::string phoneNum;
std::string type;
Name_PhoneNum* next;
Name_PhoneNum(const std::string& n, const std::string& p, const std::string& t) :name(n), phoneNum(p), type(t), next(0) { }
};
Name_PhoneNum* front;
Name_PhoneNum* rear;
static int count_friend;
static int count_relative;
static int count_colleage;
static int count_classmate;
static int count_tot;
public:
Tel_Book() :front(0), rear(0) { }
bool read_contact();
bool save_contact();
bool add_contact();
bool check_num(std::string &num);
void show_all(int n) const;
void show_part(int n) const;
bool del_contact(char n);
void search_contact(char n) const;
void format() const;
};
#endif // !TEL_BOOK_H_
tel_book.cpp
#include<iostream>
#include<fstream>
#include<iomanip>
#include<Windows.h>
#include"tel_book.h"
using std::cout;
using std::cin;
using std::endl;
using std::setw;
using std::string;
int Tel_Book::count_classmate = 0;
int Tel_Book::count_colleage = 0;
int Tel_Book::count_friend = 0;
int Tel_Book::count_relative = 0;
int Tel_Book::count_tot = 0;
void Tel_Book::format() const
{
cout.setf(std::ios::left);
cout << setw(10) << "姓 名" << setw(16) << "手机号码" << "类型" << endl;
}
bool Tel_Book::add_contact()
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << " 添加联系人 \n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout << "--------------------------------\n\n";
string name;
string num;
string type;
int numflag1, numflag2;
int typeflag;
Name_PhoneNum* temp = front;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "请输入联系人姓名(按0返回): ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, name);
if (name == "0")
return false;
cin.clear();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "请输入联系人手机号码(按0返回): ";
if (this->check_num(num)==false)
{
return false;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "请输入联系人类别(朋友、亲人、同学、同事)(按0返回): ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, type);
while (1)
{
if (type == "0")
return false;
typeflag = 0;
for (int i = 0; i < 4; i++)
{
if (type == Type[i])
{
typeflag = 1;
break;
}
}
if (typeflag == 1)
break;
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "没有与输入的联系人类型相匹配的类型,请重新输入:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, type);
}
}
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "姓 名:" << name << endl
<< "手机号码:" << num << endl
<< "类型:" << type << endl;
cout << "1-- 确认添加\n";
cout << "0-- 放弃添加\n";
cout << "请输入你的选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
char select;
while (cin >> select)
{
if (select == '0')
{
return false;
}
else if (select == '1')
{
Name_PhoneNum* add = new Name_PhoneNum(name, num, type);
if (front == 0)
{
front = add;
rear = add;
}
else
{
if (name < front->name)
{
add->next = front;
front = add;
}
else
{
temp = front->next;
Name_PhoneNum* t = front;
while (temp != 0)
{
if (name < temp->name)
{
t->next = add;
add->next = temp;
break;
}
t = temp;
temp = temp->next;
}
if (t == rear)
{
rear->next = add;
rear = add;
}
}
}
this->save_contact();
count_tot++;
if (type == "亲人")
count_relative++;
else if (type == "朋友")
count_friend++;
else if (type == "同学")
count_classmate++;
else
count_colleage++;
system("pause");
return true;
}
else
continue;
}
return true;
}
bool Tel_Book::read_contact()
{
std::string a;
std::string name;
std::string num;
std::string type;
std::ifstream inFile;
inFile.open("Tel_Book.txt");
if (!inFile.is_open())
{
cout << "打开保存联系人的文件失败,退出系统!!!\n";
system("pause");
exit(EXIT_FAILURE);
}
for (int i = 0; i < 4; i++)
{
inFile >> a;
}
inFile >> name >> num >> type;
while (inFile.good())
{
Name_PhoneNum* add = new Name_PhoneNum(name, num, type);
if (front == 0)
front = add;
else
rear->next = add;
rear = add;
count_tot++;
if (type == "亲人")
count_relative++;
else if (type == "朋友")
count_friend++;
else if (type == "同学")
count_classmate++;
else
count_colleage++;
inFile >> name >> num >> type;
}
return true;
}
bool Tel_Book::save_contact()
{
std::ofstream outFile;
outFile.open("Tel_Book.txt");
auto temp = front;
outFile.setf(std::ios::left);
outFile << setw(11) << "姓 名" << setw(21) << "手机号码" << "类型\n";
while (temp != 0)
{
outFile.setf(std::ios::left);
outFile << setw(10) << temp->name << setw(18) << temp->phoneNum << temp->type << endl;
temp = temp->next;
}
outFile.close();
return true;
}
void Tel_Book::show_all(int n) const
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << " 显示联系人\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout << "------------------------------\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << " 全部联系人\n";
Tel_Book::format();
Name_PhoneNum* temp = front;
while (temp != 0)
{
cout.setf(std::ios::left);
cout << setw(10) << temp->name << setw(16) << temp->phoneNum << temp->type << endl;
temp = temp->next;
}
cout << count_tot << "位联系人 " << count_friend << "位朋友 " << count_classmate << "位同学 " << count_colleage << "位同事 " << count_relative << "位亲人\n";
if(n==1)
system("pause");
}
void Tel_Book::show_part(int n) const
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << " 显示联系人\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout << "------------------------------\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout << " " << Type[n] << endl;
Tel_Book::format();
Name_PhoneNum* temp = front;
while (temp != 0)
{
if (temp->type == Type[n])
{
cout.setf(std::ios::left);
cout << setw(10) << temp->name << setw(16) << temp->phoneNum << temp->type << endl;
}
temp = temp->next;
}
if (n == 0)
cout << count_relative << "位亲人\n";
else if (n == 1)
cout << count_friend << "位朋友\n";
else if (n == 2)
cout << count_classmate << "位同学\n";
else
cout << count_colleage << "位同事\n";
system("pause");
}
void Tel_Book::search_contact(char n) const
{
std::string name;
std::string num;
std::string type;
int flag = 0;
Name_PhoneNum* temp = front;
system("cls");
switch (n)
{
case '1':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << " 查找联系人\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << "请输入要查找联系人的姓名:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
getline(cin, name);
this->format();
while (temp != 0)
{
if (temp->name.find(name) != string::npos)
{
flag = 1;
cout.setf(std::ios::left);
cout << setw(10) << temp->name << setw(16) << temp->phoneNum << temp->type << endl;
}
temp = temp->next;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
if (flag == 0)
cout << "\n没有找到与" << name << "匹配的联系人\n";
system("pause");
break;
case '2':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << " 查找联系人\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << "请输入要查找联系人的手机号:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
getline(cin, num);
this->format();
while (temp != 0)
{
if (temp->phoneNum.find(num) != string::npos)
{
flag = 1;
cout.setf(std::ios::left);
cout << setw(10) << temp->name << setw(16) << temp->phoneNum << temp->type << endl;
}
temp = temp->next;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
if (flag == 0)
cout << "\n没有找到与" << num << "匹配的联系人\n";
system("pause");
break;
case '3':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << " 查找联系人\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << "请输入要查找联系人的类型:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
getline(cin, type);
this->format();
while (temp != 0)
{
if (temp->type.find(type) != string::npos)
{
flag = 1;
cout.setf(std::ios::left);
cout << setw(10) << temp->name << setw(16) << temp->phoneNum << temp->type << endl;
}
temp = temp->next;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
if (flag == 0)
cout << "\n没有找到与" << type << "匹配的联系人\n";
system("pause");
break;
}
}
bool Tel_Book::del_contact(char n)
{
std::string name;
std::string num;
std::string type;
Name_PhoneNum* t1 = 0;
Name_PhoneNum* t2 = 0;
int flag = 0;
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
this->format();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
this->show_all(0);
cout << "\n\n";
cout << " 删除联系人\n";
switch (n)
{
case '1':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "请输入要删除联系人的姓名(按0返回):";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
getline(cin, name);
if (name == "0")
return false;
t1 = front;
t2 = front;
while (t1 != 0)
{
if (name == t1->name)
{
flag = 1;
break;
}
t2 = t1;
t1 = t1->next;
}
break;
case '2':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "请输入要删除联系人的手机号(按0返回):";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
if (this->check_num(num) == false)
return false;
t1 = front;
t2 = front;
while (t1 != 0)
{
if (num == t1->phoneNum)
{
flag = 1;
break;
}
t2 = t1;
t1 = t1->next;
}
break;
}
if (flag == 1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << "待删除联系人信息如下:\n";
cout << "姓 名: " << t1->name << endl;
cout << "手机号码: " << t1->phoneNum << endl;
cout << "类型: " << t1->type << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "1 -- 确认删除\n";
cout << "0 -- 取消删除\n";
cout << "请输入选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
char s;
while (cin>>s)
{
if (s == '1')
{
if (t1 == front)
front = front->next;
else if (t1 == rear)
{
t2->next = 0;
rear = t2;
}
else
t2->next = t1->next;
this->save_contact();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "删除联系人信息成功!!!";
system("pause");
return true;
}
else if (s == '0')
{
return false;
}
}
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cout << "没有找到与" << name << "相关联的联系人信息\n";
}
system("pause");
return true;
}
bool Tel_Book::check_num(std::string& num)
{
int numflag1, numflag2;
Name_PhoneNum* temp = 0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, num);
while (1)
{
if (num == "0")
return false;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
numflag1 = 1;
numflag2 = 1;
if (num.length() != 11)
{
cout << "手机号码不符合标准,请重新输入:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, num);
continue;
}
else
{
for (int i = 0; i < 11; i++)
{
if (!isdigit(num[i]))
{
numflag1 = 0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << "手机号码包含非数字的字符,请重新输入:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, num);
break;
}
}
}
while (temp != 0)
{
if (num == temp->phoneNum)
{
numflag2 = 0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cout << num << "已经存在电话簿,请重新输入:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
getline(cin, num);
break;
}
temp = temp->next;
}
if (numflag1 && numflag2)
break;
}
return true;
}
usetel_book.cpp
#include<iostream>
#include<Windows.h>
#include"tel_book.h"
using std::cout;
using std::cin;
using std::endl;
void menu();
int main(void)
{
menu();
return 0;
}
void menu()
{
Tel_Book tb;
char select;
char s;
std::string name;
std::string num;
std::string type;
tb.read_contact();
while (1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
system("cls");
cout << "---------------------------手机联系人系统------------------------\n";
cout << "-----------------------------------------------------------------\n\n";
cout << "*****************************************************************\n\n";
cout << "* 1-- 添加联系人 *\n";
cout << "* 2-- 显示联系人 *\n";
cout << "* 3-- 查找联系人 *\n";
cout << "* 4-- 删除联系人 *\n";
cout << "* 0-- 退出系统 *\n";
cout << "*****************************************************************\n";
cout << " 请输入你的选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cin >> select;
while (cin.get() != '\n')
continue;
switch (select)
{
case '0':
exit(0);
case '1':
tb.add_contact();
break;
case '2':
while (1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
system("cls");
cout << " 显示联系人\n";
cout << "--------------------------------\n";
cout << "* 1- 全部 *\n";
cout << "* 2- 亲人 *\n";
cout << "* 3- 朋友 *\n";
cout << "* 4- 同学 *\n";
cout << "* 5- 同事 *\n";
cout << "* 0- 返回 *\n";
cout << "--------------------------------\n";
cout << " 请输入你的选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cin >> s;
while (cin.get() != '\n')
continue;
if (s == '1')
tb.show_all(1);
else if (s == '0')
break;
else if (s == '2' || s == '3' || s == '4' || s == '5')
tb.show_part(s - '0' - 2);
}
break;
case '3':
while (1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
system("cls");
cout << " 查找联系人\n";
cout << "--------------------------------\n";
cout << "* 1- 按姓名查找 *\n";
cout << "* 2- 按号码查找 *\n";
cout << "* 3- 按类型查找 *\n";
cout << "* 0- 返回 *\n";
cout << "--------------------------------\n";
cout << " 请输入你的选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
cin >> s;
while (cin.get() != '\n')
continue;
if (s == '0')
break;
else if (s == '1' || s == '2' || s == '3')
tb.search_contact(s);
}
break;
case '4':
while (1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
system("cls");
cout << " 查找联系人\n";
cout << "--------------------------------\n";
cout << "* 1- 按姓名删除 *\n";
cout << "* 2- 按号码删除 *\n";
cout << "* 0- 返回 *\n";
cout << "--------------------------------\n";
cout << " 请输入你的选择:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
cin >> s;
while (cin.get() != '\n')
continue;
if (s == '0')
break;
else if (s == '1' || s == '2')
tb.del_contact(s);
}
break;
}
}
}
最后记得添加“Tel_Book.txt”文本文件,就这样吧