VC++课程设计报告.doc
1VCVC课程设计报告课程设计报告课课 程:程:VC+课程设计课程设计 系系 别:别:班班 级:级:学学 号:号:姓姓 名:名:选题选题 2 名称:名称: 选题选题 2 难易级别:难易级别:自报成绩:自报成绩: 起止时间:起止时间:指导教师:指导教师: 日期: 年 月 日2目目 录录一、 课题目标1.1 程序功能简介 1.2 课程设计要求 1.3 评定难易级别 二、 具体实现2.1 程序总体方案 2.1.1 开发平台 2.1.2 程序结构或流程图 2.2 所做改进 2.2.1 改进一2.2.1.1 改进方案2.2.1.2 具体实现 2.2.2 改进二2.2.2.1 改进方案2.2.2.2 具体实现 2.2.n 改进 N2.2.n.1 改进方案2.2.n.2 具体实现 三、 调试报告(在设计和实现过程所遇到的问题和解决,请如实填写) 四、 总体小结(在整个设计过程中的心得体会) 五、 分工介绍(是独立完成还是合作完成,若为合作完成,说明合作者以及之间的 具体分工)3一、课题目标一、课题目标1.1 程序功能简介程序功能简介一个电话簿管理小程序。利用文本文件存储电话簿数据,具有添加、删除、显示和查 询联系人电话号码的功能。1.2 课程设计要求课程设计要求(1)将电话簿数据和相应的函数封装在类中,改写程序使之结构化。 (2)增加记录修改功能,能选择修改用户的姓名、电话。 (3)增加录入时间的显示及存储。 (4)增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资 料均在屏幕上显示。1.3 评定难易级别评定难易级别A 级二、具体实现二、具体实现2.1 程序总体方案程序总体方案2.1.1 开发平台开发平台操作系统:Windows XP 开发工具:VC+6.02.1.2 程序结构或流程图程序结构或流程图(1)主函数的流程图:41 2 3 4 5 6 0开始输出菜单及提示输入选择添 加 电 话 簿 记 录显 示 电 话 簿 内 容删 除 已 有 记 录修 改 已 有 记 录根 据 姓 名 查 找根 据 首 字 母 查 找返回主菜单退出结束退出52.2 所做改进所做改进 2.2.1 改进一改进一2.2.1.1 改进方案把程序改成类:将数据成员和对这些数据相关的操作函数封装在类中,使程序结构化。定义了类的友元类,使访问类成员时更方便。 2.2.1.2 具体实现 class TelRecord /定义类 private: int Year,Month,Day,Hour,Minute; char LName20; char FName20; char Tel20; public:TelRecord(); /缺省的构造函数 TelRecord(); /析构函数TelRecord(char*,char*,char*,int,int,int,int,int); void setRecord(char*,char*r,char*,int,int,int,int ,int ); void setTime(); char* getLName(); /获得姓 char* getFName(); /获得名 char* getTel() ; /获得电话号码 int getYear(); /获得年 int getMonth(); /获得月 int getDay(); /获得日int getHour(); /获得时 int getMinute() ; /获得分 int compare(TelRecord /按照姓名比较若返回值为零,则两者相 等 void show(); void modify(char*); /修改电话号码void modify(char *,char *); /修改姓名 int lookChar(char); /首字母匹配的返回 1,不匹配的返回/按照 首字母查找,若匹配返回 1,否则返回 0 ; class Node /结点类 friend class List; private:6TelRecord* pData;Node *pNext; public:Node() pData=new TelRecord; pNext=0; /缺省的构造函数 Node(TelRecord telrecord,Node node) pData= pNext= /构造函数Node(NodepNext=node.getpNext(); Node();void inputData(TelRecord*pdata) pData=pdata; /数据录入函数void showNode() pData->show(); /结点显示函数TelRecord* getData() return pData; /获得结点信息函数 Node* getpNext() Node *p=pNext; return p; /获得下一个结点 ;class List /链表类 Node* pHead; public:List(Node* node=NULL) pHead=node; /构造函数List() if(pHead!=NULL) deleteList(); /析构函数 void setpHead(Node* node) pHead=node; /重置链表头函数void showList(); /显示链表函数void deleteList(); /删除链表函数 Node* getListHead() return pHead;Node* lookUpfirstletter(); /按照姓氏首字母智能查询函数void lookUp(TelRecord /按照姓名智能查询函数void insert(Node*); /排序插入函数void deleteNode(Node*); /删除结点函数void delete_record(); /删除记录函数int verify_delete(); /确认删除的函数void add_record(); /在链表中增加一个记录函数void modify_record(); /修改数据函数 void modifyTel(); /修改电话号码函数void modifyName(); /修改姓名函数void load_list_from_file(); /从文件载入数据函数void write_list_to_file(); /把信息写入文件的函数 void handle_choice(int); /选择处理函数 ;72.2.2 改进二改进二2.2.2.1 改进方案增加时间单元的存储与显示:在结点数据域中增加一个时间单元,在结 点数据的构造函数中调用系统时间给时间单元赋值。 2.2.2.2 具体实现 void setTime() time_date=time(0);CurrentTime=localtime(Year=CurrentTime->tm_year+1900;Month=CurrentTime->tm_mon+1;Day=CurrentTime->tm_mday;Hour=CurrentTime->tm_hour;Minute=CurrentTime->tm_min; int getYear() return Year; int getMonth() return Month; int getDay() return Day; int getHour() return Hour; int getMinute() return Minute; void setRecord(char*lastname,char*number,char*firstname, int year,int month,int day,int hour,int minute ) strcpy(LName,lastname);strcpy(Tel,number);strcpy(FName,firstname); Year=year; Month=month; Day=day; Hour=hour; Minute=minute; 2.2.3 改进三改进三2.2.3.1 改进方案使用户界面更加友好:避免输入数据类型错误导致程序无效循环或终止, 在输入数据类型时进行判断,对非法输入予以提示。 2.2.3.2 具体实现8/要求用户确认函数 int List:verify_delete() char YesNo;cout<<“n 确定删除吗?(y/n) “;YesNo=cin.get();while(YesNo!='y'cout<<“ 输入有误,重新输入: “;YesNo=cin.get();if(YesNo='y') cin.get(); return 1;else cin.get(); return 0; /将输入的字符转换为整型 int main() char str20; List FriendsList; cout<<“*欢迎使用电话簿管理系统*“<<endl; cout<<“按回车键开始“<<endl; cin.get(pause); system(“cls“); FriendsList.load_list_from_file(); current_ptr=FriendsList.getListHead(); do system(“cls“); cout<<“n=菜单=n“; . cout<<“=n“; cout<<“请输入您的选择:n“; cin.clear(); cin.getline(str,20); choice=atoi(str);FriendsList.handle_choice(choice); while(choice!=0); return 0; 9三、调试报告三、调试报告以下面的表格形式记录程序调试和测试过程。日期遇到的问题解决方法9 月 5 号在 main()函数中定义的变量,在其调用的函数中不能实现。了解到变量的作用域问题,把需要在整个程序中用得到变量定义为全局变量,由于是多文件,故使用了 extern 说明。9 月 8 号在返回主菜单的程序中,总是有异常的程序终止。检查程序,查找各种输入流函数的用法,在一些输入后立即清空缓存,或提取缓存区中的换行符。9 月 11 号设计容错函数时,出现程序异常终止。检查程序代码,做细节改动9 月 13 号电话簿输出出现错误,姓名与电话号码交叉输出。检查程序,在读取结点数据时,数据成员顺序与构造函数中不一致,修改。四、总体小结四、总体小结此次课程设计的题目的程序流程并不复杂,但实现的操作较多,涉及类的 继承和友元类的实现,要有正确地访问类的私有数据途径;关键的是,实现了 文本文件的输入输出,在大数据程序的实现中,可方便地调用、存储数据。五、分工介绍五、分工介绍独立完成。