面对对象设计4——实战销售业绩管理系统
看面对对象设计断断续续也看了半年了,类与对象的设计还是比较粗浅的,正好表弟遇到一个这样的题目,就想着实战一下试一试。
一、总体介绍
-
项目名称:销售业绩管理系统
-
项目简介:
(1)某企业有20个分公司,现对该企业的年销售业绩进行管理。
(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)要合理使用结构体、结构体数组、结构体指针访问该数组
(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;
}
以上就是主要内容。
具体可执行源代码已经上传到我的资源里面了。不过最好是自己思考,整个系统用到的知识点,上面截取的代码段都包括了,其他的功能和上面的难度相近。
推荐阅读