C语言知识销售管理计划系统设计(内含完整编辑代码及其附加资料).doc
.用户下载须知程序语言:C、C+、C#(红色字体 表示本课设使用的程序设计语言)图形功能选项:Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(红色字体 表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(红色字体 表示本课设使用的数据结构)C+语言项:STL库(红色字体 表示使用C+的STL库)编译环境:Windows 7 64位旗舰版(Linux及其他环境请谨慎下载)集成开发环境:Visual C+ 6.0、DEVC+、CodeBlocks、Visual Studio 2015(需进行修改)均可通过编译。(若无法通过编译运行,则会用 浅蓝色字体 表示)分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)内容说明: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存储产品代号和销售额的信息。便条基本信息包括销售员代号、五种产品的销售额等信息。具体结构如下:typedef struct note/便条 int no;/销售员代号 float salesVolume5;/AE产品代号的销售额 Note;typedef struct noAndSum/记录销售员代号和总销售额,用以进行排序 int no;float salesVolume;NoAndSum;typedef struct productAndSum/产品代号和销售额char ch;float salesVolume;ProductAndSum;为了实现系统的各项功能,本设计中自定义相关的各个函数,各函数的原型如下:void ShowUI();/显示主菜单界面 void ShowSubmenu(); /显示次级菜单界面 int IsNumber(char s);/判断一个字符串是不是数字 void Input();/录入功能 void Read(Note note,int *n);/读取数据 void Calculation(Note note,int n);/计算功能void Find(Note note,int *n);/查询销售员信息 void Sort(Note note,int n);/排序功能 void Sort2(Note note,int n);/统计每种产品的类型金额3.3 主函数主函数main()函数通过多分支结构switch实现功能的选择,调用不同函数实现不同功能,包括录入、读取、查询、退出、计算每个人每种产品的销售额、按销售额对销售员进行排序和统计每种产品的总销售额等模块等功能。系统主界面如图2,主函数流程图如图3所示。图2系统主界面3.4 录入功能为了便于录入便条的信息,特别设计的Input()函数进行数据的录入。3.5 读取功能从二进制文本读取数据功能。3.6 查询功能3.7 计算每个人每种产品的销售额3.8 按销售额对销售员进行排序3.9 统计每种产品的总销售额4 软件调试分析在编程当中也遇到了一些问题:1)空文件读入乱码问题。空文件读入乱码但系统不报错,给数据的处理造成阻碍。为了保证数据的读入正确,在文件尾增加了一个字符#作为结束标志。2)实现循环操作功能问题。利用链表处理数据,容易忽视由于指针的移动造成的访问出错问题。在实现数据添加、删除等功能时,增加了指针复位处理。经验总结需多次调试,否则不易发现。3)无文件条件下的数据读取的问题以及查询排序的实现。该错误是空指针对数据读取造成的程序终止性错误。附 录用户使用手册1、根据界面提示操作即可。2、请勿输入非数字以外的字符。程序源代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <ctype.h>#include <string.h>#include <Windows.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */typedef struct note/便条 int no;/销售员代号 float salesVolume5;/AE产品代号的销售额 Note;typedef struct noAndSum/记录销售员代号和总销售额,用以进行排序 int no;float salesVolume;NoAndSum;typedef struct productAndSum/产品代号和销售额char ch;float salesVolume;ProductAndSum;void ShowUI();/显示主菜单界面 void ShowSubmenu(); /显示次级菜单界面 int IsNumber(char s);/判断一个字符串是不是数字 void Input();/录入功能 void Read(Note note,int *n);/读取数据 void Calculation(Note note,int n);/计算功能void Find(Note note,int *n);/查询销售员信息 void Sort(Note note,int n);/排序功能 void Sort2(Note note,int n);/统计每种产品的类型金额 int main(void) char select=0;char select1=0;Note note31;int n=0;/记录读入的数据个数 doShowUI();select=getch();switch(select)case 1:Input();break;case 2:Read(note,&n);if(0>=n)break;doShowSubmenu();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);return 0;void ShowUI()system("cls");/清屏函数 printf("nntt*n");printf("nntt* 1-录 入 *n");printf("nntt* 2-读 取 *n");printf("nntt* 3-查 询 *n");printf("nntt* 0-退 出 *n");printf("nntt*n"); void ShowSubmenu()system("cls");/清屏函数 printf("nntt*n");printf("nntt* 1-计算每个人每种产品的销售额*n");printf("nntt* 2-按销售额对销售员进行排序 *n");printf("nntt* 3-统计每种产品的总销售额 *n");printf("nntt* 0-返回 *n");printf("nntt*n");int IsNumber(char s)int sign=1;/标记是否为数字 int n=0;/记录有几个小数点 int i=0;for(i=0;0!=si;i+)if(!isdigit(si)&&.!=si)sign=0;break;else if(.=si&&(+n)>=2)sign=0;break;return sign;void Input()FILE *fp=NULL;char ch=0;/是否继续录入 char s100;Note note;int i=0;printf("请输入要录入信息的文件名:");gets(s);/读入存储信息的文件名/ ab+ 打开或新建一个二进制文件,可以读,但只允许在文件末尾追写 if(fp=fopen(s,"ab+")=NULL)printf("文件打开失败。n");getch();return;doprintf("请输入销售员的代号(14):");gets(s);note.no=atoi(s);if(note.no<1|note.no>4)doprintf("销售员代号输入错误,请重新输入:");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.salesVolumei=atof(s);if(!IsNumber(s)doprintf("%c产品销售额输入错误,请重新输入:",A+i);gets(s);note.salesVolumei=atof(s);while(!IsNumber(s);fprintf(fp,"%d %f %f %f %f %frn",note.no,note.salesVolume0,note.salesVolume1,note.salesVolume2,note.salesVolume3,note.salesVolume4);printf("按Y继续录入,其他按键退出。nn");ch=getch();while(Y=ch|y=ch); fclose(fp);/关闭文件 void Read(Note note,int *n)FILE *fp=NULL;char s100;*n=0;/重置 printf("请输入要读取信息的文件名:");gets(s);/读入存储信息的文件名/ ab+ 打开或新建一个二进制文件,可以读,但只允许在文件末尾追写 if(fp=fopen(s,"rb")=NULL)printf("文件打开失败。n");getch();return;fseek(fp,0,SEEK_SET);/文件指针定位到开头 dofscanf(fp,"%d %f %f %f %f %frn",&(note*n.no),&(note*n.salesVolume0),&(note*n.salesVolume1),&(note*n.salesVolume2),&(note*n.salesVolume3),&(note*n.salesVolume4);(*n)+;while(!feof(fp);fseek(fp,0,SEEK_END);if(ftell<=0)*n=0;fclose(fp);void Calculation(Note note,int n)int i=0,j=0,k=0;float salesVolume5=0.0;/记录五种产品的销售额 for(i=1;i<5;i+)/遍历所有 销售员的代号 for(j=0;j<5;j+)/初始化 salesVolumej=0.0;for(j=0;j<n;j+)if(i=notej.no)for(k=0;k<5;k+)salesVolumek+=(notej.salesVolumek);printf("销售员%d:n",i);for(j=0;j<5;j+)printf("t%c产品销售额:%fn",A+j,salesVolumej);getch();void Find(Note note,int *n)int no=0;/查询代号int i=0,j=0;char s100;Read(note,n);/先读入数据printf("请输入销售员的代号(14)进行查询:");gets(s);no=atoi(s);if(no<1|no>4)doprintf("销售员代号输入错误,请重新输入:");gets(s);no=atoi(s);while(no<1|no>4);for(i=0;i<*n;i+)if(no=notei.no)printf("销售员%d:n",no);for(j=0;j<5;j+)printf("t%c产品销售额:%fn",A+j,notei.salesVolumej);getch(); void Sort(Note note,int n)NoAndSum noandsum4;NoAndSum t;int i=0,j=0,k=0; for(i=0;i<4;i+)/初始化 noandsumi.no=i+1;noandsumi.salesVolume=0.0;for(i=0;i<4;i+)for(j=0;j<n;j+)if(noandsumi.no=notej.no)for(k=0;k<5;k+)(noandsumi.salesVolume)+=(notej.salesVolumek);for(i=0;i<4;i+)/冒泡排序 for(j=i+1;j<4;j+)if(noandsumi.salesVolume<noandsumj.salesVolume)t.no=noandsumi.no;t.salesVolume=noandsumi.salesVolume;noandsumi.no=noandsumj.no;noandsumi.salesVolume=noandsumj.salesVolume;noandsumj.no=t.no;noandsumj.salesVolume=t.salesVolume;for(i=0;i<4;i+)printf("销售员%d总销售额为:%fn",noandsumi.no,noandsumi.salesVolume);getch();void Sort2(Note note,int n)ProductAndSum p5,t;int i=0,j=0;for(i=0;i<5;i+)/初始化 pi.ch=A+i;pi.salesVolume=0.0;for(i=0;i<n;i+)for(j=0;j<5;j+)(note0.salesVolumej)+=(notei.salesVolumej);for(i=0;i<5;i+)pi.salesVolume=note0.salesVolumei;for(i=0;i<5;i+)/冒泡排序 for(j=i+1;j<5;j+)if(pi.salesVolume<pj.salesVolume)t.ch=pi.ch;t.salesVolume=pi.salesVolume;pi.ch=pj.ch;pi.salesVolume=pj.salesVolume;pj.ch=t.ch;pj.salesVolume=t.salesVolume;for(i=0;i<5;i+)printf("%c产品总销售额:%fn",pi.ch,pi.salesVolume);getch();附 件1、直接双击打开源文件。2、复制-粘贴到桌面再打开,可能会丢失部分代码或者文件损坏。