C语言课程设计销售管理系统.docx
《C语言课程设计销售管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计销售管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
![C语言课程设计销售管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/3/d92e9233-244f-485b-8a15-970e95aa671a/d92e9233-244f-485b-8a15-970e95aa671a1.gif)
C语言课程设计销售管理系统
销售管理系统
摘要
在销售管理当中,人工统计的速度慢,且容易出现差错。
本销售管理系统的自动化加速了统计工作,提高管理效率。
本程序主要采用对零散的纸条进行自动读取,然后按组分类将数据保存到数组,这样的结构化非常便于程序后续的统计工作。
统计具体过程涉及到个人销量排序与产品销量排序等问题,将于正文中详细介绍。
本程序实现了所有设计要求。
关键词:
文件,排序,统计
中文摘要Ⅰ
1题目要求1
1.1要求.1
2需求分析1
3总体设计1
4详细设计2
4.1主函数2
4.2各功能模块设计5
4.3公共函数6
5.运行结果(附带抓图)7
6.总结10
7.参考文献11
1题目要求
1.1要求
某公司有四个销售员(编号:
1-4),负责销售五种产品(编号:
1-5)。
每个销售员都将当日出售的每种产品各写一张便条交上来。
每张便条内容包含:
1、销售员的代号
2、产品的代号
3、这种产品当天的销售额
每位销售员每天可能上缴0-5张便条。
假设手机到了上个月的所有便条,编写一个处理系统,读取上月的销售情况(自己设定),进行如下处理:
1、计算上个月没人每种产品的销售额
2、按销售额对销售员进行排序,输出排序结果(销售员代号)
3、统计每种产品的总销售额,对这些产品从高到低的顺序输出结果(须输出产品的代号和销售额)
4、输出统计报表
2系统分析
本程序将用到文件系统,list.txt文件内容作为数据源,其中单行内容代表一张纸条。
程序运行后首先将文件系统的原始数据读取并保存到程序的结构体数组当中,所以应提供文件输入的操作;由于纸条数据零散,所以要对原始数据进行分类操作并提供一个数组用于保存分类信息;在程序中要进行统计工作,所以要提供显示、排序等操作;另外应提供键盘式选择菜单实现功能选择。
3总体设计
根据上面的分析,可以将这个系统分为如下五大模块:
查看每人每种产品的销售额、按销售额对销售员排序、对每种产品总销售额从高到低排序、输出统计报表和退出。
其中主要模块是前四个模块。
4详细设计
4.1主函数
【数据结构】
原始数据有员工代号、产品代号和销售额,所以定义一个全局结构体数组scrip用于保存原始数据。
然后定义全局变量n保存纸条数目,定义数组s用于保存分类后的信息。
【数据结构代码】
structscrip
{
intsid;//销售员代号
intpid;//产品代号
intsn;//销售额
}scrip[M];
intn;//纸条数目
ints[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存员工和产品信息
注函数通过调用readdata()读取文件数据,然后使用foreach()函数初始化产生便于操作的保存数据的数组,初始化工作完成之后执行menu()显示主菜单。
【程序】
voidmain()//入口函数
{
readdata();//读取文件数据
foreach();//根据文件初始数据初始化便于操作的数组
menu();//显示主菜单
}
4.1.1readdata()读取文件数据
readdata()函数从list.txt文件读取数据,将数据保存到程序的结构体当中。
【程序】
voidreaddata()//从文件读取数据
{
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)printf("Can'topenthefile!
\n");
elsefor(n=0;!
feof(fp);n++){fscanf(fp,"%d%d%d\n",&scrip[n].pid,&scrip[n].sid,&scrip[n].sn);};//保存文件数据到结构体
fclose(fp);
}
4.1.2foreach()根据文件初始数据初始化便于操作的数组
foreach()从纸条读取数据并按照销售员和产品种类分类整理保存到一个二维数组,方便统计操作。
【程序】
voidforeach()//从纸条读取数据并分类整理
{
inti;
for(i=0;i{
switch(scrip[i].pid)
//按产品分大类,根据大类分销售员小类,累加个人各产品销售数量
{
case1:
switch(scrip[i].sid)
{case1:
s[0][0]+=scrip[i].sn;break;
case2:
s[1][0]+=scrip[i].sn;break;
case3:
s[2][0]+=scrip[i].sn;break;
case4:
s[3][0]+=scrip[i].sn;break;}break;
case2:
switch(scrip[i].sid)
{case1:
s[0][1]+=scrip[i].sn;break;
case2:
s[1][1]+=scrip[i].sn;break;
case3:
s[2][1]+=scrip[i].sn;break;
case4:
s[3][1]+=scrip[i].sn;break;}break;
case3:
switch(scrip[i].sid)
{case1:
s[0][2]+=scrip[i].sn;break;
case2:
s[1][2]+=scrip[i].sn;break;
case3:
s[2][2]+=scrip[i].sn;break;
case4:
s[3][2]+=scrip[i].sn;break;}break;
case4:
switch(scrip[i].sid)
{case1:
s[0][3]+=scrip[i].sn;break;
case2:
s[1][3]+=scrip[i].sn;break;
case3:
s[2][3]+=scrip[i].sn;break;
case4:
s[3][3]+=scrip[i].sn;break;}break;
case5:
switch(scrip[i].sid)
{case1:
s[0][4]+=scrip[i].sn;break;
case2:
s[1][4]+=scrip[i].sn;break;
case3:
s[2][4]+=scrip[i].sn;break;
case4:
s[3][4]+=scrip[i].sn;break;};break;
}
}
}
4.1.3menu()显示主菜单
用于显示菜单,获取用户选项进入相应模块。
【程序】
voidmenu()
{
intw,c;
do{
puts("\t\t********************MENU*********************\n\n");
puts("\t\t1.查看每人每种产品的销售额\n");
puts("\t\t2.按销售额对销售员排序(销售员代号)\n");
puts("\t\t3.对每种产品总销售额从高到低排序(产品代号和销售额)\n");
puts("\t\t4.输出统计报表\n");
puts("\t\t5.退出\n");
puts("\n\n\t\t*********************************************\n");
printf("Choiceyournumber(1-5):
[]\b\b");
scanf("%d",&c);
if(c<1||c>5)//错误输入则重新获取输入
{
w=1;
getchar();
}
elsew=0;
}while(w==1);
switch(c)//根据输入实现相应函数调用
{
case1:
detail();
break;
case2:
seller();
break;
case3:
product();
break;
case4:
total();
break;
case5:
exit(0);
}
}
4.2各功能模块设计
4.2.1查看每人每种产品的销售额模块
由于在初始化当中已经进行分类整理,所以现在只要通过遍历s数组就可以将统计信息显示出来。
【程序】
voiddetail()//显示销售情况
{
inti,j;
voidmenu();
for(i=0;i<4;i++)//遍历销售员
{
printf("\n\t\t%d号销售员销售情况:
\n",i+1);
for(j=0;j<5;j++)
//按销售员分类遍历所有产品并显示信息
printf("\t\t%d号产品销售数量:
%d\n",j+1,s[i][j]);
}
wait();
}
4.2.2按销售额对销售员排序
计算每单个销售员所有产品销售数量,用一个FOR循环循环四次,每次获取最大值后输出,输出之后将最大值标记为-1,然后进行下次循环,由此获得由大到小的排行。
【程序】
voidseller()
{
inti,j,k;
intsp[4]={0,0,0,0};
for(i=0;i<4;i++)for(j=0;j<5;j++)sp[i]+=s[i][j];
//计算每单个销售员所有产品销售数量
for(i=0;i<4;i++)//比较四次,每次选出最大数
{k=0;//用于标记单轮最大数
for(j=0;j<4;j++)if(sp[k]printf("\t\t第%d名是%d号销售员!
\n",i+1,k+1);sp[k]=-1;
//输出最大数和排名,将最大数标记为负
}
wait();
}
4.2.3对每种产品总销售额从高到低排序
计算每单个产品销售数量,用一个FOR循环循环五次,每次获取最大值后输出,输出之后将最大值标记为-1,然后进行下次循环,由此获得由大到小的排行。
【程序】
voidproduct()//与seller()原理一样,用于对产品进行统计
{
inti,j,k;
voidmenu();
intp[5]={0,0,0,0,0};
for(j=0;j<5;j++)for(i=0;i<4;i++)p[j]+=s[i][j];
for(j=0;j<5;j++)
{k=0;
for(i=0;i<5;i++)
if(p[k]
printf("\t\t第%d名是%d号产品!
\t销量为%d!
\n",j+1,k+1,p[k]);p[k]=-1;
}
wait();
}
4.2.4输出统计报表
输出报表,将数组中的统计信息输出到屏幕。
【程序】
voidtotal()//输出报表
{
printf("\n\t销售员\t产品\t销量\n");
for(inti=0;i<4;i++)for(intj=0;j<5;j++)printf("\t%d\t%d\t%d\n",i+1,j+1,s[i][j]);
wait();
}
4.2.5退出
exit()为系统函数,退出程序时使用。
4.3公共函数
wait()函数用于输出信息后的等待,通过getchar()等待用户输入并提示相关信息,完成后调用菜单函数menu()。
detail()显示销售情况的函数,通过遍历数组按销售员分类遍历所有产品并显示信息。
【程序】
voidwait()//用于输出信息后的等待
{
voidmenu();
printf("\n\t\t按回车键返回主菜单...\n\n");
getchar();
menu();
}
5运行结果(附带抓图)
List.txt文件中数据如下:
111
222
333
444
程序运行结果:
查看每人每种产品的销售额运行结果:
按销售额对销售员排序运行结果:
对每种产品销售额从高到低排序运行结果:
统计报表运行结果:
6总结
通过这次C程序设计,我掌握了模块化设计方法,能够深入的理解结构化程序设计思想,熟练运用结构化程序设计方法,提高了运用C语言进行程序设计的能力。
参考文献
1C/C++程序设计,王连相等,中国科学技术出版社,2004
2C语言程序设计,谭浩强,清华大学出版社,1999
3C程序设计题解与上机指导,谭浩强,清华大学出版社,1999
4C语言实用程序荟萃,西安电子科技大学出版社,1993
5C语言函数手册,机械工业出版社,1999
6C语言的实际应用,安徽科学技术出版社,2000
致谢
附录:
源程序
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineM4
intshoudsave=0;/**/
structscrip
{
intsid;//销售员代号
intpid;//产品代号
intsn;//销售额
}scrip[M];
intn;//纸条数目
ints[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存员工和产品信息
voidreaddata()//从文件读取数据
{
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)printf("Can'topenthefile!
\n");
elsefor(n=0;!
feof(fp);n++){fscanf(fp,"%d%d%d\n",&scrip[n].pid,&scrip[n].sid,&scrip[n].sn);};//保存文件数据到结构体
fclose(fp);
}
voidforeach()//从纸条读取数据并分类整理
{
inti;
for(i=0;i{
switch(scrip[i].pid)
//按产品分大类,根据大类分销售员小类,累加个人各产品销售数量
{
case1:
switch(scrip[i].sid)
{case1:
s[0][0]+=scrip[i].sn;break;
case2:
s[1][0]+=scrip[i].sn;break;
case3:
s[2][0]+=scrip[i].sn;break;
case4:
s[3][0]+=scrip[i].sn;break;}break;
case2:
switch(scrip[i].sid)
{case1:
s[0][1]+=scrip[i].sn;break;
case2:
s[1][1]+=scrip[i].sn;break;
case3:
s[2][1]+=scrip[i].sn;break;
case4:
s[3][1]+=scrip[i].sn;break;}break;
case3:
switch(scrip[i].sid)
{case1:
s[0][2]+=scrip[i].sn;break;
case2:
s[1][2]+=scrip[i].sn;break;
case3:
s[2][2]+=scrip[i].sn;break;
case4:
s[3][2]+=scrip[i].sn;break;}break;
case4:
switch(scrip[i].sid)
{case1:
s[0][3]+=scrip[i].sn;break;
case2:
s[1][3]+=scrip[i].sn;break;
case3:
s[2][3]+=scrip[i].sn;break;
case4:
s[3][3]+=scrip[i].sn;break;}break;
case5:
switch(scrip[i].sid)
{case1:
s[0][4]+=scrip[i].sn;break;
case2:
s[1][4]+=scrip[i].sn;break;
case3:
s[2][4]+=scrip[i].sn;break;
case4:
s[3][4]+=scrip[i].sn;break;};break;
}
}
}
voidmenu()
{
intw,c;
do{
puts("\t\t********************MENU*********************\n\n");
puts("\t\t1.查看每人每种产品的销售额\n");
puts("\t\t2.按销售额对销售员排序(销售员代号)\n");
puts("\t\t3.对每种产品总销售额从高到低排序(产品代号和销售额)\n");
puts("\t\t4.输出统计报表\n");
puts("\t\t5.退出\n");
puts("\n\n\t\t*********************************************\n");
printf("Choiceyournumber(1-5):
[]\b\b");
scanf("%d",&c);
if(c<1||c>5)//错误输入则重新获取输入
{
w=1;
getchar();
}
elsew=0;
}while(w==1);
switch(c)//根据输入实现相应函数调用
{
case1:
detail();
break;
case2:
seller();
break;
case3:
product();
break;
case4:
total();
break;
case5:
exit(0);
}
}
voiddetail()//显示销售情况
{
inti,j;
voidmenu();
for(i=0;i<4;i++)//遍历销售员
{
printf("\n\t\t%d号销售员销售情况:
\n",i+1);
for(j=0;j<5;j++)
//按销售员分类遍历所有产品并显示信息
printf("\t\t%d号产品销售数量:
%d\n",j+1,s[i][j]);
}
wait();
}
voidseller()
{
inti,j,k;
intsp[4]={0,0,0,0};
for(i=0;i<4;i++)for(j=0;j<5;j++)sp[i]+=s[i][j];
//计算每单个销售员所有产品销售数量
for(i=0;i<4;i++)//比较四次,每次选出最大数
{k=0;//用于标记单轮最大数
for(j=0;j<4;j++)if(sp[k]printf("\t\t第%d名是%d号销售员!
\n",i+1,k+1);sp[k]=-1;
//输出最大数和排名,将最大数标记为负
}
wait();
}
voidproduct()//与seller()原理一样,用于对产品进行统计
{
inti,j,k;
voidmenu();
intp[5]={0,0,0,0,0};
for(j=0;j<5;j++)for(i=0;i<4;i++)p[j]+=s[i][j];
for(j=0;j<5;j++)
{k=0;
for(i=0;i<5;i++)
if(p[k]
printf("\t\t第%d名是%d号产品!
\t销量为%d!
\n",j+1,k+1,p[k]);p[k]=-1;
}
wait();
}
voidtotal()//输出报表
{
printf("\n\t销售员\t产品\t销量\n");
for(inti=0;i<4;i++)for(intj=0;j<5;j++)printf("\t%d\t%d\t%d\n",i+1,j+1,s[i][j]);
wait();
}
voidwait()//用于输出信息后的等待
{
voidmenu();
printf("\n\t\t按回车键返回主菜单...\n\n");
getchar();
menu();
}
voidmain()//入口函数
{
readdata();//读取文件数据
foreach();//根据文件初始数据初始化便于操作的数组
menu();//显示主菜单
}