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 <<endl <<"谢谢使用" <<endl <<endl;exit(0);//退出系统break;default: break;}}return 0;}(2)各操作模块函数的实现:void book::add_person()//添加联系人{ cout <<endl <<"请根据提示输入信息" <<endl <<endlcout<<"姓名:" ;cin >>name;cout <<"电话: ";cin >>number;cout <<"QQ : ";cin >>qq;cout <<"邮编: ";cin >>post;cout <<"地址: ";cin >>address; save_new();cout <<endl <<endl <<"新联系人信息已经保存好!" <<endl <<endl;system("pause");//出现中文的显示:按任意键继续。
}void book::del_person()//删除联系人{ ofstream outData("temp.txt", ios::out);ifstream inData("pbook.txt", ios::in);if (!outData || !inData){ cout <<endl <<"对不起!找不到文件!" <<endl;system("pause"); return;}string s;cout <<endl <<"你要删除输入姓名、电话或QQ :"; cin >>s;string str; bool flag = true;while (inData >>name >>number){ getline(inData, str);if ((s==name) || (s==number)){ cout <<endl <<"你想删除的联系人:" <<endl <<endl;cout<< setiosflags(ios::left) << setw(17) << "姓名"<<" " << setw(16) << "电话号码" <<" "<< setw(18) << "QQ" <<" "<< setw(14) << "邮编" <<" "<< setw(20) << "地址"<<endl;cout <<setiosflags(ios::left) <<setw(17) <<name<<" " <<number<<str <<endl<<endl;flag = false; break;}outData <<setiosflags(ios::left) <<setw(17) <<name//将不删除的信息放到temp.txt<<" " <<number <<" "<<qq<<str <<endl;}if (flag){ cout <<endl <<"对不起!联系人中没你找的人!" <<endl <<endl;}else//将temp.txt的数据复制到pbook.txt,直接覆盖要删除的信息,达到删除效果{ while (getline(inData, str)){ outData <<str <<endl;}outData.close(); inData.close();ofstream out("pbook.txt", ios::out);ifstream in("temp.txt", ios::in);if (!out || !in){ cout <<endl <<"对不起!不能打开文件!" <<endl <<endl;system("pause");return;}while (getline(in, str)){ out <<str <<endl;}out.close(); in.close();cout <<endl <<"该联系人信息已从通迅录中删除" <<endl <<endl;}system("pause");}void book::fix()//修改信息{ ofstream outData("temp.txt", ios::out);ifstream inData("pbook.txt", ios::in); //if (!outData || !inData){ cout <<endl <<"对不起找不到文件" <<endl;system("pause"); return;}string s;cout <<endl <<"你要修改输入姓名或电话号:"; cin >>s;bool flag = true; string str;while (inData >>name >>number){ getline(inData, str);if ((s==name) || (s==number)){cout <<endl <<"你想修改的联系人:" <<endl <<endl;cout<< setiosflags(ios::left) << setw(17) << "姓名"<<" " << setw(16) << "电话号码" <<" "<< setw(18) << "QQ" <<" "<< setw(14) << "邮编" <<" "<< setw(20) << "地址"<<endl;cout <<setiosflags(ios::left) <<setw(17) <<name<<" " <<number <<str <<endl;cout <<endl <<"请根据下面提示修改信息: " <<endl;cout <<"姓名:" ;cin >>name;cout <<"电话号:";cin >>number;cout <<"QQ :";cin >>qq;cout <<"邮编:";cin >>post;cout <<"地址:";cin >>address; save_new();flag = false; break;}outData <<setiosflags(ios::left) <<setw(17) <<name<<" " <<number <<str <<endl;}if (flag){ cout <<endl <<"对不起联系人中没你找的人" <<endl <<endl;}else{ while (getline(inData, str)){ outData <<str <<endl;}outData.close();inData.close();ofstream out("pbook.txt", ios::out);ifstream in("temp.txt", ios::in);if (!out || !in){ cout <<endl <<"对不起!不能打开文件!" <<endl <<endl;system("pause");return;}while (getline(in, str)){ out <<str <<endl;}out.close();// in.close();cout <<endl <<"该联系人已在通迅录中修改" <<endl <<endl;}system("pause");}void book::find()//查询联系人{ ifstream inData("pbook.txt",ios::in);if (!inData){ cout <<endl <<"对不起!文件找不到!" <<endl;system("pause"); return;}string s;cout <<endl <<"输入你想查找的联系人的姓名、电话或QQ: "; cin >>s;bool flag = true; string str;while (inData >>name >>number){ getline(inData, str);if ((name==s) || (number==s)){cout <<endl <<"你要查找的联系人是: " <<endl <<endl;cout<< setiosflags(ios::left) << setw(17) << "姓名"<<" " << setw(16) << "电话号码" <<" "<< setw(18) << "QQ" <<" "<< setw(14) << "邮编" <<" "<< setw(20) << "地址"<<endl;cout <<setiosflags(ios::left) <<setw(17) <<name<<" "<<number<<str <<endl<<endl;flag = false; break;}}if(flag){cout<<endl<<"该联系人不存在!"<<endl<<endl;}system("pause");}void book::save_new(){ofstream f("pbook.txt", ios::app);if (!f){ cout <<endl <<"对不起!打开文件失败!" <<endl <<endl;system("pause");return;}f<< setiosflags(ios::left) << setw(17) << name<<" " << setw(16) << number <<" "<< setw(18) << qq <<" "<< setw(14) << post <<" "<< setw(20) << address <<endl;f.close();}4调试分析1.在程序的调试过程中遇上了文件存储数据的正确读取错误,但经过不断查问和查阅相关书籍后,根据调试提示错误,解决了所有错误。