C++超市管理系统课程设计

一、    设计题目(问题)描述和要求

1. 题目:人事管理系统

2. 问题描述:

某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。

要求:

(1)  其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。

(2)  程序对所有人员有提升级别的功能

(3)  月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。

(4)  能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息

二、           系统分析与模块设计

根据问题描述和要求,系统要求能够按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。确定程序至少应该具备如下功能:“查询人员”、“增加人员”、“删除人员”、“数据存盘”基本模块。

系统既然具有“数据存盘”功能-人员数据可以保存到磁盘文件,那么也就意味着今后可以从磁盘文件读出人员数据,所以系统增加了“人员数据装入”模块,以方便用户使用、避免数据重复录入。考虑到系统实现简捷,人员数据文件采用文本文件,人员数据文件名:Person.txt。

做为一个完整系统,除了具有增加人员,删除人员信息模块,还应该具有修改人员相关信息的功能,所以本系统设计时考虑增加“修改人员”模块。

考虑到根据编号查找人员信息功能在“删除人员”、“修改人员”等模块都使用,所以可以考虑设置为一个模块。

考虑到系统要求人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。这样就要求人员编号在增加人员时自动生成(增加1)且不重复。根据这个要求,可以考虑设置一个全局量:“当前最大编号”,每增加一个人员,当前最大编号自动增1,然后新增加人员使用这个编号。为了保证系统能记忆这个编号,可以使用一个数据文件保存当前这个编号。系统每次开始运行前从文件读入这个编号,随着人员增加,编号自动增加,系统每次运行结束时将这个编号写入文件。本系统将初值(没有一个用户时)设置为0。

考虑到人员的许多固定信息如:经理、销售经理的固定月薪,销售经理、销售人员提成,技术人员小时工资等都是一些不需要每个人员都要输入的信息,所以可以将这些信息都保存在一个数据文件中,本系统为了方便起见,将这些信息与“最大编号”全部保存在一个文件中,并使用“基础数据设置”模块进行设置和管理。基础数据文件也采用文本文件,基础数据文件名:Base.txt。

本系统还提供“查询本月经营信息”帮助计算销售总额,工资总额,并按照公式计算本月盈亏。

综合考虑系统具有下面8项功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。

系统使用的数据文件格式如下:

Base.txt:(格式:项目 数据)

经理固定月薪       3000

销售经理固定月薪       1000

销售经理提成%    1

销售人员提成%    2

技术人员小时工资       20

ID   6

Person.txt:(格式:编号,姓名,人员类别,其它数据,销售员销售额,技术人员工作小时)

2     wang       3     100000   

3     liu   1    

4     wu   4     100 

5     huang      2

6     tao   3     150000   

注:人员类型编号1-经理;2-销售经理;3-销售员;4-技术人员

三、           系统设计

1.  系统总体框架

使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。所以系统主要涉及两个大类:公司类Company、人员类Person。系统的总体框架就是公司类,人员类的定义;主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法(成员函数)。

(1)公司类Company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础数据设置,数据存盘,数据装入等操作的相关模块(Add,Delete,Modify,Query,Set,Save,Load)作为成员函数。

(2)人员类Person:所有人员都具有的公共信息及操作可以使用人员类进行描述。由于系统具有4类人员且4类人员数据,操作有所不同,如销售员包含销售额,而技术人员包含工作小时数且计算工资的方法不同,所以应当为4类人员创建相应的Person类的派生类。

(3)为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共同方法操作人员类,可以将人员类的方法确定为虚函数。

2.  类的层次图

Person

{ No,Name,Duty,Earning,next,Person(),CalcSalary(),Output()}

 

Manager        Sales                SalesManager        Technician

{ Manager(),   {Amount,             {Amount,            { t,

CalcSalary(),  Sales(),GetAmount(), SalesManager(),     Technician(),

Output()}      SetAmount(),         SetAmount(),        GetT(),SetT(),

CalcSalary(),       CalcSalary(),       CalcSalary(),

Output()}           Output()}           Output()}

其中:

(1)Person 类的No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person 类的CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person是抽象类,具体计算工资,输出人员信息由派生类完成。

(2)各个派生的类,包含本类对象特有的数据,Sales::Amount-销售员销售额,SalesManager::Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),Technician::t-技术人员工作小时数。

Company

