C语言销售管理系统设计内含完整代码及附件.docx
《C语言销售管理系统设计内含完整代码及附件.docx》由会员分享,可在线阅读,更多相关《C语言销售管理系统设计内含完整代码及附件.docx(23页珍藏版)》请在冰豆网上搜索。
C语言销售管理系统设计内含完整代码及附件
用户下载须知
程序语言:
C、C++、C#(红色字体表示本课设使用的程序设计语言)
图形功能选项:
Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(红色字体表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)
数据结构:
基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(红色字体表示本课设使用的数据结构)
C++语言项:
STL库(红色字体表示使用C++的STL库)
编译环境:
Windows764位旗舰版(Linux及其他环境请谨慎下载)
集成开发环境:
VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015(需进行修改)均可通过编译。
(若无法通过编译运行,则会用浅蓝色字体表示)
分多头文件编译:
否(所有代码基本都包含在一个文件,如需试验头文件功能,请自行参考相关文献)
容说明:
1、课设题目及预览容将在第二页开始展示。
2、代码行数:
304行
3、目录所示容,本文基本涵盖,如无容,会在本页进行说明。
4、附录绝对包含用户使用手册及程序完整源代码和详细注释。
5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。
6、未经平台、本人及相关法律法规允许,请勿用于其它商业行为,否则后果自负。
7、本文撰写容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。
销售管理系统设计
某公司有四个销售员(编号:
1-4),负责销售五种产品(编号:
A-E)。
每个销售员都将当天出售的每种产品各写一便条交上来。
每便条包含容:
1)销售员的代号,2)产品的代号,3)这种产品当天的销售额。
每位销售员每天上缴1便条。
系统基本功能:
1、系统以菜单方式工作
2、便条信息录入功能(便条信息用文件保存)
3、收集到了上个月的所有便条后,读取销售情况
1)计算每个人每种产品的销售额。
2)按销售额对销售员进行排序,输出排序结果(销售员代号)
3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)
4、销售员信息查询功能
要求:
使用二进制文件方式存储数据
根据分析结果,销售管理系统可分为录入、读取、查询、退出、计算每个人每种产品的销售额、按销售额对销售员进行排序和统计每种产品的总销售额等模块。
系统总体结构如图1所示。
图1系统总体结构框图
本系统采用数组存储数据,根据分析,系统设计了三个结构体:
note存储便条的基本信息,noAndSum存储销售员代号和销售总额的信息,productAndSum存储产品代号和销售额的信息。
便条基本信息包括销售员代号、五种产品的销售额等信息。
具体结构如下:
typedefstructnote{//便条
intno;//销售员代号
floatsalesVolume[5];//A~E产品代号的销售额
}Note;
typedefstructnoAndSum{//记录销售员代号和总销售额,用以进行排序
intno;
floatsalesVolume;
}NoAndSum;
typedefstructproductAndSum{//产品代号和销售额
charch;
floatsalesVolume;
}ProductAndSum;
为了实现系统的各项功能,本设计中自定义相关的各个函数,各函数的原型如下:
voidShowUI();//显示主菜单界面
voidShowSubmenu();//显示次级菜单界面
intIsNumber(chars[]);//判断一个字符串是不是数字
voidInput();//录入功能
voidRead(Notenote[],int*n);//读取数据
voidCalculation(Notenote[],intn);//计算功能
voidFind(Notenote[],int*n);//查询销售员信息
voidSort(Notenote[],intn);//排序功能
voidSort2(Notenote[],intn);//统计每种产品的类型金额
3.3主函数
主函数main()函数通过多分支结构switch实现功能的选择,调用不同函数实现不同功能,包括录入、读取、查询、退出、计算每个人每种产品的销售额、按销售额对销售员进行排序和统计每种产品的总销售额等模块等功能。
系统主界面如图2,主函数流程图如图3所示。
图2系统主界面
开始
输入选项select
select
录入
读取
查询
退出
输入选项select1
Select1
计算每个人每种产品的销售额
按销售额对销售员进行排序
统计每种产品的总销售额
返回
调用Input()
录入信息
调用Find(Notenote[],int*n)
查询信息
调用Calculation(Notenote[],intn)
计算
调用Sort(Notenote[],intn)
排序
调用Sort2(Notenote[],intn)
排序
结束
3.4录入功能
为了便于录入便条的信息,特别设计的Input()函数进行数据的录入。
3.5读取功能
从二进制文本读取数据功能。
3.6查询功能
3.7计算每个人每种产品的销售额
3.8按销售额对销售员进行排序
3.9统计每种产品的总销售额
4软件调试分析
在编程当中也遇到了一些问题:
1)空文件读入乱码问题。
空文件读入乱码但系统不报错,给数据的处理造成阻碍。
为了保证数据的读入正确,在文件尾增加了一个字符’#’作为结束标志。
2)实现循环操作功能问题。
利用链表处理数据,容易忽视由于指针的移动造成的访问出错问题。
在实现数据添加、删除等功能时,增加了指针复位处理。
经验总结需多次调试,否则不易发现。
3)无文件条件下的数据读取的问题以及查询排序的实现。
该错误是空指针对数据读取造成的程序终止性错误。
附录
用户使用手册
1、根据界面提示操作即可。
2、请勿输入非数字以外的字符。
程序源代码
#include
#include
#include
#include
#include
#include
/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/
typedefstructnote{//便条
intno;//销售员代号
floatsalesVolume[5];//A~E产品代号的销售额
}Note;
typedefstructnoAndSum{//记录销售员代号和总销售额,用以进行排序
intno;
floatsalesVolume;
}NoAndSum;
typedefstructproductAndSum{//产品代号和销售额
charch;
floatsalesVolume;
}ProductAndSum;
voidShowUI();//显示主菜单界面
voidShowSubmenu();//显示次级菜单界面
intIsNumber(chars[]);//判断一个字符串是不是数字
voidInput();//录入功能
voidRead(Notenote[],int*n);//读取数据
voidCalculation(Notenote[],intn);//计算功能
voidFind(Notenote[],int*n);//查询销售员信息
voidSort(Notenote[],intn);//排序功能
voidSort2(Notenote[],intn);//统计每种产品的类型金额
intmain(void){
charselect='\0';
charselect1='\0';
Notenote[31];
intn=0;//记录读入的数据个数
do{
ShowUI();
select=getch();
switch(select){
case'1':
Input();break;
case'2':
Read(note,&n);
if(0>=n)
break;
do{
ShowSubmenu();
select1=getch();
switch(select1){
case'1':
Calculation(note,n);break;
case'2':
Sort(note,n);break;
case'3':
Sort2(note,n);break;
}
}while('0'!
=select1);
break;
case'3':
Find(note,&n);break;
}
}while('0'!
=select);
return0;
}
voidShowUI()
{
system("cls");//清屏函数
printf("\n\n\t\t***************************\n");
printf("\n\n\t\t*1-----录入*\n");
printf("\n\n\t\t*2-----读取*\n");
printf("\n\n\t\t*3-----查询*\n");
printf("\n\n\t\t*0-----退出*\n");
printf("\n\n\t\t***************************\n");
}
voidShowSubmenu()
{
system("cls");//清屏函数
printf("\n\n\t\t************************************\n");
printf("\n\n\t\t*1-----计算每个人每种产品的销售额*\n");
printf("\n\n\t\t*2-----按销售额对销售员进行排序*\n");
printf("\n\n\t\t*3-----统计每种产品的总销售额*\n");
printf("\n\n\t\t*0-----返回*\n");
printf("\n\n\t\t************************************\n");
}
intIsNumber(chars[])
{
intsign=1;//标记是否为数字
intn=0;//记录有几个小数点
inti=0;
for(i=0;'\0'!
=s[i];i++)
if(!
isdigit(s[i])&&'.'!
=s[i]){
sign=0;
break;
}
elseif('.'==s[i]&&(++n)>=2){
sign=0;
break;
}
returnsign;
}
voidInput()
{
FILE*fp=NULL;
charch='\0';//是否继续录入
chars[100];
Notenote;
inti=0;
printf("请输入要录入信息的文件名:
");
gets(s);//读入存储信息的文件名
//ab+打开或新建一个二进制文件,可以读,但只允许在文件末尾追写
if((fp=fopen(s,"ab+"))==NULL){
printf("文件打开失败。
\n");
getch();
return;
}
do{
printf("请输入销售员的代号(1~4):
");
gets(s);
note.no=atoi(s);
if(note.no<1||note.no>4){
do{
printf("销售员代号输入错误,请重新输入:
");
gets(s);
note.no=atoi(s);
}while(note.no<1||note.no>4);
}
for(i=0;i<5;i++){
printf("请输入%c产品销售额:
",'A'+i);
gets(s);
note.salesVolume[i]=atof(s);
if(!
IsNumber(s)){
do{
printf("%c产品销售额输入错误,请重新输入:
",'A'+i);
gets(s);
note.salesVolume[i]=atof(s);
}while(!
IsNumber(s));
}
}
fprintf(fp,"%d%f%f%f%f%f\r\n",note.no,note.salesVolume[0],note.salesVolume[1],note.salesVolume[2],note.salesVolume[3],note.salesVolume[4]);
printf("按Y继续录入,其他按键退出。
\n\n");
ch=getch();
}while('Y'==ch||'y'==ch);
fclose(fp);//关闭文件
}
voidRead(Notenote[],int*n)
{
FILE*fp=NULL;
chars[100];
*n=0;//重置
printf("请输入要读取信息的文件名:
");
gets(s);//读入存储信息的文件名
//ab+打开或新建一个二进制文件,可以读,但只允许在文件末尾追写
if((fp=fopen(s,"rb"))==NULL){
printf("文件打开失败。
\n");
getch();
return;
}
fseek(fp,0,SEEK_SET);//文件指针定位到开头
do{
fscanf(fp,"%d%f%f%f%f%f\r\n",&(note[*n].no),&(note[*n].salesVolume[0]),&(note[*n].salesVolume[1]),&(note[*n].salesVolume[2]),&(note[*n].salesVolume[3]),&(note[*n].salesVolume[4]));
(*n)++;
}while(!
feof(fp));
fseek(fp,0,SEEK_END);
if(ftell<=0)
*n=0;
fclose(fp);
}
voidCalculation(Notenote[],intn)
{
inti=0,j=0,k=0;
floatsalesVolume[5]={0.0};//记录五种产品的销售额
for(i=1;i<5;i++){//遍历所有销售员的代号
for(j=0;j<5;j++)//初始化
salesVolume[j]=0.0;
for(j=0;jif(i==note[j].no){
for(k=0;k<5;k++)
salesVolume[k]+=(note[j].salesVolume[k]);
}
}
printf("销售员%d:
\n",i);
for(j=0;j<5;j++)
printf("\t%c产品销售额:
%f\n",'A'+j,salesVolume[j]);
}
getch();
}
voidFind(Notenote[],int*n)
{
intno=0;//查询代号
inti=0,j=0;
chars[100];
Read(note,n);//先读入数据
printf("请输入销售员的代号(1~4)进行查询:
");
gets(s);
no=atoi(s);
if(no<1||no>4){
do{
printf("销售员代号输入错误,请重新输入:
");
gets(s);
no=atoi(s);
}while(no<1||no>4);
}
for(i=0;i<*n;i++)
if(no==note[i].no){
printf("销售员%d:
\n",no);
for(j=0;j<5;j++)
printf("\t%c产品销售额:
%f\n",'A'+j,note[i].salesVolume[j]);
}
getch();
}
voidSort(Notenote[],intn)
{
NoAndSumnoandsum[4];
NoAndSumt;
inti=0,j=0,k=0;
for(i=0;i<4;i++){//初始化
noandsum[i].no=i+1;
noandsum[i].salesVolume=0.0;
}
for(i=0;i<4;i++)
for(j=0;jif(noandsum[i].no==note[j].no)
for(k=0;k<5;k++)
(noandsum[i].salesVolume)+=(note[j].salesVolume[k]);
for(i=0;i<4;i++)//冒泡排序
for(j=i+1;j<4;j++)
if(noandsum[i].salesVolumet.no=noandsum[i].no;
t.salesVolume=noandsum[i].salesVolume;
noandsum[i].no=noandsum[j].no;
noandsum[i].salesVolume=noandsum[j].salesVolume;
noandsum[j].no=t.no;
noandsum[j].salesVolume=t.salesVolume;
}
for(i=0;i<4;i++)
printf("销售员%d总销售额为:
%f\n",noandsum[i].no,noandsum[i].salesVolume);
getch();
}
voidSort2(Notenote[],intn)
{
ProductAndSump[5],t;
inti=0,j=0;
for(i=0;i<5;i++){//初始化
p[i].ch='A'+i;
p[i].salesVolume=0.0;
}
for(i=0;ifor(j=0;j<5;j++)
(note[0].salesVolume[j])+=(note[i].salesVolume[j]);
for(i=0;i<5;i++)
p[i].salesVolume=note[0].salesVolume[i];
for(i=0;i<5;i++)//冒泡排序
for(j=i+1;j<5;j++)
if(p[i].salesVolume
t.ch=p[i].ch;
t.salesVolume=p[i].salesVolume;
p[i].ch=p[j].ch;
p[i].salesVolume=p[j].salesVolume;
p[j].ch=t.ch;
p[j].salesVolume=t.salesVolume;
}
for(i=0;i<5;i++)
printf("%c产品总销售额:
%f\n",p[i].ch,p[i].salesVolume);
getch();
}
附件
1、直接双击打开源文件。
2、复制-粘贴到桌面再打开,可能会丢失部分代码或者文件损坏。