首页 课设报告-简单通讯录管理

课设报告-简单通讯录管理

举报
开通vip

课设报告-简单通讯录管理课程设计报告 ——简单通讯录管理 一 程序功能 该通讯录是一个简单的数据库库表,每一个记录(结点)包含一个人的所有通讯信息,详见后面源代码中的Node类的定义。 程序执行过程是:显示主菜单,用户在Input1~9,0:处输入选项(按照功能列表输入0~9中的一个数字),按回车后,执行相应功能。 1. Add Record(增加记录) 用户按提示输入各个字段。一次输入一个人的数据。新记录加入后,通讯录按指定的排序顺序排序。初始时,默认按“姓名”排序;选择菜单“8.Sort”后可修改排...

课设报告-简单通讯录管理
课程设计报告 ——简单通讯录管理 一 程序功能 该通讯录是一个简单的数据库库 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ,每一个 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 (结点)包含一个人的所有通讯信息,详见后面源代码中的Node类的定义。 程序执行过程是:显示主菜单,用户在Input1~9,0:处输入选项(按照功能列表输入0~9中的一个数字),按回车后,执行相应功能。 1. Add Record(增加记录) 用户按提示输入各个字段。一次输入一个人的数据。新记录加入后,通讯录按指定的排序顺序排序。初始时,默认按“姓名”排序;选择菜单“8.Sort”后可修改排序顺序为按“办公室电话”排序。指定一种排序方法后,就一直保持此排序方法,直到重新指定。菜单“8.Sort”可在两种排序方法之间切换。 2. Delete Record(删除记录) 用户根据提示输入待删除的姓名,系统删除该姓名的所有信息。 3. Display All Record(显示所有记录) 系统按指定顺训显示所有记录,每显示十条记录,暂停,用户按键继续。 4. Query(按姓名查找并显示一个记录) 用户按提示输入待查找的姓名,按键,显示改姓名下所有信息。 5.Modify Record(按姓名查找,并修改一个记录) 用户按提示输入待修改的姓名,系统会显示该姓名下所有信息,同时会显示子菜单,用户按子菜单提示,指定修改哪一个数据项。 子菜单如下: (1) Modify Name //修改姓名 (2) Modify Office Phone //修改办公室电话 (3) Modify Home Phone //修改住宅电话 (4) Modify Mobile Phone //修改手机号码 (5) Modify Email //修改email地址 Input1~4: 6.Add from a Text File(从正文文件中批量添加数据到链表中) 用户可建立一个正文文件(格式见实现说明中的“输入数据文件格式”),存放待加入的数据,然后从该文件中一次性导入多个人员的数据。程序运行时,用户需按提示输入中文文件名。 7.Write to a Text File 将库表中的数据写入一个中文文件中(格式见下面的“导出数据文件格式” 说明)。程序运行时用户需要按提示输入中文文件名。 8.Sort(排序) 首先显示当前排序关键字,然后会提示是否要修改,用户可根据需要回答是否要修改。该系统包含两种排序方式,按姓名和按办公室电话,可在两者间切换。 9.Delete All(删除所有记录) 0.Quit(退出系统) 二 题目分析、问题及解决、心得 题目分析:该通讯记录需要记录每个人的所有通讯信息,可以定义一个Node类进行记录,要实现多个人的信息统一记录,则需要用一个链表来实现,此链表又必须包含每个人的所有信息,所以将其定义为Node的友元类以方便记录。而主菜单的每一项功能需要用单个函数实现,故运用函数调用可实现该系统的各项功能。 问题及解决:主要问题是各个函数调用关系比较复杂,链表内外对其数据的调用关系;通过在纸上写出其调用的关系理清各函数作用并与同学讨论解决。 心得:编写过程中需要特别仔细,尤其是分号及大小写。同时加深了自己对链表、指针的理解,以及曾强了自己对函数调用关系的分析能力。 三 源代码及注释 #include #include #include #include #include #include //包含的头文件 #define len sizeof(Node) //从文件中一次读取或读入的数据长度 class Node { char Name[10]; //姓名 int OfficePhone; //办公室电话 int HomePhone; //住宅电话 char MobilePhone[15]; //手机号码 char Email[20]; //email地址 Node *next; //下一个结点指针 public: Node(char *N="nn",int O=0,int H=0,char *M="1",char *E="afsd") //带缺省值的构造函数 { strcpy(Name,N); strcpy(MobilePhone,M); strcpy(Email,E); OfficePhone=O; HomePhone=H; } void Show() //显示结点数据 { cout<next=p; TailPtr=p; p->next=NULL; } } void AddSort(Node *p) //将p指向的结点按tag指定的顺序插入到链表中 { if(HeadPtr==NULL) //链表为空时 { HeadPtr=TailPtr=p; p->next=NULL; } else //链表不为空 { Node *p1=HeadPtr,*p2=HeadPtr;//定义Node型指针并初始化 if(tag==1) { if(strcmp(HeadPtr->Name,p->Name)>=0) //将姓名进行字符间比较,p指向的结点的姓名小于首结点时 { p->next=HeadPtr; HeadPtr=p; } else { while(p1->next && strcmp(p1->Name,p->Name)<0)//查找姓名较p小的结点 { p2=p1; //保存结点 p1=p1->next; //指向下一个结点 } if(strcmp(p1->Name,p->Name)<0) AddTail(p); //若该结点姓名仍较小,插入链表尾部 else //将p插入满足条件的结点于下一结点之间 { p2->next=p;p->next=p1;} } } if(tag==2) { if(p->OfficePhone<=HeadPtr->OfficePhone) //将办公室电话进行比较,p指向的结点的办公室电话小于首结点时 { p->next=HeadPtr; HeadPtr=p; } else { while(p1->next&&p1->OfficePhoneOfficePhone)//查找办公室电话较p小的结点 { p2=p1;p1=p1->next;} //p2保存结点,p1指向下一个结点 if(p1->OfficePhoneOfficePhone) AddTail(p); //若该结点办公室电话仍较小,插入链表尾部 else //将p插入满足条件的结点于下一结点之间 { p2->next=p;p->next=p1; } } } } } Node *LookUp(char *name) //按姓名查找结点,返回改结点指针 { Node *p=HeadPtr; while(p) { if(strcmp(p->Name,name)==0) return p; //查找到结点后,返回结点指针,结束调用 p=p->next; } return NULL; //未查找到,返回空指针 } void Delete(char *name) //删除指定姓名结点 { Node *p1=HeadPtr,*p2; while(p1->next&&strcmp(p1->Name,name)) //循环查找待删除的指定结点 { p2=p1;p1=p1->next; } if(strcmp(p1->Name,name)==0)//找到待删除的指定结点,由p1指向 { if(p1==HeadPtr) //若找到的结点是首结点 HeadPtr=p1->next; else //若找到的结点不是首结点 p2->next=p1->next; delete p1; cout<<"已删除该姓名!"<next=NULL; p=p->next; AddSort(p1); } } void ShowAll() //显示全部结点,每10个一屏 { Node *p=HeadPtr; int i=1;system("cls"); while(p) //循环调用,逐个显示结点数据 { cout<Show(); p=p->next; if(i++%10==0) { system("pause");system("cls");} } } void SetTag(int t) //置tag值 { tag=t;} int GetTag() //取tag值 { return (tag);} int Count() //统计链表中结点(记录)个数 { int i=0;Node *p=HeadPtr; while(p) { p=p->next;i++;} return i; } Node *GetHeadPtr() //取首指针 { return (HeadPtr); } void DeleteAll() //删除所有数据 { Node *p; while(HeadPtr) { p=HeadPtr; HeadPtr=HeadPtr->next; delete p; } } ~AddrList() //释放链表空间 { Node *p; while(HeadPtr) { p=HeadPtr; HeadPtr=HeadPtr->next; delete p; } } void CreateList(char *filename) //从二进制文件中读入数据,构造链表 { Node *p[100];int i=0; fstream file(filename,ios::in|ios::binary); //以读方式打开二进制文件 if(!file) //文件打开失败 { cout<<"不能打开该文件:"<next; } file.close(); //关闭文件filename } void OutText(char *file) //将链表中的数据导入file文件 { Node *p;p=HeadPtr; int n=1; fstream out(file,ios::out); if(!out) //文件打开失败 { cout<<"不能打开该文件:"<next; } out.close(); //关闭文件file } }; int menu_select() // 设置主菜单 { char *menu[]={ "1.AddRecord","2.Delete Record","3.Display All Record","4.Qurery By Nme","5.Modify Record","6.Add From a Text File", "7.Write to a Text File","8.Sort","9.Delete All","0.Quit",NULL};//用字符型指针数组存储主菜单选项 int i; int choice; do //输出主菜单选项,并输入要操作的项的序号 { system("cls"); cout<<"\n\n=====Address Book Managing System=====\n\n"; for(i=0;menu[i];i++) cout<>choice; } while(choice<0||choice>9); return choice; //返回所选的操作的序号 } void add(AddrList &addrlist) //增加记录,并按排序标志tag插入结点 { Node *p[100];//定义一个Node型指针数组 char n[200],m[200],e[200]; int o,h,t; cout<<"输入将创建的记录数"<>t; cout<<"请依次输入姓名,办公室电话,住宅电话,手机号码,email地址"<>n>>o>>h>>m>>e; p[i]=new Node; //动态申请 p[i]->SetName(n); p[i]->SetOfficePhone (o); p[i]->SetHomePhone (h); p[i]->SetMobilePhone (m); p[i]->SetEmail (e); addrlist.AddSort (p[i]); //插入结点 } } void del(AddrList &addrlist) //删除记录 { Node *t; t=addrlist.GetHeadPtr();//初始化指针t if(!t)cout<<"空链表"<>p; } while(p<1||p>4); char n[20]; if(p==1) //删除单个记录 { cout<<"请输入要删除的姓名:"<>n; addrlist.Delete(n); } if(p==2) //删除多个记录 { cout<<"请输入你要删除的记录个数:"<>s; for(i=0;i>n; addrlist.Delete(n); } } if(p==3) addrlist.DeleteAll();//删除所有记录 if(p==4) system("cls"); //放弃操作,清屏返回主菜单 } } void showall(AddrList &addrlist) //显示所有记录 { Node *p; p=addrlist.GetHeadPtr(); if(!p) cout<<"空链表"<>name; p=addrlist.LookUp(name); if(p)p->Show(); else cout<<"未查找到该姓名!"<>n; p=addrlist.LookUp(n); do //循环输出选项,并选择 { system("cls"); p->Show(); for(int i=0;i<6;i++) cout<<'\t'<>k; } while(k<1||k>6); switch(k) { case 1:{ //修改姓名,若当前排序关键字为姓名,重新排序 cout<<"请输入姓名:"<>n; p->SetName(n); if(addrlist.GetTag()==1) addrlist.Sort(1); };break; case 2:{ //修改办公室电话,若当前排序关键字为办公室电话,重新排序 cout<<"请输入办公室电话:"<>o; p->SetOfficePhone(o); if(addrlist.GetTag()==2) addrlist.Sort(2); };break; case 3: //修改住宅电话 { cout<<"请输入住宅电话:"<>h; p->SetHomePhone(h); };break; case 4: //修改手机号码 { cout<<"请输入手机号码:"<>m; p->SetMobilePhone(m); };break; case 5: //修改email地址 { cout<<"请输入emal地址:"<>e; p->SetEmail(e); };break; default:; } } } void addfromtxtfile(AddrList &addrlist) //从正文文件中添加数据到链表中 { char na[20],mo[20],em[20],n[80]; int h,o,s; Node *p; cout<<"请输入要打开的文件名"<>s>>na>>o>>h>>mo>>em) //循环将数据读入链表 { p=new Node(na,o,h,mo,em); addrlist.AddSort(p); } infile.close(); //关闭文件 } void writetotxtfile(AddrList &addrlist) //将库表中的数据导出到正文文件 { char n[30]; cout<<"请输入你想要建立的文件名:"<>n; addrlist.OutText(n);//导入文件中 } void sort(AddrList &addrlist) //排序库表 { Node *p; p=addrlist.GetHeadPtr(); if(!p) //链表为空 cout<<"空链表!"<>m; if(m==1) { if(t==1) { addrlist.SetTag (2);//修改tag的值 addrlist.Sort (2);//重新排序 } if(t==2) { addrlist.SetTag(1); addrlist.Sort(1); } if(t==2) cout<<"现在关键字为:按姓名排序"<>m; if(m==1) addrlist.DeleteAll(); else ; } void quit(AddrList &addrlist) //退出系统 { addrlist.WriteToFile ("addrlist.dat");} void main() //主函数,进行函数调用以实现操作 { int choice=0; AddrList a; a.CreateList("addrlist.dat"); for(;;) { choice=menu_select(); //调用,设置主菜单 switch(choice) //按选择的序号执行操作 { case 1:add(a);system("pause");break; case 2:del(a);system("pause");break; case 3:showall(a);system("pause");break; case 4:query(a);system("pause");break; case 5:modify(a);system("pause");break; case 6:addfromtxtfile(a);system("pause");break; case 7:writetotxtfile(a);system("pause");break; case 8:sort(a);system("pause");break; case 9:delall(a);system("pause");break; case 0:quit(a);break; default:; } } } 四 测试数据 主菜单如下: 输入1,显示: 输入创建记录2,并按提示并输入“ a 1 1 1 1”、“b 2 2 2 2 “,按任意键继续,输入3,显示所有数据为 在主菜单输入4,并按提示输入a,显示 返回主菜单,输入5,按提示输入b,改姓名为h,显示: 返回主菜单,输入2,按提示输入h,显示 返回主菜单,输入7,按提示输入文件名,如下: 返回主菜单,输入6,如下,按提示输入文件名: 返回主菜单,输入8,按提示选择,如下: 返回主菜单,输入9,再输入3,如图: 返回主菜单,输入0,退出系统。
本文档为【课设报告-简单通讯录管理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_507300
暂无简介~
格式:doc
大小:146KB
软件:Word
页数:10
分类:互联网
上传时间:2012-11-12
浏览量:16