逆向软件开发与设计——高校人员信息管理系统
本次实验目的:训练逆向软件设计与开发能力。
实验内容:找一个已有的项目,阅读分析,找出软件尚存的缺陷,改进其软件做二次开发,并将过程整理成博客。
原博客链接:c++课设(很久以前做的了) - 姿态H - 博客园 (cnblogs.com)
这是一个高校人员信息管理系统。以下列出原作者程序运行界面:


我们可以看到,在选择添加教师信息时没有任何提示,以至于我们可能会将教师信息的顺序添加错误,所以我在源代码中添加了当添加教师、实验员、行政员以及教师兼行政人员的文字描述,使运行界面变为:

除了没有文字提示外,原作者的程序还存在以下问题:
添加教师等人信息后不能直接保存到txt文件中,而是临时保存在数组中。修改后:


本次修改后程序仍然不够完善,存在运行问题。以下为部分修改后的代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<fstream> using namespace std; class per { public://教师、实验员、行政人员,教师兼行政人员; int num,old; char name[20],ge[20]; void aa(); void bb() { cout<<"编号:"<<num<<" "<<"年龄:"<<old<<" "<<"姓名:"<<name<<" "<<"性别:"<<ge;//输出基类特点 } }; void per::aa() { cout<<"请输入新增人员编号:"; cin>>per::num; cout<<"请输入新增人员年龄:"; cin>>per::old; cout<<"请输入新增人员姓名: "; cin>>per::name; cout<<"请输入新增人员性别:"; cin>>per::ge; }//输入基类成员 class Teacher:public per //教师 { public: char dep[50],pro[50],tit[50]; //部门 专业 职称 void cc(){ cout<<"请输入新增教师所属部门:"; cin>>dep; cout<<"请输入新增教师专业:"; cin>>pro; cout<<"请输入新增教师职称:"; cin>>tit;} void dd(){cout<<"部门:"<<dep<<" "<<"专业:"<<pro<<" "<<"职称:"<<tit<<endl;}//输入和输出; }; class Exper:public per //实验员 { public: char lab[50],work[50]; //所在实验室 职务 void ee(){ cout<<"请输入实验员所在办公室:"; cin>>lab; cout<<"请输入实验员的职务:"; cin>>work;} void ff(){cout<<"办公室:"<<lab<<" "<<"职务:"<<work<<endl;}//输入和输出 }; class Ap:public per //行政人员 { public: char PL[20], pos[20]; //政治面貌 职务 void gg(){ cout<<"请输入行政人员政治面貌:"; cin>>PL; cout<<"请输入行政人员职务:"; cin>>pos;} void hh(){cout<<"政治面貌:"<<PL<<" "<<"职务:"<<pos<<endl;}//输入和输出 }; class TA:public Teacher //教师兼行政人员 { public: char PL[20], pos[20]; void gg(){ cout<<"请输入教师兼行政人员政治面貌:"; cin>>PL; cout<<"请输入教师兼行政人员职务:"; cin>>pos;} void hh(){cout<<"政治面貌:"<<PL<<" "<<"职务:"<<pos<<endl;} }; int main() { int i,in; Teacher tea[100]; Exper exp[100]; Ap ap[100]; TA ta[100]; int w1,w2,w3,w4; //各个职位的人员数量 w1=w2=w3=w4=0; cout<<"----------------------------------\n"; cout<<"~**欢迎进入高校人员信息管理系统**~\n"; cout<<"~*********请输入指令*************~\n"; cout<<"~指令1: 添加人员信息 ~\n"; cout<<"~指令2: 输出所有人员信息 ~\n"; cout<<"~指令3: 查询人员信息 ~\n"; cout<<"~指令4: 修改人员信息 ~\n"; cout<<"~指令5: 删除人员信息 ~\n"; cout<<"~指令6: 输出人员总数和各类人数 ~\n"; cout<<"~指令7: 保存信息至桌面-test1 ~\n"; cout<<"~指令8: 结束程序 ~\n\n"; cout<<"请输入操作指令:\n"; while(cin>>in) { if(in<1||in>8){cout<<"指令错误,请重新输入指令";continue;} if(in==1) //添加信息 { int op; cout<<"请进行下一步指令: \n"; cout<<"指令1:添加教师信息 \n"; cout<<"指令2:添加实验员信息\n"; cout<<"指令3:添加行政员信息\n"; cout<<"指令4:添加教师兼行政员信息\n"; cin>>op; if(op<1||op>4){cout<<"指令错误,请重新输入指令";continue;} FILE *fp; fp=fopen("test.txt","a"); if(op==1) { if(w1>=100){cout<<"人员达到上限\n";continue;} tea[w1].aa(); tea[w1].cc(); for(i=0;i<w1;i++) { if(tea[w1].num==tea[i].num){ cout<<"数据重复添加!\n"; w1--;break; } } fprintf(fp,"%d\t",tea[w1].num); fprintf(fp,"%d\t",tea[w1].old); fprintf(fp,"%s\t",tea[w1].name); fprintf(fp,"%s\t",tea[w1].ge); fprintf(fp,"%s\t",tea[w1].dep); fprintf(fp,"%s\t",tea[w1].pro); fprintf(fp,"%s\t\n",tea[w1].tit); cout<<"保存成功!"<<endl ; w1++; } if(op==2) { if(w2>=100){cout<<"人员达到上限\n";continue;} exp[w2].aa(); exp[w2].ee(); for(i=0;i<w2;i++) { if(exp[w2].num==exp[i].num){ cout<<"数据重复添加!\n"; w2--;break; } } fprintf(fp,"%d\t",exp[w2].num); fprintf(fp,"%d\t",exp[w2].old); fprintf(fp,"%s\t",exp[w2].name); fprintf(fp,"%s\t",exp[w2].ge); fprintf(fp,"%s\t",exp[w2].lab); fprintf(fp,"%s\t\n",exp[w2].work); cout<<"保存成功!"<<endl ; w2++; } if(op==3) { if(w3>=100){cout<<"人员达到上限\n";continue;} ap[w3].aa(); ap[w3].gg(); for(i=0;i<w3;i++) { if(ap[w3].num==ap[i].num){ cout<<"数据重复添加!\n"; w3--;break; } } fprintf(fp,"%d\t",ap[w3].num); fprintf(fp,"%d\t",ap[w3].old); fprintf(fp,"%s\t",ap[w3].name); fprintf(fp,"%s\t",ap[w3].ge); fprintf(fp,"%s\t",ap[w3].PL); fprintf(fp,"%s\t\n",ap[w3].pos); cout<<"保存成功!"<<endl ; w3++; } if(op==4) { if(w4>=100){cout<<"人员达到上限\n";continue;} ta[w4].aa(); ta[w4].gg(); for(i=0;i<w4;i++) { if(ta[w4].num==ta[i].num) cout<<"数据重复添加!\n"; w4--;break; } fprintf(fp,"%d\t",ta[w3].num); fprintf(fp,"%d\t",ta[w3].old); fprintf(fp,"%s\t",ta[w3].name); fprintf(fp,"%s\t",ta[w3].ge); fprintf(fp,"%s\t",ta[w3].PL); fprintf(fp,"%s\t\n",ta[w3].pos); cout<<"保存成功!"<<endl ; w4++; } fclose(fp); } if(in==2) //输出信息 { char ch; ifstream infile("f1.dat",ios::in);//以输入的方式打开文件 if(!infile){ cerr<<"open error!"<<endl; exit(1); } ofstream outfile("f3.dat");//定义输出流f3.dat文件 if(!outfile){ cerr<<"open error!"<<endl; exit(1); } while(infile.get(ch)){//当读取字符成功时 if(ch<=122&&ch>=97) ch=ch-32; outfile.put(ch); cout<<ch; } cout<<endl; infile.close(); outfile.close(); } if(in==3) //查询信息 { FILE *fp; int i,No; float salary; fp=fopen("test.txt","r"); if(fp==NULL){ cout<<"当前文件没有人员信息!"; exit(0); } int sc; cout<<"继续输入指令: \n"; cout<<"指令1;根据编号查询\n"; cout<<"指令2:根据名字查询\n"; cout<<" 输入:"; cin>>sc; if(sc==1) { int bh,cnt; cnt=0; cout<<"输入编号:"; cin>>bh; for(i=0;i<w1;i++) { if(tea[i].num==bh) { tea[i].bb(); tea[i].dd(); cnt=1; } } for(i=0;i<w2;i++) { if(exp[i].num==bh) { exp[i].bb(); exp[i].ff(); cnt=1; } } for(i=0;i<w3;i++) { if(ap[i].num==bh) { ap[i].bb(); ap[i].hh(); cnt=1; } } for(i=0;i<w4;i++) { if(ta[i].num==bh) { ta[i].bb(); ta[i].hh(); cnt=1; } } if(cnt==0)cout<<"此编号不存在!\n"; } if(sc==2) { getchar(); cout<<"请输入名字\n"; int cnt=0; char bt[20]; gets(bt); for(i=0;i<w1;i++) { if(strcmp(tea[i].name,bt)==0) { tea[i].bb(); tea[i].dd(); cnt=1; } } for(i=0;i<w2;i++) { if(strcmp(exp[i].name,bt)==0) { exp[i].bb(); exp[i].ff(); cnt=1; } } for(i=0;i<w3;i++) { if(strcmp(ap[i].name,bt)==0) { ap[i].bb(); ap[i].hh(); cnt=1; } } for(i=0;i<w4;i++) { if(strcmp(ta[i].name,bt)==0) { ta[i].bb(); ta[i].hh(); cnt=1; } } if(cnt==0)cout<<"没有找到该名字匹配项!\n"; } fclose(fp); } if(in==4) //修改信息。 { int cnt; int sb; cout<<"输入需要修改的编号;\n"; cin>>sb; for(i=0;i<w1;i++){ if(tea[i].num==sb) { cout<<"重新输入修改后的信息"; tea[i].aa(); tea[i].cc(); cnt=1; } } for(i=0;i<w2;i++){ if(exp[i].num==sb) { cout<<"重新输入修改后的信息"; exp[i].aa(); exp[i].ee(); cnt=1; } } for(i=0;i<w3;i++) { if(ap[i].num==sb) { cout<<"重新输入修改后的信息"; ap[i].aa(); ap[i].gg(); cnt=1; } } for(i=0;i<w4;i++) { if(ta[i].num==sb) { cout<<"重新输入修改后的信息"; ta[i].aa(); ta[i].gg(); cnt=1; } } if(cnt==0)cout<<"修改的人员不存在!\n"; } if(in==5) //删除人员信息 { int i; cout<<"请输入要删除的人员编号;\n"; int dele; cin>>dele; for(i=0;i<w1;i++) { if(tea[i].num==dele) { for(int j=i;j<w1-1;j++) tea[j]=tea[j+1]; w1--; } if(i==w1)cout<<"查无此人!\n"; } for(i=0;i<w2;i++) { if(exp[i].num==dele) { for(int j=i;j<w2-1;j++) exp[i]=exp[i+1]; w2--; } if(i==w2)cout<<"查无此人!\n"; } for(i=0;i<w3;i++) { if(ap[i].num==dele) { for(int j=i;j<w3-1;j++) ap[i]=ap[i+1]; w3--; } if(i==w3)cout<<"查无此人!\n"; } for(i=0;i<w4;i++) { if(ta[i].num==dele) { for(int j=i;j<w4-1;j++)ta[i]=ta[i+1]; w4--; } if(i==w4)cout<<"查无此人!\n"; } cout<<"删除成功!\n"; } if(in==6) { cout<<"人员总数:"<<w1+w2+w3+w4<<endl; cout<<"教师人员:"<<w1<<"\t"<<"实验员:"<<w2<<endl; cout<<"行政人员:"<<w3<<"\t"<<"教师兼行政人员:"<<endl; } if(in==7) { FILE *fl; fl=fopen("test.dat","w"); for(i=0;i<w1;i++) { fprintf(fl,"%d %s %d %s %s %s %s\n",tea[i].num,tea[i].name,tea[i].old,tea[i].ge,tea[i].dep,tea[i].pro,tea[i].tit); } for(i=0;i<w2;i++) { fprintf(fl,"%d %s %d %s %s %s\n",exp[i].num,exp[i].name,exp[i].old,exp[i].lab,exp[i].work); } for(i=0;i<w3;i++) { fprintf(fl,"%d %s %d %s %s %s\n",ap[i].num,ap[i].name,ap[i].old,ap[i].PL,ap[i].pos); } for(i=0;i<w4;i++) { fprintf(fl,"%d %s %d %s %s %s\n",ta[i].num,ta[i].name,ta[i].old,ta[i].PL,ta[i].pos,ta[i].pro,ta[i].tit); } fclose(fl); cout<<"保存成功!"; } if(in==8)break; cout<<"请输入操作指令:\n"; } cout<<"欢迎下次使用!\n"; }
浙公网安备 33010602011771号