为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C++课程设计 电话簿管理

2011-11-01 11页 doc 67KB 40阅读

用户头像

is_416333

暂无简介

举报
C++课程设计 电话簿管理VC++课程设计作业二 VC++课程设计 ——电话簿管理程序的设计 本程序是在第5章第5题的基础之上改进而来的。增加了加密,修改记录的功能、录入时间的显示及存储、智能查询等功能。 汉化了菜单与帮助,并且使用了类与对象重建了系统。 程序中使用了friend_node来表示一个记录,其中包含了char last_name[20]表示朋友的姓,char first_name[15]表示朋友的名,char phone_num[12]表示电话号码,指针friend_node *next指向后一个结点,指针friend_node *las...
C++课程设计 电话簿管理
VC++课程作业二 VC++课程设计 ——电话簿管理程序的设计 本程序是在第5章第5题的基础之上改进而来的。增加了加密,修改的功能、录入时间的显示及存储、智能查询等功能。 汉化了菜单与帮助,并且使用了类与对象重建了系统。 程序中使用了friend_node来表示一个记录,其中包含了char last_name[20]表示朋友的姓,char first_name[15]表示朋友的名,char phone_num[12]表示电话号码,指针friend_node *next指向后一个结点,指针friend_node *last指向前一个结点。 程序中使用了类friend_node来封装双向链表,其成员数据及成员函数如下: void handle_choice(int choice) 根据用户选择调用函数 void add_record() 增加记录 void insert_node(friend_node *new_rec_ptr)将一个由new_rec_ptr指向的新结点插入链表中 friend_node*position_insertion_point(charlastname[20])根据姓氏,返回其在链表中的正确位置, 新结点即将插入此点 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 search_by_lastname()根据姓氏查找 void search_by_name()精确查找某一记录 void search_by_firstname()按名查询 void modify_record()修改数据 void look_char() 智能查询 void write_list_to_file()将链表数据写如文件 void load_list_from_file()读取数据,重建链表处理函数 void help_me()帮助 void welcome()使用菜单界面 void enter()用户登录 程序流程图如下: N Y Y N 现在主要说明一下此次程序改进中几个新增和改进的地方 1、​ 增加记录,程序增加了记录写入时间的功能,时间取自格林威治时间1970年1月1日00:00所经过的秒数,在结点数据域中增加了时间单元,并在写入记录时调用系统时间给时间单元赋值. 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 << "姓: "; cin.get(new_rec_ptr->last_name,20); cin.ignore(20,'\n'); cout << "名: "; cin.get(new_rec_ptr->first_name,15); cin.ignore(20,'\n'); cout << "电话号码: "; cin.get(new_rec_ptr->phone_num,15); cin.ignore(20,'\n'); time_date=time(0); //time( )函数是取得自格林威治时间1970年1月1日00:00所经过的秒数 CurrentTime=localtime(&time_date); new_rec_ptr->year=CurrentTime->tm_year+1900; new_rec_ptr->month=CurrentTime->tm_mon+1; new_rec_ptr->day=CurrentTime->tm_mday ; new_rec_ptr->hour=CurrentTime->tm_hour ; new_rec_ptr->minute=CurrentTime->tm_min ; insert_node(new_rec_ptr); } else { cout << "警告:您输入了错误的信息,此记录无效!\n"; }system("cls"); } 2、​ 显示所有记录,由函数 void list::display_list() 完成,增加了控制每屏显示数据个数的功能,难度不大.清屏之后询问一次显示几个记录,输入n,置计数器count=0;每次显示记录时判断是否要清屏,是则清屏,否则继续显示记录,直到所有记录均显示完毕。 void list::display_list() { int count=0; system("cls"); cout<<"每次显示几个记录?"; cin>>n; cin.ignore(20,'\n'); system("cls"); current_ptr=head_ptr; while(current_ptr) { cout<<"姓名:"<last_name<first_name<phone_num<next; count++; if(count%n==0) { getchar(); system("cls"); } } cout<<"没有数据!"<last_name, search_string) != 0)) {//顺序依次查找结点,若不匹配循环查找 current_ptr = current_ptr->next; } if(current_ptr != NULL) //若匹配,输出结点信息 { cout << "找到您所需记录\n"; cout << current_ptr->first_name << ' ' << current_ptr->last_name << endl; cout << current_ptr->phone_num << endl; cout << current_ptr->year<<"-"<month<<"-"<day<<'\t'<hour<<":"<minute<first_name, search_string) != 0)) { current_ptr = current_ptr->next; } if(current_ptr != NULL) { cout << "找到您所需记录\n"; cout << current_ptr->first_name << ' ' << current_ptr->last_name << endl; cout << current_ptr->phone_num << endl; cout << current_ptr->year<<"-"<month<<"-"<day<<'\t'<hour<<":"<minute<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 << ' '<< current_ptr->first_name ; cout << setw(36) << current_ptr->phone_num << endl; } current_ptr = current_ptr->next; } current_ptr=temp_ptr; } else { cout << "没有找到记录\n"; cout << "按回车键继续\n"; cin.get(pause); system("cls"); } } (4)按姓名首字母查询是本次程序新增加的一个服务,在缺省情况下查询可以更方便快捷. 5、帮助系统,由函数void friend_node::help_me()执行,但由于能力有限,该系统空有架势,只是一些输入输出的简单功能. void list::help_me() { do{ system("cls"); cout<<"欢迎来到帮助系统,请选择:"<>n; switch(n) { case 1: system("cls"); cout<<"在目录里查找文件Friends.dat;"<word
封装储存,并可以更改. 在程序中添加了friend class Customer 用户类来封装用户信息 { pivate: char Customer_name[30]; char password[10]; public: void log_in(char*,Customer)const; void Register(Customer*) } 这个程序的程序量较大,约800行,所以调试起来有一定难度。困难主要集中在双向链表的操作上,因为程序中几乎每一个函数的功能均建立在双向链表的操作上。而双向链表的操作中的问题主要出现在一些边缘情况上,例如删除头结点、尾结点,插入头结点、尾结点等。在双向链表中,每一个结点均有两个指针,分别指向前一个结点和后一个结点,但是头结点与尾结点比较特殊,因为它们没有前一个结点与后一个结点,故它们的head_ptr指针与end_ptr指针分别为空,然而开始程序中并没有注意这个问题,故在调试中遇到了许多问题,改进之后才解决这些问题。 总的来说这个程序想作成不太难,,因为算法较简单,虽然操作上较为复杂,但是假如思路清楚还是可以很快的解决问题。 但做好的话就需要更多的编程理论知识和实践经验.由于本人的才疏学浅,暂且留留个问题,等以后在来完善. 程序就象一种语言,当你有一脑袋的想法想去表述的时候,却又不知道如何去说,这种痛苦的感觉蔓延在我编程的整个过程中.让我记忆犹新. 盘中存有加密前的程序和加密后的程序。
/
本文档为【C++课程设计 电话簿管理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索