销售管理系统设计
某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当天出售的每种产品各写一张便条交上来。每张便条包含内容:
1)销售员的代号
2)产品的代号
3)这种产品的当天的销售额。
每位销售员每天上缴1张便条。试设计一个便条管理系统,使之能提供以下功能:
1、便条信息录入功能(便条信息用文件保存)--输入
2、收集到了上个月的所有便条后,读取销售情况
1)计算每个人每种产品的销售额。
2)按销售额对销售员进行排序,输出排序结果(销售员代号)
3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)
#include <stdio.h> #include <windows.h> #include <stdlib.h> /*定义日期结构体*/
typedef struct Date { int year; int month; int day; } Date; /*定义便条结构体*/ typedef
struct note { Date date; int price[5]; } note; /*定义员工结构体*/ typedef struct staff
{ char name[10]; char sex[3]; int age; int id; } staff; /* 全局变量部分 */ note
not[31]; //便条数组not,以一个月为准 staff sta[5]; //员工数组sta,后续用于读取文件中所有员工信息并保存 int ID;
//某员工的编号 int productPrice[5][5]= {0}; //销售额数组 char s[10]="Note_.txt";
//控制文件的打开选择 /* 选择界面函数 */ void choiceMenu(); //主菜单 void administrator(); //管理员操作
void funstaff(); //员工操作 /* 销售情况 */ void findStaffSale(); //查询员工的销售情况 2 void
findProductSale(); //查询产品的销售情况 2 void statistics(); //计算销售额 3 void printSale();
//打印销售额 2 /* 员工相关函数 */ int readData_staff(); //从文件中读取员工信息,返回员工人数 3 void
saveData_staff(int n); //将n个员工数据写入到文件中 3 int printStaff(); //打印文件的所有员工数据 2 void
addStaff(); //增加员工 1 void delStaffs(); //清除所有员工信息 1 void changeStaff();
//修改员工信息 1 /* 便条相关函数 */ int readData_note(); //从文件中读取便条内容,返回便条数据个数 3 void
saveData_notes(int n); //将n个便条数据写入到文件中 3 int printNote(); //打印文件的所有便条数据 1 void
addNote(); //上传便条 1 void changeNote(); //修改便条信息 1 void delNotes(); //清除所有便条内容 1
/*查询产品的销售情况*/ void findProductSale() { int i,j,k,tmp; int id[5]=
{0,1,2,3,4},sum[5]= {0}; statistics(); //先在productPrice中计算好所有人各个产品的销售额 for(i=0;
i<5; i++) for(j=0; j<5; j++) sum[i]+=productPrice[j][i]; // 统计某产品销售额之和 for(i=0;
i<4; i++) //与员工销售额排序相同,修改为按产品销售额排序 for(j=0; j<4; j++) if(sum[j]<sum[j+1]) {
tmp=id[j]; id[j]=id[j+1]; id[j+1]=tmp; //先交换id,后交换销售额 tmp=sum[j];
sum[j]=sum[j+1]; sum[j+1]=tmp; } printf("按产品销售额排序的结果为:\n");
printf("产品代号\t销售额\n"); for(i=0; i<5; i++) printf("%4d\t\t%d\n",id[i]+1,sum[i]);
printf("\n"); } /*查询员工的销售情况*/ void findStaffSale() { int i,j,k,tmp; int id[5]=
{0,1,2,3,4},sum[5]= {0}; statistics(); for(i=0; i<5; i++) for(j=0; j<5; j++)
sum[i]+=productPrice[i][j]; // 统计某员工所有产品的销售总额 for(i=0; i<4; i++) //冒泡排序
for(j=0; j<4; j++) if(sum[j]<sum[j+1])//按销售额排序,同时记录销售额对应的员工id的排序 { tmp=id[j];
id[j]=id[j+1]; id[j+1]=tmp; //id先交换,再交换销售额 tmp=sum[j]; sum[j]=sum[j+1];
sum[j+1]=tmp; } printf("按员工销售额排序的结果为:\n"); printf("员工代号\t销售额\n"); for(i=0; i<5;
i++) printf("%4d\t\t%d\n",id[i]+1,sum[i]); printf("\n"); } /*打印销售员各个产品的销售额*/
void printSale() { int i,j,k,tmp; statistics(); printf("销售员各个产品的销售额:\n\n\t\t");
for(j=0; j<5; j++) printf("%d号产品\t",j+1); printf("\n"); for(i=0; i<5; i++) {
printf("销售员%d:\t",i+1); for(j=0; j<5; j++) printf("%d\t",productPrice[i][j]);
printf("\n"); } } /*计算销售额*/ void statistics() { system("cls");
//计算每个人每种产品的销售额,行对应id代号,列对应销售额数据 int i,j,k,tmp; for(i=0; i<5; i++) for(j=0;
j<5; j++) productPrice[i][j]=0; // 初始化 for(i=0; i<5; i++) { ID=i+1;
k=readData_note();//该员工共有多少便条数据 k--; while(k>=0) { for(j=0; j<5; j++)
productPrice[i][j]+=not[k].price[j];//统计数据 k--; } } } /*清除便条内容*/ void
delNotes() { printf("请确认删除哪个员工的便条:"); scanf("%d",&ID); s[4]='0'+ID;
/*确认打开哪个员工的便条内容*/ FILE *p=fopen(s,"w+"); fclose(p); if (!feof(p))
printf("删除成功!\n"); else printf("删除失败!\n"); } /*清除员工信息*/ void delStaffs() { FILE
*p=fopen("StaffInfo.txt","w+");//以写方式打开直接清空 if (!feof(p)) printf("删除成功!\n");
else printf("删除失败!\n"); fclose(p); } /*从文件中读取便条,返回便条数据个数*/ int readData_note()
{ int n=0; s[4]='0'+ID; /*确认打开哪个员工的便条内容*/ FILE* p = fopen(s,"rb"); if (p !=
NULL) { int k; while (1) { k = fread(not+n,sizeof(note), 1, p); //
每个数据块存储到not数组的各个元素中,大小为sizeof(note),每次存1个,文件指针p if (k != 1) break; n++; }
fclose(p); return n; } return 0; } /*将n个便条数据写入到文件中*/ void saveData_notes(int n)
{ char s[10]="Note_.txt"; s[4]='0'+ID; FILE* p=fopen(s,"wb"); if(p!=NULL) {
fwrite(not,sizeof(note),n,p); //
not数组用于存储某员工一个月的便条数据,共有n条,大小为sizeof(note),文件指针p fclose(p); } else
printf("文件保存失败!\n"); } /*打印文件中的所有便条数据*/ int printNote() { system("cls"); int n;
n=readData_note(); /*从文件中读取便条数据个数*/ if(n==0) { printf("当前员工无便条数据!\n"); return
0; } printf("%d号员工共有%d个便条数据:\n\n",ID,n); for(int i=0; i<n; i++) {
printf("便条%d:\t",i+1);
printf("日期:%d年%d月%d日\n",not[i].date.year,not[i].date.month,not[i].date.day);
printf("产品代号\t销售额\n"); printf("--------------------\n"); for(int j=0; j<5; j++)
printf("%d\t\t%d\n",j+1,not[i].price[j]); printf("--------------------\n\n"); }
return n; } /*上传便条*/ void addNote() { system("cls"); int flag,n;
n=readData_note(); if(n==31) { printf("本月便条数据已满,不可添加!\n"); return; } else
printf("共有%d条便条",n); do { if(n==31) { printf("本月便条数据已满!\n"); break; }
printf("请输入日期(空格分开,如2022 01 01):\n");// 输入日期
scanf("%d%d%d",¬[n].date.year,¬[n].date.month,¬[n].date.day);
printf("请输入1-5号产品的销售额:\n"); // 输入对应产品销售额 for(int i=0; i<5; i++)
scanf("%d",¬[n].price[i]); n++; printf("是否继续上传便条?(1是/0否):\n"); }
while(scanf("%d",&flag)&&flag==1); saveData_notes(n); } /*从文件中读取员工信息,返回员工人数*/
int readData_staff() { int n = 0; FILE* p = fopen("StaffInfo.txt", "rb"); //
二进制读打开 if (p != NULL) { int k; while (1) //除非读取失败,否则一直循环 { k = fread(sta + n,
sizeof(staff), 1, p); // fread数据块读函数,第一个参数是用于接收数据的地址,所以存入每个块就需要sta+n //
第二个是对象的大小,第三个是读取对象的个数,第四个是文件指针 if (k != 1) break; n++; } fclose(p); return n; }
else { printf("读取失败!"); return 0; } } /*将n个员工数据写入到文件中*/ void saveData_staff(int
n) { FILE* p = fopen("StaffInfo.txt", "wb"); //二进制写打开 if (p != NULL) {
fwrite(sta, sizeof(staff), n, p); // fwrite数据块写函数,第一个参数是读取数据的首地址,第二个是数组每个元素的大小
// 第三个是需要写入的个数,第四个是文件指针 fclose(p); } else printf("文件保存失败!\n"); }
/*打印文件的所有员工数据*/ int printStaff() { system("cls"); int n=readData_staff(); //
读取员工信息 if (n == 0) { printf("无员工数据!\n"); return 0; } printf("共有%d个员工:\n", n);
printf("姓名\t性别\t年龄\tid\n\n"); for (int i = 0; i < n; i++)
printf("%s\t%s\t%d\t%d\n", sta[i].name, sta[i].sex, sta[i].age, sta[i].id);
return n; } /*增加员工*/ void addStaff() { system("cls"); int n,flag;
n=printStaff(); // 打印员工信息并返回员工个数 if(n==5) { printf("人数已满!不可添加\n"); return ; }
do { system("cls"); if(n==5) { printf("\n人数已满,不可添加!\n"); break; }
printf("请输入姓名、性别、年龄:\n"); scanf("%s%s%d", sta[n].name,sta[n].sex,&sta[n].age);
sta[n].id = n+1; // id对应n+1 n++; printf("\n是否继续添加(1是/0否):");
while(getchar()!='\n'); } while (n<5&&scanf("%d", &flag)&&flag);
saveData_staff(n); } /*改变员工信息*/ void changeStaff() { int flag, x, n;
system("cls"); n=printStaff(); // 打印员工信息并返回员工个数 if(!n) {
printf("是否添加员工?(1是/0否):"); // 无员工时询问是否添加 if(scanf("%d",&flag)&&flag==1) //
return语句放在if内部,之前放在外部导致bug { addStaff(); return; } } else {
printf("是否删除所有员工?(1是/0否):"); // 有员工时询问是否需要清除 if(scanf("%d",&flag)&&flag==1) {
delStaffs(); return; } } do { do { printf("请选择要进行修改的员工id(1至%d):\n", n);
scanf("%d", &x); } while (!(x >= 1 && x <= n )); printf("请输入姓名、性别、年龄:\n");
scanf("%s%s%d", sta[x-1].name,sta[x-1].sex,&sta[x-1].age);
printf("\n\t\t是否继续修改?(1/是,0/否):[ ]\b\b"); } while (scanf("%d", &flag) && flag
== 1); saveData_staff(n); } /*改变便条信息*/ void changeNote() { int flag, x, n;
system("cls"); n=printNote(); //打印所有便条,并获取便条个数 if(!n) {
printf("是否添加便条?(1是/0否):"); // 没有便条数据时询问是否要添加 if(scanf("%d",&flag)&&flag==1)
addNote(); return ; } do { do { printf("请选择要进行修改的便条(1至%d):\n", n); scanf("%d",
&x); }while (!(x >= 1 && x <= n )); printf("请输入日期(空格分开,如2022 01 01):\n"); //
便条数据先存进结构体数组,后续保存回文件
scanf("%d%d%d",¬[n-1].date.year,¬[n-1].date.month,¬[n-1].date.day);
printf("请输入1-5号产品的销售额:\n"); for(int i=0; i<5; i++)
scanf("%d",¬[n-1].price[i]); printf("\n\t\t是否继续修改?(1/是,0/否):[ ]\b\b"); }
while (scanf("%d", &flag) && flag == 1); saveData_notes(n); // 保存便条数据 }
/*管理员操作*/ void administrator() { int x,flag; do { do { system("cls");
printf("\t\t############################\n");
printf("\t\t#####1.添加员工#############\n");
printf("\t\t#####2.修改员工信息#########\n"); printf("\t\t#####3.删除便条内容#########\n");
printf("\t\t#####4.查询产品销售情况#####\n"); printf("\t\t#####5.查询员工销售情况#####\n");
printf("\t\t#####6.打印员工#############\n");
printf("\t\t#####7.打印销售额###########\n");
printf("\t\t#####8.退出系统#############\n");
printf("\t\t############################\n"); printf("\t\t请选择功能[ ]\b\b\b");
scanf("%d", &x); switch (x) { case 1: addStaff(); break; case 2: changeStaff();
break; case 3: delNotes(); break; case 4: findProductSale(); break; case 5:
findStaffSale(); break; case 6: printStaff(); break; case 7: printSale();
break; case 8: { printf("\n欢迎下次使用!"); exit(0); } break; default: { while
(getchar() != '\n'); printf("\t\t\t输入有误,请重新输入!\n"); system("pause"); //
暂停,保证输入提示信息正常显示不被清屏 } } }while (!(x >= 1 && x <= 8));
printf("是否返回管理员功能选择界面?(1是/0否):");
}while(scanf("%d",&flag)&&flag==1);//执行完内部功能后选择是否返回选择界面,也就是是否继续循环 } /*员工操作*/
void funstaff() { int x,flag; do{ printf("\t\t请输入自己的id(1到5):");
}while(!scanf("%d",&ID)||ID<1||ID>5); // 员工登录时输入个人id,便于后续对应的操作(ID全局变量) do {
system("cls"); printf("\t\t############################\n");
printf("\t\t###1.上传便条###############\n");
printf("\t\t###2.修改便条信息###########\n"); printf("\t\t###3.打印便条数据###########\n");
printf("\t\t###4.退出系统###############\n");
printf("\t\t############################\n"); printf("\t\t请选择功能:[ ]\b\b");
scanf("%d", &x); while (!(x >= 1 && x <= 4)) { while (getchar() != '\n');
printf("\t\t输入有误,请重新输入!\n"); printf("\t\t请选择功能:[ ]\b\b"); scanf("%d", &x); }
switch (x) { case 1: addNote(); break; case 2: changeNote(); break; case 3:
printNote(); break; case 4: { printf("欢迎下次使用!"); exit(0); } break; }
printf("是否返回销售员的功能选择界面?(1是/0否):"); //执行完功能后选择是否返回上级界面 }
while(scanf("%d",&flag)&&flag==1); } /*主菜单*/ void choiceMenu() { int x;
system("cls"); // 清屏操作 printf("\t\t\t############################\n");
printf("\t\t\t######1.管理员登录##########\n");
printf("\t\t\t######2.销售员的登录########\n");
printf("\t\t\t######3.退出系统############\n");
printf("\t\t\t############################\n"); printf("\t\t\t请选择功能:[ ]\b\b");
scanf("%d", &x); while (!(x >= 1 && x <= 3)) { while (getchar() != '\n'); //
用户输入字符等非法数据时,清除缓冲区 printf("\t\t\t输入有误,请重新输入!\n"); printf("\t\t\t请选择功能:[
]\b\b"); scanf("%d", &x); } if (x == 1) administrator(); else if (x == 2)
funstaff(); else { printf("欢迎下次使用!\n"); exit(0); } } int main() { int flag; do
{ choiceMenu(); printf("是否返回主菜单(1是/0否):"); } while(scanf("%d",&flag)&&flag==1);
printf("欢迎下次使用!"); return 0; }