对C++图书管理系统中实现删除图书的功能进行的改进
此为软件开发与创新课程的作业
- 对已有项目(本人、同学、教师或网上)进行阅读。
- 找出软件尚存的缺陷并分析。
- 对其进行改进。
- 整理形成一份博客.
原项目简介
原项目是我自己在大一下学期进行小学期课程设计时所编写的图书管理系统,包含增删改查图书的功能,而当时我个人想要使用文件的输入与输出达到方便存储的功能。

order = -1; cout<<"\n"; cout<<"----------------------------------------------------------\n"; cout<<"| 1. 图书信息录入 2. 图书信息查询 3. 图书信息删除 |\n"; cout<<"| 4. 办理借书手续 5. 办理还书手续 6. 已借出图书|\n"; cout<<"| 7.统计图书库存 |\n"; cout<<"| 按 \"0\"退出 |\n"; cout<<"----------------------------------------------------------\n"; cout<<" 请输入相应序号进行相应操作:"; cin>>order; cin.clear(); cin.ignore(100,'\n');

1 void library::DelBook() 2 { 3 string del_book; 4 string line; 5 vector<string>res; 6 string temp; 7 bool flag=false; 8 9 10 fstream in; 11 in.open("book.txt",ios::in); 12 if(!in) 13 { 14 cerr<<"打开错误文件"<<endl; 15 } 16 17 18 cout<<"请输入需要删除的图书ID"<<endl; 19 cin>>del_book; 20 21 22 23 while(getline(in,line)) 24 { 25 26 stringstream input(line); //将line切割 通过input存入temp,然后存入res中 27 times=0; 28 while(input>>temp) 29 { 30 if(del_book == temp && times==0) 31 { 32 33 for(int i=0;i<5;i++) 34 { 35 input>>temp; 36 } 37 input>>temp; 38 flag=true; 39 cout<<"\n找到了喔,应该删除成功了\n"; 40 continue; 41 } 42 res.push_back(temp); 43 times++; 44 45 } 46 } 47 48 //outData(res,5); 49 in.close(); 50 51 if(!flag) 52 { 53 cout<<"\n错误的书籍ID\n"; 54 return ; 55 } 56 fstream out; 57 58 59 out.open("book.txt",ios::out); 60 if(!out) 61 { 62 cerr<<"打开文件失败!"<<endl; 63 } 64 65 for(int j=0;j<res.size();j+=5) 66 { 67 line = res[j] + " " + res[j+1] + " " + res[j+2] + " " + res[j+3] + " " + res[j+4] + "\n"; 68 out<<line; 69 } 70 out.close(); 71 72 }
截图:
原代码能够删除图书,但是会将所有文件中图书的数据删除,并且不会回到原页面,会直接退出程序。
截图:
经过现在的检查发现可能会有以下问题:
- 文件运用不熟练,导致文件输出出错。
- 删除时未设置下限。
改进方案
上学期即大二上学期,我们学习了数据结构的内容,发现这段代码其实可以使用链表结构,不仅精炼的代码,而且加强了代码的可读性。

void SeqList::delete_array(int deldisc)//删除图书 { if(deldisc>truelength||deldisc<1) { cout<<"错误:删除位置无效"<<endl; system("pause"); } else { int delindx=deldisc-1; delete bookarray[delindx]; for(int i=delindx;i<truelength-1;i++) { bookarray[i]=bookarray[i+1]; } bookarray[truelength-1]=NULL; truelength=this->ntruelength(); } }
截图:
心得
这次的作业我认为非常有意义,可以让我们第一次体会到读代码并且改进的感觉。即使是我自己写的代码,才过了半年多我都没能找到一丝丝熟悉的感觉,至始至终都觉得十分陌生,这也警示了我若是长久停留在理论阶段而不自己动手打代码,可能最后练代码都看不懂。