我是靠谱客的博主 烂漫乌冬面,最近开发中收集的这篇文章主要介绍C语言期末销售管理系统设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

销售管理系统设计

某公司有四个销售员(编号: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("%4dtt%dn",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("%4dtt%dn",id[i]+1,sum[i]);
printf("n");
}
/*打印销售员各个产品的销售额*/
void printSale()
{
int i,j,k,tmp;
statistics();
printf("销售员各个产品的销售额:nntt");
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("%dt",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个便条数据:nn",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("%dtt%dn",j+1,not[i].price[j]);
printf("--------------------nn");
}
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",&not[n].date.year,&not[n].date.month,&not[n].date.day);
printf("请输入1-5号产品的销售额:n");
// 输入对应产品销售额
for(int i=0; i<5; i++)
scanf("%d",&not[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年龄tidnn");
for (int i = 0; i < n; i++)
printf("%st%st%dt%dn", 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("ntt是否继续修改?(1/是,0/否):[ ]bb");
}
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",&not[n-1].date.year,&not[n-1].date.month,&not[n-1].date.day);
printf("请输入1-5号产品的销售额:n");
for(int i=0; i<5; i++)
scanf("%d",&not[n-1].price[i]);
printf("ntt是否继续修改?(1/是,0/否):[ ]bb");
}
while (scanf("%d", &flag) && flag == 1);
saveData_notes(n);
// 保存便条数据
}
/*管理员操作*/
void administrator()
{
int x,flag;
do
{
do
{
system("cls");
printf("tt############################n");
printf("tt#####1.添加员工#############n");
printf("tt#####2.修改员工信息#########n");
printf("tt#####3.删除便条内容#########n");
printf("tt#####4.查询产品销售情况#####n");
printf("tt#####5.查询员工销售情况#####n");
printf("tt#####6.打印员工#############n");
printf("tt#####7.打印销售额###########n");
printf("tt#####8.退出系统#############n");
printf("tt############################n");
printf("tt请选择功能[
]bbb");
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("ttt输入有误,请重新输入!n");
system("pause");
// 暂停,保证输入提示信息正常显示不被清屏
}
}
}while (!(x >= 1 && x <= 8));
printf("是否返回管理员功能选择界面?(1是/0否):");
}while(scanf("%d",&flag)&&flag==1);//执行完内部功能后选择是否返回选择界面,也就是是否继续循环
}
/*员工操作*/
void funstaff()
{
int x,flag;
do{
printf("tt请输入自己的id(1到5):");
}while(!scanf("%d",&ID)||ID<1||ID>5);
// 员工登录时输入个人id,便于后续对应的操作(ID全局变量)
do
{
system("cls");
printf("tt############################n");
printf("tt###1.上传便条###############n");
printf("tt###2.修改便条信息###########n");
printf("tt###3.打印便条数据###########n");
printf("tt###4.退出系统###############n");
printf("tt############################n");
printf("tt请选择功能:[ ]bb");
scanf("%d", &x);
while (!(x >= 1 && x <= 4))
{
while (getchar() != 'n');
printf("tt输入有误,请重新输入!n");
printf("tt请选择功能:[ ]bb");
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("ttt############################n");
printf("ttt######1.管理员登录##########n");
printf("ttt######2.销售员的登录########n");
printf("ttt######3.退出系统############n");
printf("ttt############################n");
printf("ttt请选择功能:[ ]bb");
scanf("%d", &x);
while (!(x >= 1 && x <= 3))
{
while (getchar() != 'n');
// 用户输入字符等非法数据时,清除缓冲区
printf("ttt输入有误,请重新输入!n");
printf("ttt请选择功能:[ ]bb");
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;
}

最后

以上就是烂漫乌冬面为你收集整理的C语言期末销售管理系统设计的全部内容,希望文章能够帮你解决C语言期末销售管理系统设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部