C语言实现的销售管理系统
最后修改于2021/05/18
要求
某公司有N(N<=20)位销售员(编号:E001-E00N,至少包含销售员的若干基本信息如姓名、性别、受教育程度等),负责销售M(M<=30)个产品(编号:P001-P00M,至少包含产品的基本信息,如产品名称、单价、库存量等信息)。每个销售员在销售商品时,执行订单操作(销售记录,至少包含销售日期、销售编号、销售员编号、销售产品编号、销售数量等信息)。 设计一个简易库存-销售系统,使之能提供以下功能: 1、系统以菜单方式工作; 2、销售表信息录入功能(销售记录信息用文件保存)--输入; 3、统计销售情况 1)统计每个销售员的总销售额、每种产品的总销售额; 2)按销售额对销售员进行升序排序,输出排序结果; 3)按销售额对产品进行降序排序,输出排序结果。 (提示:至少应该有三个文件来保存基本数据,一个文件保存商品的基本信息,一个文件保存销售员的基本信息,还有一个文件保存销售记录。自行设计完整的数据结构并实现以上功能,程序应具有简单的错误处理,如不存在的销售员、超过库存的销售、不存在的产品等。如同学觉得能有更好的想法,也可以增加额外的功能,会酌情加分)。
项目的实验报告包括以下部分内容:
一、报告封面(请自行设计,内容清晰明了);
二、第一章:项目介绍;
三、第二章:完善的程序设计算法与流程;
四、第三章:清晰的测试结果;
五、第四章:分析与评论:完整且清晰的注释;
整个报告必须是:完整的包含以上内容且文档的总体风格非常专业(包括:参考文献、版权声明等)。
变量命名遵循的是谷歌的C/C++编程规范,结合注释应该不难理解本人的代码思路;
当初在设计的时候,安全是按照较大规模的数据进行设计的,对于题目要求的一百以内的数据,的确有点太冗杂了。
项目简介 本程序使用C语言进行编写,主要实现了对销售人员信息、商品信息、销售记录的录入与排序操作、文件的读写,为了加快查询速度和处理较大规模的数据量,使用Hash原理,可以在O(1)时间复杂度内通过关键值找到目标信息,但是不足之处在于作者还不能构建出一个把销售人员名字或商品名字作为关键值的Hash算法,只能把编号作为唯一的索引值。
C语言标准:C17
编译环境:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
操作系统:Windows 10 20H2
开发工具:CLion 2021.1.1(JetBrains)、
Visual Studio Code 1.56.2(MircorSoft)
文件操作 程序中的文件路径均使用相对路径,所用到的文件与源代码在相同的目录之下
代码规范 函数、变量命名遵循Google的C/C++编程规范
代码如下:
头文件
#ifndef SalesSystem
#define SalesSystem
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#define KHashSize 50
const int KMaxSalesman = 20;
const int KMaxProduct = 30;
typedef struct _Salesman_ Salesman;
typedef struct _ProductInformation_ ProductInformation;
typedef struct _Data_ Data;
typedef struct _SaleRecord_ SaleRecord;
struct _Salesman_ //用来记录销售人员信息的结构体
{
int number; //编号
char name[20]; //姓名
char gender[4]; //性别;0为男,否则为女
char education_experience[20]; //教育经历;高中、本科、研究生、小学
double sumsale;
};
struct _ProductInformation_ //记录商品信息的结构体
{
int number; //编号
char name[20]; //商品名称
double price; //单价
int remain_quantity; //剩余的商品数量
double sumsale;
};
struct _Data_ //记录日期的结构体
{
int year; //年
int month; //月
int day; //日
};
struct _SaleRecord_ //记录销售记录,里面嵌套了两个结构体
{
Data data; //销售日期
int number; //销售编号
int count; //销售的数量
ProductInformation productinformation; //产品信息
Salesman salesman; //销售人员的信息
};
/*******************************************************/
//创建索引,可以在O(1)的时间复杂度由编号内找到对应的信息
Salesman *salesman_number_hash[KHashSize] = {
NULL};
Salesman *salesman_name_hash[KHashSize] = {
NULL};
ProductInformation *product_number_hash[KHashSize] = {
NULL};
ProductInformation *product_name_hash[KHashSize] = {
NULL};
SaleRecord *sale_record_number_hash[KHashSize] = {
NULL};
/*******************************************************/
int compare_saleman(const void *a, const void *b) //对销售人员的销售额按照升序排列(从小到大)
{
Salesman *pa = (Salesman *)a;
Salesman *pb = (Salesman *)b;
return pa->sumsale - pb->sumsale;
}
int compare_product(const void *a, const void *b) //对单个商品的消费额按照降序排列(从大到小)
{
ProductInformation *pa = (ProductInformation *)a;
ProductInformation *pb = (ProductInformation *)b;
return pb->sumsale - pa->sumsale;
}
void PrintTips() //打印菜单
{
system("cls"); //清楚终端内的所有内容
printf("+--------------------------------------------------------+\n");
printf("| |*Menu*| |\n");
printf("| | 1.InPutSalesman | |\n");
printf("| | 2.InPutProductInformation | |\n");
printf("| | 3.InPutSaleRecord | |\n");
printf("| | 4.CalculateSaleSumOfProduct | |\n");
printf("| | 5.CalculateSaleSumOfSalesman | |\n");
printf("| | 6.SortSaleOfSalesman | |\n");
printf("| | 7.SortSaleOfProduct | |\n");
printf("| | 8.Exit | |\n");
printf("+--------------------- |*End*| -----------------------+\n");
printf(