第一篇:C++课程设计(教务管理系统)
#include
void menu(University uni);//菜单函数声明
class Student//学生类 { public: string name;int age;string sex;int number;string major;
public: void disp_stu();
friend void file_in(University &uni);
friend void file_out(University uni);};void Student::disp_stu(){
}
class Institute//学院类 { public: string name;cout<<“学生姓名:”<
public: void add_stu();
//添加学生
bool delete_stu(int i);
// 删除学生
bool modefy_stu(int i);
//修改学生信息
void disp_ins_1();
// 显示本院学生信息
friend void file_in(University &uni);
friend void file_out(University uni);};void Institute::add_stu(){
} Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Add(p);//在链表末尾增加一个节点
bool Institute::delete_stu(int i){
} head.Remove(i);//删除链表指定位置节点 return true;bool Institute::modefy_stu(int i){
Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Remove(i);//删除链表指定位置节点 head.Insert(i,p);//在链表指定位置插入一个新节点
return true;} void Institute::disp_ins_1(){
}
class University//学校类 { public: string name;int age;string addr;List
void design_stu();//学生信息设置 int i;Node
cout<<“学院名字:”< } cout<<“-------”<pData->disp_stu();q=q->pNext; void add_ins(); //添加学院 bool delete_ins(int n); // 删除学院 void design_cqut(); //设置学校信息 bool modefy_cqut(); //修改学校信息 void disp_cqut(); //显示学校信息 void design_ins(); //学院信息设置 bool modefy_ins(int n); //修改学院 void disp_ins(); //显示学院信息 void search_menu();void search_name(string n);//姓名 void search(string n);//性别//函数重载 void search(int n);//学号 bool search_age(int n);//年龄 friend void file_in(University &uni);};friend void file_out(University uni); void University::design_stu(){ int i,m,j;int n;cout<<“ ★★★★★★学生信息设置★★★★★★ ”< { disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { } } head.pCurrent=head.pCurrent->pNext;//当前指针指后移 cout<<“输入要添加的学生信息:”;head.pCurrent->pData->add_stu();cout<<“按任意键返回上一级菜单:”< disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { head.pCurrent=head.pCurrent->pNext;//当前指针指后移 } } head.pCurrent->pData->disp_ins_1();cout< { disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { } } head.pCurrent=head.pCurrent->pNext;//当前指针指后移 head.pCurrent->pData->disp_ins_1();cout< } cin>>n;head.pCurrent->pData->modefy_stu(n);cout<<“按任意键返回上一级菜单:”< void University::add_ins(){ } bool University::delete_ins(int n){ } bool University::modefy_ins(int n){ Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Remove(n);//删除链表指定位置节点 head.Insert(n,p);//在指定位置插入节点信息 return true;head.Remove(n);//删除链表指定位置节点 return true;Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Add(p);//在链表末尾增加一个节点 } void University::disp_ins(){ int i;Node for(i=1;i<=head.size;i++){ cout<pData->name< } void University::design_ins(){ int i;int j;cout<<“ ★★★★★★学院信息设置★★★★★★ ”< cout< { } disp_ins();cout<<“按任意键返回上一级菜单:”< disp_ins(); add_ins(); cout<<“按任意键返回上一级菜单:”< getch();system(“cls”);//清屏 design_ins(); break;} case 3: { } disp_ins();cout<<“输入删除学院序号:”;cin>>j;delete_ins(j);cout<<“按任意键返回上一级菜单:”< disp_ins();cout<<“输入修改学院序号:”;cin>>j;modefy_ins(j);cout<<“按任意键返回上一级菜单:”< } case 5:menu(*this);break;} } bool University::modefy_cqut(){ cout<<“学校名字:”;cin>>name;cout<<“创建年代:”;cin>>age;cout<<“学校地址:”;cin>>addr;return true;} void University::design_cqut(){ int i; University uni;cout<<“ ★★★★★★学校信息设置★★★★★★ cout< switch(i){ case 1: { disp_cqut(); cout<<”按任意键返回上一级菜单:“< getch();system(”cls“);//清屏 design_cqut(); break; } case 2: { modefy_cqut(); cout<<”按任意键返回上一级菜单:“< getch();system(”cls“);//清屏 design_cqut();break;”< } } } case 3:menu(uni);break; void University::disp_cqut(){ cout<<“学校有关信息为:”< } void University::search_name(string n){ int i,j,m=0;head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;i for(j=0;j { if(n==head.pCurrent->pData->head.pCurrent->pData->name) { } head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移 } bool University::search_age(int n){ int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i } cout<<“有”< } head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead;for(j=0;j } head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;} head.pCurrent=head.pCurrent->pNext;} cout<<“有”< void University::search(string n){ } int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i for(j=0;j if(n==head.pCurrent->pData->head.pCurrent->pData->sex){ head.pCurrent->pData->head.pCurrent->pData->disp_stu();} m++; head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext; } cout<<“有”< int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead; for(j=0;j { if(n==head.pCurrent->pData->head.pCurrent->pData->number) { head.pCurrent->pData->head.pCurrent->pData->disp_stu(); m++; } head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext; } head.pCurrent=head.pCurrent->pNext;} cout<<“有”< /****************************************信息查询菜***********************************************/ void University::search_menu(){ int i;cout<<“ ★★★★★信息查询显示★★★★★”< switch(i){ case 1: { 单 disp_ins(); cout<<“按任意键返回上一级菜单:”< { } head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;i } head.pCurrent->pData->disp_ins_1();head.pCurrent=head.pCurrent->pNext;cout<<“按任意键返回上一级菜单:”< } int j;disp_ins();cout<<“请输入学生所在学院序号:”;cin>>i;system(“cls”);//清屏 head.pCurrent=head.pHead;for(j=1;jpNext;head.pCurrent->pData->disp_ins_1();cout<<“按任意键返回上一级菜单:”< case 4: { string n;cout<<“输入要查询的姓名:”;cin>>n;system(“cls”);//清屏 search_name(n); } cout<<“按任意键返回上一级菜单:”< { } int n1;cout<<“输入要查询的年龄:”;cin>>n1;search_age(n1);cout<<“按任意键返回上一级菜单:”< system(“cls”);//清屏 case 6: { } string n;cout<<“输入要查询的性别:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”< } int n;cout<<“输入要查询的学号:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”< menu(*this); } } } break;/**********************************************************************/ { int i,j;ifstream inf(“cqutData.txt”,ios::in);inf>>uni.name;inf>>uni.age;inf>>uni.addr;inf>>uni.head.size;//学院个数 for(i=0;i 导出文件数据void file_in(University &uni) Node else uni.head.pEnd->pNext=m;//把节点m赋给下一个学院信息节点 m->pPrev=uni.head.pEnd;//节点m指向学院信息的尾节点 uni.head.pCurrent=uni.head.pEnd=m;//学院信息的尾节点始终指向m节点 inf>>uni.head.pCurrent->pData->head.size;//学生个数 for(j=0;j Student *q=new Student;inf>>q->name;inf>>q->age;inf>>q->sex;inf>>q->number;inf>>q->major; Node n->pPrev=uni.head.pCurrent->pData->head.pEnd; uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pEnd=n;//学生信息的尾节点始终指向n节点 } } } /************************************************************************************/ void file_out(University uni){ ofstream ouf(“cqutData.txt”,ios::out);int i,j;ouf< 导入文件数据ouf< uni.head.pCurrent=uni.head.pHead;//当前指针指向学院节点头指针 for(i=0;i ouf< ouf< uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pHead;//当前指针指向学生节点头指针 for(j=0;j ouf< uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移 } } } uni.head.pCurrent=uni.head.pCurrent->pNext;//学院当前指针后移 /************************退出系统菜单****************************/ void exit(University uni){ } int i;cout<<“是否保存修改内容:”< { } file_out(uni);exit(0);break;case 2:{exit(0);break;} case 3: { menu(uni);break;} case 4: { file_out(uni); } } menu(uni);break; /***************************************************************************************/ void menu(University uni){ system(“cls”);/*清屏*/ int i;cout< 主菜单 cout<<“★★★★★★★★★★★★★主菜单★★★★★★★★★★★★★”< cout< cout< cout< } int main(){ University u; } file_in(u);menu(u);return 0;switch(i){ case 1:uni.design_cqut();break;case 2:uni.design_ins();break;case 3:uni.design_stu();break; case 4:uni.search_menu();break; case 5:exit(uni);break;} #include string name;};class Student:public Person { public: Student(string n,int num,string ss):Person(n),number(num),address(add),str1(ss){} virtual void show(); void input_stu(); void display_stu(); void display_qu(); ~Student(){} protected: string str1; int number; string address;};void Student::show(){ cout<<“向老师提出的问题是:”;cin>>str1;} void Student::display_qu(){ cout< void Student::input_stu(){ cin>>Student::name;cin>>Student::number;cin>>Student::address;} void Student::display_stu(){ add,string cout<<“姓名:”< Teacher(string n,string sub,string sdf):Person(n),subject(sub),str2(sdf){} virtual void show(); void input_t(); void display_t(); void display_an(); ~Teacher(){} protected: string subject; string str2;};void Teacher::display_an(){ cout< void Teacher::show(){ cout<<“我的回答是:”;cin>>str2;} void Teacher::input_t(){ cin>>Teacher::name;cin>>Teacher::subject;} void Teacher::display_t(){ cout<<“姓名:”< Admin(string n,int tel,string ssfs):Person(n),telphone(tel),str3(ssfs){} virtual void show(); void input_ad(); void display_ad(); void display_gg(); ~Admin(){} protected: int telphone; string str3;};void Admin::display_gg(){ cout<<“公告:”;cout< void Admin::show(){ cout<<“公告是:”;cin>>str3;} void Admin::input_ad(){ cin>>Admin::name;cin>>Admin::telphone;} void Admin::display_ad(){ cout<<“姓名是:”< int main(){ int z,h,m;z=0;h=0;m=0; Student stu(“guochun”,20150311,“qlu”,“sdss”); Teacher tea(“cuiyu”,“math”,“dsdf”); Admin ad(“steve jobs”,178641,“sdfs”); while(1) { int x; cout<<“*******************”< cout<<“1.学生”< cout<<“2.教师”< cout<<“3.管理员”< cout<<“*******************”< cout<<“选择你的身份”< cin>>x; if(x<=0||x>3) cout<<“输入错误!”< else { switch(x) { case 1: cout<<“请选择你要干什么”< case 1:stu.display_stu();break; case 2:stu.input_stu(); } cout<<“修改后的个人信息为:”< { stu.Student::show(); z=1;} break; } break; case 2: cout<<“请选择你要干什么”< cout<<“学生有问题提问”< ad.display_gg();} cout<<“___________________”< cout<<“发生错误!”;else { switch(q) { case 1:tea.display_t();break; case 2:tea.input_t(); cout<<“修改后的个人信息为:”< tea.display_t();break; case 3: { if(z==1) { cout<<“学生的问题是:”; stu.display_qu(); tea.Teacher::show(); h=1; } } break; } } break; case 3: cout<<“请选择你要干什么”< cout<<“___________________”< cout<<“1.显示个人信息”< cout<<“发生错误!”; else { switch(l) { case 1:ad.display_ad();break; case 2:ad.input_ad(); cout<<“修改后的个人信息为:”< ad.display_ad();break; case 3: { ad.Admin::show(); m=1; } break; } } break; } } } return 0;} 课 程 设 计 课程名称 C++课程设计 题目名称 图书管理系统 2016 年月 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.GetLength());// 把类CString对象的内容赋值到字符数组中 user.password[m_password.GetLength()]=' ';//在数组末尾加结束符号 //在文件末尾,把新的记录写入。 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 here UpdateData(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 { //请注意与写入数据的顺序要保持一样,否则会读错数据。 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 //普通用户,进入图书查询页面 { 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 here int 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 { //请注意与写入数据的顺序要保持一样,否则会读错数据。 file.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_book[i].pub_name)); file.Read(&(m_user_book[i].pub_date),sizeof(m_user_book[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;i CString str; str=m_user_book[i].author; m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_user_book[i].bname; m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名 str=m_user_book[i].pub_name; m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_user_book[i].pub_date); ///整型变为字符串,便于在控件显示 m_list.SetItemText(i,3,str);//设置第i行第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 { CString str; int ret1=0,ret2=0; str=m_user_book[i].author; ret1=str.Find(m_author,0);//ret1>=0, 表示str中包含了m_author的字段 str=m_user_book[i].bname; ret2=str.Find(m_bname,0);//ret2>=0, 表示str中包含了m_bname的字段 if(ret1>=0) //按作者查询 { str=m_user_book[i].author; m_list.InsertItem(num,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_user_book[i].bname; m_list.SetItemText(num,1,str);//设置第i行第1列的的数据为书名 str=m_user_book[i].pub_name; m_list.SetItemText(num,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_user_book[i].pub_date); ///整型变为字符串,便于在控件显示 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.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()),m_add_author.GetLength());// 把类CString对象的内容赋值到字符数组中 book.author[m_add_author.GetLength()]=' ';//在数组末尾加结束符号 memcpy(book.bname,m_add_bname.GetBuffer(m_add_bname.GetLength()),m_add_bname.GetLength());// 把类CString对象的内容赋值到字符数组中 book.bname[m_add_bname.GetLength()]=' ';//在数组末尾加结束符号 memcpy(book.pub_name,m_add_pub_name.GetBuffer(m_add_pub_name.GetLength()),m_add_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中 book.pub_name[m_add_pub_name.GetLength()]=' ';//在数组末尾加结束符号 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.bname,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 notification handler code here UpdateData(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; //将book类的字符串数组赋值为字符串变量,方便比较。 CFile file;// 建立一个文件类,关于其用法,请baidu。 file.Open(“book.dat”,CFile::modeReadWrite);//打开文件 file.SeekToBegin(); file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数 for(int i=0;i { str_author=m_book[i].author; str_bname=m_book[i].bname; str_pub_name=m_book[i].pub_name; if(str_author==m_author||str_bname==m_bname||str_pub_name==m_pub_name||m_book[i].pub_date==m_pub_date) { memcpy(m_book[i].author,m_modify_author.GetBuffer(m_modify_author.GetLength()),m_modify_author.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].author[m_modify_author.GetLength()]=' ';//在数组末尾加结束符号 memcpy(m_book[i].bname,m_modify_bname.GetBuffer(m_modify_bname.GetLength()),m_modify_bname.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].bname[m_modify_bname.GetLength()]=' ';//在数组末尾加结束符号 memcpy(m_book[i].pub_name,m_modify_pub_name.GetBuffer(m_modify_pub_name.GetLength()),m_modify_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].pub_name[m_modify_pub_name.GetLength()]=' ';//在数组末尾加结束符号 m_book[i].pub_date=m_modify_pub_date; } ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_book[i].author,sizeof(m_book[i].author)); file.Write(&m_book[i].bname,sizeof(m_book[i].bname)); file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name)); file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date)); ///////////////////////////////////////////////////////////////////////////////////////// //在列表控件中显示所有条记录 str=m_book[i].author; m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_book[i].bname; m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名 str=m_book[i].pub_name; m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_book[i].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 here UpdateData(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; //将book类的字符串数组赋值为字符串变量,方便比较。 int n_book,n_flag=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;i { str_author=m_book[i].author; str_bname=m_book[i].bname; str_pub_name=m_book[i].pub_name; if(str_author==m_del_author||str_bname==m_del_bname||str_pub_name==m_del_pub_name||m_book[i].pub_date==m_del_pub_date) { n_flag=1; //删除标志置1 i+=1; //第i个元素为要删除元素,跳过 } ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持 学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_book[i].author,sizeof(m_book[i].author)); file.Write(&m_book[i].bname,sizeof(m_book[i].bname)); file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name)); file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date)); } if(n_flag==1) { n_book=m_num_book-1; //表示删除了一本书,则将文件的书本数减1。 file.SeekToBegin(); file.Write(&n_book,sizeof(n_book));//写书本记录本数,先填入本来的书本数。 //用消息框提示 str.Format(“成功删除书籍记录.”); AfxMessageBox(str); } else { //用消息框提示 str.Format(“没有这一本书的记录,不能删除.”); AfxMessageBox(str); } file.Close();} (5)、用户信息管理页面,包含读取所有用户信息,删除、添加、修改用户信息。1.读取所有用户信息以(4)基本相同。 2.删除用户信息实现基本方法与(4)基本相同。3.添加用户信息实现基本方法与(4)基本相同。4.修改用户信息实现基本方法与(4)基本相同。 四.实验结果及分析 (1.)登录页面 成功注册 普通用户成功登录页面 查询结果 管理员登录页面 图书管理页面 成功添加图书。 用户信息管理页面 分析:基本功能是可以实现的,但是因为是用数组来存放图书信息与用户信息,所以对于数据大了之后处理能力不够方便以及效率不高。而且删除信息的时候只是删除该条数据的信息,数据后面的信息往上移动,所以最后面会有两条重复的信息,虽然文件开头储存信息数目已经减一,读取数据是按照文件开头储存的信息数目来读取信息,但是有时候读取会有乱码。我在程序中找不到那个隐藏的bug,五、心得体会 这次C++课程设计学到了很多,懂得了C++看起来虽然简单,可是要用这个计算机语言来实现一些有用的功能,怎么运用确实是一门挺高深的学问,我们学习计算机语言不能只是看书看概念,要多上机实验,这样才能对计算机语言有比较深的了解,才能够提高自己的编程以及调试找BUG的能力。现在来总结一下编程过程中遇到的一些值得注意的问题。 1.派生出一个类时,为编辑框增加变量名后,然后在类声明中自己增加类成员,如果再想在对话框中增加编辑框并且添上变量名会出现错误。(如下,在Csearch 类中自己添加下面箭头指向的代码后,会出现下图右的错误,解决方法是把箭头指向的代码放到//}}AFX_DATA后面,因为此语句为MFC对话框自行添加编辑变量的结束,如果我们将自己定义的变量也添加到此语句前,编译器不清楚是MFC自行添加的变量还是用户自行添加的变量。)2.遇到编译器没有出错,可是运行结果与自己想象的不一样,很可能是逻辑错误。如: 在用户注册时,我是将用户数据直接存到文件尾,这是不正确的,因为管理员页面有删除用户的功能,这个功能的原理是先读文件头的用户数(假定为10个),然后将用户的数据先读取出来,然后经过一个判断,再储存重新储存回文件,而文件中储存的用户数据大小是没有变化的,也就是说文件尾会有两份最后一个用户的数据(即如果删除的是第七个,文件中最后会有两份第十个用户的数据,文件头的记录用户数为9个),如果添加用户直接储存在文件尾则会储存在第11个用户的位置,可是以后读取的话只是读取到第10个。所以会出现读取错误,密码不匹配的问题。应该根据记录的用户数让文件指针指向最后一个用户数据后面。file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg); 以上两个问题是困扰我比较久的,其他问题经过百度还有自己的调试,解决还算快,不值得重点说。 六、参考文献 1.C++面向对象程序设计(第二版) 谭浩强 编著 2.成绩管理系统MFC教程 3.CNDN论坛,关于文件操作的指针运算。 c++超市管理系统课程设计报告 第1章 任务描述 本次C++实践课题为“超市管理系统”。要求功能有 A、添加商品信息,有商品编号、商品名、供应商代号、进货价、售出价、存货数等。进货:若商品已存在,只需修改存货数;若不存在,需增加新纪录。B、售出:输入商品编号,修改相应的存货数与销售额。C、查询:查询商品,销售额。 第2章 系统需求及主要功能 本系统为超市管理系统的设计与实现,可供超市管理者对超市商品信息的查询和修改,适用于各种小型超市,有效地提高了工作效率。若查询不符合实际情况,则会提示错误。Enter键确认。 本系统实现以下功能: (1)进入系统后提示适用方法,键入相应数字依次将商品代码(由阿拉伯数字组成)、商品名称、商品产地、商品单价以及库存量等商品信息存入并保存。 (2)键入商品名称,可将要求删除商品调出,并予以删除。 (3)键入相应数字选项,可修改超市商品的所有信息。 (4)键入相应数字选项,可查询需要查询的商品的所有信息。 (5)键入相应数字选项,可显示超市所有商品的所有信息。 (6)键入数字0退出系统。 第3章 系统概要 3.1主界面流程图 设计超市管理系统的主界面,主界面相应的现实有下列菜单:增加商品、删除商品、修改商品、查询商品、统计商品、显示商品、退出。 超市管理系统 商品类 超市类 查询商品 统计商品 修改商品 增加商品 删除商品 找到 是 否 开始 开始 3.1主界面流程图 3.2 超市管理模块设计 (1) 超市初始化模块 类名为Goods和Supermarket,分别定义了商品的名称,代码,产地,单价和库存数量,以及需要在链表里面寻找的指针。 (2)增加商品的函数模块 在文件中写入产品的信息,加入链表。 (3)删除商品的函数模块 删除结点已达到删除产品的目的。 (4)修改商品的函数模块 载入商品的全部数据,并且放入内存,并且可以重新写入修改。如果没有找到商品,则返回。 (5)统计商品的函数模块 统计结点数以记录商品的数量,载入所有商品的数量和单价计算商品的总价值。 (6)数据存储的函数模块 将链表的所有数据写入文件,然后关闭文件。 (7)数据读入的函数模块 打开文件,然后将文件中的数据写入内存以备用。 第4章 系统设计过程 4.1 主界面流程图 设计超市管理系统的主界面,主界面相应的现实有下列菜单:增加商品、删除商品、修改商品、查询商品、统计商品、显示商品、退出。 查询商品 超市管理系统 商品类 超市类 统计商品 修改商品 增加商品 删除商品 找到 是 否 开始 结束 4.1主界面流程图 4.2清除内存中的商品函数 在超市管理系统中,商品出售出去,库存中的商品信息必须清除。 类外定义一个函数clear,在函数中定义一个指针p,讲物品goods赋给p,为了使函数能够不断地清除内存中的数据,要使指针移动,首先将p->next赋予goods,然后删除p中的数据,清空p中的数据,然后将goods赋给p,依次循环,从而实现删除库存中的一个或多个商品。 流程图如图 开始 定义指针 goods赋值p给p 将p的next赋值给goods 删除p中的数据 goods赋值给p 是否有需要删除的商品 结束 YES NO 图4.2清除内存商品流程图 4.3增加商品信息 类外定义一个函数add,首先在函数中定义变量商品代码 num 和商品数量count,都为double类型,商品名name和产地address为char类型,价格price 为int类型,首先要求用户输入商品信息,依次输入商品的代码、商品名称、商品产地、商品单价,判断单价是否在0~65535之间,如果不在范围内重新输入直到在范围之内再继续向下面执行,输入商品库存量,库存在0~99999之间,如果超出范围重新输入,在范围之内继续执行,保存数据。 开始 定义变量 输入商品代码名称产地 输入商品价格 (0~65535) 输入商品库存 (0~99999) 保存 No No Yes Yes 图4.3 增加商品流程图 4.4删除商品信息的过程 (1)在Supermarket类下定义一个Delete函数作为删除商品信息的函数,然后定义商品名,输入商品信息。 (2)查找要删除的结点(节点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),分别定义两个指针,原商品表信息指针p1和输入的商品信息指针p2,在p1循环的过程中比较输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,否则p2指向p1,使得两指针同化,p1指针接着指向下一指针,这样依次向后查询。 (3)删除结点,如果找到要删除的结点则删除,在这个条件下,如果删除的结点是第一个结点,则继续将指针后移删除第一结点,如果删除的结点是后续结点,则将p2下一指针指向p1下一指针,则删除相应的后续结点。 输出的结果是:找到并删除或者sorry,未找到! 流程图如图4.5 查找要删除的结点 定义指针p1 p2 比较输入商品名和商品表已知商品名是否一致 是否找到结点 继续向后查找 p2=p1;p1=p1->next 是否为第一结点 找到则删除成功 查找后续结点 是 是 是 否 否 否 开始 结束 图4.5 删除商品流程图 4.5修改商品信息的过程 (1)定义各参数变量的类型,然后是输入要查找等待修改的商品名称 (2)查找要修改的结点,定义p1、p2指针,p1为指向goods商品表指针,p2为输入的商品指针,判断p1指针,如果输入的商品名和原有的商品名一致,则结束本次循环,否则,p1和p2指针同化,p1接着指向p1的下一指针。 (3)修改结点,若找到相应的要修改的结点,则p1指向Output函数,接着输出要修改的信息,利用Switch语句来调用相应的修改信息。 (4)创建新商品的结点,把原来要修改的结点删除并重新替换要创建的商品结点。如果找到等待修改的结点则修改,否则保持商品表信息不变。 流程图如图4.6 输入要查的商品名 查找要修改的结点 比较输入商品名和商品表已知商品名是否一致 是否找到第一结点 继续向后查找 p2=p1;p1=p1->next 继续查找后续结点 删除并替换 是 是 否 否 是 否 开始 结束 图4.6 修改商品流程图 4.6查询商品的过程: (1)在Supermarket类下定义一个Query函数作为查询商品信息的函数,输入商品名。 (2)查找要查询的结点(结点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),定义一个原商品表信息指针p1,在p1循环的过程中比较 输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,否则 p1指针接着指向下一指针,这样依次向后查询。 (3)查询结点,如果找到要查询的结点则输出:查询成功并输出其所有信息,若没有找到输出:sorry未找到! 流程图如图4.7 定义指针p1 比较输入商品名和商品表已知商品名是否一致 是否找到商品 继续向后查找 p1=p1->next 是 是 否 否 输入要查询商品的名字 开始 结束 图4.7查询商品流程图 4.7统计商品的过程 (1)是在Supermarket类下定义一个Add_up函数作为统计商品信息的函数,然后定义两个double型变量Amount和Value分别表示要求统计商品的总量和总价值,输入商品名字name。 (2)查找要统计的结点(结点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),定义一个指针p1,原商品表信息指针p1,在p1循环的过程中比较输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,p1指针接着指向下一指针,这样依次向后查询。没找到则输出:sorry,未找到! (3)统计商品,每当找到一个商品后就将Amount与p1所指count相加存入Amount,并将此时p1所指的count与price相乘再加上Value存入Value,循环查找相加,最后分别输出。 流程图如图4.8 开始 查找要统计的结点 定义指针p1 比较输入商品名和商品表已知商品名是否一致 是否找到结点 继续向后查找 p1=p1->next 是 是 否 否 否 Amount+=p1->count; Value+=p1->count*p1->price Value+=p1->count*p1->price 从 当前指针p1 输出 结束 图4.8 统计商品流程图 第4章 系统测试 打开软件后见到如图所示的界面正式进入超市管理系统 图5.1 系统主界面 该软件有增加商品、删除商品、修改商品、查询商品、统计商品、显示商品六大功能。 (1)增加商品 选择1 进入商品录入界面 图5.2 新增商品信息界面 依次录入商品代码、商品名称、商品产地、商品单价、商品的库存量并按Y保存。 (2)删除商品 图5.3 删除商品界面 首先输入商品的名称,然后选择是Y 或者N。 (3)修改商品 选择3 进入修改商品界面 图5.4 修改商品界面 输入商品的名称,系统会显示商品代码、名称、产地、价格、库存量,然后分别选择1 改商品代码、2改商品名称、3改商品产地、4改商品单价、5 改商品库存量、7改全部信息。 (4)查询商品 图5.5 查询商品界面 输入商品名称后,系统会显示你所查询的商品信息,有商品的代码、商品的名称、商品的产地、商品的单价和库存量等。 (5)统计商品 图5.6 统计商品界面 选择5后进入统计商品,输入商品名称后,会显示出商品的数量和总价值。 (6)显示所有商品 选择6后 系统会显示所有商品的信息 图5.7 显示所有商品信息界面 第6章 总 结 在xx老师的耐心指导下,本组成员结各人之长,集集体智慧,终于基本完成了超市管理系统的设计与实现。 在实训期间,各成员按时完成各自的分配任务,及时交付组长进行整理融合。整理完毕后进行调试发现有不少有待改善之处,如商品价格和商品库存量不能为负数,也不能高的离谱等。在李杰老师的严格要求下,最后还增加了一个显示栏,通过该显示函数的实现可对超市所有商品一目了然。本着认真学习,对自己负责的态度,本组成员共同努力,对该系统程序的不足之处尽力修改,尽量达到程序的健壮性等。 但是尽管本组成员都非常努力,但该程序仍有不足之处,如对于商品代码num和商品库存量count若输入英文字母,按回车键后屏幕便会闪烁不停,重新打开系统后前面所输入的商品信息不能保存,在保存商品时按Y以外的键也可保存等。 总之,在XX老师的悉心指导下,我们收获颇丰!不仅深刻掌握了课本知识,而且加强了团队意识,在以后各自的人生发展道路上抹下了浓重的一笔! 参考文献: [1]《C++面向对象程序设计》(第一版) 谭浩强 北京:清华大学出版社 2006年1月 [2]《C程序设计 》(第三版) 谭浩强 北京:清华大学出版社2005年7月 附 录 课程分工: XX:主界面的设计与实现,商品的显示,程序的整合。 XX:商品的删除,商品的修改。 XX:清除内存中商品的数据,增加商品,创建商品类节点。 XX:查询商品,统计商品数量与价值。 XX:数据存盘与装入。 系统的测试由五人共同完成。 五、解决方案 C++程序设计实践教学环节任务书 1.分析程序的功能要求,划分程序功能模块。 2.画出系统流程图。 一、题目: 学生成绩管理分析系统 3.代码的编写。定义类和各个功能函数。 4.程序的功能调试。 二、目的与要求 5.完成系统总结报告以及使用说明书。 1.目的: 六、进度安排 1)巩固C++基础知识;此次课程设计时间为一周或两周,分四个阶段完成: 2)能够运用面向对象方法进行类的设计; 1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要 3)锻炼学生编程能力,解决实际问题的能力。求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。2.编码调试阶段:根据设计分析方案设计类并编写代码,然后调试该代码,实 2.要求现课题要求的功能。3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、基本要求: 总体设计、详细设计、编码、测试的步骤和内容。 1)按照软件开发流程进行开发 4.考核阶段。 2)类的设计合理;包括类的继承多态等; 3)模块划分清晰合理; 七、撰写课程设计报告或课程设计总结 4)实用性好。课程设计报告要求: 创新要求: 在基本要求达到后,可进行创新设计,比如系统用户功能控制,对管理员级和一总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步般级别的用户系统功能操作不同。骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。 三、信息描述 八、参考资料1.《C++程序设计》.郑莉.清华大学出版社 有关该系统基本信息的描述,如:学号、姓名、系别、班级和所选科目及各科成绩2.《C++编程思想》.Bruce Eckel [刘宗田].机械工业出版社等。3.《C++ Primer》中文版.Lippman[潘爱民].中国电力出版社出版4.《Effective C++中文版》Scott Meyers[侯捷].华中科技大学出版社 四、功能描述 1.学生基本信息及成绩所选科目成绩的录入修改和删除。 2.基本信息的查询(分系、班级;分科目)。 3.对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率); 4.对所开课程的成绩分析(求其平均成绩,最高分和最低分); 5.对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一 学期学生总体成绩进行排名,并显示各科成绩信息)第二篇:c++课程设计:教务管理系统源代码
第三篇:C++课程设计(简单图书管理系统)
第四篇:c++超市管理系统课程设计报告
第五篇:C++课程设计学生成绩管理分析系统