C++课程设计(简单图书管理系统)(共17页).doc

上传人:飞****2 文档编号:14102111 上传时间:2022-05-02 格式:DOC 页数:17 大小:320.50KB
返回 下载 相关 举报
C++课程设计(简单图书管理系统)(共17页).doc_第1页
第1页 / 共17页
C++课程设计(简单图书管理系统)(共17页).doc_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《C++课程设计(简单图书管理系统)(共17页).doc》由会员分享,可在线阅读,更多相关《C++课程设计(简单图书管理系统)(共17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上课 程 设 计 课程名称 C+课程设计题目名称 图书管理系统 2016 年 6 月 29 日目录一设计内容与要求(1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的录入、查询、删除等功能。(2)、实现用户管理,系统具有用户注册功能。管理员的账号和密码由系统指定,登录后可进行修改。一般用户注册后才能登录使用系统。管理员具有录入、查询、删除图书信息及一般用户的功能。一般用户只有图书查询功能。 (3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。(4)、图书管理功能,管理员能够录入、查询、删除图书信息。(5)、图书查询功能,管理员及一般用户

2、能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。提示:上述为基本功能,可参考实际的系统进行扩展。二设计思路:为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。程序主要分为4个页面:(1) 登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。(2) 图书查询页面。由Cdialog类派生出CSearch类。包含读取所有图书

3、数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。(3) 管理员图书管理页面。由Cdialog类派生出CBookdata类。包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。(4) 用户信息管理页面,由Cdialog类派生出CUserdata类。包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。 三关键模块实现及主要代码(1)自己建立的类1.用户

4、类:class CUserpublic:int num;char password20;2.图书信息类:class Book /图书类public: char author10; /设置作者姓名char bname20; /设置图书书名char pub_name20; /设置出版社名称int pub_date; /设置出版年月;(2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。1.用户注册处理响应函数:void CMyprojectDlg:OnButton3() /用户注册/ TODO: Add your control notification

5、 handler code here /以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持用户记录数,/后面依次保持用户记录注意,写用户的每个信息的顺序要与读取时的顺序一致。 UpdateData(TRUE);CUser user;int n_user=0; /用户的个数,管理员默认为第一个。自己输入为账号:1111,密码:0000。int size=0;fstream file(user.dat,ios:in|ios:out); / 建立一个文件类,关于其用法,请baidu。file.seekg(ios:beg); /将文件指针指向文件头。file.read(char

6、*)&n_user,sizeof(n_user); /读取用户数。 n_user+=1;file.seekp(ios:beg);file.write(char*)&n_user,sizeof(n_user);/写学生记录个数user.num=m_num; /之前定义user.password为string,导致密码匹配时有错误。memcpy(user.password,m_password.GetBuffer(m_password.GetLength(),m_password.GetLength(); / 把类CString对象的内容赋值到字符数组中user.passwordm_passwor

7、d.GetLength()=0; /在数组末尾加结束符号/在文件末尾,把新的记录写入。file.seekp(4+(n_user-1)*sizeof(CUser),ios:beg); /这里出错file.write(char*)&user.num,sizeof(user.num);file.write(char*)&user.password,sizeof(user.password); file.close();/用消息框提示CString str;str.Format(成功注册,成为第 %d 个注册用户,请按确定返回重新登录.,n_user-1); /因为第一个为管理员,不算为用户人数。Af

8、xMessageBox(str);2.用户登录处理响应函数。其中包含判断是管理员,还是普通用户。void CMyprojectDlg:OnButton2() /用户登录/ TODO: Add your control notification handler code here UpdateData(TRUE); CUser m_user100;int i;int size;int n_user=0; /文件中用户的个数/读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。/根据记录个数,依次读取用户记录 放在成员变量m_st数组中(已在类体中声明了) C

9、File file;file.Open(user.dat,CFile:modeReadWrite);size=GetFileSize(void*)file.m_hFile,NULL); /读取文件大小,size=0表示是空文件if(size0)file.SeekToBegin();file.Read(&n_user,sizeof(n_user);if(n_user0 & n_user99) /实验中限定为0100个用户记录for( i=0;in_user;i+) /请注意与写入数据的顺序要保持一样,否则会读错数据。file.Read(&(m_useri.num),sizeof(m_useri.

10、num);file.Read(&(m_useri.password),sizeof(m_useri.password);file.Close();/if(m_num=1111&m_password=0000) /管理员进入管理员页面 CAdministrators administrators; administrators.DoModal();CString str_password;for(i=0;i0)file.SeekToBegin();file.Read(&n_book,sizeof(n_book);if(n_book0 & n_book99) /实验中限定为0100个书本记录m_n

11、um_book=n_book;for( i=0;in_book;i+) /请注意与写入数据的顺序要保持一样,否则会读错数据。file.Read(&(m_user_booki.author),sizeof(m_user_booki.author);file.Read(&(m_user_booki.bname),sizeof(m_user_booki.bname);file.Read(&(m_user_booki.pub_name),sizeof(m_user_booki.pub_name);file.Read(&(m_user_booki.pub_date),sizeof(m_user_book

12、i.pub_date);file.Close();/在列表控件中显示所有条记录/插入每列的表头;m_list.InsertColumn(0,作者,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,书名,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,出版社,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,出版日期,LVCFMT_LEFT,100,1);/每一行插入一条书本记录for(i=0;in_book;i+)CString str;str=m_user_booki.author;m_lis

13、t.InsertItem(i,str); /InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)str=m_user_booki.bname;m_list.SetItemText(i,1,str);/设置第i行第1列的的数据为书名str=m_user_booki.pub_name;m_list.SetItemText(i,2,str);/设置第i行第2列的的数据为出版社str.Format(%d,m_user_booki.pub_date); /整型变为字符串,便于在控件显示m_list.SetItemText(i,3,str);/设置第i

14、行第3列的的数据为出版日期2.图书查询响应函数。void CSearch:OnButton4() /查询图书/ TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();int num=0; /表示查找结果的个数int i; for(i=0;i=0, 表示str中包含了m_author的字段str=m_user_booki.bname;ret2=str.Find(m_bname,0); /ret2=0, 表示str中包含了m_bname的字段if(ret1=0)

15、/按作者查询str=m_user_booki.author;m_list.InsertItem(num,str); /InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)str=m_user_booki.bname;m_list.SetItemText(num,1,str);/设置第i行第1列的的数据为书名str=m_user_booki.pub_name;m_list.SetItemText(num,2,str);/设置第i行第2列的的数据为出版社str.Format(%d,m_user_booki.pub_date); /整型变为字符串

16、,便于在控件显示m_list.SetItemText(num,3,str);/设置第i行第3列的的数据为出版日期num+=1; /结果+1; (4)管理员图书管理页面。包含读取所有图书,添加图书,修改图书,删除图书的功能。1.读取所有图书功能实现与(3)的实现一样。2.添加图书响应函数。void CBookdata:OnButton7() /添加图书UpdateData(TRUE);Book book;int n_book=0; /书本的个数int size=0;fstream file(book.dat,ios:in|ios:out); / 建立一个文件类,关于其用法,请baidu。file

17、.seekg(ios:beg); /将文件指针指向文件头。file.read(char*)&n_book,sizeof(n_book); /读取书籍数。/以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持书本记录数,/后面依次保持书本记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 n_book+=1;file.seekp(ios:beg);file.write(char*)&n_book,sizeof(n_book);/写学生记录个数memcpy(book.author,m_add_author.GetBuffer(m_add_author.GetLength(

18、),m_add_author.GetLength(); / 把类CString对象的内容赋值到字符数组中book.authorm_add_author.GetLength()=0; /在数组末尾加结束符号memcpy(book.bname,m_add_bname.GetBuffer(m_add_bname.GetLength(),m_add_bname.GetLength(); / 把类CString对象的内容赋值到字符数组中book.bnamem_add_bname.GetLength()=0; /在数组末尾加结束符号memcpy(book.pub_name,m_add_pub_name.G

19、etBuffer(m_add_pub_name.GetLength(),m_add_pub_name.GetLength(); / 把类CString对象的内容赋值到字符数组中book.pub_namem_add_pub_name.GetLength()=0; /在数组末尾加结束符号book.pub_date=m_add_pub_date;/在文件末尾,把新的记录写入。file.seekp(4+(n_book-1)*54,ios:beg); file.write(char*)&book.author,sizeof(book.author);file.write(char*)&book.bnam

20、e,sizeof(book.bname);file.write(char*)&book.pub_name,sizeof(book.pub_name);file.write(char*)&book.pub_date,sizeof(book.pub_date);file.close();/用消息框提示CString str;str.Format(文件中已有 %d 本书籍记录.,n_book);AfxMessageBox(str);3.修改图书响应函数。void CBookdata:OnButton5() /修改图书,必须先读取图书才能修改图书。/ TODO: Add your control no

21、tification handler code hereUpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,作者,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,书名,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,出版社,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,出版日期,LVCFMT_LEFT,100,1); CString str_author,str_bname,str_pub_name,str; /将b

22、ook类的字符串数组赋值为字符串变量,方便比较。 CFile file; / 建立一个文件类,关于其用法,请baidu。 file.Open(book.dat,CFile:modeReadWrite); /打开文件file.SeekToBegin(); file.Write(&m_num_book,sizeof(m_num_book);/写书本记录本数 for(int i=0;im_num_book;i+) str_author=m_booki.author; str_bname=m_booki.bname; str_pub_name=m_booki.pub_name; if(str_auth

23、or=m_author|str_bname=m_bname|str_pub_name=m_pub_name|m_booki.pub_date=m_pub_date) memcpy(m_booki.author,m_modify_author.GetBuffer(m_modify_author.GetLength(),m_modify_author.GetLength(); / 把类CString对象的内容赋值到字符数组中 m_booki.authorm_modify_author.GetLength()=0; /在数组末尾加结束符号memcpy(m_booki.bname,m_modify_b

24、name.GetBuffer(m_modify_bname.GetLength(),m_modify_bname.GetLength(); / 把类CString对象的内容赋值到字符数组中 m_booki.bnamem_modify_bname.GetLength()=0; /在数组末尾加结束符号memcpy(m_booki.pub_name,m_modify_pub_name.GetBuffer(m_modify_pub_name.GetLength(),m_modify_pub_name.GetLength(); / 把类CString对象的内容赋值到字符数组中 m_booki.pub_n

25、amem_modify_pub_name.GetLength()=0; /在数组末尾加结束符号 m_booki.pub_date=m_modify_pub_date; /以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,/后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_booki.author,sizeof(m_booki.author); file.Write(&m_booki.bname,sizeof(m_booki.bname); file.Write(&m_booki.pub_name,sizeof

26、(m_booki.pub_name); file.Write(&m_booki.pub_date,sizeof(m_booki.pub_date); /在列表控件中显示所有条记录 str=m_booki.author;m_list.InsertItem(i,str); /InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)str=m_booki.bname;m_list.SetItemText(i,1,str);/设置第i行第1列的的数据为书名str=m_booki.pub_name;m_list.SetItemText(i,2,str);

27、/设置第i行第2列的的数据为出版社str.Format(%d,m_booki.pub_date); /整型变为字符串,便于在控件显示m_list.SetItemText(i,3,str);/设置第i行第3列的的数据为出版日期 file.Close(); /用消息框提示str.Format(成功修改书籍记录.);AfxMessageBox(str);4.删除图书响应函数。void CBookdata:OnButton6() /删除图书,读取了图书数据后才能删除图书/ TODO: Add your control notification handler code hereUpdateData(T

28、RUE);m_list.DeleteAllItems();m_list.InsertColumn(0,作者,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,书名,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,出版社,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,出版日期,LVCFMT_LEFT,100,1);CString str_author,str_bname,str_pub_name,str; /将book类的字符串数组赋值为字符串变量,方便比较。int n_book,n_flag

29、=0; / n_flag为删除标志,1为有元素删除了 CFile file; / 建立一个文件类,关于其用法,请baidu。 file.Open(book.dat,CFile:modeReadWrite); /新建一个文件并且打开文件file.SeekToBegin(); file.Write(&m_num_book,sizeof(m_num_book);/写书本记录本数,先填入本来的书本数。 for(int i=0;im_num_book;i+) str_author=m_booki.author; str_bname=m_booki.bname; str_pub_name=m_booki.

30、pub_name; if(str_author=m_del_author|str_bname=m_del_bname|str_pub_name=m_del_pub_name|m_booki.pub_date=m_del_pub_date) n_flag=1; /删除标志置1 i+=1; /第i个元素为要删除元素,跳过 /以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,/后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_booki.author,sizeof(m_booki.author); file.Wri

31、te(&m_booki.bname,sizeof(m_booki.bname); file.Write(&m_booki.pub_name,sizeof(m_booki.pub_name); file.Write(&m_booki.pub_date,sizeof(m_booki.pub_date); if(n_flag=1)n_book=m_num_book-1; /表示删除了一本书,则将文件的书本数减1。 file.SeekToBegin(); file.Write(&n_book,sizeof(n_book);/写书本记录本数,先填入本来的书本数。 /用消息框提示 str.Format(成

32、功删除书籍记录.); AfxMessageBox(str);else /用消息框提示 str.Format(没有这一本书的记录,不能删除.); AfxMessageBox(str); file.Close();(5)、用户信息管理页面,包含读取所有用户信息,删除、添加、修改用户信息。1.读取所有用户信息以(4)基本相同。2.删除用户信息实现基本方法与(4)基本相同。3.添加用户信息实现基本方法与(4)基本相同。4.修改用户信息实现基本方法与(4)基本相同。四实验结果及分析(1.)登录页面成功注册普通用户成功登录页面 查询结果管理员登录页面图书管理页面成功添加图书。用户信息管理页面分析:基本功能

33、是可以实现的,但是因为是用数组来存放图书信息与用户信息,所以对于数据大了之后处理能力不够方便以及效率不高。而且删除信息的时候只是删除该条数据的信息,数据后面的信息往上移动,所以最后面会有两条重复的信息,虽然文件开头储存信息数目已经减一,读取数据是按照文件开头储存的信息数目来读取信息,但是有时候读取会有乱码。我在程序中找不到那个隐藏的bug,五、心得体会这次C+课程设计学到了很多,懂得了C+看起来虽然简单,可是要用这个计算机语言来实现一些有用的功能,怎么运用确实是一门挺高深的学问,我们学习计算机语言不能只是看书看概念,要多上机实验,这样才能对计算机语言有比较深的了解,才能够提高自己的编程以及调试

34、找BUG的能力。现在来总结一下编程过程中遇到的一些值得注意的问题。1.派生出一个类时,为编辑框增加变量名后,然后在类声明中自己增加类成员,如果再想在对话框中增加编辑框并且添上变量名会出现错误。(如下,在Csearch 类中自己添加下面箭头指向的代码后,会出现下图右的错误,解决方法是把箭头指向的代码放到/AFX_DATA后面,因为此语句为MFC对话框自行添加编辑变量的结束,如果我们将自己定义的变量也添加到此语句前,编译器不清楚是MFC自行添加的变量还是用户自行添加的变量。)2.遇到编译器没有出错,可是运行结果与自己想象的不一样,很可能是逻辑错误。如:在用户注册时,我是将用户数据直接存到文件尾,这

35、是不正确的,因为管理员页面有删除用户的功能,这个功能的原理是先读文件头的用户数(假定为10个),然后将用户的数据先读取出来,然后经过一个判断,再储存重新储存回文件,而文件中储存的用户数据大小是没有变化的,也就是说文件尾会有两份最后一个用户的数据(即如果删除的是第七个,文件中最后会有两份第十个用户的数据,文件头的记录用户数为9个),如果添加用户直接储存在文件尾则会储存在第11个用户的位置,可是以后读取的话只是读取到第10个。 所以会出现读取错误,密码不匹配的问题。应该根据记录的用户数让文件指针指向最后一个用户数据后面。file.seekp(4+(n_user-1)*sizeof(CUser),ios:beg); 以上两个问题是困扰我比较久的,其他问题经过百度还有自己的调试,解决还算快,不值得重点说。六、参考文献1.C+面向对象程序设计(第二版) 谭浩强 编著2. 成绩管理系统MFC教程3.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