第一篇:c语言销售管理系统
课程设计说明书
学 院、系: 专
业: 学 生 姓 名: 设 计 题 目:
起 迄 日 期: 指 导 教 师:
学 号: 销售管理系统
日期: 2017年5月12日
设计目的
1.了解管理信息系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作。2.握高级程序设计语言的知识。
3.践中逐步掌握程序设计的思想和方法,培养问题求解和语言的应用能力。
4.程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,能对C语言 的文件操作有一个更深刻的了解。
5.提高与程序设计和软件开发有关的各种综合能力。
6.通过本课程设计,培养上机动手能力,巩固《C语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手能力,闯过编程关; 7.为后续各门计算机课程的学习打下坚实基础;8.学会用c语言程序设计来设计销售管理系统设计。任务概述
某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当天出售的每种产品各写一张便条交上来。每张便条包含内容:1)销售员的代号,2)产品的代号,3)这种产品的当天的销售额。每位销售员每天上缴1张便条。
试设计一个便条管理系统,使之能提供以下功能:
1、系统以菜单方式工作
2、便条信息录入功能(便条信息用文件保存)--输入
3、收集到了上个月的所有便条后,读取销售情况 1)计算每个人每种产品的销售额。
2)按销售额对销售员进行排序,输出排序结果(销售员代号)
3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果
4)输出统计报表 模块划分
主菜单及头文件设计
编辑系统菜单运行
输入信息
保存信息,参数为结构体数组和记录数
读入取函数,参数为结构体数组
清单输出
主要功能的实现 主要函数说明及其N-S图
主菜单及头文件设计: 我们按照老师所给的示例我们首先编译了一个头文件,在头文件里,编译了主函数需要用到的一些函数,如#include “stdio.h”等,因为需要录入便条的所有信息,所有用一个数据结构来实现信息的储存方式,用数组方式,把每条信息都编译成一个数组,如销售员代号用name[4]记录。头文件还包括了定义常数记录数typedef struct,主函数原型
int menu_select();/*声明函数*/ int enter(RECODE t[]);/*声明函数*/ void salor(RECODE t[],int n);/*声明函数*/ int sum(RECODE t[],int n,int m);/*声明函数*/ void list1(RECODE t[],int n);/*声明函数*/ void list2(RECODE t[],int n);/*声明函数*/ void list3(RECODE t[],int n);/*声明函数*/ void save(RECODE t[],int n);/*声明函数*/ int load(RECODE t[]);/*声明函数*/
这些的都是主函数需要用到的数据,因此放入头文件当中,在主程序开始之前直接引用#include “pro.h”。
2.编辑系统菜单运行:
题目要求我们系统以菜单方式工作,所以我们现要定义一个系统的结构体数组RECODE rec[600],用for(;;)循环让菜单实现无限循环,让switch(menu_select())调用主菜单函数,返回值整数作开关语句的条件,之后分别定义菜单的信息,如:
case 1: length=enter(rec);就是输入信息的定义编辑,当然最后需要用到break来实现返回。菜单定义完成之后,开始编译菜单的输出,这部分,用了printf就把需要显示的菜单显示出来,然后由用户选择菜单的选项,因为菜单只有0~7的选项,为了防止用户输入选项超值,所以用do while语句来控制,(c<0||c>7)
限定了用户输入的数据只有0~7才有效,超值则返回开始菜单,重新选择(return)。
3.输入信息:
输入信息一般都是使用scanf来实现,但在用户输入之前需要解决一个问题,程序必须限制用户的输入序数(记录条数),所以在输入数据之前,必须先限定序数,方法则是用一个for循环来实现,有用户输入一个数字,成为循环的上限,而用户输入的便条信息则在此限定下,不能超出,当超出时则返回到开始菜单。用户输入的便条信息分别存入对应的数组当中,如便条条数则存入t[i].num当中。
4.保存信息,参数为结构体数组和记录数:
用户输入的信息需要保存时,用save选项进行保存。保存的时候,实现应该建立一个指向文件的指针,从而固定保存文件时的位置,之后用if语句来判断打开文件是否正常,if((fp=fopen(“record.txt”,“wb”))==NULL),如果没打开(打开不正常),则程序执行退出;当判断文件打开正常时,系统显示“保存文件”(用printf(“n保存文件n”)来完成),保存信息是用到的fprintf函数,将制定记录数输入文件fprintf(fp,“%d”,n),因为源文件中采用了换行,保存文件是系统默认不会进行保存,所有必须加如换行符号保存,防止文件丢失,保证文件以用户输入的信息一致,保存换行符号依然采用fprintf函数来实现,具体源文件为fprintf(fp,“rn”);当确立了保存的可以性之后,系统开始录入需要保存的信息,用for循环语句,不断把用户输入的信息保存,因为之前在编写输入,输出程序时,都用到了一定的格式,保证信息的一一对应,所以在保存文件时,也需要确定和输入是相同的格式,这里依然使用fprintf函数来进行保存,如fprintf(fp,“%-10d%-7d%-7d%-7d%-7d-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5)就是把销售员代号,产品代号,销售额按照间隔7个字符格式进行保存,在保存格式确立后,需要把换行符号再次写入文件,程序结束后fclose结束保存,并用printf输出“文件保存成功”,让用户知道已经保存文件。
5.读入取函数,参数为结构体数组:
前面已经做了文件的保存,当保存文件成功后,系统会以record.txt文件保存在与程序同级的文件夹下,而读入函数,就是为了让用户再次打开运行程序时,可以直接读取之前已经输入并保存过的信息,和储存信息一样,读入函数也采用了参数为结构体数组,同样应该确定文件指向指针FILE *fp,读入函数之前,应该确定是否有已经保存的文件,用保存文件一样,用if语句来进行判断
if((fp=fopen(“record.txt”,“rb”))==NULL),如果判断失败,系统不能读入文件,则会显示“不能打开文件”,用printf(“不能打开文件n”)来实现,同时系统要结束读入文件的执行,用exit(1)实现;如果判断成功,则系统会自动读入用户已经保存的数据(fscanf(fp,“%d”,&n)读入记录数),用for循环把已经保存的数据一一对应的读入到正在执行的程序中,这里需要注意的是,读取的数据格式应该同保
存
时的一
致,如
储
存
时的格
式
是fprintf(fp,“%-10d%-7d%-7d%-7d%-7d-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5),则读
入的时的格
式
就
为fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2),&(t[i].a3),&(t[i].a4),&(t[i].a5)),读取成功后关闭文件fclose(fp),并显示“成功地从文件读入数据!!”(用printf实现)。
6.清单输出:
读取销售情况有3个,分别是每个人每种产品的销售额,按销售额对销售员进行排序和每种产品的总销售额三个函数: 1).每个人每种产品的销售额:
首先,要定义每个人,每种产品,销售额数组如 int i,j,sum0=0,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;int c[4],b1[4]={0},b2[4]={0},b3[4]={0},b4[4]={0},b5[4]={0},用for循环来求每个人的总销售额:for(i=0;i<4;i++);用for循环来求每个人每种产品的总销售额:for(i=0;i 此部分要分两部分其一是,每位销售员销售额;其二是,按销售额对销售员排序。在求每个销售员销售额时也是要先定义销售员代号,产品代号,销售额。接着是则是用输入要查询的销售员的代号,用scanf(“%d”,&s)来记录输入销售员代号的信息,然后输出头标(如销售员代号,产品代号,销售额等,用printf实现),之后开始查询,查询信息首先需要一个for语句来,实现对已存入数据的所有查询for(i=0;i 也一样首先要定义数组,接着用c[i]=sum(t,n,i+1)求每个人的总销售额,再用for循环,再用 sum0+=c[i]对所有产品的销售额求总,用for循环对每个人每种产品的销售额求总销售额,再用for循环实现每种产品的总销售额,然后输出 头标(如销售员代号,产品代号,总销售额等,用printf实现)即可。程序运行数据及其结果 1.进入主菜单: 2.选择“1”,输入便条: 3.输入条数,如:输入2天的便条,8条: 4.选择“2”,保存到文件: 5.选择“3”,读取文件: 6.选择“4”,显示清单: 7.选择“5”,每位销售员的销售额: 8.输入查询员工代号,如:查询的员工号为3: 8.选择“6”,每种产品的销售额: 9.选择“7”,按销售额对销售员排序: 10.选择“0”,退出管理: 11.保存的文件: 保存的文件为TXT格式,其保存的文件为: 课程设计心得 经过上机实践学习,使我对c语言有了更进一步的认识和了解,C语言是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的地位。要学好这种语言,仅仅学习课本上的知识是不够的,还要经常自己动手,有较强的实践能力。只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。通过实践,我也发现 我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习c语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。 附录: #include “stdio.h”/*输入输出函数*/ #include “stdlib.h”/*通用应用程序函数*/ #include “string.h”/*字符串函数*/ #include “ctype.h”/*字符操作函数*/ typedef struct /*定义结构体变量*/ { int name;/*销售员代号*/ int a1;/*产品一代号*/ int a2;/*产品二代号*/ int a3;/*产品三代号*/ int a4;/*产品四代号*/ int a5;/*产品五代号*/ }RECODE; /******以下是函数原型*******/ int menu_select();/*声明函数*/ int enter(RECODE t[]);/*声明函数*/ void salor(RECODE t[],int n);/*声明函数*/ int sum(RECODE t[],int n,int m);/*声明函数*/ void list1(RECODE t[],int n);/*声明函数*/ void list2(RECODE t[],int n);/*声明函数*/ void list3(RECODE t[],int n);/*声明函数*/ void save(RECODE t[],int n);/*声明函数*/ int load(RECODE t[]);/*声明函数*/ /*主函数开始*/ int main()/*主函数*/ { } RECODE rec[600];int length; system(“cls”);/*清屏*/ for(;;)/*无限循环*/ {switch(menu_select())/*根据用户的选择判断该调用哪个功能函数*/ { break;case 2:save(rec,length); } } break;break;break;break;break;break;case 3:length=load(rec);case 4:list1(rec,length);case 5:salor(rec,length);case 6:list2(rec,length);case 7:list3(rec,length);case 0:exit(0); case 1:length=enter(rec);int menu_select()/*菜单函数*/ { int n; printf(“********************MENU*****************nn”);printf(“ 1 输入便条n”);printf(“ 2 保存到文件n”);printf(“ 3 读取文件n”);printf(“ 4 显示便条清单n”); printf(“ 5 每位销售员的销售额n”);printf(“ 6 每种产品的销售额n”);printf(“ 7 按销售额对销售员排序n”);printf(“ 0 退出管理n”); printf(“*********************END****************nn”);printf(“ 请选择你的操作(0-7): n”);scanf(“%d”,&n);if(0 /*清单输入*/ int enter(RECODE t[]){ int i,num;system(“cls”);/*清屏*/ printf(“请输入要写的便条条数:n”); scanf(“%d”,&num);/*输入所要写入的清单的条数*/ printf(“name product1 product2 product3 product4 product5”);for(i=0;i } printf(“n----nnn”);return i;} /*保存文件*/ void save(RECODE t[],int n){ printf(“nn-----n”); scanf(“%d%d%d%d%d%d”,&t[i].name,&t[i].a1,&t[i].a2,&t[i].a3,&t[i].a4,&t[i].a5); int i; FILE *fp;/*调用fopen函数*/ if((fp=fopen(“record.txt”,“wb”))==NULL)/*如果函数带回一个空指针值*/ { printf(“不能打开文件n”);/*不能打开文件*/ exit(1);} fprintf(fp,“%d”,n);fprintf(fp,“rn”);for(i=0;i fprintf(fp,“%-10d%-7d%-7d%-7d%-7d%-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5);/*将便条的信息输出到fp指向的文件上*/ fprintf(fp,“rn”);} fclose(fp);/*关闭文件*/ printf(“****保存成功***nn”);/*显示保存成功*/ printf(“press any key to continue......n”);getchar();} /*读取文件*/ int load(RECODE t[]){ int i,n;FILE *fp; if((fp=fopen(“record.txt”,“r”))==NULL)/*如果函数带回一个空指针值*/ { printf(“不能打开文件n”);/*不能打开文件*/ exit(1);} fscanf(fp,“%d”,&n); for(i=0;i fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2), &(t[i].a3),&(t[i].a4),&(t[i].a5));/*从fp指向的文件上读入便条信息*/ fclose(fp); printf(“n 成功读取文件!!n”);/*成功读入信息*/ printf(“press any key to continue......nn”);getchar();return n;} /*显示清单*/ void list1(RECODE t[],int n){ int i;FILE *fp; if((fp=fopen(“record.txt”,“r”))==NULL)/*如果函数带回一个空指针值*/ { printf(“不能打开文件n”);/*不能打开文件*/ exit(1);} fscanf(fp,“%d”,&n);for(i=0;i fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2),&(t[i].a3),&(t[i].a4),&(t[i].a5));/*从fp指向的文件上读入便条信息*/ fclose(fp); printf(“***************************the recode**************************nnn”); printf(“name product1 product2 product3 product4 product5”);for(i=0;i printf(“ %d %d %d %d %d %d”,t[i].name,lise of saling t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5); } printf(“nn--n”);printf(“n press any key to continue.......n”);getchar();} /*每位销售员销售额*/ void salor(RECODE t[],int n){ int i,s; int b1=0,b2=0,b3=0,b4=0,b5=0; printf(“请输入要查询的销售员的代号(1-4): n”); scanf(“%d”,&s);/*输入所要查看的售货员的代号*/ for(i=0;i if(t[i].name==s){b1+=t[i].a1; b2+=t[i].a2; b3+=t[i].a3; b4+=t[i].a4; b5+=t[i].a5;} printf(“name product1 product2 product3 product4 product5n”); printf(“------------n”); printf(“%-15d%-10d%-10d%-7d%-7d%-7d”,s,b1,b2,b3,b4,b5); printf(“npress enter to continue.......n”); getchar(); } /*销售产品总和*/ int sum(RECODE t[],int n, int e){ int i,sum=0; for(i=0;i<=n;i++)/*求销售产品的总和*/ if(e==t[i].name) {sum+=t[i].a1;sum+=t[i].a2;sum+=t[i].a3;sum+=t[i].a4;sum+=t[i].a5;} return sum;} /*每种产品的销售额*/ void list2(RECODE t[],int n){ int i,j,sum0=0,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;int c[4],b1[4]={0},b2[4]={0},b3[4]={0},b4[4]={0},b5[4]={0};system(“cls”);;for(i=0;i<4;i++) c[i]=sum(t,n,i+1);/*求每个人的总销售额*/ for(i=0;i<4;i++) sum0+=c[i];/*所有产品的销售额*/ for(i=0;i for(i=0;i<4;i++)/*每种产品的总销售额*/ {sum1+=b1[i];sum2+=b2[i]; sum3+=b3[i];sum4+=b4[i];sum5+=b5[i];} printf(“ products numn”); printf(“ code sumnn”);for(i=0;i<4;i++) printf(“ %-10d%-7d%-7d%-7d%-7d%-7d%-7dn”,i+1,b1[i],b2[i],b3[i],b4[i],b5[i],c[i]);printf(“ psum %-7d%-7d%-7d%-7d%-7d%-7d”,sum1,sum2,sum3,sum4,sum5,sum0);printf(“n press any key to continue.......n”);getchar();} /*按销售额对销售员排序*/ void list3(RECODE t[],int n){ int i,j,s; int c[4],m[4];/*定义两个数组*/ system(“cls”);/*清屏*/ for(i=0;i<4;i++)m[i]=i+1;for(i=0;i<4;i++)c[i]=sum(t,n,m[i]); for(i=0;i<4;i++)/*按销售员的销售额进行排序*/ for(j=i+1;j<4;j++)if(c[i] } printf(“the sequce of salor'saling number from many to fewn”);for(i=0;i<4;i++)/*输出销售员代号*/ printf(“%dn”,m[i]); printf(“ninput any key to continue.......n”);getchar();} 销售 销售管理系统主要业务主要包括:客户管理、价格管理、信用管理、合同管理、出货管理以及贷款管理等 客户管理: 内容主要包括客户基础资料、客户特征、业务状况、交易现状 价格管理:使用历次售价、最新成本加成和按价格政策定价等三种价格依据。同 时,按价格政策定价时,支持商品促销价,可以按客户定价,也可以按存货定价。按存货定价时还支持按不同自由项定价。主要包括存货价格、客户价格、折扣政策、价格组。 信用管理: 信用管理的目标包括降低企业赊账的风险,减少坏账损失;降低销售 变现天数,加快流动资金周转。其内容包括客户资信调查、制定信用政策、管理客户资信、应收账款的管理。 合同管理: 合同管理主要是订单管理。订单管理,主要是根据客户需求和企业的 生产能力,制定企业的供货计划,接受客户订单,同时协调客户与内部各部门尤其是生产和储运部门的工作,确保销售订单按时完成,并做好后续服务等相关工作。其内容包括库存信息管理、存货和客户价格管理、信用审查、付款条件与期限管理。 出货管理: 分为发货管理、退货管理以及客户档案管理三部分。发货管理内容包 括发货单、出库单生成,发货方式管理,发货检验跟踪。客户档案管理又包括客户信息管理,发货地址管理,发、退货记录等内容。贷款管理: 以票据的方式管理客户的往来款,包括票据录入、客户贷款提现、转 账等。依据销售发货单开具销售发票,发票审核后即可确认收入,形成应收账款,在应收款管理系统可以查询和制单,并据此收款。开出销售发票向客户催收销售货款,并将发票转给财务部门记账。 各功能模块分析 销售管理子系统包含5个功能模块,分别为销售基础资料模块,收发货管理模块,销售计划管理模块,销售服务管理模块,销售订单管理模块,具体说明如下: 销售基础数据:基础数据是指与销售相关的基本资料包括费用定义、销售佣金、销售员资料、客户资料、订单取消原因、退货原因、交货方式、订货方式、价格种类、客户组别、销售类型等; 收发货管理:其主要功能包括销售过账,发票维护,差价维护,退、换货通知,发货通知等;销售计划管理:包括销售计划的合并与维护两部分; 销售服务管理:主要是与销售服务相关过程的维护,包括销售服务记录,服务过 程记录,销售政策发布,销售网点维护与服务跟踪; 销售订单管理:主要是对合同相关及客户信用相关的功能。包括销售计划,产品 系列维护,信用管理,销售价格维护,订单、合同终止结清,订单、合同维护等。 报告正文 1、题目与要求: 1.1 某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当日出售的每种产品各写一张便条交上来。每张便条内容有 销售员的代号 产品的代号 这种产品当天的销售额 1.2 每位销售员每天可能上缴0-5张便条。假设手机到了上个月的所有便条,编写一个处理系统,读取上月的销售情况(自己设定),进行如下处理: 计算上个月没人每种产品的销售额 按销售额对销售员进行排序,输出排序结果(销售员代号) 统计每种产品的总销售额,对这些产品从高到低的顺序输出结果(须输出产品的代号和销售额) 输出统计报表 2、需求分析 本程序将用到文件系统,list.txt文件内容作为数据源,其中单行内容代表一张纸条。程序运行后首先将文件系统的原始数据读取并保存到程序的结构体数组当中,所以应提供文件输入的操作;由于纸条数据零散,所以要对原始数据进行分类操作并提供一个数组用于保存分类信息;在程序中要进行统计工作,所以要提供显示、排序等操作;另外应提供键盘式选择菜单实现功能选择。 3、功能实现设计 3.1总体设计 根据上面的分析,可以将这个系统分为如下五大模块:查看每人每种产品的销售额、按销售额对销售员排序、对每种产品总销售额从高到低排序、输出统计报表和退出。其中主要模块是前四个模块。 3.2流程图 3.3详细设计: 3.3.1【头文件和预定义】 #include #include 原始数据有销售员代号、产品代号和销售额,所以定义一个全局结构体数组scrip用于保存原始数据。然后定义全局变量n保存纸条数目,定义数组s用于保存分类后的信息。struct ss { int sid;//销售员代号 int pid;//产品代号 int sn;//销售额 }ss[M];int n;//纸条数目 int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存员工和产品信息 3.3.4【主函数】 显示程序设计者相关信息和调用文件读取函数、数据初始化函数和主菜单函数 void main()//入口函数,即主函数 { readdata();//读取文件数据 foreach();//根据文件初始数据初始化便于操作的数组 menu();//显示主菜单 } 3.3.4-1【文件读取函数】readdata()读出便条中的内容,并保存到文件结构体中 void readdata()//从文件读取数据 { FILE *fp;if((fp=fopen(“list.txt”,“r”))==NULL){ printf(“Can't open the file!n”); exit(0);} else for(n=0;!feof(fp);n++) { fscanf(fp,“%d %d %dn”,&ss[n].sid,&ss[n].pid,&ss[n].sn); } //保存文件数据到结构体 fclose(fp);} 3.3.4-2【文件读取函数】foreach()将保存到结构体中的信息按产品分类,再根据销售员进行分类,将信息存到数组当中。 void foreach()//从纸条读取数据并分类整理 { int i;for(i=0;i { switch(ss[i].pid) //按产品分大类,根据大类分销售员小类,累加个人各产品销售数量 { case 1: switch(ss[i].sid) { case 1:s[0][0]+=ss[i].sn;break; case 2:s[1][0]+=ss[i].sn;break; case 3:s[2][0]+=ss[i].sn;break; case 4:s[3][0]+=ss[i].sn;break; } break; case 2: switch(ss[i].sid) { case 1:s[0][1]+=ss[i].sn;break; case 2:s[1][1]+=ss[i].sn;break; case 3:s[2][1]+=ss[i].sn;break; case 4:s[3][1]+=ss[i].sn;break; } break; case 3: switch(ss[i].sid) { case 1:s[0][2]+=ss[i].sn;break; case 2:s[1][2]+=ss[i].sn;break; case 3:s[2][2]+=ss[i].sn;break; case 4:s[3][2]+=ss[i].sn;break; } break; case 4: switch(ss[i].sid) { case 1:s[0][3]+=ss[i].sn;break; case 2:s[1][3]+=ss[i].sn;break; case 3:s[2][3]+=ss[i].sn;break; case 4:s[3][3]+=ss[i].sn;break; } break; case 5: switch(ss[i].sid) { case 1:s[0][4]+=ss[i].sn;break; case 2:s[1][4]+=ss[i].sn;break; case 3:s[2][4]+=ss[i].sn;break; case 4:s[3][4]+=ss[i].sn;break; }; break;} } } 3.3.4-3【主菜单函数】menu()显示系统功能菜单以供用户选择相关功能使用,根据用户选择分别可调用 detail():计算上个月每个人每种产品的销售额 seller():按销售额对销售员进行排序,输出排序结果(销售员代号)product():统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序结果(需输出产品代号和销售额)exit(0):退出系统 void menu(){ int w,c;do{ puts(“tt*********菜单*********************nn”);puts(“tt 1.查看每人每种产品的销售额n”);puts(“tt 2.按销售额对销售员排序(销售员代号)n”);puts(“tt 3.对每种产品总销售额从高到低排序(产品代号和销售额)n”);puts(“tt 4.输出统计报表n”);puts(“tt 5.退出n”);puts(“nntt*********************************************n”);printf(“请选择(1-5):[ ]bb”);scanf(“%d”,&c);if(c<1||c>5)//错误输入则重新获取输入 { w=1;getchar();} else w=0;} while(w==1); switch(c)//根据输入实现相应函数调用 { case 1: detail();break;//每个销售员每种产品的销售额统计 case 2: seller();break;case 3: product();break;case 4: total();break;case 5: exit(0);} } 3.3.5【功能函数】 5-1【每人每种产品销售额统计函数】detail()计算上个月每个人每种产品的销售额 void detail()//显示销售情况 { int i,j;for(i=0;i<4;i++)//遍历销售员 { printf(“ntt%d号销售员销售情况:n”,i+1); for(j=0;j<5;j++) //按销售员分类遍历所有产品并显示信息 printf(“tt%d号产品销售数量:%dn”,j+1,s[i][j]); } choice();} 3.3.5-1【销售员销售业绩排序函数】seller()按销售额对销售员进行排序,输出排序结果(销售员代号)void seller(){ int i,j,k;int sp[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(“tt第%d名是%d号销售员!n”,i+1,k+1);sp[k]=-1; //输出最大数和排名,将最大数标记为负 } choice();} 3.3.5-2【总销售额统计函数】void product()统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序 void product()//与seller()原理一样,用于对产品进行统计 { int i,j,k;int p[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(“tt第%d名是%d号产品!t销量为%d!n”,j+1,k+1,p[k]);p[k]=-1; } choice();} 3.3.5-3【统计报表输出函数】total()统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序结果(需输出产品代号和销售额) void total()//输出报表 { int i,j;printf(“nt销售员t产品t销量n”);for(i=0;i<4;i++) for(j=0;j<5;j++) printf(“t %dt %dt %dn”,i+1,j+1,s[i][j]);choice();} 3.3.6【公共函数】 【选择函数】choice()选择退出系统或则返回主菜单 void choice()//用于输出信息功能选择 { int c;printf(“请选择接下来想做什么t1>返回菜单t2>退出系统scanf(”%d“,&c);if(c==1)menu();else exit(0);puts('n');} 4、运行结果(附带抓图) List.txt(便条)文件中数据如下: 2 3 4 1 [ ]bb”);3 运行结果 显示主菜单: 查看每人每种产品的销售额运行结果: 按销售额对销售员排序运行结果: 对每种产品销售额从高到低排序运行结果: 统计报表运行结果: 5、总结 通过这次C程序设计,我掌握了模块化设计方法,能够深入的理解结构化程序设计思想,熟练运用结构化程序设计方法,提高了运用C语言进行程序设计的能力。此外我还熟悉了,对于文件读写的操作。更重要的是对程序的调试有了显著的提高。我发现我对程序的设计越来越感兴趣了,我决定今后在这一方面下一番功夫,取得一些成绩。 6、源程序 #include int pid;//产品代号 int sn; //销售额 }ss[M];int n; //纸条数目 int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存员工和产品信息 void main()//入口函数,即主函数 { p readdata();//读取文件数据 foreach(); //根据文件初始数据初始化便于操作的数组 menu(); //显示主菜单 } void readdata() //从文件读取数据 { FILE *fp;if((fp=fopen(“list.txt”,“r”))!=NULL){ printf(“Can't open the file!n”); exit(0);} else for(n=0;!feof(fp);n++) { fscanf(fp,“%d %d %dn”,&ss[n].sid,&ss[n].pid,&ss[n].sn); } //保存文件数据到结构体 fclose(fp);} void foreach() //从纸条读取数据并分类整理 { int i;for(i=0;i //遍历所有纸条 { switch(ss[i].pid) //按产品分大类,根据大类分销售员小类,累加个人各产品销售数量 { case 1: switch(ss[i].sid) { case 1:s[0][0]+=ss[i].sn;break; case 2:s[1][0]+=ss[i].sn;break; case 3:s[2][0]+=ss[i].sn;break; case 4:s[3][0]+=ss[i].sn;break; } break; case 2: switch(ss[i].sid) { case 1:s[0][1]+=ss[i].sn;break; case 2:s[1][1]+=ss[i].sn;break; case 3:s[2][1]+=ss[i].sn;break; case 4:s[3][1]+=ss[i].sn;break; } break; case 3: switch(ss[i].sid) { case 1:s[0][2]+=ss[i].sn;break; case 2:s[1][2]+=ss[i].sn;break; case 3:s[2][2]+=ss[i].sn;break; case 4:s[3][2]+=ss[i].sn;break; } break; case 4: switch(ss[i].sid) { case 1:s[0][3]+=ss[i].sn;break; case 2:s[1][3]+=ss[i].sn;break; case 3:s[2][3]+=ss[i].sn;break; case 4:s[3][3]+=ss[i].sn;break; } break; case 5: switch(ss[i].sid) { case 1:s[0][4]+=ss[i].sn;break; case 2:s[1][4]+=ss[i].sn;break; case 3:s[2][4]+=ss[i].sn;break; case 4:s[3][4]+=ss[i].sn;break; }; break; } } } void menu(){ int w,c;do{ puts(“tt********************菜单*********************nn”); puts(“tt 1.查看每人每种产品的销售额n”); puts(“tt 2.按销售额对销售员排序(销售员代号)n”); puts(“tt 3.对每种产品总销售额从高到低排序(产品代号和销售额)n”); puts(“tt 4.输出统计报表n”); puts(“tt 5.退出n”); puts(“nntt*********************************************n”); printf(“请选择(1-5):[ ]bb”); scanf(“%d”,&c); if(c<1||c>5) //错误输入则重新获取输入 { w=1; getchar(); } else w=0;} while(w==1); switch(c) //根据输入实现相应函数调用 { case 1: detail();break;//每个销售员每种产品的销售额统计 case 2: seller();break;case 3: product();break;case 4: total();break;case 5: exit(0); } } void detail() //显示销售情况 { int i,j; for(i=0;i<4;i++) //遍历销售员 { printf(“ntt%d号销售员销售情况:n”,i+1); for(j=0;j<5;j++) //按销售员分类遍历所有产品并显示信息 printf(“tt%d号产品销售数量:%dn”,j+1,s[i][j]); } choice();} void seller(){ int i,j,k;int sp[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(“tt第%d名是%d号销售员!n”,i+1,k+1);sp[k]=-1; //输出最大数和排名,将最大数标记为负 } choice();} void product() //与seller()原理一样,用于对产品进行统计 { int i,j,k;int p[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(“tt第%d名是%d号产品!t销量为%d!n”,j+1,k+1,p[k]);p[k]=-1;} choice();} void total() //输出报表 { int i,j;printf(“nt销售员t产品t销量n”);for(i=0;i<4;i++) for(j=0;j<5;j++) printf(“t %dt %dt %dn”,i+1,j+1,s[i][j]); choice();} void choice() //用于输出信息功能选择 { int c;printf(“请选择接下来想做什么t1>返回菜单t2>退出系统 [ ]bb”);scanf(“%d”,&c);if(c==1)menu();else exit(0);puts('n');} 金蝶ERP操作手册 销售管理系统 操 作 手 册 慈溪市联创软件有限公司 2014年10月 金蝶ERP操作手册 进入销售管理 1、销售订单 1.1 新增 操作:供应链——》销售管理——》销售订单——》销售订单-新增 1)双击“销售订单—新增”打开“销售订单” 2)光标依次定位在“购货单位”、“销售方式”处,按F7或点击工具条上的“查看”按钮,弹出“条件过滤”窗口,根据具体情况选择销售方式式和客户,单击确定即可; 3)在产品代码项上,按F7或点击工具条上的“查看”按钮,弹出“核算项目—物料”窗口 金蝶ERP操作手册 4)选择你要销售商品的名称,双击该名称,返回销售订单窗口,在该订单的物料处填入数量、单价等信息。 填入交货日期,最后在部门、业务员项上按F7或点击工具条上的“查看”按钮选择正确的选项,最后单击保存按钮保存。 1.2 维护 操作:供应链——》销售管理——》销售订单——》销售订单-维护 1)双击“销售订单-维护”打开“条件过滤”窗口,过滤选项根据视具体的情况选择,点击确定,进入销售订单序时簿。 金蝶ERP操作手册 2)销售订单序时簿中会列出你所有过滤条件下的订单,在这里查看销售订单详细情况,并确认产品的数量、单价等相关信息无误后,点击工具条的“审核”按钮,弹出审核是否成功提示信息,当提示审核成功后会在销售订单序时簿该销售订单的审核标志字段处打上Y的已审核标志;同时,对销售可以进变更、修改、删除等操作。 2、发货通知单。 2.1 新增 操作:供应链——》销售管理——发货通知》发货通知单-新增 1)双击“发货通知单—新增”打开“发货通知单” 2)光标定位在“源单类型”处,选择销售订单,然后在选单号处,按F7或点击工具条上的“查看”按钮,弹出“条件过滤”窗口,根据具体情况选择过滤条件等选项,单击确定,弹出“销售订单序时簿” 金蝶ERP操作手册 3)窗口中出现的是已经审核并且未关闭的销售订单,选择要关联的销售订单,双击该销售订单,系统就会把该销售订单的信息带回到“发货通知单 ”窗口上来 2.2 维护 操作:供应链——》销售管理——发货通知》发货通知单-维护 金蝶ERP操作手册 1)双击“发货通知单维护”打开“条件过滤”窗口,在审核标志处选择未审核,其他选项根据具体的情况选择,点击确定,进入发货通知单序时簿 2)发货通知单序时簿中会列出你所有过滤条件下的发货通知单,在这里查看到根据销售订单要发货的详细情况,并确认发货产品的数量、规格等相关信息无误后,点击工具条的“审核”按钮,弹出审核是否成功提示信息,当提示审核成功后会在发货通知单序时簿的审核标志字段处打上Y的已审核标志;同时,对发货通知单可以进变更、修改、删除等操作。 3、销售出库单。3.1 新增 操作:供应链——》销售管理——销售出库单》销售出库单-新增 1)双击“销售出库单—新增”打开“销售出库单”录入界面 2)光标定位在“源单类型”处,选择发货通知单,然后在选单号处,按金蝶ERP操作手册 F7或点击工具条上的“查看”按钮,弹出“条件过滤”窗口,根据具体情况选择过滤条件等选项,单击确定,弹出“发货通知单序时簿” 3)窗口中出现的是已经审核并且未关闭的发货通知单,选择要关联的发货通知单,双击该发货通知单,系统就会把该发货通知单的信息带回到“销售出库单 ”窗口上来 3.2 维护 操作:供应链——》销售管理——销售出库》销售单-维护 1)双击“销售出库单维护”打开“条件过滤”窗口,在审核标志处选择未审核,其他选项根据具体的情况选择,点击确定,进入销售出库单序时簿 金蝶ERP操作手册 2)销售出库单序时簿中会列出你所有过滤条件下的销售出库单,在这里查看到根据发货通知单产生的销售出库单,并确认出库产品的数量、规格等相关信息无误后,点击工具条的“审核”按钮,弹出审核是否成功提示信息,当提示审核成功后会在销售出库单序时簿的审核标志字段处打上Y的已审核标志;同时,对销售出库单可以进修改、删除等操作。 4、销售开票 4.1新增: 1)供应链——》销售管理——》销售发票——》新增,双击。 2)在“源单类型”里选择销售出库,“选单号”里按F7,弹出“条件过滤”窗口,根据需要的条件选择对应的销售出库单。金蝶ERP操作手册 3)选择需要生成发票的销售出库单,点击返回后弹回销售发票界面,确认无误后保存。 4.2维护 1)双击“销售发票维护”打开“条件过滤”窗口,在审核标志处选择未审核,其他选项根据具体的情况选择,点击确定,进入销售发票序时簿 在过滤出的销售发票里选择需要审核的销售发票,点击审核。在弹出审核成金蝶ERP操作手册 功后,审核人和审核标记列里会显示审核人的名字和Y字样,说明审核成功; 对未审核的单据,可以进行修改、删除等操作。 5、收款单 5.1新增: 1)财务会计——》应收款管理——》收款--收款单》新增,双击。 2)在“源单类型”里选择销售发票,“选单号”里按F7,弹出“条件过滤”窗口,根据需要的条件选择对应的销售发票 3)选择需要生成发票的销售发票,点击返回后弹回收款单界面,确认无误后保存。 5.2维护 金蝶ERP操作手册 1)双击“收款单维护”打开“条件过滤”窗口,在审核标志处选择未审核,其他选项根据具体的情况选择,点击确定,进入收款单序时簿 在过滤出的收款单序时簿里选择需要审核的付款单,点击审核。在弹出审核成功后,审核人和审核标记列里会显示审核人的名字和Y字样,说明审核成功; 对未审核的单据,可以进行修改、删除等操作 至此,由销售订单-》发货通知单-》销售出库单-》销售发票-》收款单(应收系统)整体操作流程及步骤完毕,如果不完善之处,敬请指教! 报告正文 1、题目与要求: 1.1 某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当日出售的每种产品各写一张便条交上来。每张便条内容有 销售员的代号 产品的代号 这种产品当天的销售额 1.2 每位销售员每天可能上缴0-5张便条。假设手机到了上个月的所有便条,编写一个处理系统,读取上月的销售情况(自己设定),进行如下处理: 计算上个月没人每种产品的销售额 按销售额对销售员进行排序,输出排序结果(销售员代号) 统计每种产品的总销售额,对这些产品从高到低的顺序输出结果(须输出产品的代号和销售额) 输出统计报表 2、需求分析 本程序将用到文件系统,list.txt文件内容作为数据源,其中单行内容代表一张纸条。程序运行后首先将文件系统的原始数据读取并保存到程序的结构体数组当中,所以应提供文件输入的操作;由于纸条数据零散,所以要对原始数据进行分类操作并提供一个数组用于保存分类信息;在程序中要进行统计工作,所以要提供显示、排序等操作;另外应提供键盘式选择菜单实现功能选择。 3、功能实现设计 3.1总体设计 根据上面的分析,可以将这个系统分为如下五大模块:查看每人每种产品的销售额、按销售额对销售员排序、对每种产品总销售额从高到低排序、输出统计报表和退出。其中主要模块是前四个模块。 3.2流程图 3.3详细设计: 3.3.1【头文件和预定义】 #include #include 原始数据有销售员代号、产品代号和销售额,所以定义一个全局结构体数组scrip用于保存原始数据。然后定义全局变量n保存纸条数目,定义数组s用于保存分类后的信息。struct ss { int sid;//销售员代号 int pid;//产品代号 int sn;//销售额 }ss[M];int n;//纸条数目 int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存员工和产品信息 3.3.4【主函数】 显示程序设计者相关信息和调用文件读取函数、数据初始化函数和主菜单函数 void main()//入口函数,即主函数 { readdata();//读取文件数据 foreach();//根据文件初始数据初始化便于操作的数组 menu();//显示主菜单 } 3.3.4-1【文件读取函数】readdata()读出便条中的内容,并保存到文件结构体中 void readdata()//从文件读取数据 { FILE *fp;if((fp=fopen(“list.txt”,“r”))==NULL){ printf(“Can't open the file!n”); exit(0);} else for(n=0;!feof(fp);n++) { fscanf(fp,“%d %d %dn”,&ss[n].sid,&ss[n].pid,&ss[n].sn); } //保存文件数据到结构体 fclose(fp);} 3.3.4-2【文件读取函数】foreach()将保存到结构体中的信息按产品分类,再根据销售员进行分类,将信息存到数组当中。 void foreach()//从纸条读取数据并分类整理 { int i;for(i=0;i { switch(ss[i].pid) //按产品分大类,根据大类分销售员小类,累加个人各产品销售数量 { case 1: switch(ss[i].sid) { case 1:s[0][0]+=ss[i].sn;break; case 2:s[1][0]+=ss[i].sn;break; case 3:s[2][0]+=ss[i].sn;break; case 4:s[3][0]+=ss[i].sn;break; } break; case 2: switch(ss[i].sid) { case 1:s[0][1]+=ss[i].sn;break; case 2:s[1][1]+=ss[i].sn;break; case 3:s[2][1]+=ss[i].sn;break; case 4:s[3][1]+=ss[i].sn;break; } break; case 3: switch(ss[i].sid) { case 1:s[0][2]+=ss[i].sn;break; case 2:s[1][2]+=ss[i].sn;break; case 3:s[2][2]+=ss[i].sn;break; case 4:s[3][2]+=ss[i].sn;break; } break; case 4: switch(ss[i].sid) { case 1:s[0][3]+=ss[i].sn;break; case 2:s[1][3]+=ss[i].sn;break; case 3:s[2][3]+=ss[i].sn;break; case 4:s[3][3]+=ss[i].sn;break; } break; case 5: switch(ss[i].sid) { case 1:s[0][4]+=ss[i].sn;break; case 2:s[1][4]+=ss[i].sn;break; case 3:s[2][4]+=ss[i].sn;break; case 4:s[3][4]+=ss[i].sn;break; }; break;} } } 3.3.4-3【主菜单函数】menu()显示系统功能菜单以供用户选择相关功能使用,根据用户选择分别可调用 detail():计算上个月每个人每种产品的销售额 seller():按销售额对销售员进行排序,输出排序结果(销售员代号)product():统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序结果(需输出产品代号和销售额)exit(0):退出系统 void menu(){ int w,c;do{ puts(“tt*********菜单*********************nn”);puts(“tt 1.查看每人每种产品的销售额n”);puts(“tt 2.按销售额对销售员排序(销售员代号)n”);puts(“tt 3.对每种产品总销售额从高到低排序(产品代号和销售额)n”);puts(“tt 4.输出统计报表n”);puts(“tt 5.退出n”);puts(“nntt*********************************************n”);printf(“请选择(1-5):[ ]bb”);scanf(“%d”,&c);if(c<1||c>5)//错误输入则重新获取输入 { w=1;getchar();} else w=0;} while(w==1); switch(c)//根据输入实现相应函数调用 { case 1: detail();break;//每个销售员每种产品的销售额统计 case 2: seller();break;case 3: product();break;case 4: total();break;case 5: exit(0);} } 3.3.5【功能函数】 5-1【每人每种产品销售额统计函数】detail()计算上个月每个人每种产品的销售额 void detail()//显示销售情况 { int i,j;for(i=0;i<4;i++)//遍历销售员 { printf(“ntt%d号销售员销售情况:n”,i+1); for(j=0;j<5;j++) //按销售员分类遍历所有产品并显示信息 printf(“tt%d号产品销售数量:%dn”,j+1,s[i][j]); } choice();} 3.3.5-1【销售员销售业绩排序函数】seller()按销售额对销售员进行排序,输出排序结果(销售员代号)void seller(){ int i,j,k;int sp[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(“tt第%d名是%d号销售员!n”,i+1,k+1);sp[k]=-1; //输出最大数和排名,将最大数标记为负 } choice();} 3.3.5-2【总销售额统计函数】void product()统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序 void product()//与seller()原理一样,用于对产品进行统计 { int i,j,k;int p[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(“tt第%d名是%d号产品!t销量为%d!n”,j+1,k+1,p[k]);p[k]=-1; } choice();} 3.3.5-3【统计报表输出函数】total()统计每种产品的总销售额,对这些产品按从高到低的顺序输出排序结果(需输出产品代号和销售额) void total()//输出报表 { int i,j;printf(“nt销售员t产品t销量n”);for(i=0;i<4;i++) for(j=0;j<5;j++) printf(“t %dt %dt %dn”,i+1,j+1,s[i][j]);choice();} 3.3.6【公共函数】 【选择函数】choice()选择退出系统或则返回主菜单 void choice()//用于输出信息功能选择 { int c;printf(“请选择接下来想做什么t1>返回菜单t2>退出系统scanf(”%d“,&c);if(c==1)menu();else exit(0);puts('n');} 4、运行结果(附带抓图) List.txt(便条)文件中数据如下: 2 3 4 1 [ ]bb”);3 运行结果 显示主菜单: 查看每人每种产品的销售额运行结果: 按销售额对销售员排序运行结果: 对每种产品销售额从高到低排序运行结果: 统计报表运行结果: 5、总结 通过这次课程设计,我掌握了模块化设计方法,能够深入的理解结构化程序设计思想,熟练运用结构化程序设计方法,提高了运用C语言进行程序设计的能力。此外我还熟悉了,对于文件读写的操作。更重要的是对程序的调试有了显著的提高。我发现我对程序的设计越来越感兴趣了,我决定今后在这一方面下一番功夫,取得一些成绩。第二篇:销售管理系统
第三篇:C语言课程设计销售管理系统报告
第四篇:销售管理系统操作手册
第五篇:销售管理系统报告