
--通讯录管理系统
一、题目要求:
采用VC++实现通讯录管理,主要涉及的学生信息包括:学号、姓名、生日、性别、班级、电话、宿舍、地址等信息。编写程序来完成如下功能:
1、新建学生通讯录:采用头插入的方式建链表,并询问是否保存到文件。
2、向学生通讯录插入学生信息:采用头插入的方式把结点插进去。
3、在通讯录删除学生信息:删除结点(按学号、姓名删除),并询问是否从文件中删除。
4、在通讯录中查询学生信息:按姓名或学号的形式查找,然后显示学生信息。
5、在屏幕中输出全部学生信息:输出链表的每一个内容,按照一定格式进行显示。
6、修改学生信息:按学号、姓名修改查询到的位置对应的学生信息。
7、统计学生信息学生信息:按性别、班级统计查询到的位置对应的学生信息。
8、保存并退出:告知结束运行系统。向文件写入学生通讯录信息,把链表中的结点都保存到文件中。
二、题目分析:
1、总体思路如下:
三、源代码:
#include #include #include #include using namespace std; struct DataType //定义所有信息 { char number[20]; //学号 char name[20]; //姓名 char birthday[20]; //生日 char sex[1]; //性别 char class_num[20]; //班级 char telephone[12]; //电话 char dom[10]; //宿舍 char address[20]; //地址 }; struct student //定义学生信息 { DataType data; student *next; }; class txl { private: student *head; //头指针 student *currptr; //当前指针 public: txl(); ~txl(); void Creat(); //新建学生通讯录 void Insert(); //向学生通讯录插入学生信息 void Delete(); //在通讯录删除学生信息 void WriteFile(); //从文件中读取通讯录的信息 void ReadFile(); //向文件写入学生通讯录信息 void Search(); //在通讯录中查询学生信息 void Display(); //在屏幕中输出全部学生信息 void Revise(); //修改通讯录中学生信息 void Count(); //在屏幕中按照统计输出学生信息 void Exit(); //退出 }; txl::txl() //构造函数 { head=currptr=NULL; }; txl::~txl() //析构函数 { student *temp=head; //释放空间 while(temp) { delete temp; } } //新建学生通讯录 // 功能:采用头插入的方式建链表,并询问是否保存到文件 // 参数:无 //返回值:无 void txl::Creat() { cout<<"你想要建立多少个学生的通讯录:"; int i,n; char mf[1]; cin>>n; cout<<"\\n************录入工作开始**************\\n"< { currptr=new student; cout<<"请输入第"< cin>>currptr->data.number; cout<<"请输入第"< cin>>currptr->data.name; cout<<"请输入第"< cin>>currptr->data.birthday; cout<<"请输入第"< cin>>*mf; while((*mf)!='m' && (*mf)!='f') //使输入为男女 { cout<<"输入格式有误,请输入'm/f'。"< } if((*mf)=='m'||(*mf)=='f') //保存 { *(currptr->data.sex)=(*mf); } cout<<"请输入第"< cin>>currptr->data.class_num; cout<<"请输入第"< cin>>currptr->data.telephone; cout<<"请输入第"< cin>>currptr->data.dom; cout<<"请输入第"< cin>>currptr->data.address; cout<<"\\n************华丽的分割线**************\\n"< head=currptr; } cout< //向学生通讯录插入学生信息 // 功能:采用头插入的方式把结点插进去,并询问是否保存到文件 // 参数:无 //返回值:无 void txl::Insert() { char mf[1]; cout<<"你想要在哪个位置插入:"; int k,n=0; //k记录插入位置,n记录链表长度 cin>>k; student *p=head,*q=NULL,*t=head; while(t) { t=t->next; n++; } if(k>n+1||k<1) //不存在此位置,不能存入 { cout<<"此位置不合法"; } else{ currptr=new student; cout<<"请输入你要插入的学生的信息!"< cin>>currptr->data.number; cout<<"请输入学生的姓名:"; cin>>currptr->data.name; cout<<"请输入学生的生日:"; cin>>currptr->data.birthday; cout<<"请输入学生的性别[m/f]:"; cin>>*mf; while((*mf)!='m' && (*mf)!='f') //使输入为男女 { cout<<"输入格式有误,请输入'm/f'。"< cin>>*mf; } if((*mf)=='m'||(*mf)=='f') //保存 { *(currptr->data.sex)=(*mf); } cout<<"请输入学生的班级:"; cin>>currptr->data.class_num; cout<<"请输入学生的电话:"; cin>>currptr->data.telephone; cout<<"请输入学生的宿舍:"; cin>>currptr->data.dom; cout<<"请输入学生的地址:"; cin>>currptr->data.address; if(k==1) //建链表 { currptr->next=head; head=currptr; } else { for(int i=1;i q=p; p=p->next; } q->next=currptr; currptr->next=p; } } } //在通讯录删除学生信息 // 功能:删除结点,并询问是否从文件中删除(采用覆盖原有文件的形式) // 参数:无 //返回值:无 void txl::Delete() { if(head!=NULL) //链表存在时就做删除操作 { int k,n=0; student *cu=head; student *p=head,*q=head->next,*t=head; cout<<"你可以通过以下方式删除:"< char ch; cin>>ch; while(ch!='1'&&ch!='2') { cout< cin>>ch; }//判断输入是否符合 if(ch=='1') { char num[20]; cout<<"请输入你要的学号:"; cin>>num; while(cu!=NULL) { n++; if(strcmp(cu->data.number,num)==0) //判断是否是所查学号 { break; } cu=cu->next; } if(cu==NULL) cout<<"不存在这个学号!"< { k=n; if(k==1) head=head->next; else { for(int i=1;i p=q; q=q->next; } if(q==NULL) p=NULL; else p->next=q->next; } cout<<"删除成功!"< } else { int n=0; char nam[20]; cout<<"请输入你要的姓名:"; cin>>nam; while(cu!=NULL) { n++; if(strcmp(cu->data.name,nam)==0) //判断是否是所查姓名 { break; } cu=cu->next; } if(cu==NULL) cout<<"不存在这个姓名!未能成功删除!"< { k=n; if(k==1) head=head->next; else { for(int i=1;i p=q; q=q->next; } if(q==NULL) p=NULL; else p->next=q->next; } cout<<"删除成功!"< } } } //向文件写入学生通讯录信息 // 功能:把链表中的结点都保存到文件中 // 参数:链表的一个结点 //返回值:无 void txl::WriteFile() { student *s=head; ofstream fop; fop.open("通讯录.dat",ios::binary|ios::trunc); //以二进制形式打开文件//覆盖原来的文件且重新保存删除后的内容 if(!fop) { cout<<"通讯录.dat 无法打开!"< } char Y_N; cout<<"您需要保存更改到文件中吗?(Y/N):"; //询问是否保存到文件中 cin>>Y_N; while(Y_N!='Y'&&Y_N!='y'&&Y_N!='N'&&Y_N!='n') //使输入为yes或no { cout<<"请输入 'Y' 或 'N':"; cin>>Y_N; } if(Y_N=='Y'||Y_N=='y') //保存 { while(s) { while(fop.write((char *)&s->data,sizeof(s->data))) { s=s->next; flush(cout); } } cout<<"保存成功!"< fop.close(); } //从文件中读取通讯录的信息 // 功能:从文件中读取内容,并建链表 // 参数:无 //返回值:无 void txl::ReadFile() { currptr=new student; ifstream fip("通讯录.dat",ios::in|ios::binary); //以二进制形式打开文件 while(fip.read((char *)&currptr->data,sizeof(currptr->data))) { currptr->next=head; head=currptr; currptr=new student; } fip.close(); delete currptr; } //在通讯录中查询学生信息 // 功能:按姓名或学号的形式查找 // 参数:无 //返回值:无 void txl::Search() { cout<<"你可以通过以下方式查询:"< char ch; cin>>ch; cout<<"你要查询的信息是:"; while(ch!='1'&&ch!='2') { cout< cin>>ch; } student *cu=head; if(ch=='1') //按学号查询 { char num[20]; cin>>num; while(cu!=NULL) { if(strcmp(cu->data.number,num)==0) //判断是否是所查学号 { cout<<"你要找的学生信息为:"< < } cu=cu->next; } if(cu==NULL) cout<<"不存在这个学生!"< else //按姓名查询 { char na[20]; cin>>na; while(cu!=NULL) { if(strcmp(cu->data.name,na)==0) //判断是否是所查姓名 { cout<<"你要找的学生信息为:"< < } cu=cu->next; } if(cu==NULL) //查询不到 cout<<"不存在这个学生!"< } //在屏幕中输出全部学生信息 // 功能:输出链表的每一个内容 // 参数:无 //返回值:无 void txl::Display() { if(head==NULL) cout<<"通讯录里没有内容!\\n\\n"; else{ student *k=head; cout< while(k) { cout< < } cout< } //修改学生信息 // 功能:修改输入位置对应的学生信息 // 参数:无 //返回值:无 void txl::Revise() { if(head!=NULL) //链表存在时就做删除操作 { char mf[1]; student *cu=head; student *p=head,*q=head->next,*t=head; cout<<"你可以通过以下方式修改:"< char ch; cin>>ch; while(ch!='1'&&ch!='2') { cout< cin>>ch; }//判断输入是否符合 if(ch=='1') { char num[20]; cout<<"请输入你要的学号:"; cin>>num; while(cu!=NULL) { if(strcmp(cu->data.number,num)==0) //判断是否是所查学号 { break; } cu=cu->next; } if(cu==NULL) cout<<"不存在这个学号!"< { cout<<"请输入你要更改的学生的信息!"< cin>>cu->data.number; cout<<"请输入学生的姓名:"; cin>>cu->data.name; cout<<"请输入学生的生日:"; cin>>cu->data.birthday; cout<<"请输入学生的性别[m/f]:"; cin>>*mf; while((*mf)!='m' && (*mf)!='f') //使输入为男女 { cout<<"输入格式有误,请输入'm/f'。"< cin>>*mf; } if((*mf)=='m'||(*mf)=='f') //保存 { *(currptr->data.sex)=(*mf); } cout<<"请输入学生的班级:"; cin>>cu->data.class_num; cout<<"请输入学生的电话:"; cin>>cu->data.telephone; cout<<"请输入学生的宿舍:"; cin>>cu->data.dom; cout<<"请输入学生的地址:"; cin>>cu->data.address; cout<<"\\n修改成功!\\n"< } else { char nam[20]; cout<<"请输入你要的姓名:"; cin>>nam; while(cu!=NULL) { if(strcmp(cu->data.name,nam)==0) //判断是否是所查姓名 { break; } cu=cu->next; } if(cu==NULL) cout<<"不存在这个姓名!"< { cout<<"请输入你要更改的学生的信息!"< cin>>cu->data.number; cout<<"请输入学生的姓名:"; cin>>cu->data.name; cout<<"请输入学生的生日:"; cin>>cu->data.birthday; cout<<"请输入学生的性别[m/f]:"; cin>>*mf; while((*mf)!='m' && (*mf)!='f') //使输入为男女 { cout<<"输入格式有误,请输入'm/f'。"< cin>>*mf; } if((*mf)=='m'||(*mf)=='f') //保存 { *(currptr->data.sex)=(*mf); } cout<<"请输入学生的班级:"; cin>>cu->data.class_num; cout<<"请输入学生的电话:"; cin>>cu->data.telephone; cout<<"请输入学生的宿舍:"; cin>>cu->data.dom; cout<<"请输入学生的地址:"; cin>>cu->data.address; cout<<"\\n修改成功!\\n"< } } } //统计学生信息学生信息 // 功能:修改输入位置对应的学生信息 // 参数:无 //返回值:无 void txl::Count() { cout<<"你可以通过以下方式统计:"< char ch; cin>>ch; while(ch!='1'&&ch!='2') { cout< cin>>ch; } student *cu=head; if(ch=='1') //按性别统计 { cout<<"你要统计的性别是[m/f]:"; char sexs[1]; int n=0; cin>>sexs; if(cu!=NULL) { cout<<"你要找的学生信息为:"< { if(strcmp(cu->data.sex,sexs)==0) //判断是否是所查性别 { n++; cout< < cu=cu->next; } if(n==0) cout<<"该班不存在学生!"< cout<<"共有"< } else //按班级统计 { cout<<"你要统计的班级是:"; char cls[20]; int n=0; cin>>cls; if(cu!=NULL) { cout<<"你要找的学生信息为:"< { if(strcmp(cu->data.class_num,cls)==0) //判断是否是所查班级 { n++; cout< < cu=cu->next; } if(n==0) cout<<"该班不存在学生!"< cout<<"共有"< } } //保存并推出 // 功能:告知结束运行系统 // 参数:无 //返回值:无 void txl::Exit() //退出 { WriteFile(); //询问是否保存对文件的修改 cout<<"感谢使用本系统!"< } //main.cpp int main() { system ("color 3F"); cout<<"\\n"; cout<<"***************************欢迎使用通讯管理系统***************************"< cout<<"2.插入学生信息\\"; cout<<"3.删除学生信息 *"< cout<<"5.显示学生信息\\"; cout<<"6.修改学生信息 *"< cout<<"8.保存管理系统\\"; cout<<"请输入1--8操作 *"< txl t; t.ReadFile(); //读取文件里的信息 cout<<"读取文件内容成功!"< cout<<"*******************************学生通讯管理系统***************************"< cout<<"2.插入学生信息\\"; cout<<"3.删除学生信息 *"< cout<<"5.显示学生信息\\"; cout<<"6.修改学生信息 *"< cout<<"8.保存退出系统\\"; cout<<"请输入1--8操作 *"< cin>>ch; while(ch>'8'||ch<'1') //使选择范围在1~8 { cout<<"输入错误,请重新输入(1-8):"; cin>>ch; } switch(ch) { case '1':t.Creat();break; //1、新建学生通讯录 case '2':cout<<"现在学生的信息如下:"< t.Insert();break; //2、向学生通讯录插入学生信息 case '3':cout<<"现在学生的信息如下:"< t.Delete();break; //3、在通讯录删除学生信息 case '4':cout<<"现在学生的信息如下:"< t.Search();break; //4、在通讯录中查询学生信息 case '5':cout<<"现在学生的信息如下:"< case '6':cout<<"现在学生的信息如下:"< t.Revise();break; //6、在通讯录修改学生信息 case '7':t.Count();break; //7、在通讯录统计学生信息 case '8':t.Exit();break; //8、保存并退出 } }while(1); return 0; }