{Person *Worker,

Clear(),Company(),~Company(),Add(),Delete(),Modify(),

Query(),Set(),Save(),Load()}

其中:

(1)Worker就是人员链表。

(2)Clear()用于清除人员链表所有结点。

(3)Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各个功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。

3.  系统关键算法流程图

(1)主函数流程

 

(2) Company::Add()

(3) Company::Delete()

(4) Company::Modify


 

(5) Company::Query()

(6)Company::Save()

(7) Company::Load()

四、           源程序清单

参见附录

五、           系统测试

(列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求)

六、           小结

(设计过程心得体会)

一、    课设计题目:

超市进销存管理系统

二、    设计的目的

通过课程设计,学生在下述各方面的能力应该得到锻炼:巩固《面向对象程序设计》课程的基本知识和方法,通过该系统的实现,进一步培养学生理论联系实际、综合分析和解决问题的能力;掌握自顶而下的结构化程序设计的方法;进一步掌握在集成环境中程序调试的方法。

三、   设计内容

用面向对象程序设计方法实现一个简单的超市进销存管理系统。系统的主要功能是:完成超市进销存管理。公司内有若干种商品:

ü  商品代码(num)

ü  商品名称(name)

ü  产地(address)

ü  单价(price)

ü  该类商品的库存数量(count)

要求完成以下功能:①商品基本信息管理:商品的增加、修改和删除等。②商品的查询与统计:按商品名称查询基本信息、统计库存商品数量及总价值等。

四、    设计要求

课程设计最终要求有三个方面:完成软件设计开发,运行得到正确的结果;撰写课程设计报告、课程设计答辩。

1.  软件设计开发:提供源代码清单。

2. 课程设计报告撰写:

l  撰写要求及格式参见《课程设计报告模板》。

l  课程设计结束,在WORD中以A4大小排版,并严格按照统一封面进行填写和打印;

l  没有条件的同学,统一用稿纸手写,做到字迹工整,排列清晰,绘图细致。

l  严禁抄袭程序或报告,否则以零分计。

3.  答辩工作由指导教师根据情况安排。

五、进度安排

按教学计划规定,该课程设计总学时数为12,其进度及时间大致分配如下:

说明:需求分析、流程图的绘制、编写程序、撰写课程设计报告等过程在时间紧张的情况下,可由学生在课外补充完成。

六、答辩与成绩评定

1.课程设计的程序代码及相关文档保存在一个文件夹中并上报给指导教师,文件夹名称为学生姓名及学号的组合。有以下情况的学生不能参加答辩:

·设计报告未经指导教师审阅。

·或设计内容不全(有设计报告而无设计程序、有设计程序而无设计报告)。

·未经指导教师许可或无故不到者,缺勤率达50%的学生。

答辩时,设计者在5分钟内阐述自己的设计过程和最终结果,突出设计中遇到的主要问题和解决方法,然后回答教师提问。每位学生答辩总时间一般不超过10分钟。

2.课程设计成绩的评定:根据设计的完成情况、程序的编制质量、独立设计能力以及答辩情况综合衡量,由答辩小组讨论决定。原则上按以下公式计算:

课程设计成绩=考勤×10%+报告×20%+答辩×20%+程序×50%

七、教学参考书目

1、李龙澍:《C++程序设计》  清华大学出版社 

2、钱能:《C++程序设计基础》 清华大学出版社。

#include<iostream.h>

#include<fstream.h>

#include<ctype.h>

#include<stdlib.h>

#include<string.h>

int n=0;                         //全局数据,结点数量

class Goods

{

  protected:

       char name[20];                //商品名称

       double num;                   //商品代码

       char address[30];             //商品产地

       int price;                    //商品单价

       double count;                 //该类商品库存量

       Goods *next;

public:

       Goods(double num,char*name,char*address,int price,double count)

       {      this->num=num;

              strcpy(this->name,name);

              strcpy(this->address,address);

              this->price=price;

              this->count=count;

       }

       void Output()

       {              cout<<"num:"<<num<<"  name:"<<name<<"  address:"<<address

                     <<"  price:"<<price<<"  count:"<<count<<endl;

       }

       friend class Supermarket;

};

class Supermarket

{private:

       Goods *goods;          //商品表

       void Clear();  //清除内存中数据

public:

       Supermarket()

       {     goods=NULL;

              Load();

       }

       ~Supermarket()

