当前位置:文档之家› C++课程设计(简单图书管理系统)

C++课程设计(简单图书管理系统)

课程设计课程名称C++课程设计题目名称图书管理系统2016 年 6 月29 日目录一.设计内容与要求 (2)二.设计思路: (4)三.关键模块实现及主要代码 (4)四.实验结果及分析 (13)五、心得体会 (16)六、参考文献 (17)一.设计内容与要求(1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的录入、查询、删除等功能。

(2)、实现用户管理,系统具有用户注册功能。

管理员的账号和密码由系统指定,登录后可进行修改。

一般用户注册后才能登录使用系统。

管理员具有录入、查询、删除图书信息及一般用户的功能。

一般用户只有图书查询功能。

(3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。

(4)、图书管理功能,管理员能够录入、查询、删除图书信息。

(5)、图书查询功能,管理员及一般用户能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。

提示:上述为基本功能,可参考实际的系统进行扩展。

二.设计思路:为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。

同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。

程序主要分为4个页面:(1)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。

(2)图书查询页面。

由Cdialog类派生出CSearch类。

包含读取所有图书数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。

(3)管理员图书管理页面。

由Cdialog类派生出CBookdata类。

包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。

(4)用户信息管理页面,由Cdialog类派生出CUserdata类。

包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。

因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。

三.关键模块实现及主要代码(1)自己建立的类1.用户类:class CUser{public:int num;char password[20];};2.图书信息类:class Book //图书类{public:char author[10]; //设置作者姓名char bname[20]; //设置图书书名char pub_name[20]; //设置出版社名称int pub_date; //设置出版年月};(2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。

1.用户注册处理响应函数:void CMyprojectDlg::OnButton3() //用户注册{// TODO: Add your control notification 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*)&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.GetL ength()); // 把类CString对象的内容赋值到字符数组中user.password[m_password.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); ///因为第一个为管理员,不算为用户人数。

AfxMessageBox(str);}2.用户登录处理响应函数。

其中包含判断是管理员,还是普通用户。

void CMyprojectDlg::OnButton2() //用户登录{// TODO: Add your control notification handler code hereUpdateData(TRUE);CUser m_user[100];int i;int size;int n_user=0; //文件中用户的个数////////////////////////////////////////////////////////////////////////////////////////////读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取用户记录放在成员变量m_st数组中(已在类体中声明了)CFile file;file.Open("user.dat",CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL); //读取文件大小,size==0表示是空文件if(size>0){file.SeekToBegin();file.Read(&n_user,sizeof(n_user));}if(n_user>0 && n_user<99) //实验中限定为0~100个用户记录{for( i=0;i<n_user;i++){//请注意与写入数据的顺序要保持一样,否则会读错数据。

file.Read(&(m_user[i].num),sizeof(m_user[i].num));file.Read(&(m_user[i].password),sizeof(m_user[i].password));}}file.Close();/////////////////////////////////////////////////if(m_num==1111&&m_password=="0000") //管理员进入管理员页面{CAdministrators administrators;administrators.DoModal();}CString str_password;for(i=0;i<n_user;i++) //普通用户,进入图书查询页面{str_password=m_user[i].password;if(m_user[i].num==m_num){if(str_password==m_password){CSearch search;search.DoModal();}else{CString str;str.Format("密码或者账号错误,请重新输入!");AfxMessageBox(str);}}}}(3)图书查询页面。

包含读取所有图书数据,以及根据作者姓名或者书名来查询图书。

1.读取所有图书响应函数。

void CSearch::OnButton5() //显示出所有图书{// TODO: Add your control notification handler code hereint i;int size;int n_book=0; //文件book的本数////////////////////////////////////////////////////////////////////////////////////////////读取文件中的书本记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取书籍记录放在成员变量m_user_book数组中(已在类体中声明了)CFile file;file.Open("book.dat",CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL); //读取文件大小,size==0表示是空文件if(size>0){file.SeekToBegin();file.Read(&n_book,sizeof(n_book));}if(n_book>0 && n_book<99) //实验中限定为0~100个书本记录{m_num_book=n_book;for( i=0;i<n_book;i++){//请注意与写入数据的顺序要保持一样,否则会读错数据。

相关主题