mfc界面的图书管理系统(共29页).doc
精选优质文档-倾情为你奉上目录专心-专注-专业数据结构课程设计图书管理1.设计目的“数据结构”是计算机科学与技术专业一门十分重要的专业技术基础课,计算机科学各领域及有关的应用软件都要使用到各种数据结构。对于从事计算机科学及其应用的科技工作者来说,数据结构与算法是必须透彻地掌握的重要基础。学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成设计和编写中小型软件的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。课程设计要求学生在完成程序设计的同时能够撰写比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。2.问题描述采用Visual C+编程语言开发工具和MFC,设计并实现图书管理系统。该系统实现了图书管理中的添加,查询,删除,全部查询,退出等功能,以及汇总图书清单,包括对书籍各项信息的汇总。3.需求分析3.1 数据需求图书信息:书名,所属类型,作者,定价,出版日期以及ISBN。3.2 基本功能需求1.汇总图书清单,包括对书籍各项信息的汇总;(各项信息包括书名,所属类型,作者,定价,出版日期以及ISBN。)2.对书籍信息的增、删、查、全部查询等功能。其中删除功能主要依靠第一无二的ISBN,查询功能可以依靠任何一种图书信息(即书名,所属类型,作者,定价,出版日期以及ISBN任意一种)。3.3 非功能性需求用户界面需求:简洁、易用、易懂、友好的用户界面。硬件要求:装有Visual C+6.0的计算机。可靠性需求:保证用户在正常使用本系统时,用户的操作或误操作不会产生数据的丢失。4.概要设计4.1 数据结构用结构struct定义图书信息,用链表实现对图书信息的存储及维护。以文件的形式保存图书信息到硬盘。4.2 系统包含的函数函数原型:void CAddDlg:OnButtonAdd()功能:在链表结尾添加一个结点并将链表信息存入文件“图书管理.txt”函数原型:void CChaxunDlg: OnButtonChaxun()功能: 完成查找用户信息的功能并在编辑框和用户列表中显示出来函数原型:void CDelDlg:OnButton1()功能: 删除链表和用户列表的当前结点函数原型:void CLookDlg:OnButtonDialog()功能: 在编辑框和用户列表中显示全部书籍出来4.3 函数间的关系1.进入程序调用booklist()从硬盘读取数据,并将信息放入链表中。2.用函数CDelDlg:OnButton1()删除链表和用户列表的当前结点。3.可用函数CAddDlg:OnButtonAdd()在链表结尾添加一个结点并在用户列表中显示4.CChaxunDlg: OnButtonChaxun()可实现按不同方式进行图书查询。5.CLookDlg:OnButtonDialog()在编辑框和用户列表中显示全部书籍出来。按书名按从书类型按作者按出版日期按价格按ISBN图书管理系统添加书目查询书目删除书目查询全部书籍退出系统4.4 系统功能模块图图4-1 系统功能模块图5.详细设计5.1 结构体的详细定义class booklistpublic:CString bookname;/书名CString congshuname;/丛书种类CString writer;/作者CString price;/价格CString dateyear;/出版年份CString datemonth;/出版月份CString ISBN;booklist *next;5.2 系统函数详细介绍增加书籍:void CAddDlg:OnButtonAdd() / TODO: Add your control notification handler code hereUpdateData();extern booklist *head_book;if(m_bookname=""|m_congshuname=""|m_isbn=""|m_month=""|m_price=""|m_writer=""|m_year="")MessageBox("请填写完整图书信息");else booklist *p=head_book;booklist *Book=new booklist;Book->next=NULL;Book->bookname=m_bookname;Book->congshuname=m_congshuname;Book->datemonth=m_month;Book->dateyear=m_year;Book->ISBN=m_isbn;Book->price=m_price;Book->writer=m_writer;if(head_book=NULL)head_book=Book;else if(p->ISBN>m_isbn)Book->next=head_book;head_book=Book;elsewhile(p->next)if(p->next->ISBN>m_isbn)Book->next=p->next;p->next=Book;break;p=p->next;if(p->next=NULL)p->next=Book;MessageBox("添加成功");char* pszFileName = ".data.txt"CStdioFile myFile;CFileException fileException;CString str;if(!myFile.Open(pszFileName,CFile:modeCreate|CFile:modeReadWrite,&fileException)MessageBox("打开失败");TRACE("Cannotopenfile%s,error=%un",pszFileName,fileException.m_cause);myFile.SeekToEnd();myFile.WriteString("书名,丛书名,作者,定价(元),出版年月, ISBN ");myFile.WriteString("n");/extern booklist *head_book;for(p=head_book;p;p=p->next)str.Format("%s,%s,%s,%s,%s.%s,%s",p->bookname,p->congshuname,p->writer,p->price,p->dateyear,p->datemonth,p->ISBN);myFile.SeekToEnd();myFile.WriteString(str);myFile.WriteString("n");/DestroyWindow(this); CDialog:OnCancel();BOOL CAddDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_isbn="978-7-115-"UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to /a control / EXCEPTION: OCX Property Pages should /return FALSEvoid CAddDlg:OnCancel2() / TODO: Add your control notification handler code herem_bookname=""m_congshuname=""m_isbn=""m_month=""m_price=""m_writer=""m_year=""UpdateData(FALSE);查询书籍:BOOL CChaxunDlg:OnInitDialog() CDialog:OnInitDialog();LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);/获/取当前窗口stylelStyle &= LVS_TYPEMASK; /清除显示方式位lStyle |= LVS_REPORT; /设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);/设置/styleDWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;/选中某行使整行高亮 /(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;/网格线(只适用与report /风格的listctrl)/ dwStyle |= LVS_EX_CHECKBOXES;/item前生成checkbox控件m_list.SetExtendedStyle(dwStyle); /设置扩展风格m_list.InsertColumn( 0, "书名", LVCFMT_LEFT, 190 ); /插入列 m_list.InsertColumn( 1, "丛书名", LVCFMT_LEFT, 100 ); m_list.InsertColumn( 2, "作者", LVCFMT_LEFT, 120 ); m_list.InsertColumn( 3, "定价", LVCFMT_LEFT, 50 ); m_list.InsertColumn( 4, "出版日期", LVCFMT_LEFT, 80 ); m_list.InsertColumn( 5, "ISBN", LVCFMT_LEFT, 140 ); / TODO: Add extra initialization here m_bookname="不限" m_isbn="不限" m_price="不限" m_year="不限" m_month="不限" m_writer="不限" m_congshuname="不限" UpdateData(FALSE); return TRUE; / return TRUE unless you set the focus /to a control / EXCEPTION: OCX Property Pages should return FALSEvoid CChaxunDlg:OnButtonChaxun() / TODO: Add your control notification handler code herem_list.DeleteAllItems( );int i=0;/标记查找到的本数CString str;extern booklist *head_book;/m_ListBox.ResetContent();UpdateData();int nRow;for(booklist *p=head_book;p;p=p->next)if(m_bookname=""|m_bookname="不限"|m_bookname=p->bookname)if(m_congshuname=""|m_congshuname="不限"|m_congshuname=p->congshuname)if(m_writer=""|m_writer="不限"|m_writer=p->writer)if(m_price=""|m_price="不限"|m_price=p->price)if(m_isbn=""|m_isbn="不限"|m_isbn=p->ISBN)if(m_year=""|m_year="不限"|m_year=p->dateyear)if(m_month=""|m_month="不限"|m_month=p->datemonth|m_month=p->datemonth.Left(2)|(m_month=p->datemonth.Left(1)&&p->datemonth.Mid(1,1)='(')str.Format("%s",p->bookname);m_ListBox.AddString(str);str.Format("%s.%s",p->dateyear,p->datemonth);nRow = m_list.InsertItem(0, p->bookname);/插入行nRow = m_list.InsertItem(0, "sb");/插入行m_list.SetItemText(nRow, 1, p->congshuname);/设置数据m_list.SetItemText(nRow, 2, p->writer);/设置数据m_list.SetItemText(nRow, 3, p->price);/设置数据m_list.SetItemText(nRow, 4, str);/设置数据m_list.SetItemText(nRow, 5, p->ISBN);/设置数据i+;if(i=0)MessageBox("无此书");删除书籍:void CDelDlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData();int delbooknum=0;CString str;extern booklist *head_book;booklist *q,*p=head_book;/MessageBox(head_book->ISBN);while(p->ISBN=m_isbn)q=p;p=p->next;head_book=p;delbooknum+;delete q;CString str1;if(head_book->next!=NULL)for(booklist *p=head_book;p;p=p->next)if(p->next!=NULL&&p->next->ISBN=m_isbn)str1.Format(" 书名: %snISBN: %sn",p->next->bookname,p->next->ISBN);p->next=p->next->next;delbooknum+;if(delbooknum=0)MessageBox("无此书","警告");else str.Format("%s %d %s","已删除",delbooknum,"本");MessageBox(str1+str);char* pszFileName = ".data.txt"CStdioFile myFile;CFileException fileException;if(!myFile.Open(pszFileName,CFile:modeCreate|CFile:modeReadWrite,&fileException)MessageBox("打开失败");TRACE("Can not open file %s,error=%un",pszFileName,fileException.m_cause);myFile.SeekToEnd();myFile.WriteString("书名,丛书名,作者,定价(元),出版年月, ISBN ");myFile.WriteString("n");/extern booklist *head_book;for(booklist *p=head_book;p;p=p->next)str.Format("%s,%s,%s,%s,%s.%s,%s",p->bookname,p->congshuname,p->writer,p->price,p->dateyear,p->datemonth,p->ISBN);myFile.SeekToEnd();myFile.WriteString(str);myFile.WriteString("n");CDialog:OnCancel();void CDelDlg:OnCancel() / TODO: Add extra cleanup hereCDialog:OnCancel();BOOL CDelDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_isbn="978-7-115-"UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should /return FALSE查询全部书籍:BOOL CLookDlg:OnInitDialog() CDialog:OnInitDialog(); LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE); /获取当前窗口style lStyle &= LVS_TYPEMASK; /清除显示方式位 lStyle |= LVS_REPORT; /设置style SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); /设置style DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;/选中某行使整行高/亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;/网格线(只适用与/report风格的listctrl) / dwStyle |= LVS_EX_CHECKBOXES;/item前生成checkbox控件 m_list.SetExtendedStyle(dwStyle); /设置扩展风格/ TODO: Add extra initialization hereextern booklist *head_book;int booknum=0;extern length;CString str;m_list.InsertColumn( 0, "书名", LVCFMT_LEFT, 190 );/插入列m_list.InsertColumn( 1, "丛书名", LVCFMT_LEFT, 100 );m_list.InsertColumn( 2, "作者", LVCFMT_LEFT, 120 );m_list.InsertColumn( 3, "定价", LVCFMT_LEFT, 50 );m_list.InsertColumn( 4, "出版日期", LVCFMT_LEFT, 90 );m_list.InsertColumn( 5, "ISBN", LVCFMT_LEFT, 180 ); int nRow; for(booklist *q=head_book;q;q=q->next) str.Format("%s.%s",q->dateyear,q->datemonth); nRow = m_list.InsertItem(0, q->bookname);/插入行 /nRow = m_list.InsertItem(0, "sb");/插入行 m_list.SetItemText(nRow, 1, q->congshuname);/设置数据 m_list.SetItemText(nRow, 2, q->writer);/设置数据 m_list.SetItemText(nRow, 3, q->price);/设置数据 m_list.SetItemText(nRow, 4, str);/设置数据 m_list.SetItemText(nRow, 5, q->ISBN);/设置数据 booknum+; length=booknum;m_booknum=length;UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to /a control / EXCEPTION: OCX Property Pages should /return FALSEvoid CLookDlg:OnButton1() / TODO: Add your control notification handler code hereCDelDlg dlg;dlg.DoModal();5.3 系统功能模块介绍系统有四个模块其中包含了图书的增加,删除,查找(分按书名,所属类型,作者,定价,出版日期以及ISBN查找)及显示全部书籍。5.4 具体模块设计5.4.1增加书籍开始 输入书名 输入丛书类型输入作者输入出版年月输入价格输入ISBN结束图5.1增加书籍5.4.2 删除书籍开始输入ISBN结束图5.2删除书籍5.4.3 查询书籍开始输入书名结束图5.3 查询书籍(注:查找图书分书名,所属类型,作者,定价,出版日期以及ISBN按查找,只是方式不同而已。)6.调试分析本软件是基于Windows的编程开发,所以,软件调试必须在Windows环境下进行。调试前须做好准备工作:(1) 需要安装Visual C+6.0的计算机一台;配置好之后,在Visual C+6.0环境下进行软件的调试。(2) 测试数据:图书信息输入:在“添加”模块中,点击“添加”会新建一个所有信息为空的图书信息,可添加信息。 图书信息删除:输入需要删除的书的ISBN,点击删除,再次确认后即可删除。图书的查询:按书名,所属类型,作者,定价,出版日期以及ISBN进行查询这几个功能模块在具体编程实现上基本上是一样的,因为都是针对图书信息的查询。因此我们仅以“按书名进行查询”为例来说明一下这几个功能模块的详细实现过程。输入需要查询的书名,点击查找,如果存在该书就显示在下方的列表,并且显示详细信息。(3) 算法改进设想:在程序设计前期,我并没有用txt文件来保存图书信息。经过我不断的修改以及调试后,该程序总算可以进行txt文本的读出与写入,并且添加图书信息后可以直接将信息保存在txt文本文件中。7.使用说明1.双击图书管理.exe进入程序主界面。图7.1系统主界面2.添加图书图7.2添加图书3.删除图书图7.3删除图书4.查找图书图7.4查找图书5.显示全部图书图7.5显示全部图书6.退出点击“退出”退出程序,此时系统自动进行存盘。8.设计总结图书管理系统课程设计,通过这次数据结构课程设计,真正达到了学与用的结合,增强了对数据结构方面应用的理解,对自己今后参与开发程序积累了不少经验。在最近的答辩时,老师问了几个我在做课程设计时没有想到的问题,后来自己找到了问题,就是界面的设计确定不太好。在代码区查看后知道自己少写了一些提示信息,添加之后就没有问题了。通过这次课程设计,我发现了自己在课程设计时的不足,比如考虑的不周全、想问题不全面。我们现在在学校,有老师和同学的热心帮助和提醒,可以发现并及时解决问题,但是以后走在工作岗位后,这些都要靠自己,所以,这方面的能力要加强。在实验过程中,从建立数据开始,对程序设计理念及思想上有了更高的认识,从需求分析,到概念设计和逻辑设计的表示,我懂得了不少程序开发过程中的知识,在实验中建表,及其关系模式,增强了自己在数据结构中应用程序语言的灵活性,其中包括插入、删除、查询之间的联系。在整个学习与设计过程中,在课程设计过程中不免遇到各种各样的困难,通过与同学间的探讨,查阅资料解决困难,增强了自己的自学能力.这次课程设计让我知道了什么叫做付出才有回报.这次课程设计给了我一个锻炼自己,强化专业知识的机会,通过这次课程设计,我相信,只要认真学习,多借鉴别人的经验,多思考,多实践,最后就能成功了。在实验中我上网查阅了不少参考资料,并学以致用,自我创新,从学到用又从用到学,不断修改,同时加强了自己对理论知识的学习与理解,这对完善系统设计有很大帮助。总之在这次设计过程中我受益匪浅,为以后工作打下了坚实的基础。本次课程设计是在指导老师的带的领下完成的。课程设计从选题、实验研究到最后的成稿,都得到了老师的热情鼓励和悉心指导,凝聚了恩师许多心血。老师勤勤肯肯工作的精神将是值得我永远学习的。在此谨向尊敬的老师致以由衷的感谢和崇高的敬意!在本次课程设计的选题、研究与实验过程中,得到了许多同学的大力帮助,在此表示衷心的感谢! 在本次课程设计中,我从老师身上了学到了很多东西,他深厚的理论水平都使我受益匪浅,无论在理论还是实践上都给与我很大的帮助,在此特别感谢老师的帮助,使我的计算机知识的到更广泛更全面的补充。还值得我感谢的是我的亲爱的同学们,当我遇到问题请他们帮忙时,他们没有推辞,放下手中正在忙的事帮我解决问题,在此对此深表歉意,同时更多的是感谢。9.参考文献1. Robert L. Kruse,Data Structures And Program Design in C+,高等教育出版社,2001.5.2. 严蔚敏等编著,数据结构(C语言版),清华大学出版社,1997.4;3. 赵文静等编著,数据结构与算法,科学出版社,2005.08;4 Clifford,A.Shaffer编著,数决结构与算法分析(C+版),电子工业出版社,2005.75 赵文静编著,数据结构-C+语言描述,西安交通大学出版社,1999.016 孙鑫,于安萍编著,VC+深入详解,电子工业出版社,2007.77 COHOON & DAVIDSON编著,C+程序设计,清华大学出版社,2005.8