欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面对对象设计4——实战销售业绩管理系统

程序员文章站 2023-12-26 09:15:51
...

看面对对象设计断断续续也看了半年了,类与对象的设计还是比较粗浅的,正好表弟遇到一个这样的题目,就想着实战一下试一试。

一、总体介绍

  1. 项目名称:销售业绩管理系统

  2. 项目简介:

(1)某企业有20个分公司,现对该企业的年销售业绩进行管理。

(2)每个分公司的信息包括:公司号、公司名、公司经理、各类(包括服务类、货物类和工程类)产品销售额。

二、具体要求

  1. 系统功能要求有菜单提示

  2. 各项功能要求

(1)录入信息

提示用户输入每个分公司的各项信息(公司号系统自动产生流水号,每次增加1,无需输入)

(2)保存信息

存入文件,提示保存是否成功

(3)显示信息

若无信息,则提示无;有若信息则显示,请注意对齐各项信息

(4)查询信息

输入:公司名

输出:该公司的公司号、公司名等全部信息

(5)修改信息

输入:公司名

输出:该公司的公司号、公司名等全部信息,并询问用户修改哪项信息,选择后

输入:新信息,提示用户确实要修改吗y/n

输入y则修改,写入文件,修改后提示修改成功,并显示该公司更新后的完整信息

(6)添加信息

输入:公司名等信息(公司号系统自动产生流水号,无需输入),提示用户确定添加吗y/n

输入y则添加,写入文件,添加后显示添加成功

(7)删除信息

输入:公司名

输出:该公司的公司号、公司名等全部信息,并询问用户确实要删除吗y/n

输入y则从文件中删除,并提示用户删除成功

(8)求某个分公司的三类产品累计年销售总额

输入:公司名

输出:三类产品累计年销售总额

(9)求所有分公司的年销售总额并排序

输入:无

输出:排序结果

(10)求某个分公司在年度销售总额中的名次

输入:公司名

输出:名次

(11)求所有分公司的某类产品的平均销售额

输入:某类产品名

输出:该类产品的平均销售额

(12)对所有分公司的某类产品年度销售额排序

输入:产品类别

输出:排序结果

(13)退出

提示用户确实要退出?y/n

用户输入y后退出

  1. 程序设计要求

(1)要合理使用结构体、结构体数组、结构体指针访问该数组

(2)逻辑独立的功能定义在函数中

(3)要有合理提示,例如修改、删除需提示确认

(4)考虑程序鲁棒性,对不合法数据要有错误处理机制

(5)所有数据保存在文件中

我的想法就是分公司是一个类,主公司一个类,分公司的类全是保存信息的格式,公司名,经理名等等,然后主公司类可以操作分公司类型的数据,并且主公司可以访问存放在磁盘中的文件。

大致就是这样的:


class sub_Company {
public:
 int num;
 char name[20];
 char maneger[20];
 float sale_service;
 float sale_goods;
 float sale_engineer;
};

class mainCompany {
public:;
 void rst();//初始化
 void input();//录入信息
 void save();//保存信息
 void seek();//查找信息
 void modify();//修改信息
 void del();//删除信息
 void add();//添加信息
 void display();//显示信息
 void sale_money();//某公司总销售额查询
 void sale_order();//所有分公司的某类产品的平均销售额
 void sale_sort_all();//年销售总额排序
 void sale_all_grade();//年销售总额排名
 void sale_all_order();//对所有分公司的某类产品年度销售额排序
 void menu();//显示菜单
};

vector<sub_Company>com;

com是与文件关联的数组,每当磁盘文件内容变化时,com也会随之刷新,而用到一些查询功能的时候就不需要再重新读取,比较方便。

下面是一些主要功能的代码

初始化,将文件与数组相关联。

void mainCompany::rst() {
 sub_Company a;
 fstream file("company.txt", ios::in | ios::binary);
 com.clear();
 while (file.peek() != EOF) {
  file.read((char*)&a, sizeof(sub_Company));
  com.push_back(a);
 }
 file.close();
}

保存,将数组内容保存在文件中。

void mainCompany::save() {
 sub_Company a;
 if (com.size() < 1) {
  cout << "无有效数据输入!" << endl;
  return;
 }
 fstream file("company.txt", ios::out | ios::binary | ios::trunc);
 for (int i = 0; i < com.size(); i++) {
  a = com.at(i);
  a.num = i + 1;
  file.write((char*)&a, sizeof(sub_Company));
 }
 file.close();
 rst();//这里的rst保障了文件内容与数组的实时对应。
}

修改,通过对数组的操作与其对应。

void mainCompany::modify() {
 float money;
 char midname[20];
 char name[20];
 int flag = 0;
 cout << "请输入修改公司名:" << endl;
 cin >> name;
 for (int i = 0; i < com.size(); i++) {
  if (strcmp(com.at(i).name, name) == 0) {
   flag = 1;
   cout << "公司号" << "\t" << "公司名" << "\t" << "公司经理" << "\t" << "服务类销售额" << "\t" << "商品类销售额" << "\t" << "工程类销售额" << endl;
   cout << com.at(i).num << "\t" << com.at(i).name << "\t" << com.at(i).maneger << "\t\t" << com.at(i).sale_service << "\t\t" << com.at(i).sale_goods << "\t\t" << com.at(i).sale_engineer << endl;
   cout << "修改公司名-----------1" << endl;
   cout << "修改经理名-----------2" << endl;
   cout << "修改服务类销售额-----3" << endl;
   cout << "修改商品类销售额-----4" << endl;
   cout << "修改工程类销售额-----5" << endl;
   char judge;
   do {
    cin >> judge;
   } while (judge > '5' || judge < '1');
   switch (judge) {
   case'1':cout << "请输入修改内容:";  cin >> midname; strcpy_s(com.at(i).name, midname); break;
   case'2':cout << "请输入修改内容:";  cin >> midname; strcpy_s(com.at(i).maneger, midname); break;
   case'3':cout << "请输入修改内容:";  cin >> money; com.at(i).sale_service = money; break;
   case'4':cout << "请输入修改内容:";  cin >> money; com.at(i).sale_goods = money; break;
   case'5':cout << "请输入修改内容:";  cin >> money; com.at(i).sale_engineer = money; break;
   default:break;
   }
   cout << "确定修改?请输入y/n:";
   do {
    cin >> judge;
   } while (judge != 'y' && judge != 'n');
   if (judge == 'y') {
    save();
   }
   else {
    rst();//当不修改时,数组内容应该与文件一一对应,所以要重新刷新
   }
  }
 }
 if (flag == 0) {
  cout << "不存在该公司!" << endl;
 }
}

输入,删除,增添操作与修改操作类似。

然后是用到了容器及其算法的操作。

void mainCompany::sale_sort_all() {
 vector<float>sale_money;//用于存放每一个公司的钱
 for (int i = 0; i < com.size(); i++) {
  float money = com.at(i).sale_engineer + com.at(i).sale_goods + com.at(i).sale_service;//计算总销售额
  sale_money.push_back(money);
 }
 sort(sale_money.begin(),sale_money.end());//标准库算法之排序,从小到大
 for (int i = 0; i < sale_money.size(); i++)
 {
  cout << sale_money[i] << " ";
 }
 cout << endl;
}

以上就是主要内容。

具体可执行源代码已经上传到我的资源里面了。不过最好是自己思考,整个系统用到的知识点,上面截取的代码段都包括了,其他的功能和上面的难度相近。

相关标签: 面对对象设计

上一篇:

下一篇: