[问题描述] 实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。 [内容] 1、利用链式存储结构来实现 2、系统的菜单功能项如下: 1----新建学生通讯录 2----向学生通讯录插入学生信息 3----在通讯录删除学生信息 4----在文件中读取通讯录信息 5----向文件中写入学生通讯录信息 6----在通讯录中查询学生信息 7----在屏幕中输出全部学生信息 8----退出 代码如下: //通讯录.h #include<iostream> #include<fstream> #include<string> #include<iomanip> using namespace std; struct DataType //定义所有信息 { char number[20]; //学号 char name[20]; //姓名 char birthday[20]; //生日 char sex[6]; //性别 char telephone[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 Exit(); //退出 }; //通讯录.cpp #include"通讯录.h" txl::txl() //构造函数 { head=currptr=NULL; }; txl::~txl() //释构函数 { student *temp=head; //释放空间 while(temp) { delete temp; } } //新建学生通讯录 // 功能:采用头插入的方式建琏,并询问是否保存到文件 // 参数:无 //返回值:无 void txl::Creat() { cout<<"你想要建立多少个学生的通讯录:"; int i,n; cin>>n; for(i=0;i<n;i++) //输入学生信息 { currptr=new student; cout<<"请输入学生的学号:"; cin>>currptr->data.number; cout<<"请输入学生的姓名:"; cin>>currptr->data.name; cout<<"请输入学生的生日:"; cin>>currptr->data.birthday; cout<<"请输入学生的性别:"; cin>>currptr->data.sex; cout<<"请输入学生的电话号码:"; cin>>currptr->data.telephone; cout<<"请输入学生的地址:"; cin>>currptr->data.address; currptr->next=head; //头插入建琏 head=currptr; } }; //向学生通讯录插入学生信息 // 功能:采用头插入的方式把结点插进去,并询问是否保存到文件 // 参数:无 //返回值:无 void txl::Insert() { 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<<"请输入你要插入的学生的信息!"<<endl; //需插入的学生信息 cout<<"请输入学生的学号:"; cin>>currptr->data.number; cout<<"请输入学生的姓名:"; cin>>currptr->data.name; cout<<"请输入学生的生日:"; cin>>currptr->data.birthday; cout<<"请输入学生的性别(male/female):"; cin>>currptr->data.sex; cout<<"请输入学生的电话号码:"; cin>>currptr->data.telephone; cout<<"请输入学生的地址:"; cin>>currptr->data.address; if(k==1) //建琏 { currptr->next=head; head=currptr; } else { for(int i=1;i<k;i++) { q=p; p=p->next; } q->next=currptr; currptr->next=p; } } } //在通讯录删除学生信息 // 功能:删除结点,并询问是否从文件中删除(采用覆盖原有文件的形式) // 参数:无 //返回值:无 void txl::Delete() { if(head!=NULL) //琏表存在时就做删除操作 { cout<<"你想要在哪个位置删除:"; int k,n=0; //k记录删除位置,n记录琏表长度 student *p=head,*q=head->next,*t=head; cin>>k; while(t) { t=t->next; n++; } if(k>n||k<1) cout<<"This position don't exist!"<<endl; //所要删除位置超出范围 else { if(k==1) head=head->next; else { for(int i=1;i<k-1;i++) { p=q; q=q->next; } if(q==NULL)p=NULL; else p->next=q->next; } } } } //向文件写入学生通讯录信息 // 功能:把琏表中的结点都保存到文件中 // 参数:琏表的一个结点 //返回值:无 void txl::WriteFile() { student *s=head; ofstream fop; fop.open("通讯录.dat",ios::binary|ios::trunc); //以二进制形式打开文件//覆盖原来的文件且重新保存删除后的内容 if(!fop) { cout<<"通讯录.dat can't open!"<<endl; abort(); } char Y_N; cout<<"Would you like to save it in file(Y/N)"; //询问是否保存到文件中 cin>>Y_N; while(Y_N!='Y'&&Y_N!='y'&&Y_N!='N'&&Y_N!='n') //使输入为yes或no { cout<<"Please input 'Y' or '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<<"Successfully Save File!"<<endl; } 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<<"你可以通过以下方式查询:"<<endl; cout<<"1、按学号查询"<<endl; cout<<"2、按姓名查询"<<endl; cout<<"你想要按什么方式查询(1 or 2):"; char ch; cin>>ch; cout<<"你要查询的信息是:"; while(ch!='1'&&ch!='2') { cout<<endl; 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<<"你要找的学生信息为:"<<endl; cout<<cu->data.number<<" "<<cu->data.name<<" "<<cu->data.birthday<<" "<<cu->data.sex<<" " <<cu->data.telephone<<" "<<cu->data.address<<endl; break; } cu=cu->next; } if(cu==NULL) cout<<"不存在这个学生!"<<endl; } else //按姓名查询 { char na[20]; cin>>na; while(cu!=NULL) { if(strcmp(cu->data.name,na)==0) //判断是否是所查姓名 { cout<<"你要找的学生信息为:"<<endl; cout<<cu->data.number<<" "<<cu->data.name<<" "<<cu->data.birthday<<" "<<cu->data.sex<<" " <<cu->data.telephone<<" "<<cu->data.address<<endl; break; } cu=cu->next; } if(cu==NULL) //查询不到 cout<<"不存在这个学生!"<<endl; } } //在屏幕中输出全部学生信息 // 功能:输出琏表的每一个内容 // 参数:无 //返回值:无 void txl::Display() { if(head==NULL) cout<<"通讯录里没有内容!\n\n"; else{ student *k=head; cout<<setiosflags(ios::left)<<setw(10)<<"学号"<<setiosflags(ios::left)<<setw(10)<<"姓名" <<setiosflags(ios::left)<<setw(10)<<"生日"<<setiosflags(ios::left)<<setw(6)<<"性别" <<setiosflags(ios::left)<<setw(10)<<"电话号码"<<setiosflags(ios::left)<<setw(10) <<"地址"<<endl; //设置左对齐输出 while(k) { cout<<setiosflags(ios::left)<<setw(10)<<k->data.number<<setw(10)<<setiosflags(ios::left) <<k->data.name<<setw(10)<<setiosflags(ios::left)<<k->data.birthday<<setw(6) <<setiosflags(ios::left)<<k->data.sex<<setw(10)<<setiosflags(ios::left) <<k->data.telephone<<setw(10)<<setiosflags(ios::left)<<k->data.address<<endl; k=k->next; } cout<<endl; } } // 功能:告知结束运行系统 // 参数:无 //返回值:无 void txl::Exit() //退出 { WriteFile(); //询问是否保存对文件的修改 cout<<"感谢使用本系统!"<<endl; exit(1); //命令整个程序退出; } //main.cpp #include<iostream> #include"通讯录.h" using namespace std; int main() { cout<<"****************欢迎使用学生通讯录管理系统****************"<<endl; cout<<"#========================================================#"<<endl; cout<<"#*********在这个管理系统中,我们可以做以下的操作*********#"<<endl; cout<<"#*********1、新建学生通讯录******************************#"<<endl; cout<<"#*********2、向学生通讯录插入学生信息********************#"<<endl; cout<<"#*********3、在通讯录删除学生信息************************#"<<endl; cout<<"#*********4、在通讯录中查询学生信息**********************#"<<endl; cout<<"#*********5、在屏幕中输出全部学生信息********************#"<<endl; cout<<"#*********6、退出(并保存修改)****************************#"<<endl; cout<<"#========================================================#"<<endl; char ch; txl t; t.ReadFile(); //读取文件里的信息 cout<<"已从文件中读取内容了!\n"; do{ cout<<"********************************************************\n"; cout<<"**1、新建//2、插入//3、删除//4、查询//5、显示//6、退出**"<<endl; cout<<"********************************************************\n"; cout<<"What do you want to do:"; cin>>ch; while(ch>'6'||ch<'1') //使选择范围在1~6 { cout<<"Error operation!Please input again:"; cin>>ch; } switch(ch) { case '1':t.Creat();break; //1、新建学生通讯录 case '2':cout<<"现在学生的信息如下:"<<endl; t.Display(); t.Insert();break; //2、向学生通讯录插入学生信息 case '3':cout<<"现在学生的信息如下:"<<endl; t.Display(); t.Delete();break; //3、在通讯录删除学生信息 case '4':cout<<"现在学生的信息如下:"<<endl; t.Display(); t.Search();break; //5、在通讯录中查询学生信息 case '5':t.Display();break; //6、在屏幕中输出全部学生信息 case '6':t.Exit();break; //7、退出 } }while(1); return 0; }

评论