某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当天出售的每种产品各写一张便条交上来。每张便条包含内容:
1)销售员的代号
2)产品的代号
3)这种产品的当天的销售额。
每位销售员每天上缴1张便条。试设计一个便条管理系统,使之能提供以下功能:
1、便条信息录入功能(便条信息用文件保存)--输入
2、收集到了上个月的所有便条后,读取销售情况
1)计算每个人每种产品的销售额。
2)按销售额对销售员进行排序,输出排序结果(销售员代号)
3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)
#include
#include
#include
/*定义日期结构体*/
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]=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= 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;
}