C++课程设计——电话簿管理
- 格式:doc
- 大小:87.00 KB
- 文档页数:18
#include<fstream.h>#include<conio.h>#include<iostream.h>#include<iomanip.h>#include<time.h>#include<string.h>#include<stdlib.h>class friend_node //电话簿类的定义。
{private:int year,month,day,hour,minute;//时间单元char last_name[20]; //姓氏char first_name[15];//名字char phone_num[20];//电话号码char pause;friend_node *next;public: //各种函数的说明void handle_choice(int choice); //根据用户选择调用函数void add_record();//增加记录void insert_node(friend_node *new_rec_ptr);//将一个由new_rec_ptr指向的新结点插入链表中friend_node *position_insertion_point(char lastname[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);//删除中间当前结点void delete_node(friend_node *previous_ptr);//删除当前结点void delete_list();//删除成个链表void search_by_lastname();//根据姓氏查找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();//进入函数int verify_delete();//要求用户确认};friend_node *fun_ptr;friend_node *head_ptr; //全程变量,链头指针friend_node *current_ptr; //全程变量,用于指明当前在链表中的位置time_t time_date; // time_t 里面放的是星期、月份、日期、时间及年份等数据tm *CurrentTime;//定义时间的一个指针void friend_node::welcome(){cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;cout << "\t\t\t\t欢迎进入电话簿管理\n";cout << "\t\t\t\t"<<setw(15)<<"按Enter键继续";cin.get( pause);system("cls"); //执行系统命令:cls-清屏int choice;head_ptr = NULL; // 初始化链表头指针。
load_list_from_file(); //装载数据文件到链表。
do{ // 主菜单显示cout <<"\t《主菜单》"<<endl<<"-------------------------------------------------"<<endl;cout << "\t1 - 增添新记录\n\n";cout << "\t2 - 显示所有记录\n\n";cout << "\t3 - 查找号码\n\n";cout << "\t4 - 删除指定记录\n\n";cout << "\t5 - 修改指定用户个人信息\n\n";cout << "\t6 - 帮助\n\n";cout << "\t0 - 退出系统\n\n";cout << "\t\t请输入所选项: ";cin >> choice;handle_choice(choice); //根据选择调用函数。
.} while(choice != 0); //选择结束后退出循环.}//此函数结束void main(){ friend_node dianhuabu; //定义电话簿类的对象,便于调用函数dianhuabu.welcome();}//此函数结束void friend_node::handle_choice(int choice) // 根据用户选择(choice)调用对应处函数{ int n ;switch(choice){case 1: //添加记录,add_record(); // 调用相应函数.break;case 2: //显示记录,display_list(); // 调用相应函数break;case 3: //查找记录,cout<<"1 按姓查找,2 按名查找, 3按首字母查找(智能查找)";cin>>n;if(n==1) search_by_lastname();if(n==2) search_by_firstname();if(n==3) look_char();break; //调用相应函数case 4: // 删除记录,delete_record(); //调用相应函数break;case 5: //修改数据modify_record(); //调用相应函数break;case 6: //帮助help_me(); //调用相应函数break;case 0: // 退出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 << "姓: ";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);//localtime( )函数是将类型为time_t的时间值,放入结构类型为tm的结构中new_rec_ptr->year=CurrentTime->tm_year+1900; //将当前时间变为标准形式new_rec_ptr->month=CurrentTime->tm_mon+1; //取出月份赋给类中的私有数据Month,tm_mon是从0开始,//表示12月份依次为0~11,故真实月份需加一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");} //此函数结束void friend_node::insert_node(friend_node *new_rec_ptr) //将一个由new_rec_ptr 指向的新节点插入链表中{system("cls");friend_node *before_ptr;friend_node *after_ptr;if(head_ptr == NULL){ // 如果是空链表,插入点是唯一的new_rec_ptr->next = NULL;head_ptr = new_rec_ptr;}{if(strcmp(new_rec_ptr->last_name, head_ptr->last_name) < 0){ // 如果新结点小于头结点,make_node_new_head(new_rec_ptr); // 新结点作为头结点.}else // 根据姓氏,返回其在链表中的正确位置{current_ptr = position_insertion_point(new_rec_ptr->last_name);before_ptr = current_ptr;after_ptr = current_ptr->next;if(after_ptr == NULL) // 如果下一结点为尾结点,将新结点作为尾结点{add_node_to_end(new_rec_ptr);}else // 否则新结点插入链表中{before_ptr->next = new_rec_ptr;new_rec_ptr->next = after_ptr;}}}} //此函数结束friend_node *friend_node::position_insertion_point(char lastname[20]){ // 根据姓氏,返回其在链表中的正确位置。