       {Goods*p;

         p=goods;

           while(p)

              {      p=p->next;

                     delete goods;

                     goods=p;

              }

           goods=NULL;

       }

       void Add();                //增加商品

       void Delete();             //删除商品

       void Modify();             //修改商品

       void Query();              //查询商品

       void Add_up();             //统计商品

       void Save();               //基础数据存盘

       void Load();               //基础数据装入

};

void Supermarket::Clear()     //清除内存中商品数据(内部使用)

{    Goods* p;

      p=goods;

      while(p)

      {      goods=p->next;

             delete p;

             p=goods;

      }

}

void Supermarket::Add()      

{       Goods *p;

   double num,count;

    char name[20],address[30]; 

    int price;

       cout<<"\n请输入新增商品信息:\n";

    cout<<"商品代码:";cin>>num;

    cout<<"商品名称:";cin>>name;

    cout<<"商品产地:";cin>>address;

    cout<<"商品单价:";cin>>price;

    cout<<"该商品库存量:";cin>>count;

       //创建新商品类结点

       p=new Goods(num,name,address,price,count);

       p->next=NULL;

   if(goods==NULL)

              { goods=p;

                n++;   

              }

       else

              {

            Goods *p2=goods;

                     while(p2->next)

                            p2=p2->next;

                     p2->next=p;

                     n++;

              }

}            

void Supermarket::Delete()     //删除商品

{  char name[20];

  cout<<"\n请输入要删除的商品名称:\n";

  cin>>name;

  //查找要删除的结点

  Goods *p1,*p2;  p1=goods;

  while(p1)

  {    if(strcmp(p1->name,name)==0) break;

    else

    {      p2=p1;

      p1=p1->next;

    }

  }

  //删除结点

  if(p1!=NULL)                   //若找到结点,则删除

  {    if(p1==goods)             //若要删除的结点是第一个结点

    {      goods=p1->next;

      delete p1;

         n--;

    }

    else                      //若要删除的结点是后续结点

    {      p2->next=p1->next;

      delete p1;

         n--;

    }

    cout<<"找到并删除\n";

  }

  else                        //未找到结点

    cout<<"Sorry,未找到!\n";

}

void Supermarket::Modify()     //修改商品信息

{  double num,count;

  char name[20],address[30]; 

  int price;

  cout<<"\n 修改商品,请输入要查的商品名称:\n";

  cout<<"Name:";  cin>>name;

  //查找要修改的结点

  Goods *p1,*p2;  p1=goods;

  while(p1)

  {    if(strcmp(p1->name,name)==0) break;

    else

    {      p2=p1;

      p1=p1->next;

    }

  }

  //修改结点

  if(p1!=NULL)   //若找到结点

  {    p1->Output();

    cout<<"\n请选择要修改的信息(1—商品代码,2—商品名称,3—产地,4—单价,5—该商品库存量,6—修改全部信息):\n";

       int a; cin>>a;

    switch(a)

       {     case 1:cout<<"请输入新代码:"; cin>>num;

            strcpy(name,p1->name);strcpy(addressp1->address);price=p1->price;count=p1->count; break;

     case 2:cout<<"请输入新名称:"; cin>>name

            num=p1->num;strcpy(address,p1->address);price=p1->price;count=p1->count; break;     case 3:cout<<"请输入新产地:"; cin>>address;

            num=p1->num;strcpy(name,p1->name);price=p1->price;count=p1->count; break;

     case 4:cout<<"请输入新单价:"; cin>>price;

            num=p1->num;strcpy(name,p1->name);strcpy(address,p1->address);count=p1->count; break;

     case 5:cout<<"请输入新库存数据:"; cin>>count;

            num=p1->num;strcpy(name,p1->name);strcpy(address,p1->address);price=p1->price; break;

     case 6:cout<<"请输入新信息:\n";

                  cout<<"商品代码:";     cin>>num;

               cout<<"商品名称:";     cin>>name;

               cout<<"商品产地:";     cin>>address;

            cout<<"商品单价:";     cin>>price;

               cout<<"该商品库存量:"; cin>>count; break;

       }

     //创建新商品结点

      Goods *p3;

      p3=new Goods(num,name,address,price,count);

       //员工结点替换到链表

      p3->next=p1->next;

      if(p1==goods)  //若要替换的结点是第一个结点

        goods=p3;

      else          //若要替换的结点是后续结点

        p2->next=p3;

      delete p1;   //删除原来的商品结点

      cout<<"修改成功!\n";

  }

  else  //未找到结点

    cout<<"Sorry,未找到!\n";

}

 void Supermarket::Query()

