课程设计报告格式926.docx
- 文档编号:29995432
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:17
- 大小:67.85KB
课程设计报告格式926.docx
《课程设计报告格式926.docx》由会员分享,可在线阅读,更多相关《课程设计报告格式926.docx(17页珍藏版)》请在冰豆网上搜索。
课程设计报告格式926
北京化工大学北方学院
课程设计报告
课程名称课程设计
设计题目电话簿管理系统
专业、班级软件0702
学号
姓名刘玮
指导教师
设计时间2010.9.1——2010.9.30
2010年9月27日
一、引言(简要说明设计题目的目的、意义、内容、主要任务等)
随着电脑的普及,各种应用软件已经成了人们生活中不可缺少的助手,本次课程设计这是基于这一点,我决定利用自己所学的知识开发一套电话簿管理系统软件,方便人们在电脑上实现管理查询自己电话簿。
电话簿所实现的基本功能如下
1.将电话簿数据存储在access数据库中。
2.增加记录修改功能,能选择修改用户名的姓、名、电话。
3.增加录入时间的显示及存储。
4.增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。
本程序在windowsxpvc2005access环境下编译通过
二、正文(课程设计的主要内容,包括实验与观测方法和结果、仪器设备、计算方法、编程原理、数据处理、设计说明与依据、加工整理和图表、形成的论点和导出的结论等。
正文内容必须实事求是、客观真切、准确完备、合乎逻辑、层次分明、语言流畅、结构严谨,符合各学科、专业的有关要求。
)
模块设计
根据系统功能的要求,电话簿管理系统分为三个主要模块。
即电话资料输入管理、修改管理、查询管理。
可以将系统分解成为几个功能模块来分别设计,功能模块间的关系如图1所示。
电话资料输入管理
修改管理
软件主界面
查询管理
程序流程图
开始
结束
模块功能设计
本系统功能模块包括电话资料输入管理、修改管理、查询管理。
1电话资料输入管理
用于管理输入的电话信息,主要包括姓名,电话等。
2修改管理
用于管理已输入信息的修改过程。
3查询管理
用于查询已储存的电话信息,并提供多种查询方式。
数据库设计
数据库设计是要在一个给定的应用环境中,通过合理的逻辑设计和有效的物理设计,构造较优的数据库模式、子模式,建立数据库和设计应用程序,满足用户的各种信息需求。
1概念结构设计
在数据库设计中,先要对系统分析所得的数据字典中的数据存储进行分析,然后得出系统的关系模式,可以采用实体——联系图(简称E——R图)的方法进行数据结构的描述。
E——R图由实体、属性、联系三部分组成。
E——R图的有关符号说明如下:
下面列出本系统的E-R图:
主要功能代码介绍
/**********************************************\
函数原型:
voidDataInit()
功能:
完成从文件读取数据的操作,如果文件不存在则只建立链表
输入输出均为空,只是一个过程.
***********************************************/
voidCPhoneBookDlg:
:
DataInit()
{
structPhoneCard*p,*q;//定义两个临时指针
bFileEmpty=FALSE;//文件默认为不空
bNewFile=FALSE;//假定不是新文件
bFileModified=FALSE;//初始化文件属性
p=head=(structPhoneCard*)malloc(sizeof(structPhoneCard));
head->prev=head->next=NULL;//建立头结点(不存放数据)
if(!
(fp=fopen("data.dat","r")))//试图用只读方式打开数据文件,如文件不存在则fp返回NULL值
{
bNewFile=TRUE;//文件不存在,当然是新文件了
bFileEmpty=TRUE;//文件当前状态是空的,第一次运行程序嘛
iCount=0;//总结点数为0,注意不包括头结点,头结点不用来存放数据
last=head;//尾结点此时就是头结点
}
if(!
bFileEmpty)//因为文件默认为不空,如果文件已存在,则从文件中读取数据建立链表
{
fread(&iCount,sizeof(int),1,fp);//先从文件中读取总结点数
for(inti=0;i { q=(structPhoneCard*)malloc(sizeof(structPhoneCard)); fread(q,sizeof(structPhoneCard),1,fp); q->next=NULL; q->prev=p; p->next=q; p=p->next; m_NameList.InsertString(i,p->name);//显示名单 } last=p;//改变尾指针的指向 } if(iCount==0)//如果名单为空,禁用更新、删除和查找等按钮,以免发生误操作导致错误 { GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE); GetDlgItem(IDC_DELETE)->EnableWindow(FALSE); GetDlgItem(IDC_SEARCHBYNAME)->EnableWindow(FALSE); GetDlgItem(IDC_SEARCHBYPHONE)->EnableWindow(FALSE); GetDlgItem(IDC_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_PHONE)->EnableWindow(FALSE); GetDlgItem(IDC_ADDRESS)->EnableWindow(FALSE); GetDlgItem(IDC_CODE)->EnableWindow(FALSE); } else { m_NameList.SetCurSel(0);//默认选中第一条记录 OnSelchangeNamelist(); } } /**********************************************\ 函数原型: voidOnAdd() 功能: 在链表的结尾添加一条记录,并将默认将新记录的姓名置为“新名字”,其它项为空 输入输出均为空,只是一个过程. ***********************************************/ voidCPhoneBookDlg: : OnAdd() { //TODO: Addyourcontrolnotificationhandlercodehere GetDlgItem(IDC_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_PHONE)->EnableWindow(TRUE); GetDlgItem(IDC_ADDRESS)->EnableWindow(TRUE); GetDlgItem(IDC_CODE)->EnableWindow(TRUE);//启用文本框控件 curr=(structPhoneCard*)malloc(sizeof(structPhoneCard));//将当前指针指向新增加的结点上 strcpy(curr->name,"新名字"); strcpy(curr->num,""); strcpy(curr->address,""); strcpy(curr->code,"");//将默认的数据复制到当前结点 m_NameList.InsertString(m_NameList.GetCount(),"新名字"); m_NameList.SetCurSel(m_NameList.GetCount()-1);//在列表框中插入新名字并选中 iCount++;//总结点数加1 curr->next=NULL; curr->prev=last; last->next=curr; last=curr;//在尾结点后插入新结点 bFileEmpty=FALSE; bFileModified=TRUE;//修改文件属性,文件被修改且不为空 GetDlgItem(IDC_UPDATE)->EnableWindow(TRUE); GetDlgItem(IDC_DELETE)->EnableWindow(TRUE); GetDlgItem(IDC_SEARCHBYNAME)->EnableWindow(TRUE); GetDlgItem(IDC_SEARCHBYPHONE)->EnableWindow(TRUE);//启用更新、删除、查找按钮控件 LoadInfo(curr);//在文本框显示个人信息 } /**********************************************\ 函数原型: voidDataUpdate() 功能: 完成修改当前记录的操作 输入输出均为空,只是一个过程. ***********************************************/ voidCPhoneBookDlg: : OnUpdate() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); intsel=m_NameList.GetCurSel();//得到所选择记录在列表框中的序号 if(m_szName=="") { MessageBox("必须键入姓名! ","错误! ",MB_ICONERROR); m_IDC_Name.SetFocus(); return;//如果姓名输入框为空则发生错误 } strcpy(curr->name,m_szName); strcpy(curr->num,m_szPhone); strcpy(curr->address,m_szAddress); strcpy(curr->code,m_szCode);//将更新的数据从文本输入框复制到结点 m_NameList.DeleteString(sel); m_NameList.InsertString(sel,m_szName); m_NameList.SetCurSel(sel);//更新列表框中的姓名 m_Button_Add.SetFocus();//将焦点设置到“添加”按钮上 } /**********************************************\ 函数原型: voidOnSelchangeNamelist() 功能: 当列表框的选择项改变时,移动指针到指定结点的位置 输入输出均为空,只是一个过程. ***********************************************/ voidCPhoneBookDlg: : OnSelchangeNamelist() { //TODO: Addyourcontrolnotificationhandlercodehere intsel=m_NameList.GetCurSel();//获得当前的选择 curr=head->next; for(inti=0;i curr=curr->next;//移动当前指针到选定结点 LoadInfo(curr);//更新界面 } /**********************************************\ 函数原型: voidLoadInfo(PhoneCard*p) 功能: 将结点中存放的数据信息显示在文本框中 输入为当前结点的地址值 输出为空 ***********************************************/ voidCPhoneBookDlg: : LoadInfo(PhoneCard*p) { m_szName=p->name; m_szPhone=p->num; m_szAddress=p->address; m_szCode=p->code; UpdateData(FALSE); m_IDC_Name.SetFocus(); m_IDC_Name.SetSel(0,20,TRUE); } /**********************************************\ 函数原型: voidOnDelete() 功能: 将当前结点删除 输入为空 输出为空 ***********************************************/ voidCPhoneBookDlg: : OnDelete() { //TODO: Addyourcontrolnotificationhandlercodehere intsel=m_NameList.GetCurSel();//得到所选记录在列表框中的序号 structPhoneCard*p=curr;//新建一个临时指针变量 if(MessageBox("确定要删除吗? ","警告",MB_ICONQUESTION|MB_OKCANCEL)==IDCANCEL) return;//弹出确认对话框 iCount--;//总结点数减1 //删除当前结点 p->prev->next=p->next; if((p->next)! =NULL)//注意删除结点为末尾结点时的操作! p->next->prev=p->prev; else last=p->prev; free(p);//释放内存空间 m_NameList.DeleteString(sel);//在列表框中删除记录 if(m_NameList.GetCount()==0){ GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE); GetDlgItem(IDC_DELETE)->EnableWindow(FALSE); GetDlgItem(IDC_SEARCHBYNAME)->EnableWindow(FALSE); GetDlgItem(IDC_SEARCHBYPHONE)->EnableWindow(FALSE); GetDlgItem(IDC_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_PHONE)->EnableWindow(FALSE); GetDlgItem(IDC_ADDRESS)->EnableWindow(FALSE); GetDlgItem(IDC_CODE)->EnableWindow(FALSE); OnClear(); bFileEmpty=TRUE; bFileModified=TRUE; return;//如果剩除到一条记录都不剩,则需要禁用一些控件以免发生误操作,同时修改文件属性 } if(sel m_NameList.SetCurSel(sel); else m_NameList.SetCurSel(sel-1);//将焦点定义在列表中上一条记录 OnSelchangeNamelist(); } /**********************************************\ 函数原型: voidOnClear() 功能: 清除当前文本框里的内容 输入为空 输出为空 ***********************************************/ voidCPhoneBookDlg: : OnClear() { //TODO: Addyourcontrolnotificationhandlercodehere m_szName=""; m_szPhone=""; m_szAddress=""; m_szCode=""; UpdateData(FALSE); } /**********************************************\ 函数原型: voidOnClose() 功能: 程序结束时将链表中的数据保存到文件 输入为空 输出为空 ***********************************************/ voidCPhoneBookDlg: : OnClose() { //TODO: Addyourmessagehandlercodehereand/orcalldefault structPhoneCard*p;//声明一个临时指针变量 if((! bNewFile)&&bFileModified)//根据文件属性来决定是否要删除原文件 { fclose(fp); DeleteFile("data.dat"); } if(! bFileEmpty)//根据文件是否为空来决定是否要新建文件并写入数据 { if(! (fp=fopen("data.dat","w+")))//如果创建新文件失败 { MessageBox("I'msorrybuttheprogramencounterafilediskproblem! ","ERROR",MB_ICONERROR); return; } fwrite(&iCount,sizeof(int),1,fp);//将总结点数写入文件 fseek(fp,sizeof(int),0);//移动文件指针 p=head->next;//将临时指针变量移动来头结点的下一个结点,也就是第一个存放数据的结点 while(p)//当结点不为空 { fwrite(p,sizeof(structPhoneCard),1,fp); p=p->next;//将数据写入文件并将指针后移 } } CDialog: : OnClose(); } voidCPhoneBookDlg: : OnAbout() { //TODO: Addyourcontrolnotificationhandlercodehere CAboutDlgdlg; dlg.DoModal(); } voidCPhoneBookDlg: : OnOK() { OnUpdate();//这个函数是为了处理回车键的事件,默认为关闭对话框,现在改为调用OnUpdate()函数 } /**********************************************\ 函数原型: voidOnSearchbyname() 功能: 以姓名方式查找相应的记录,如不存在则提示找不到 输入为空 输出为空 ***********************************************/ voidCPhoneBookDlg: : OnSearchbyname() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); intsel=m_NameList.FindString(m_NameList.GetCurSel(),m_szSearchContent);//直接调用FindString函数查找并得到序号 if(sel==LB_ERR)//如果找不到记录,则输入查找失败提示 { MessageBox("找不到记录! ","提示",MB_ICONWARNING); return; } m_NameList.SetCurSel(sel);//选中所找到的记录项 OnSelchangeNamelist(); } /**********************************************\ 函数原型: voidOnSearchbyphonw() 功能: 以电话方式查找相应记录 输入为空 输出为空 ***********************************************/ voidCPhoneBookDlg: : OnSearchbyphone() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); PhoneCard*temp=curr;//将当前结点的地址存入一个临时指针中 intsel=m_NameList.GetCurSel();//得到当前记录的序号 do { curr=curr->next;//从当前记录的下一记录开始查找 sel++;//序号加1 if(curr==NULL)//如果已经查找到表尾 { curr=head->next;//将当前指针移动到头结点的下一个结点,因为头结点并不存放数据 sel=0;//第一条记录的序号为0 } if(! (strcmp(curr->num,m_szSearchContent)))//如果匹配成功 { m_NameList.SetCurSel(sel);//选中找到的记录项 OnSelchangeNamelist(); return;//已完成查找,退出函数体 } }while(curr! =temp);//循环条件为没有遍历整个链表 MessageBox("找不到记录! ","提示",MB_ICONWARNING);//已经遍历整个链表但没有找到记录,输出查找失败信息 return; } 三、结论(应当准确、完整、明确精练;也可以在结论或讨论中提出建议、设想、尚待解决问题等。 ) 这次完成电话簿管理程序的程序量较大,所以调试起来有一定难度。 其实刚翻开这本《C++课程设计》时,我感到万分措手无策,每道题的源程序代码都有三四叶那么长,密密麻麻的字母把我的头都看晕了。 我很恐慌,这样高难度的程序,对于我这样一个新手,该是多么大的挑战啊! 在正式编写程序之前,我又将C++课本的第八章以后又复习了一遍。 重点回顾了指针、类和对象、构造和析构函数这几章,为编程打下基础。 不过,在程序的编写中,还是在一些函数的调用时出现错误,行参和实参的数据类型相匹配的问题,函数实现部分也出现问题。 我通过查阅资料和向同学请教,终于将这些问题一一解决了。 遇到的困难主要集中在双向链表的操作上,因为程序中几乎每一个函数的功能均建立在双向链表的操作上。 而双向链表的操作中的问题主要出现在一些边缘情况上,例如删除头结点、尾结点,插入头结点、尾结点等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 格式 926