1需求分析
1.1 设计任务要求
通讯录系统主要包含以下要求:
(1)设计一个学生通讯录管理系统,每个学生数据信息包括:姓名、电话号码、qq、邮编和地址;
(2)创建学生数据类型为结构体并以磁盘文件保存;
(3)能读取磁盘文件并显示输出学生的相关信息;
(4)能按姓名或电话等多种方式进行学生信息查询;
(5)能查询、添加、修改和删除学生通讯录。
1.2 系统功能需求分析
系统主要包含以下主要功能:
(1)查询通讯录记录;
(2)添加通讯录记录;
(3)修改通讯录记录;
(4)删除通讯录记录;
(5)关闭通讯录。
2 概要设计
2.1 数据类型
本系统中所有变量都定义为字符串型,学生通讯录数据类型定义为结构体类型。然而为了更加方便,添加了抽象数据类型类book ,再私有继承了以结构体存储的学生数据。
2.2 主程序及各程序层次关系
以下是系统功能模块关系图,主要包含查询、添加、修改、删除联系人和关闭系统等功能。另外还提供了键盘式选择菜单实现功能选择。
图2.1 系统功能模块关系图
查询联系人:可以选择用姓名和电话两种方式查询
添加联系人:可以添加通讯录记录,依次输入姓名、电话、qq 、邮编和地址 修改联系人:输入欲修改联系人姓名后,再依次输入修改姓名、电话、qq 、邮编和地址即可完成修改
删除联系人:输入欲删除联系人的姓名后,会自动删除该联系人的记录内容 关闭系统:选择相关操作进行系统正常关闭,保存有效数据记录
3 详细设计
3.1 实现数据类型
(1)以字符串类型定义通讯录中学生数据信息变量:
string name;//姓名string number;//电话号码
string qq;//QQ号string post;//邮编
string address;//地址
(2)学生通讯录数据类型定义为结构体存储:
struct inf{
string name;//姓名
string address;//地址
string number;//电话号码
string post;//邮编
string qq;//QQ号
}datatype;
(3)实现类book私有继承结构体inf:
class book:private inf
{public:
book(){};//默认构造函数
int face();//首页
void add_person();//添加联系人
void del_person();//删除联系人
void fix();//修改信息
void find();//查询联系人
void save_new();//保存新增加的联系人};
3.2 实现各操作模块的功能
(1)主函数的实现:
int main()
{ int choose; book b;
while (choose = b.face())
{ switch (choose)
{case 1:
b.find();////查询联系人
break;
case 2:
b.add_person();////添加联系人
break;
case 3:
b.fix();////修改信息
break;
case 4:
b.del_person();////删除联系人
break;
case 5:
cout < exit(0);//退出系统 break; default: break; } } return 0; } (2)各操作模块函数的实现: void book::add_person()//添加联系人 { cout < cout<<"姓名:" ;cin >>name; cout <<"电话: ";cin >>number; cout <<"QQ : ";cin >>qq; cout <<"邮编: ";cin >>post; cout <<"地址: ";cin >>address; save_new(); cout < system("pause");//出现中文的显示:按任意键继续。。。 } void book::del_person()//删除联系人 { ofstream outData("temp.txt", ios::out); ifstream inData("pbook.txt", ios::in); if (!outData || !inData) { cout < system("pause"); return; } string s; cout < string str; bool flag = true; while (inData >>name >>number) { getline(inData, str); if ((s==name) || (s==number)) { cout < <<" " << setw(16) << "电话号码" <<" " << setw(18) << "QQ" <<" "<< setw(14) << "邮编" <<" " << setw(20) << "地址"< cout < <<" " < flag = false; break; } outData < <<" " < } if (flag) { cout < else//将temp.txt的数据复制到pbook.txt,直接覆盖要删除的信息,达到删除效果 { while (getline(inData, str)) { outData < } outData.close(); inData.close(); ofstream out("pbook.txt", ios::out); ifstream in("temp.txt", ios::in); if (!out || !in) { cout < system("pause");return; } while (getline(in, str)) { out < out.close(); in.close(); cout < } system("pause"); } void book::fix()//修改信息 { ofstream outData("temp.txt", ios::out); ifstream inData("pbook.txt", ios::in); // if (!outData || !inData) { cout < system("pause"); return; } string s; cout < bool flag = true; string str; while (inData >>name >>number) { getline(inData, str); if ((s==name) || (s==number)) { cout < cout<< setiosflags(ios::left) << setw(17) << "姓名" <<" " << setw(16) << "电话号码" <<" "<< setw(18) << "QQ" <<" " << setw(14) << "邮编" <<" "<< setw(20) << "地址"< cout < <<" " < cout < cout <<"姓名:" ;cin >>name; cout <<"电话号:";cin >>number; cout <<"QQ :";cin >>qq; cout <<"邮编:";cin >>post; cout <<"地址:";cin >>address; save_new(); flag = false; break; } outData < <<" " < } if (flag) { cout < } else { while (getline(inData, str)) { outData < } outData.close();inData.close(); ofstream out("pbook.txt", ios::out); ifstream in("temp.txt", ios::in); if (!out || !in) { cout < system("pause");return; } while (getline(in, str)) { out < out.close();// in.close(); cout < } system("pause"); } void book::find()//查询联系人 { ifstream inData("pbook.txt",ios::in); if (!inData) { cout < system("pause"); return; } string s; cout < bool flag = true; string str; while (inData >>name >>number) { getline(inData, str); if ((name==s) || (number==s)) { cout < cout<< setiosflags(ios::left) << setw(17) << "姓名"<<" " << setw(16) << "电话号码" <<" "<< setw(18) << "QQ" <<" "<< setw(14) << "邮编" <<" "<< setw(20) << "地址"< cout < <<" "< flag = false; break; } } if(flag) {cout< system("pause"); } void book::save_new() {ofstream f("pbook.txt", ios::app); if (!f) { cout < system("pause");return; } f<< setiosflags(ios::left) << setw(17) << name<<" " << setw(16) << number <<" "<< setw(18) << qq <<" "<< setw(14) << post <<" "<< setw(20) << address < f.close(); } 4调试分析 1.在程序的调试过程中遇上了文件存储数据的正确读取错误,但经过不断查问和查阅相关书籍后,根据调试提示错误,解决了所有错误。通过文件存储学生数据信息,使得读取信息操作更加方便、省事; 2.在执行操作时,是根据文件搜索算法,去获取学生数据信息。使得在时间和空间上读取数据都要更加快捷、省事。其时间复杂度为O(2n); 3.经过这一次的系统设计,使我认识到了实践的重要性,只有实践多了才能把知识学得好,学得牢。同时让我对数据结构得到了进一步的学习,以及对C++语言的学习得以提高,最后也大部分掌握了文件存储数据的相关操作。 5 用户使用手册 1.本程序的运行环境为WINDOWS操作系统,运行软件为Microsoft Visual C++; 2.运行程序后即输出提示信息,由于在定义变量时已将需要输入的定义为string型变量,所以输入时需根据提示信息按要求输入; 3.运行程序后屏幕上会出现通讯录主菜单,然后根据需要选择1-5序号的操作,输入选定序号后,按Enter键,程序就会执行相关操作。比如输入序号1,再按Enter键,程序就会运行查询联系人的代码操作,然后再根据提示进行查询工作即可; 4.当以上操作完成后,程序将输出“按任意键继续...”此时,查询联系人工作的程序运行完毕。 6 测试数据和数据结果 (1)输入操作序号:2 依次输入:wen 151******** 997191620 123456 湖南长沙 输出结果如下所示: (2)输入操作序号:1 输入姓名:wen;(或电话号码:151********) 输出结果如下所示: (3)输入操作序号:3 输入姓名:wen 重新依次输入要修改信息:wen 151******** 997191620 654321 海南万宁 输出结果如下所示: (4)输入操作序号:4 输入姓名:wen 输出结果如下所示: (5)输入操作序号:5 输出结果如下所示: 参考文献 [1] 严蔚敏,吴伟民. 数据结构(C语言版). 北京:清华大学出版社,1997.04 [2] 张晓莉,罗文劼,刘振鹏等。数据结构与算法。北京:机械工业出版社,2002.10 [3] 王宏生,宋继红。数据结构。北京:国防工业出版社,2006.01 [4] 孙淑霞,肖阳春,魏琴等.C/C++程序设计教程(第2版)。北京:电子工业出版社,2007.03 [5] 谭浩强。C++程序设计。北京:清华大学出版社,2004,06 附录源程序清单 #include #include #include #include #include using namespace std; struct inf{ string name;//姓名 string address;//地址 string number;//电话号码 string post;//邮编 string qq;//QQ号 }datatype; class book:private inf { public: book(){};//默认构造函数 int face();//首页 void add_person();//添加联系人 void del_person();//删除联系人 void fix();//修改信息 void find();//查询联系人 void save_new();//保存新增加的联系人 }; //首页 int book::face() system("cls");//清楚屏幕 cout < cout<<" *****************************************" < <<" # #" < <<" # 通迅录#" < <<" # #" < <<" # 1. 查询联系人. #" < <<" # #" < <<" # 2. 添加新联系人. #" < <<" # #" < <<" # 3. 修改联系人. #" < <<" # #" < <<" # 4. 删除联系人. #" < <<" # #" < <<" # 5. 关闭系统. #" < <<" # #" < <<" *****************************************" < <<" 请选择您要操作的序号(1-5):" ; int choose; cin >>choose; return choose; } //添加联系人 void book::add_person() { cout < <<"姓名:" ; cin >>name; cout <<"电话: "; cin >>number; cout <<"QQ : "; cin >>qq; cout <<"邮编: "; cin >>post; cout <<"地址: "; cin >>address; save_new(); cout < system("pause");//出现中文的显示:按任意键继续。。。 } //删除联系人 void book::del_person() { ofstream outData("temp.txt", ios::out); ifstream inData("pbook.txt", ios::in); if (!outData || !inData) { cout < system("pause"); return; } string s; cout < cin >>s; string str; bool flag = true; while (inData >>name >>number) { getline(inData, str); if ((s==name) || (s==number)) { cout < <<" " << setw(16) << "电话号码" <<" " << setw(18) << "QQ" <<" " << setw(14) << "邮编" <<" " << setw(20) << "地址"< cout < <<" " < flag = false; break; outData < <<" " < } if (flag) { cout < } else//将temp.txt的数据复制到pbook.txt,直接覆盖要删除的信息,达到删除效果 { while (getline(inData, str)) { outData < } outData.close(); inData.close(); ofstream out("pbook.txt", ios::out); ifstream in("temp.txt", ios::in); if (!out || !in) { cout < system("pause"); return; } while (getline(in, str)) { out < out.close();// in.close(); cout < } system("pause"); } //修改信息 void book::fix() { ofstream outData("temp.txt", ios::out); ifstream inData("pbook.txt", ios::in); // if (!outData || !inData) { cout < system("pause"); return; } string s; cout < cin >>s; bool flag = true; string str; while (inData >>name >>number) { getline(inData, str); if ((s==name) || (s==number)) { cout <