ctllyran

导航

逆向软件开发与设计——高校人员信息管理系统

本次实验目的:训练逆向软件设计与开发能力。

实验内容:找一个已有的项目,阅读分析,找出软件尚存的缺陷,改进其软件做二次开发,并将过程整理成博客。

原博客链接: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";
}

 

posted on 2023-03-06 00:26  心柔小甜甜  阅读(59)  评论(0)    收藏  举报