




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
visual c+课程设计实验报告题目:电话薄管理班级:07102003学号:0710200310姓名: 指导老师: 2008年9月实验题目: 5-5 电话薄管理一、 课程设计要求: 功能介绍:一个电话薄管理小程序。利用文本文件存储电话薄数据,具有添加、删除、显示和查询联系人号码的功能。(1) 将电话薄数据和相应的函数封装在类中,改写程序使之结构化。(2) 增加记录修改功能,能选择修改用户的姓名、电话。(3) 增加录入时间的显示及存储。(4) 增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。平定难易等级:a级。二、 程序设计思想(相关问题解决办法):类 封装成类是首先遇到的问题,我根据课程设计书上的提示,通过看书和与同学讨论,最后比较清楚地明白了类的封装方法。我在封装时,在类中定义了一些内联函数,并且把函数都定义为公有成员,这样可以方便类外的函数使用成员数据。书上的参考程序与我的稍有不同。增加时间 这个是通过互联网学到的,利用time.h。3) 增加修改功能 我定义了 friend_node:modify_record 函数,用来修改用户的姓名、电话。在函数中,我运用了if-else,switch等语句并对函数进行了重载。并且本程序可以选择修改,姓,名,电话。首字母查询 这是一个比较难解决的问题,我使用了与全名查找基本相同的函数,我只要求姓相同,全名查找要求姓和名全部相同。我在这个的解决上还存在一些问题,这证明程序还是不够完善。这说明我对指针的使用还不够好。三、 课程设计心得:本来打算选计算器,后来觉得计算器编起来没什么意思,就换成了这个难一点儿的电话薄管理。在程序编写过程中,我发现,不只是难了一点儿。但是,有难度才有挑战,才有乐趣,不是么?看到源程序,立马被其拥有的函数的数量震撼了。把它们封装起来费了我不少精力。但是,看着它们由零散的函数变为整齐的类,就如同看到c语言向c+语言进化。课程还提出了要增加时间单元。在vb里面,只需要把一个小钟表图标拖进来就可以了,而在c+里面,我尚且不知如何操作。最后通过互联网,才算学会在c+中调用时间单元。也算是学了一招吧。通过这次c+的课程设计,我的知识得到了巩固,同时也学到了很多新知识。我意识到,我们不应是为了编程而编程,而是为了解决问题而编程。编出来的程序能够为我们服务,程序才有意义。四、 以下是我所编写的程序源代码及相关注解: /*第5题电话簿管理-源代码及关键源代码注解如下:*/phonebook 1.0 by mark miller #include#include#include#include#include#include#include/全程结构及变量class friend_node /类类型定义,包括:姓、名和电话号码 tm * currenttime;/定义时间指针 char last_name20;/姓 char first_name15;/名 char phone_num12;/电话号码 int nyear,nmonth,nday,nhour,nminute;/定义 friend_node *next,*prev; char pause;/定义一字符型变量,用于接受输入的任意键public: /函数原形说明 void handle_choice(int choice); /处理选择 void add_record();/增加记录 void insert_node(friend_node *new_rec_ptr);/插入节点 friend_node *position_insertion_point(char lastname20);/寻找节点插入位置 void make_node_new_head(friend_node *new_rec_ptr);/插入链首 void add_node_to_end(friend_node *new_rec_ptr);/插入链尾 void move_current_to_end();/使当前指针指向链尾 void display_list();/显示链表 void delete_record();/删除记录 void delete_head_of_list();/删除链首 void delete_end_of_list(friend_node *previous_ptr);/删除链尾 void delete_from_middle_of_list(friend_node *previous_ptr);/删除链表中一节点 int verify_delete();/确认是否删除 void delete_node(friend_node *previous_ptr);/删除一节点 void delete_list();/删除链表 void friend_node:jqsearch_by_name(); void search_by_name();/精确查找某一记录 void modify_record();/修改记录 void write_list_to_file();/将链表写入文件 void load_list_from_file();/从文件中提取链表数据 void help_me();/帮助文件 void welcome(); friend istream& operator(istream& ,friend_node&);/重载函数 ; friend_node *head_ptr; /全程变量,链头指针 friend_node *current_ptr; /全程变量,用于指明当前节点在链表中的位置 friend_node *tail_ptr;/全程变量 friend_node *temp_ptr;/主函数 void friend_node:welcome() coutendlendlendlendlendlendlendlendlendlendl; cout tt 欢迎使用电话簿管理程序 完美中文版 endlendl; cout tt 学号:0710200310 姓名:曹哲endlendl; cout ttt-按回车键继续-; char str20; cin.getline(str,20);/接受输入的任意字符 system(cls); /执行系统命令:cls-清屏 int choice; head_ptr = null; /初始化链首指针为空 load_list_from_file(); / 从磁盘文件读取链表数据 do /主菜单显示 cout -电话簿管理-endl=endl; cout 增加新的电话簿记录nn; / cout 显示所有电话簿记录nn; / cout 查找确定电话簿记录(姓名精确查找)nn; cout 删除确定电话簿记录(通过姓氏查找)nn; cout 修改确定电话簿记录(姓名精确查找)nn;cout 帮助nn;cout 退出系统nn;cout 智能查询nn; cout choice;/输入选择 handle_choice(choice); / 调用handle_choice()函数根据选择作出反映,从而调动相应的功能函数 while(choice != 7); / 返回菜单直到用户选择退出 void friend_node:handle_choice(int choice) /根据用户选择(choice)调用对应处函数 switch(choice) / 根据choice的值执行 case 1: add_record(); / 往链表中增加记录 break; case 2: display_list(); / 显示链表中所有记录 break; case 3: search_by_name(); /精确查找某一记录 break; case 4: delete_record(); /找到某记录后删除该记录 break;case 5: modify_record();/修改记录 break;case 6: help_me();/帮助文件 break;case 8: jqsearch_by_name(); break;case 7: write_list_to_file(); /将数据存入文件并从内存中释放链表所占用的空间 if(head_ptr != null) delete_list(); break;default : / 任何其他的选择都将显示出错信息 cout 无效的选择!n; break; void friend_node:add_record() / 在链表中增加一个记录 friend_node *new_rec_ptr; / 为新节点申请一指针 new_rec_ptr = new friend_node; / 为新节点分配内存并初始化指针使指向它 if(new_rec_ptr != null) / 若分配内存过程中没有出错,获取数据并使节点插入链表 system(cls); / 从用户那里得到姓名和电话号码. cin.ignore(20,n);/清空缓冲区,碰到字符串结束符就结束,从而接受新的字符 /以下程序中出现这一语句表同一意思 cout last_name,20); cin.ignore(20,n);cout first_name,15); cin.ignore(20,n); cout phone_num,15); cin.ignore(20,n); insert_node(new_rec_ptr);/插入新结点 time_t timedata=time(0); currenttime=localtime(& timedata);nyear=currenttime-tm_year+1900;nmonth=currenttime-tm_mon+1;nday=currenttime-tm_mday;nhour=currenttime-tm_hour;nminute=currenttime-tm_min; else / 若在分配内存中出错,显示警告信息并不要创建节点 cout next =new_rec_ptr-prev= null; /双向链表 else/链表不为空,又分3种情况 if(strcmp(new_rec_ptr-last_name, head_ptr-last_name) last_name);/确定应插入的位置 before_ptr = current_ptr; / 用指针保持跟踪节点 after_ptr = current_ptr-next; /在插入点位置的两边 if(after_ptr = null) / 若 after_ptr已达链尾,则将新节点插入链尾 add_node_to_end(new_rec_ptr); else /否则将节点插入before_ptr和after_ptr各自所向的节点之间 before_ptr-next = new_rec_ptr; new_rec_ptr-next = after_ptr;new_rec_ptr-prev=before_ptr;after_ptr-prev=new_rec_ptr; friend_node *friend_node:position_insertion_point(char lastname20)/对应后面的实参为new_rec_ptr-last_name / 根据姓氏,返回其在链表中的正确位置。新节点即将插入此点。 char temp_name20; int tempint; if(head_ptr-next != null) / 若不指一个节点存在 / 搜寻链表找到正确插入点 current_ptr = head_ptr; temp_ptr = current_ptr-next; strcpy(temp_name, temp_ptr-last_name); / 循环直至找到合适的插入位置 tempint = strcmp(lastname,temp_name); while(tempint 0) & (current_ptr-next !=null) current_ptr = temp_ptr; / 检测current_ptr所指节点是否即为链尾节点 if(current_ptr-next != null) temp_ptr = current_ptr-next; strcpy(temp_name, temp_ptr-last_name); tempint = strcmp(lastname,temp_name); else / 若任何一节点已存在于链表中, 则current_ptr所指即为链首 / 新的节点将被加到链表尾部 current_ptr = head_ptr; return(current_ptr);/返回一个地址 / 使被new_rec_ptr所指的节点成为链首的函数/ 用来处理插入时的一类特殊情况. void friend_node:make_node_new_head(friend_node *new_rec_ptr) friend_node *temp_ptr; / 定义一临时指针,保持跟踪链首 temp_ptr = head_ptr; / 使temp_ptr指向当前的链首 new_rec_ptr-next = temp_ptr; / 使欲插入节点的next指针指向当前链首 temp_ptr-prev=new_rec_ptr; /使temp_ptr指针的前向指针指向新插入节点 head_ptr = new_rec_ptr; / 再使欲插入节点成为新的链首,即成功插入新节点至链表首 / 使被new_rec_ptr所指的节点成为链尾的函数/ 用来处理插入时的一类特殊情况. void friend_node:add_node_to_end(friend_node *new_rec_ptr) new_rec_ptr-next = null; / 使欲插入节点的next指针指向null. new_rec_ptr-prev=tail_ptr; move_current_to_end(); / 调用move_current_to_end()函数使current_ptr指向链表尾 current_ptr-next = new_rec_ptr; / 使current_ptr的next指向欲插入节点,从而使欲插入节点成为链尾 / 使current_ptr指向链表尾的函数void friend_node:move_current_to_end() current_ptr = head_ptr; / 把头指针的地址给current_ptr while(current_ptr-next != null) / 遍历链表直至到达链表尾 current_ptr = current_ptr-next; / 显示整个链表void friend_node:display_list() char fullname36;/ 定义一个字符型数组,用来存放姓名int n;/每屏显示的纪录数 current_ptr = head_ptr; / 把头指针的地址给current_ptr,从而实现遍历链表 if(current_ptr != null) cout endl;cout n; cout 姓 名 电话号码n;cout录入时间:nyear / nmonth / nday / nhour:nminuteendl;/输出时间 cout -n; do int i=1; while (ilast_name); / 以下3行均为字符串处理函数,实现拼接 strcat(fullname, ); / 拼接为last_name first_name strcat(fullname, current_ptr-first_name); cout.setf(ios:left);/设置左对齐 cout setw(10)fullname; cout.unsetf(ios:left);/取消设置左对齐 cout.setf(ios:right);/设置右对齐 cout setw(20) phone_num next; / 使current_ptr指向下一个结点. cout endl; i+; cout 按enter继续 n; cin.get(pause); cin.ignore(1,pause); while(current_ptr != null); / 循环直到链表尾 system(cls); else / 若链表为空,显示此信息 cout n没有记录可显示n; void friend_node:jqsearch_by_name() /精确查找某一记录system(cls);char last_name_string20;/ 定义一字符型数组用来存放last_namecurrent_ptr = head_ptr; / 移current_ptr指针至链首cin.ignore(20,n);cout last_name, last_name_string) = 0)temp_ptr=current_ptr;cout n找到信息n;cout endl;cout - -n;cout 姓名 电话号码 n;cout - -n;cout.unsetf(ios:left);cout.setf(ios:right);cout last_name first_name ;cout setw(36) phone_num next;current_ptr=temp_ptr;elsecout 没有找到记录n;cout 按回车键继续n;cin.get(pause);system(cls);void friend_node:search_by_name() /精确查找某一记录system(cls);char last_name_string20;/ 定义一字符型数组用来存放last_name char first_name_string20; / 定义一字符型数组用来存放first_namecurrent_ptr = head_ptr; / 移current_ptr指针至链首cin.ignore(20,n);cout n请输入你想查询(或修改)者的姓: ;cin.get(last_name_string,20); /输入姓并保存在last_name_stringcin.ignore(20,n); cout first_name, first_name_string) = 0 & strcmp(current_ptr-last_name, last_name_string) = 0)temp_ptr=current_ptr;cout n找到信息n;cout endl;cout - -n;cout 姓名 电话号码 n;cout - -n;cout.unsetf(ios:left);cout.setf(ios:right);cout last_name first_name ;cout setw(36) phone_num next;current_ptr=temp_ptr;elsecout 没有找到记录n;cout 按回车键继续n;cin.get(pause);system(cls);/ 从链表中删除某个节点的功能函数void friend_node:delete_record() system(cls); char search_string20; friend_node *previous_ptr; previous_ptr = null; / 初始化previous_ptr指针,使其指向null. current_ptr = head_ptr; / 使current_ptr指向链首从而开始找欲删除的节点 cin.ignore(20,n); cout last_name, search_string) != 0) previous_ptr = current_ptr; / 保持一指针指向正欲删除的节点 current_ptr = current_ptr-next; if(current_ptr != null) / 若current_ptr所指并非null, 则找到对应记录 cout n找到记录n; cout last_name first_name endl; cout phone_num endl; if(verify_delete() / 询问用户是否确认删除 / 若是 delete_node(previous_ptr); / 则删除previous_ptr指针所指向的下一个节点 cout n纪录已删除n; else / 否则,什么也不做 cout n记录未被删除n; else / 若未找到记录,显示此信息 cout n未找到对应信息,记录未被删除.n; system(cls); void friend_node: help_me()help:int choice2;system(cls);cout n欢迎使用帮助系统,请选择你想知道的 版本号v1.0 nnn;cout 1: 我的记录将有何变化n;cout n2: 怎样删除所有记录n;cout n3: 这个程序开发了多久n;cout n4: 如何联系本人n;cout choice2;cin.ignore();switch(choice2) /帮助菜单case 1:cout n通过执行文件friends.dat来查看n;cout n若被重命名后再写入文件,则原记录丢失n;cout n按enter继续n;cin.get(pause);system(cls);goto help;break;case 2:cout n删除文件friends.datn;cout n按enter继续n;cin.get(pause);system(cls);goto help;break;case 3:cout n一周吧n;cout n按enter继续n;cin.get(pause);system(cls);goto help;break;case 4:cout n;cout n按enter继续n;cin.get(pause);system(cls);goto help;break;default:cout 按enter退出;cin.get(pause);cout 按enter继续n;cin.get(pause);system(cls);break; / 确认是否删除的函数int friend_node:verify_delete() char yesno; cout yesno; if(yesno = y) | (yesno = y) return(1); / 若用户确实要删除返回真值 else return(0); / 否则返回假值 / 删除被current_ptr所指的节点void friend_node:delete_node(friend_node *previous_ptr) if(current_ptr = head_ptr) / 若要删除的节点是链首节点 / 调用专门的函数处理这种特殊情况 delete_head_of_list(); else if(current_ptr-next = null) / 若将要删除的节点是链尾节点 / 同样调用专门的函数处理这种特殊情况 delete_end_of_list(previous_ptr); else / 若也非链尾节点 / 则从链表中间删除该节点 delete_from_middle_of_list(previous_ptr); /调用专门的函数处理这种情况 /删除链首节点void friend_node:delete_head_of_list() current_ptr = head_ptr; / 使current_ptr指向链首 if(head_ptr-next != null) / 若链表中不指一个节点 head_ptr = current_ptr-next; / 使第2个节点成为新的链首 else / 否则,使head_ptr指向null / 来说明链表已空 head_ptr = null; delete current_ptr; / 释放被删除节点占用的内存 / 删除链尾节点void friend_node:delete_end_of_list(friend_node *previous_ptr) delete current_ptr; / 释放被删除节点占用的内存 previous_ptr-next = null; / 使被删除节点前的那个节点成为新的链尾 current_ptr = head_ptr; / 使current_ptr指向链首 / 从链表中删除节点void friend_node:delete_from_middle_of_list(friend_node *previous_ptr) / 摘下被删除节点 previous_ptr-next = current_ptr-next; delete current_ptr; / 释放被删除节点占用的内存 current_ptr = head_ptr; / 使current_ptr指向链首 / 释放被链表占用的内存void friend_node:delete_list() friend_node *temp_ptr; / 定义一指针用来作临时存储 current_ptr = head_ptr; / 使current_ptr指向链首 do / 遍历链表 temp_ptr = current_ptr-next; / 使临时指针指向被删除节点的next delete current_ptr; / 删除current node指针指向的节点. current_ptr = temp_ptr; / 再使current_ptr指向被删除节点的next节点 while(temp_ptr != null); /修改记录void friend_node:modify_record(void) int n; char last_name120; char first_name115; char phone_num112; search_by_name();/此时current_ptr指向欲修改的节点 if(current_ptr) cout你想修改当前记录的哪一项?; coutn1.姓:; coutn2.名:; coutn; switch(n) case 1: coutlast_n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 胸痛诊疗中心管理制度
- 老旧小区自治管理制度
- 船舶公司仓库管理制度
- 药品委托试验管理制度
- 社区实践讲堂管理制度
- 纸箱印刷车间管理制度
- 职业卫生应急管理制度
- 美术培训员工管理制度
- 福特公司人员管理制度
- 2025年中国可生物降解殡葬用品行业市场全景分析及前景机遇研判报告
- 2025年山东将军烟草新材料科技有限公司招聘笔试冲刺题(带答案解析)
- 兵团开放大学2025年春季《公共关系学》终结考试答案
- 2025年中考语文押题作文范文10篇
- 打造重点专科协议书
- 细菌性结膜炎
- 红木文化知到智慧树期末考试答案题库2025年广西大学
- 2025-2030进口肉类市场发展分析及行业投资战略研究报告
- 智慧医院建设项目实施方案
- 项目协作与沟通过程中的冲突管理试题及答案
- 2025年轨道车司机(中级)职业技能鉴定参考试题库(含答案)
- 生物必修1教师用书
评论
0/150
提交评论