c++课程设计---电话薄管理.doc_第1页
c++课程设计---电话薄管理.doc_第2页
c++课程设计---电话薄管理.doc_第3页
c++课程设计---电话薄管理.doc_第4页
c++课程设计---电话薄管理.doc_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC+课程设计 电话薄管理 李冬运 912110190237一 题目要求程序功能一个电话簿管理小程序。利用文本文件储存电话簿数据,具有添加,删除,显示和查询联系人电话号码的功能。(1)将电话簿数据和相应的函数封装在类中,改写程序使之结构化。(2)增加纪录修改功能,能选择修改用户的姓名,电话等信息。(3)增加录入时间的显示及储存。(4)增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。二 课程设计解决问题和过程(1)程序的设计思想是什么?运用学习的文件流的知识对文件进行操作,原程序将电话簿数据存放在文本文件中,在程序开始运行时将数据读入系统文件,在程序运行期间使用单向链表来添加,删除,管理数据。在程序结束前再将数据写回文本文件,这样的结构比较合理,不会造成数据的丢失,课程设计的要求是根据这一结构将数据与函数封装起来。关于如何增加时间单元的储存与显示课程设计要求将电话簿录入时间的系统时间纪录并显示,这就需要学会调用系统的dos命令,比如system(“date”)就可以调用系统的日期,然后在程序中显示出来。还有其他的各种系统命令,在程序中或多或少都有体现。(3)修改后的程序 以及封装就是充分利用函数和类,主函数只写一点点。主函数中多次调用函数,在主函数外完成各函数定义等。我设计的管理项目主要包括以下几个:1添加联系人纪录2显示电话簿内容3根据姓名查询电话簿数据4根据姓名删除电话簿数据5根据姓名修改电话簿数据6智能查找电话簿数据7帮助0退出系统主要功能都不在主函数里,而是用了类的知识在。我这里按照书上提示的定义了三个类,一个电话簿记录类,一个链表类,一个节点类。主要的类,程序中有一个选择函数,可以通过这个函数来实现各种功能。注意:在修改电话簿数据时,首先询问是只修改电话号码还是只修改姓名,如果只修改电话号码,则找到该结点后将新的电话号码更新即可;如果需要修改姓名,就需要先删除原结点,然后建立新结点,输入新的姓名、电话、将这个结点插入到链表中,因为电话簿是按姓名顺序排列的。(4)如何设计修改功能的函数 基本思路:查找目标-建立新信息-插入新信息-删除原记录。首先根据姓名查找用户的方法找到需要修改的目标,然后建立一个新结点输入修改的内容,此时新信息储存在新结点中,再将新结点插入到链表中并将查找到的需要修改的结点删除。使用了查找函数、增加函数、删除函数这三个函数的思路。三 程序调试分析 在程序的调试过程中我遇到了种种困难,首先是出现的各种errors,一出现就是好多,我还要一个一个去找,鉴于程序中三个类的函数太多,查找起来十分不便。最难搞的就是链表的内容,一不小心就出现各种错误。考虑不周全,没有想到空链表,还有各结点处的数据处理,很是头疼。当然还有开始没考虑到的确认删除函数,询问是否继续函数等,在学姐同学的帮助下,终于调试正确!四 程序调试(截图版) 五 总结编这个程序真是耗费了我相当多的人力财力与物力,最先选的就是这题,后来觉得这题太难,真心不会,就决定换一题。然后我又想不能挑太简单的,觉得至少是中等难度,希望通过编写程序更多地提高自己。于是选了解方程的那个题,周日整天对着电脑越改越错,越改errors越多,我真不知道该怎么办了。最后决定还是认真做电话薄管理。通过我的不懈努力,现在终于完成,我感到深深的自豪与激动,还有一定得感谢一下在此次编程中帮助我的人。这次VC+程序设计让我对知识进行了一次总结和巩固,而通过这次做课程设计,也使我明白了实践的重要性,我现在也很愿意做一些实践活动,来提高自己的能力。这次做课程我真的受益非浅,我以后会多参与这种活动来锻炼自己的。链表部分我会一如既往好好努力,请看我的作业。六 附录源程序:#include#include/conio.h 是 Console (键盘和屏幕) 输出输入函数的头文件,con - Console,#include#include#include#includechar pause;class CTelRecord /电话簿记录类private:char date20;char time20; char szName20;/电话簿的数据:姓名和电话号码 char szNumber20;char szTName20;public: CTelRecord();/缺省构造函数 CTelRecord(char *name,char *number,char *,char*,char*);/构造函数 void SetRecord(char *name,char *number,char *,char *D,char *T);/输入数据函数void SetDate_Time(char *dd,char*tt)strcpy(date,dd);strcpy(time,tt);char *GetLName()return szName;char *GetFName()return szTName;char *GetNumber()return szNumber;char *GetDate()return date;/增加时间的显示及存储char *GetTime()return time;/显示时间 int Compare(CTelRecord &);/比较函数,比较姓名 void Show();/打印数据函数 void Modify(char*number);/修改电话号码 int LookChar(char*szName);/根据首字母查找匹配的姓名;class CNode/定义节点类private:CTelRecord*pData;/用于指向数据类的指针 CNode*pNext;/指向链表下一个节点的指针public: CNode()pData=new CTelRecord;pNext=0; /节点构造函数CNode(CTelRecord ctelrecord,CNode node)pData=&ctelrecord,pNext=&node;/构造函数 CNode(CNode&node);/用于拷贝的构造函数CNode(); void InputData(CTelRecord*pdata)pData=pdata;/数据录入函数 void ShowNode()pData-Show(); /结点显示函数 CTelRecord *GetData()return pData; /获得结点信息函数CNode *GetpNext()CNode *p=pNext;return p; /获得下一个结点 friend class CList; /定义链表类为友员类;CNode *current_ptr=NULL; /全程变量,用于指明当前在链表中的位置class CList/定义链表类CNode *pHead;/链表头节点指针public: CList(CNode *node=NULL)pHead=node; /构造函数 CList()DeleteList(); /析构函数void SetpHead(CNode*node)pHead=node; /重置链表头函数 void AddNode(CNode *pnode); /在首部添加节点 void DeleteNode(CNode *); /删除结点函数 CNode *LookUp(CTelRecord &); /按照姓氏智能查询函数(新增函数用以完成设计要求(4) void ShowList(); /显示链表函数 void DeleteList(); /删除链表函数 CNode *GetListHead()return pHead; /获得链表头部函数CNode *GetListEnd(); /获得链表尾部函数CNode *GetListNextNode(CNode *); /获得链表中指定结点的下个结点函数 void Insert(CNode *pnode); /排序插入函数int load_list_from_file(); /从文件载入数据函数void delete_record(); /删除记录函数int verify_delete(); /确认删除的函数void write_list_to_file(); /把信息写入文件的函数void handle_choice(int choice); /选择处理函数void help_me(); /帮助函数;CTelRecord:CTelRecord()strcpy(date,date);strcpy(time,time);strcpy(szName,姓氏);strcpy(szTName,名字);strcpy(szNumber,电话号码);CTelRecord:CTelRecord(char *lastname,char *firstname,char *number,char *DD,char *TT) strcpy(date,DD);strcpy(time,TT);strcpy(szName,lastname);strcpy(szNumber,number); strcpy(szTName,firstname);void CTelRecord:SetRecord(char *lastname,char *firstname,char *number,char *DD,char *TT)strcpy(date,DD);strcpy(time,TT);strcpy(szName,lastname);strcpy(szNumber,number);strcpy(szTName,firstname);int CTelRecord:Compare(CTelRecord &ctelrecord) if(strcmp(ctelrecord.szName,szName)=0|strcmp(ctelrecord.szTName,szTName)=0)return 0;else return 1;void CTelRecord:Show()char name40;strcpy(name,szName);strcat(name,szTName);coutsetw(40)namesetw(20)szNumbersetw(20)datesetw(10)timepNext=pnode-pNext=NULL;CNode *CList:GetListNextNode(CNode *pnode)return pnode-pNext;void CList:Insert(CNode * pnode)CNode * M=pHead;if(pHead=NULL)pHead=pnode;pHead-pNext=NULL; else while(M-pNext) M=M-pNext; M-pNext= pnode; pnode-pNext=NULL; int CList:load_list_from_file() / 从数据文件FRIENDS.TXT中读取数据重建链表处理函数current_ptr=pHead;ifstream infile; infile.open(FRIENDS.txt,ios:in|ios:nocreate); CNode *new_rec_ptr; int end_loop = 0; if (!infile) / 如果成功打开文件 / 从文件读入数据char dd20;char tt20;char LName20;char FName20; char Number20; for(;end_loop=0 ;)new_rec_ptr=new CNode; if(new_rec_ptr-GetData()=NULL)end_loop=1;continue;if(new_rec_ptr != NULL) / 确保new_rec_ptr指针不为NULLif(!infile.eof() /如果文件中有数据可读入infile.getline(LName,20); infile.getline(FName,20);infile.getline(Number,20);infile.getline(dd,20);infile.getline(tt,20);if(strlen(LName) != 0 &strcmp(LName, END OF FILE) != 0)/如果姓氏的长度不为零if(new_rec_ptr-GetData()!=NULL)new_rec_ptr-GetData()-SetRecord(LName,FName,Number,dd,tt);if(pHead=NULL) /若头指针为零AddNode(new_rec_ptr);else Insert(new_rec_ptr); strcpy(LName,);strcpy(FName,);strcpy(Number,);strcpy(dd,);strcpy(tt,);else end_loop = 1;else cout 输入完成!n;end_loop = 1;return 1;infile.close(); / 关闭文件 else / 打开文件失败cout 数据库中暂时没有数据n;return 0; / 文件录入函数结束 void CList:delete_record() CNode * Q; Q= pHead;system(cls);char search_string20;CNode *cnode;cnode = NULL; current_ptr = pHead; / 从链表头部开始 cin.ignore(20,n);cout GetData()!=NULL&strncmp(search_string,current_ptr-GetData()-GetLName(),strlen(search_string) !=0&strncmp(search_string,current_ptr-GetData()-GetLName(),strlen(current_ptr-GetData()-GetLName() !=0)/此函数功能即比较字符串str1和str2的前maxlen个字符 cnode = current_ptr; current_ptr = current_ptr-pNext; if(current_ptr != NULL¤t_ptr-GetData()!=NULL) cout n以下为您想要寻找的记录n;cout GetData()-GetFName() ,GetData()-GetLName() endl;cout GetData()-GetNumber() endl;if(verify_delete() DeleteNode(current_ptr); cout n已删除记录n; else cout n没有删除任何记录n;else cout pNext ; delete cnode ; else if(cnode-pNext = NULL) CNode* p_look = pHead;while(p_look-pNext!=cnode);delete cnode ;p_look-pNext = NULL; else while(Q-pNext!=cnode) Q=Q-pNext;Q-pNext=cnode-pNext;delete cnode; void CList:DeleteList() /删除链表函数CNode*temp_ptr; current_ptr=pHead; do temp_ptr=current_ptr-GetpNext();if(current_ptr-GetpNext()=NULL)current_ptr=NULL; elsecurrent_ptr=temp_ptr; while(temp_ptr!= NULL); / 删除链表函数结束void CList:ShowList() /显示信息函数char fullname30;char date_time30;current_ptr = pHead; if(current_ptr != NULL¤t_ptr-GetData()!=NULL)cout endl; cout GetData()-GetLName(); strcat(fullname, current_ptr-GetData()-GetFName();strcpy(date_time,current_ptr-GetData()-GetDate();strcat(date_time,current_ptr-GetData()-GetTime(); cout.setf(ios:left); cout setw(30) fullname; cout setw(20) GetData()-GetNumber()setw(30)date_timepNext; cout endl; while(current_ptr != NULL); cout 请按回车键n;cin.get(pause);cin.ignore(1,pause); else cout n没有可以显示的记录n; / 显示信息函数结束int CList:verify_delete()char YesNo;cout YesNo;if(YesNo = Y) | (YesNo = y)return 1; elsereturn 0; / 删除确认函数void CList:write_list_to_file()ofstream outfile;outfile.open(FRIENDS.txt,ios:out|ios:nocreate); if (!outfile) current_ptr = pHead; if(pHead != NULL¤t_ptr-GetData()!=0) do outfilesetiosflags(ios:left)GetData()-GetLName()n;outfilesetiosflags(ios:left)GetData()-GetFName()n;outfilesetiosflags(ios:left)GetData()-GetNumber()n;outfilesetiosflags(ios:left)GetData()-GetDate()n;outfilesetiosflags(ios:left)GetData()-GetTime()pNext; while(current_ptr != NULL); outfile.close(); else cout GetData()-LookChar(search_string)!=0)if (i=0)coutShowNode();i+;current_ptr=current_ptr-pNext;if(i)cout智能查找完成,结果如上显示。n;else cout对不起,没有您要找的记录n;current_ptr=cc;return current_ptr;/智能查找函数结束void CList:help_me() /帮助函数help:int choice2;system(cls);cout 欢迎来到帮助信息栏,请选择你需要的帮助:n;cout 1: 为什么选了显示号码却什么都没有显示出来?n;cout 2: 如何清除所有记录?n;cout 3: 智能查找不能用啊n;cout choice2;switch(choice2) /帮助case 1:cout 你还没有输入任何数据n;cout 当然什么也没有显示n;cout 试着输入一点东西吧n;pause=getch(); system(cls);goto help;break;case 2:cout 删除文件数据n;cout 按回车键继续.n;pause=getch();system(cls);goto help;break;case 3:cout 看一下Lock指示灯n;cout 有没有按下Caps Lock啊?n;cout 有的话关掉吧n;pause=getch();system(cls);goto help;break;default:cout pNext;CNode * current_ptr_end=current_ptr;return current_ptr_end; void CList:handle_choice(int choice)switch(choice) case 1: char ch;system(cls);/清屏do CNode *pnode;/定义一个节点类型变量指针pnode=new CNode;char first_name20;char last_name20;char phone_num20;char dd20;char tt20;if(pnode!=NULL)CTelRecord *ctelrecord=new CTelRecord;/电话簿记录类型开辟的内存地址赋给电话簿记录类型变量指针cin.ignore(20,n); /如果计数值达到20或者被抛弃的字符是n,则cin.ignore() 函数执行终止; cout 请输入要添加的名字:n ;cin.get(first_name,20);cin.ignore(20,n);cout 请输入要添加的姓氏:n ;cin.get(last_name,20);cin.ignore(20,n);cout c:translate.txt);fstream trf(c:translate.txt,ios:in|ios:nocreate);trf.getline(dd,20);trf.close();system(time /tc:translate.txt);trf.open(c:translate.txt,ios:in|ios:nocreate);trf.getline(tt,20);trf.close();ctelrecord-SetRecord(last_name,first_name,phone_num,dd,tt);pnode-InputData(ctelrecord);/if(pHead!=NULL)Insert(pnode);/按顺序插入节点/else /AddNode(pnode);/在首部添加节点system(date /t);system(time /t);cout要继续吗?(y/n)n;cin.get(ch);system(cls); else coutyou can not add a noden;/如果没有成功创建动态空间while(ch=y|ch=Y); break; case 2: system(cls);system(date /t); system(time /t); ShowList(); break; case 3: delete_record();break; case 4:char ch;fstream trf;do char lastname20,firstname20,dd20,tt20;int ch1;CTelRecord ctelrecord;cout请输入要修改的姓氏n;cin.getline(lastname,20);cin.ignore(20,n);coutGetData()-Compare(ctelrecord)!=0)current_ptr=current_ptr-pNext;if(current_ptr=NULL)cout对不起没有找到您要找的记录n;elsecoutShowNode();cout请选择您要修改的项目:n;cout1、修改电话号码n;coutch1;switch(ch1)case 1:char number20;coutGetData()-Modify(number);system(date /ttranslate.txt);trf.open(c:translate.txt,ios:in|ios:nocreate);trf.getline(dd,20);trf.close();system(time /tc:translate.txt);trf.open(c:translate.txt,ios:in|ios:nocreate);trf.getline(tt,20);trf.close();current_ptr-GetData()-SetDate_Time(dd,tt);break;case 2:if(verify_delete()DeleteNode(current_ptr);CNode *pnode;pnode=new CNode;char first_name20;char last_name20;char phone_num20;if(pnode!=NULL)CTelRecord *ctelrecord=new CTelRecord;system(cls);cin.ignore(20,n); cout 请输入要添加的名字:n ;cin.get(first_name,20);cin.ignore(20,n);cout 请输入要添加的姓氏:n ;cin.get(last_name,20);cin.ignore(20,n);cout c:translate.txt);trf.open(c:translate.txt,ios:in|ios:nocreate);trf.getline(dd,20);trf.close();system(time /tc:translate.txt);trf.open(d:translate.txt,ios:in|ios:nocreate);trf.getline(tt,20);trf.close();ctelrecord-SetRecord(last_name,first_name,phone_num,dd,tt);pnode-InputData(ctelrecord);Insert(pnode);cout已完成修改n;elsecout修改失

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论