欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    简单通讯录c++课程设计.doc

    • 资源ID:2385462       资源大小:335KB        全文页数:22页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    简单通讯录c++课程设计.doc

    C+课程设计简单通讯录管理0411204班041120431董力1程序菜单功能 通讯录是一个简单的数据库库表,每一个记录(结点)包含个人所有通讯信息。程序执行过程为:显示主菜单,用户在choice:处输入选项(按照功能列表输入19中的一个数字),按回车后执行相应的功能。 具体函数的功能请见下面4. 提供典型测试数据组2分析,感想。 (1)、数据结构 程序采用一个单向链表类结构实现,每个结点代表一个通讯记录,链表类实现通讯录多个记录的管理工作。 (2)、新增功能 可批量输入,一次输入多个人的信息。 (3)、遇到的问题 这次课设遇到的问题较多,首先就是学过的知识无法融会贯通。在完成课设时,许多知识点需要翻书查找(比如在输入输出流的部分),有时需要请教他人。其次,是程序十分长,而且自己小错误不断,这样检查起来非常麻烦。所以当运行程序时,出现了102个错误,其中大部分不是算法的问题,而是像少了“;”或是if中判断是否相等时用“=”而不是“=”。最后,程序较长,编辑起来费力,有时一个算法出问题,其后的几个函数连带都会出问题,而且编译时没有显示有错误,这让检查起来非常麻烦,需要一遍又一遍阅读,有时还要请教别人一起阅读,耗时很长。 (4)、感想这次课设成功完成,让我非常惊讶。平时作业的一个程序,有时需要一个下午来完成。现在,我发现原来我也可以完成如此复杂的程序。更重要的是,这次课设让我的一些知识能记得更加深刻,对于编程也更加熟练。而且,我知道请教他人的重要性, 有时自己一个人想不出来的问题,问问同学,可以更好更快的解决。最后,我知道了光把理论知识还不够,还要不断实践,这样才能将知识掌握得更加牢固,更加灵活。3提供有注释的源程序#include <iostream.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#include <iomanip.h>#include <fstream.h>class Nodechar Name10; /姓名int OfficePhone; /办公室电话int HomePhone; /家庭电话char MobilePhone15; /手机号码char E_Mail20; /电子邮箱地址Node*Next; /下一个结点指针public:Node(char na="sb",int op=0,int hp=0,char mp="0",char em="0") /构造函数,有缺省值strcpy(Name,na); /将na中的姓名拷贝到Name中OfficePhone=op; /将op中的数值赋给OfficePhoneHomePhone=hp; /将hp中的数值赋给HomePhonestrcpy(MobilePhone,mp);/将mp中的字符串拷贝到MobilePhone中strcpy(E_Mail,em); /将em中的字符串拷贝到E_Mail中void Show() /显示结点数据cout<<'t'<<Name<<'t'<<OfficePhone<<'t'<<HomePhone<<'t'<<MobilePhone<<'t'<<E_Mail<<endl; /输出一个记录中的所有数据void print(ofstream &out) /将结点数据写入文件out.open("addresslist.text");/打开名为"addresslist.text"的文档out<<'t'<<Name<<'t'<<OfficePhone<<'t'<<HomePhone<<'t'<<MobilePhone<<'t'<<E_Mail<<endl; /将数据存入"addresslist.text"中out.close(); /关闭文档void SetName(char na) /修改姓名strcpy(Name,na);void SetOfficePhone(int op)/修改办公室电话OfficePhone=op;void SetHomePhone(int hp)/修改住宅电话HomePhone=hp;void SetMobilePhone(char mp)/修改手机号码strcpy(MobilePhone,mp);void SetE_Mail(char em)/修改电子邮箱地址strcpy(E_Mail,em);friend class AddressList; /将AddressList类说明为友元类;class AddressListNode *HeadPtr; /链表首指针Node *TailPtr; /链表尾指针int Tag; /排序状态标志public:AddressList() /构造函数,创建空链表,将Tag的值置为1HeadPtr=NULL; /设置首指针的初始值为空TailPtr=NULL; /设置尾指针的初始值为空Tag=1; /Tag的初始值为1void AddTail(Node*p) /将p指向的结点加入到链表的尾部if(HeadPtr=NULL)/如果链表为空,将数据添加在第一条HeadPtr=TailPtr=p;/链表为空,首尾指针均指向pelseTailPtr->Next=p;/如果不为空,则尾指针的Next指向pTailPtr=p; /将p的值赋给TailPtrTailPtr->Next=NULL;/使TailPtr的成员Next为空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)/按姓名排列 p1=HeadPtr;/将首指针赋给p1 while(strcmp(p->Name,p1->Name)>0&&p1->Next!=NULL)/比较p中Name和p1中的大小 p2=p1;p1=p1->Next; /如果p大,就将下一个数据赋给p1,否则跳出循环 if(strcmp(p->Name,p1->Name)<=0)/如果p的成员Name比较小 p->Next=p1;/将p的下一个指向p1 if(HeadPtr=p1) HeadPtr=p;/如果首指针等于p1,则将p的值赋给首指针 else p2->Next=p; /如果p1是第一个将p赋给HeadPtr,否则p2下一个指向p else/如果找不到比p的Name小的数据,就将p插在链表末尾 p1->Next=p;/将p赋给p的下一条记录 p->Next=NULL;/而p的下一条为空 if(Tag=2)/按办公室电话排列,同按姓名排列的方法 p1=HeadPtr; while(p->OfficePhone)>(p1->OfficePhone)&&p1->Next!=NULL) p2=p1;p1=p1->Next; if(p->OfficePhone)<=(p1->OfficePhone) p->Next=p1; if(HeadPtr=p1) HeadPtr=p; else p2->Next=p; else p1->Next=p; p->Next=NULL; if(Tag=3)/按家庭电话排列,同按姓名排列的方法 p1=HeadPtr; while(p->HomePhone)>(p1->HomePhone)&&p1->Next!=NULL) p2=p1;p1=p1->Next; if(p->HomePhone)<=(p1->HomePhone) p->Next=p1; if(HeadPtr=p1) HeadPtr=p; else p2->Next=p; else p1->Next=p; p->Next=NULL; if(Tag=4)/按手机号码排列,同按姓名排列的方法 p1=HeadPtr; while(strcmp(p->MobilePhone,p1->MobilePhone)>0&&p1->Next!=NULL) p2=p1;p1=p1->Next; if(strcmp(p->MobilePhone,p1->MobilePhone)<=0) p->Next=p1; if(HeadPtr=p1) HeadPtr=p; else p2->Next=p; else p1->Next=p; p->Next=NULL; if(Tag=5)/按电子邮箱地址排列,同按姓名排列的方法 p1=HeadPtr; while(strcmp(p->E_Mail,p1->E_Mail)>0&&p1->Next!=NULL) p2=p1;p1=p1->Next; if(strcmp(p->E_Mail,p1->E_Mail)<=0) p->Next=p1; if(HeadPtr=p1) HeadPtr=p; else p2->Next=p; else p1->Next=p; p->Next=NULL; Node *LookUp(char*name)/按姓名查找结点,返回该结点指针 Node *p=HeadPtr;/定义一个Node型指针,初始值为HeadPtr while(p!=NULL)/当链表不为空时 if(strcmp(p->Name,name)=0)/循环比较数据中的Name成员 return p;/如果存在,返回结点 p=p->Next;/将p的下一组数据赋给p return NULL;/如果不存在,返回值为空 void Delete(char*name)/删除指定姓名的结点 Node *p1,*p2; if(HeadPtr=NULL)/当链表为空时 cout<<"通讯录为空,无结点可删!n" p1=HeadPtr; while(strcmp(p1->Name,name)!=0&& p1->Next!=NULL)/查找所在位置 p2=p1;/将p1的值赋给p2 p1=p1->Next;/p1指向下一条记录 if(strcmp(p1->Name,name)=0)/若找到该姓名对应的数据,删除该数据 if(p1=HeadPtr)/如果p1在第一条,则将首指针指向下一条记录,将p1空出 HeadPtr=p1->Next; else/否则将p1的上一个记录的成员Next直接指向p1的下一条记录 p2->Next=p1->Next; delete p1;/释放p1的空间 cout<<"删除了一个数据!n" else /若找不到,则输出"通讯录上没找到该条记录!" cout<<name<<"通讯录上没找到该条记录!n" void DeleteAll()/删除链表中全部结点 Node*p;/定义一个Node型指针变量p while(HeadPtr)/当首指针不为0时,进行循环p=HeadPtr;/将head赋给pHeadPtr=HeadPtr->Next;/将head的下一条数据赋给headdelete p;/释放p的空间 void Sort(int tag) /按Tag指定的关键字重新排序 Tag=tag; /将tag的值赋给Tag Node *p1,*p;/定义两个Node型指针变量p1,p p=HeadPtr;/将首指针的值赋给p HeadPtr=NULL;/将首指针置为空 while(p) /当首指针不为空时,进行循环p1=p;/将p的值赋给p1 p=p->Next;/p指向下一条记录 p1->Next=NULL;/p1的成员Next指向空 AddSort(p1);/调用公有成员函数,将p1重新按关键字排序 void ShowAll() /显示全部结点,每10个显示一屏 Node *p=HeadPtr;/定义一个Node型指针p,初始化为首指针的值int i=1; /定义一个整型变量,计算现实的数据个数system("cls"); /清屏while(p) /当p不为空时,进行循环cout<<i<<'t'p->Show(); /循环输出数据pp=p->Next; /将下一条记录的值赋给pif(!(i+%10) /当i是10的倍数时,暂停程序并清屏system("pause");system("cls"); void SetTag(int t) /重置Tag的值 Tag=t; int GetTag() /获取Tag的值 return(Tag);/返回Tag的值 int Count() /计算链表中有多少个结点 Node*p;/定义一个Node型指针p int t=0;/定义一个整型变量t,用来计算链表中结点的个数 p=HeadPtr;/将首指针的值赋给p while(p->Next!=NULL)/当链表不为空时 t=t+1;/每当数据不为空时,t就加1 p=p->Next;/p指向下一条记录 t=t+1; /因为当p->Next=NULL是就退出程序,所以末尾t要加1 return t;/返回t Node*GetHeadPtr()/获取链表首指针 return HeadPtr;/返回首指针 AddressList() /析构函数,释放链表空间 Node*p;/定义一个Node型的指针变量 while(HeadPtr!=NULL)/链表不为空,进行循环 p=HeadPtr;/将第一条数据赋给p HeadPtr=HeadPtr->Next;/将下一条数据赋给首指针 delete p;/释放p的空间 #define Len sizeof(class Node)/定义常量Len为Node类数据的长度 void CreateList(char*filename)/从二进制文件中读入数据,构造链表 Node*p100;/定义一个有100个数据空间的指针数组 int i=0,j=0;/定义两个整型变量,来记录第几条数据和读取数据的个数 fstream file(filename,ios:in|ios:binary);/定义一个文件流对象 if(!filename)/当文件为空时,无法打开 cout<<"不能打开文件:"<<filename<<endl; exit(1); file.read(char*)&Tag,sizeof(int);/从文件中读取Tag file.read(char*)&j,sizeof(int);/从文件中读取数据的个数 p0=new Node; /申请一个p的动态存储空间 while(file.read(char*)pi,Len)!=0)/从文件中读取Len长度的数据不为0 pi+1=new Node; AddSort(pi+1);/调用公有成员函数AddSort(),将文件中数据读取后,重新排序 file.close;/关闭文件 void WriteToFile(char*filename)/将链表中的数据写入指定的二进制文件 Node*p;/定义一个Node型的指针变量 p=HeadPtr;/将首指针的值赋给p fstream file(filename,ios:in|ios:binary);/定义一个文件流对象 if(!filename)/当文件为空时,无法打开文件 cout<<"不能打开文件:"<<filename<<endl; exit(1); while(p!=0)/当数据不为0时,将数据写入文件中 file.write(char*)p,Len);/将p写入文件中 p=p->Next; file.close;/关闭文件 void outtxt(char *file)/将数据从文件file导出Node *p=HeadPtr;/定义一个Node型指针变量,初始值为HeadPtrint n=1;/定义一个整型变量,作为数据的序号fstream out(file,ios:out);/以写入的方式打开正文文件if(!out)/定义一个输出文件流对象cout<<"不能打开该文件:"<<file<<endl;exit(1);while(p)out<<n+<<'t'<<(*p).Name<<'t'<<(*p).OfficePhone<<'t'<<(*p).HomePhone<<'t'<<(*p).MobilePhone<<'t'<<(*p).E_Mail<<endl;/按以上方式输出到文件中p=p->Next;out.close();int menu_select() /菜单实现 char*a="1.Add Record","2.Delete Record","3.Display All Record","4.Query", "5.Modify Record","6.Add from a Text File","7.Write to a Text File", "8.Sort","9.Delet All","0.Quit",NULL;/将菜单的选项赋给数组 int i,choice;/定义两个整型变量,一个用于输出选项,一个用于选择,并调用相关函数 do system("cls"); cout<<"nn=Address Book Managing Syetem=nn" for(i=0;ai;i+)/循环输出选项 cout<<ai<<endl; cout<<"n=n" cout<<"Input 1-9,0:" cin>>choice;/输入choice while(choice<0|choice>9);/在0到9的菜单中做出选择 return(choice);/返回所选的值void add(AddressList&addrlist) /增加记录 Node *p50;/一次需要输入的数据 char n100,m100,o100;/姓名,手机,电子邮箱 int q,r;/办公和家庭电话 int i,j; cout<<"请输入本次需要输入的数据的个数(0100):" cin>>j; cout<<"请依次输入姓名、办公电话、家庭电话、手机号码和电子邮箱地址:" for(i=0;i<j;i+)/按所选个数输入数据 cin>>n>>q>>r>>m>>o;/输入数据的各个成员

    注意事项

    本文(简单通讯录c++课程设计.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开