1课程设计课程名称C++课程设计题目名称图书管理系统2016年6月29日2目录一.设计内容与要求...............................................................................................................2二.设计思路:.......................................................................................................................4三.关键模块实现及主要代码...............................................................................................4四.实验结果及分析.............................................................................................................13五、心得体会.........................................................................................................................16六、参考文献.........................................................................................................................17一.设计内容与要求(1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的3录入、查询、删除等功能。(2)、实现用户管理,系统具有用户注册功能。管理员的账号和密码由系统指定,登录后可进行修改。一般用户注册后才能登录使用系统。管理员具有录入、查询、删除图书信息及一般用户的功能。一般用户只有图书查询功能。(3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。(4)、图书管理功能,管理员能够录入、查询、删除图书信息。(5)、图书查询功能,管理员及一般用户能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。提示:上述为基本功能,可参考实际的系统进行扩展。4二.设计思路:为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。程序主要分为4个页面:(1)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。(2)图书查询页面。由Cdialog类派生出CSearch类。包含读取所有图书数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。(3)管理员图书管理页面。由Cdialog类派生出CBookdata类。包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。(4)用户信息管理页面,由Cdialog类派生出CUserdata类。包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。三.关键模块实现及主要代码(1)自己建立的类1.用户类:classCUser{public:intnum;charpassword[20];};2.图书信息类:classBook//图书类{public:charauthor[10];//设置作者姓名charbname[20];//设置图书书名charpub_name[20];//设置出版社名称intpub_date;//设置出版年月};5(2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。1.用户注册处理响应函数:voidCMyprojectDlg::OnButton3()//用户注册{//TODO:Addyourcontrolnotificationhandlercodehere////////////////////////////////////////////////////////////////////////////////////////以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持用户记录数,//后面依次保持用户记录注意,写用户的每个信息的顺序要与读取时的顺序一致。UpdateData(TRUE);CUseruser;intn_user=0;//用户的个数,管理员默认为第一个。自己输入为账号:1111,密码:0000。intsize=0;fstreamfile(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.GetLength());//把类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();///////////////////////////////////////////////////////////////////////////////////////////用消息框提示CStringstr;str.Format(成功注册,成为第%d个注册用户,请按确定返回重新登录.,n_user-1);///因为第一个为管理员,不算为用户人数。AfxMessageBox(str);}62.用户登录处理响应函数。其中包含判断是管理员,还是普通用户。voidCMyprojectDlg::OnButton2()//用户登录{//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);CUserm_user[100];inti;intsize;intn_user=0;//文件中用户的个数////////////////////////////////////////////////////////////////////////////////////////////读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。//根据记录个数,依次读取用户记录放在成员变量m_st数组中(已在类体中声明了)CFilefile;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)//实验中限定为0~100个用户记录{for(i=0;in_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)//管理员进入管理员页面{CAdministratorsadministrators;administrators.DoModal();}CStringstr_password;for(i=0;in_user;i++)//普通用户,进入图书查询页面{str_password=m_user[i].password;if(m_user[i].num==m_num)7{if(str_password==m_password){CSearchsearch;search.DoModal();}else{CStringstr;str.Format(密码或者账号错误,请重新输入!);AfxMessageBox(str);}}}}(3)图书查询页面。包含读取所有图书数据,以及根据作者姓名或者书名来查询图书。1.读取所有图书响应函数。voidCSearch::OnButton5()//显示出所有图书{//TODO:Addyourcontrolnotificationhandlercodehereinti;intsize;intn_book=0;//文件book的本数////////////////////////////////////////////////////////////////////////////////////////////读取文件中的书本记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。//根据记录个数,依次读取书籍记录放在成员变量m_user_book数组中(已在类体中声明了)CFilefile;file.Open(book.dat,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件if(size0){file.SeekToBegin();file.Read(&n_book,sizeof(n_book));}if(n_book0&&n_book99)//实验中限定为0~100个书本记录{m_num_book=n_book;for(i=0;in_book;i++){//请注意与写入数据的顺序要保持一样,否则会读错数据。8file.Read(&(m_user_book[i].author),sizeof(m_user_book[i].author));file.Read(&(m_user_book[i].bname),sizeof(m_user_book[i].bname));file.Read(&(m_user_book[i].pub_name),sizeof(m_user