{

  cout<<"\n****查询商品****\n";

  char name[20];

  cout<<"\n请输入要查询的商品名称:\n";

  cin>>name;

  Goods *p1=goods;

  while(p1)

  {

    if(strcmp(p1->name,name)==0) break;

    else p1=p1->next;

  }

  if(p1!=NULL)          //若找到结点

  {

         cout<<"\n要查询的信息如下:\n";

      cout<<"该类商品代码:\t"<<p1->num<<"\t"<<"该类商品名称:\t"<<p1->name<<"\t\n";

         cout<<"该类商品产地:\t"<<p1->address<<"\t"<<"该类商品单价:\t"<<p1->price<<"\t\n";

         cout<<"该类商品库存量:\t"<<p1->count<<"\t";

  }

  else //未找到结点

         cout<<"\nSorry,未找到该类商品!\n"; 

}

 void Supermarket::Add_up()                  //统计超市商品总数量于价值

{

       cout<<"\n****商品统计****\n";

       double Amount=0,Value=0;

       char name[20];

    cout<<"\n请输入要统计的商品名称:\n";

    cin>>name;

       Goods *p1;

       p1=goods;

       while(p1)

       {  if(strcmp(p1->name,name)==0) break;

          else p1=p1->next;

       }

       if(p1)

       {while(p1)

        {

              Amount+=p1->count;

              Value+=p1->count*p1->price;

              p1=p1->next;

        }

        cout<<"商品总数量是:\n";

        cout<<Amount;

        cout<<"\n商品总价值是:\n";

        cout<<Value;

       }

    else

        cout<<"\nSorry,未找到该类商品!\n";

}

 void Supermarket::Save()                 //数据存盘

{  

       cout<<"是否保存?[Y/N]";

    char a;

    cin>>a;

    if(a=='n')return;

    if(a=='y'||a=='Y')

       {

      ofstream outfile("base.txt",ios::out);

         if(!outfile){cerr<<"open error!";exit(1);}

         Goods* p;p=goods;

         while(p)

         {

        outfile<<"商品代码\t\t"<<p->num<<endl;

           outfile<<"商品名称\t\t"<<p->name<<endl;

           outfile<<"商品产地\t\t"<<p->address<<endl;

           outfile<<"商品单价\t\t"<<p->price<<endl;

           outfile<<"该商品库存量\t"<<p->count<<endl;

           cout<<endl;

           p=p->next;

         }

         outfile.close();

      cout<<"已完成数据的保存\n";

       }

}     

 void Supermarket::Load()    //数据装入

{

       Goods *p=goods;

       ifstream infile("base.txt",ios::in|ios::nocreate);

       //读一条信息

       infile>>p->num>>p->name>>p->address>>p->price>>p->count;

       while(infile.good())

       {

              //创建商品结点

              p=new Goods(p->num,p->name,p->address,p->price,p->count);

              p->next=NULL;

              //商品结点加入

              if(goods)       //若已存在结点

              {

               Goods*p2;

         p2=goods;

               while(p2->next)  //查找尾结点

                      p2=p2->next;

               p2->next=p;     //连接

              }

              else             //表空

                     goods=p;     //连接

     //读下一条信息

        infile>>p->num>>p->name>>p->address>>p->price>>p->count;

       }

       cout<<"\n商品数据已经装入\n";

}

 int main()

{       char c;

       Supermarket a;

       do{

              cout<<"\n****超市进销存管理系统****\n";

              cout<<"    1—增加商品\n";

           cout<<"    2—删除商品\n";

           cout<<"    3—修改商品\n";

           cout<<"    4—查询商品\n";

              cout<<"    5—统计商品\n";

        cout<<"    6—退出  \t 请选择(1—6):";    

           cin>>c;           

        switch(c)

              {

              case '1':a.Add();

                          a.Save();break;

              case '2':a.Load();

                          a.Delete();

                          a.Save();break;

              case '3':a.Load();

                          a.Modify();

                             a.Save();break;

              case '4':a.Load();

                          a.Query(); break;

              case '5':a.Load();

                          a.Add_up();break;

              }

       }while(c!='6');

       return 0;

}

相关推荐