VC++ 课程实验报告专业班级:学号:报告人:C++课程实验报告一、实验题目:电话本管理二、功能描述:这是一个电话簿管理小程序,利用文本文件储存电话簿数据,具有添加、删除、显示和查询联系人电话号码功能。
在这个小型管理程序中,类与类之间通过链表将各个数据相连接,形成一个通畅的应用小程序!在程序中,对于用户需求尽可能的予以满足.三、算法设计与实验步骤四、流程图:按ENTER进入电话本功能界面电话本功能界面(用户根据界面说明进行选择操作)0 进入帮助1添加联系人2查找并修改3姓名查找联系人4首字母近似查找5显示全部记录6删除记录用户根据帮助程序根据提示用户新建联系人姓名和电话号码输入联系人姓名,查找修改输入姓名查找输入首字母匹配查找显示电话薄全部数据逐一删除联系人数据,首先输入联系人姓名7退出电话簿程序并保存电话簿数据四、类与对象结构描述,核心程序代码(需要有相应的注释)1.程序中所定义的类 (1)电话簿记录类 class CTelRecord {private:int nYear,nMonth,nDay,nHour,nMinute,nSecond; //时间单元 char szName[20]; //电话簿数据:姓名和电话号码 char Last[20]; char szNumber[20]; public:CTelRecord(){} //构造函数CTelRecord(char *name,char *number);void SetRecord(char *name,char *last,char *number); //输出时间 int Compare(char *name); //根据姓名查找void SetName(char *name){strcpy(szName,name);} void SetNum(char *num){strcpy(szNumber,num);} void SetLast(char *last){strcpy(Last,last);}char *GetName(void){return szName;} //需通过函数访问的私有成员char *GetLast(void){return Last;} char *GetNum(void){return szNumber;} int GetYear(void){return nYear;} int GetMonth(void){return nMonth;}用户选择0后进入帮助界面1 怎样产生一个新纪录2 怎样显示我的电话本3 什么时候我有一种新版面4 什么时候有一种新版面5 退出帮助进入电话簿功能界面电话本功能界面int GetDay(void){return nDay;}int GetHour(void){return nHour;}int GetMinute(void){return nMinute;}int GetSecond(void){return nSecond;}void Show(); //打印数据void Modify(char *number); //修改结点函数int LookChar(char *szName); //按首字母查找匹配姓名};(2)定义结点类class CNode{private:CTelRecord *pData; //用于指向数据类指针CNode *pNext; //指向链表下一个结点指针public:CNode(){pData=0;pNext=0;} //结点构造CNode(CNode &node); //拷贝构造函数void ShowNode(){pData->Show();} //指向打印函数CTelRecord *GetData(void){return pData;}friend class CList; //定义链表类为友元类};(3) 定义链表类class CList{CNode *head_ptr,*current_ptr;public:CList(){head_ptr=NULL;} //构造函数void Help_me(); //帮助函数void AddNode(); //在首部添加结点void DeleteNode(); //删除结点void ShowList(); //显示所有记录void DeleteList(); //删除所有记录void Search(); //查找CNode *GetListHead(){return head_ptr;}void Insert(CNode *new_rec_ptr); //按顺序插入新节点CNode*Position_insertion_point(char name[20]);void ModNum(void); //修改号码void SearchFriends(void); //查找具有相似名的记录void load_list_from_file(void); //保存文件void write_list_to_file(); //把文件数据写入链表中};2.新增函数说明根据姓氏,返回其在链表中的正确位置,新节点即将插入此点。
CNode*CList::Position_insertion_point(char name[20]){char temp_name[20];CNode *temp_ptr;int tempint;if(head_ptr->pNext!=NULL) // 如果有多于一个结点的链表,查找结点在链表中的正确位置{current_ptr=head_ptr;temp_ptr=current_ptr->pNext;strcpy(temp_name,temp_ptr->pData->GetName());tempint=strcmp(name,temp_name); /*比较链表中的姓氏与欲插入的姓氏的大小*/while((tempint>0)&¤t_ptr->pNext!=NULL) /*若欲插入的姓氏大于链表中当前结点的姓氏,继续向下查找*/{current_ptr=temp_ptr;if(current_ptr->pNext!=NULL){temp_ptr=current_ptr->pNext;strcpy(temp_name,temp_ptr->pData->GetName());tempint=strcmp(name,temp_name);}}}else //如果只有一个头结点,返回头结点的位置,新结点插在头节点后 current_ptr=head_ptr;return(current_ptr);}3.电话簿记录在链表的读取与写入(1)从链表读取数据void CList::load_list_from_file(void) //从数据文件FRIENDS.DAT中读取数据,重建链表处理函数{CNode *new_rec_ptr; //CTelRecord *Phonebook;ifstream infile;int end_loop=0;infile.open("FRIENDS.DAT",ios::in);if(infile) //打开文件正确{do{new_rec_ptr=new CNode;new_rec_ptr->pData=new CTelRecord;if(new_rec_ptr!=NULL){char name[20],last[20],number[20];int year,month,day,hour,minute,second;infile.getline(name,20);new_rec_ptr->pData->SetName(name);infile.getline(last,20);new_rec_ptr->pData->SetLast(last);if((strcmp(new_rec_ptr->pData->GetName(),"")!=0)&&(strcmp(new_rec_ptr->pData->GetName(),"END OF FILE")!=0)) {infile.getline(number,20);new_rec_ptr->pData->SetNum(number);infile>>year;infile.get(pause);infile>>month;infile.get(pause);infile>>day;infile.get(pause);infile>>hour;infile.get(pause);infile>>minute;infile.get(pause);infile>>second;infile.get(pause);new_rec_ptr->pData->SetTime(year,month,day,hour,minute,second);Insert(new_rec_ptr);}else //读到文件尾{delete new_rec_ptr;end_loop=1;}}else //如果结点分配空家出错{cout<<"WARNING:Memory error.Load from disk wan unsuccessful.\n";end_loop=1;}}while(end_loop==0);infile.close();}else //如果打开文件出错cout<<"No usable data file located.List is empty.\n";}(2)将数据写入链表void CList::write_list_to_file() //将链表写入文件{ofstream outfile;outfile.open("FRIENDS.DAT",ios::out); //打开文件if(outfile) //打开正确{current_ptr=head_ptr;if(head_ptr!=NULL) //链表不为空,循环写入{do{outfile<<current_ptr->pData->GetName()<<endl;outfile<<current_ptr->pData->GetLast()<<endl;outfile<<current_ptr->pData->GetNum()<<endl;outfile<<current_ptr->pData->GetYear()<<endl;outfile<<current_ptr->pData->GetMonth()<<endl;outfile<<current_ptr->pData->GetDay()<<endl;outfile<<current_ptr->pData->GetHour()<<endl;outfile<<current_ptr->pData->GetMinute()<<endl;outfile<<current_ptr->pData->GetSecond()<<endl;current_ptr=current_ptr->pNext;}while(current_ptr!=NULL);}outfile<<"END OF FILE"<<endl;outfile.close();}else //打开文件出错cout<<"Error opening file!\n";}4.课程设计要求的实现(1)记录修改函数实现void CList::ModNum(void) //修改号码{system("cls");char search_string[20],new_phone_number[20];current_ptr=head_ptr;cin.ignore(20,'\n');cout<<"\nEnter the First name for which you want to change his or her phonenumber:";cin.get(search_string,20); //需要修改的姓氏cin.ignore(20,'\n');while((current_ptr!=NULL)&&((current_ptr->pData->Compare(search_string))!=0)) current_ptr=current_ptr->pNext;if(current_ptr!=NULL) //如果找到匹配的结点,输出结点信息{cout<<"\nRECORD FOUND\n";current_ptr->ShowNode();cout<<"Enter New Phonenumber:";cin.get(new_phone_number,20);cin.ignore(20,'\n');current_ptr->pData->Modify(new_phone_number);}else //查找万整个链表,未查到匹配的结点{cout<<"NO MATCH FOUND\n";cout<<"Press Enter Continue\n";cin.get(pause);system("cls");}}(2)记录录入信息时间void CTelRecord::SetRecord(char *name,char *last,char *number) //调用系统时间{strcpy(szName,name);strcpy(Last,last);strcpy(szNumber,number);struct tm *times; //定义时间指针变量.....(只能用指针)time_t t; //定义系统时间变量,供提供系统时间t = time(0); //当前系统时间给变量ttimes = localtime(&t); //把系统时间变量强制转换成tm结构体形式时间nYear=(times->tm_year+1900);nMonth=times->tm_mon;nDay=times->tm_mday;nHour=times->tm_hour;nMinute=times->tm_min;nSecond=times->tm_sec;}(3)首字母查询功能void CList::SearchFriends(void){system("cls");char FirstWords[20],name[20];int length,k=0;current_ptr=head_ptr;cin.ignore(20,'\n');cout<<"\nEnter the first words to found several similar Friends:";cin.get(FirstWords,20);cin.ignore(20,'\n');length=strlen(FirstWords);while(current_ptr!=NULL){strcpy(name,current_ptr->pData->GetName());name[length]='\0';if(strcmp(name,FirstWords)==0) //如果找到匹配的结点,输出结点信息{if(k==0)cout<<"\nRECORD FOUND\n";current_ptr->ShowNode();k=1;}current_ptr=current_ptr->pNext;}if(k==0) //查找万整个链表,未查到匹配的结点{cout<<"NO MATCH FOUND\n";cout<<"Press Enter Continue\n";cin.get(pause);system("cls");}}五、运行界面、运行结果与使用说明六、小结与思考:1.在做了课程实验以后,我对C++的了解更深了,很多知识得到了巩固,一些不懂的知识也渐渐明了!这其中主要是对类的封装收获很多,在类的封装过程中,对数据的访问控制问题很重要;在面向对象程序设计中,对访问的控制也是比较重要,我相信这对以后学习其他面向对象程序语言会有很大的帮助!2.作了电话簿管理得小型程序后,我对链表更加熟悉了,作为C++所特有得指针和链表再编写程序得过程中运用十分广泛,我还必须多加练习才能达到一个更高的水平,链表和类都是非常重要的!3.在完完整整的做完一个课程实验后,我对程序的整体性有了一个明确的认识,做一个程序必须要注意程序前后的联系,要具有清晰的思路,程序要具有层次。