程序设计课程设计报告.docx
《程序设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《程序设计课程设计报告.docx(30页珍藏版)》请在冰点文库上搜索。
程序设计课程设计报告
程序设计课程设计报告
(2012--2013年度第一学期)
销售管理系统
专业
计算机科学与技术
学生姓名
班级
\
学号
\
指导教师
\
完成日期
\
目录
1概述1
1.1课程设计目的1
1.2课程设计内容1
2系统总体设计2
2.1系统目标2
2.2主体功能2
2.3系统流程3
2.4开发环境3
3系统详细设计3
3.1系统主界面设计3
3.2统计功能模块设计4
3.3人员排序功能模块设计5
3.4产品排序功能模块设计5
3.5输出功能模块设计6
4测试6
4.1测试方案6
4.2测试结果6
5小结9
参考文献10
附录11
附录1源程序清单11
附录1.1统计功能模块源程序17
附录1.2人员排序功能模块源程序18
附录1.3产品排序功能模块源程序19
附录1.4输出功能模块源程序20
销售管理系统的设计与实现
1概述
1.1课程设计目的
1、巩固并加深对C语言程序设计知识的理解;
2、掌握和提高C语言编程和程序调试的基本技能;
3、进一步理解和运用结构化程序设计的思想和方法;
4、提高运用C语言解决实际问题的能力;
5、初步掌握开发小型实用软件的基本方法;
6、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
1.2课程设计内容
课程名称:
销售管理系统
说明:
某公司有四个销售员(编号:
1-4),负责销售五种产品(编号:
1-5)。
每个销售员都将每天出售的每种商品各写一张便条交上来。
每张便条包含内容:
销售员代号;产品的代号;这种产品的当天的销售额。
每位销售员每天的可能上交0-5张便条。
假设,收集到了上个月的所有便条,编写一个处理系统,读取上个月的销售情况(自己设定),进行处理。
要求:
1)计算上个月每个人每种产品的销售额;
2)按销售额对销售员进行排序,输出排序结果(销售员代号);
3)统计每种产品的总销售额,对这些产品按从高到低的顺序,输出排序结果(需输出产品的代号和销售额);
4)输出统计报表
销售统计报表
销售员代号产品代号销售之和
12345
1
2
3
4
每种产品之和
2系统总体设计
2.1系统目标
销售管理系统是为了方便管理者了解产品销售情况、检索相关产品资料、制定出更好的销售方案,系统管理员可以进行用户管理。
为了提高系统的工作效率和工作质量,系统开发要做到以下几点:
a)纸条中数据的输入(该系统的程序将运用到文件系统,其中单行数据内容是一张纸条上的数据,通过运行文件系统,将原始数据读取并保存到源程序中的结构体数组中);
b)程序需要达到的功能(因为纸条中的数据很零乱,不易输入,所以要先将其中的数据分类,并且要将其保存起来,要有保存的功能;数据输入后要将其统计出来,因此还要有显示、排序、选择的功能);
2.2主体功能
图2-1系统功能模块图
2.3系统流程
Y
N
图2-2系统总体流程图
2.4开发环境
这个程序的开发环境是TurboC.
3系统详细设计
3.1系统主界面设计
主界面的函数设计:
从main()函数中system(“cls”);menu();进入函数,执行完所有的函数后自动退出该函数,其中system(“cls”)是清屏命令,menu()是菜单函数,用来提示用户如何选择。
函数调用关系:
直接被主函数调用,并在文中无返回值的空值void函数。
功能描述:
显示出菜单让用户选择,并提示该如何操作,体现了模块化的思想。
图3-1主菜单界面截图
3.2统计功能模块设计
注:
统计模块就是计算每人每种产品的销售额模块
统计功能模块设计:
当主函数的switch()开关结构中的choice==1时开始,打开数据文件,提示用户通过键盘对该月的员工销售情况进行输入,然后通过提示语:
printf(“继续输入请按回车键,结束进程请按esc\n”),进行提示,如果选择了“esc”,就结束对数据的输入,跳出switch()开关函数,接着执行下面的循环结构。
函数调用关系:
被主函数调用,由开关结构进去,并在文中无返回值的空值void函数。
图3-2统计模块界面截图
图3-3统计功能模块流程图
3.3人员排序功能模块设计
注:
人员排序功能模块功能就是按销售额对销售员的排序
人员排序功能模块设计:
当主函数的switch()开关结构中的choice==2时开始,首先用fopen()打开文件,用fread()读取二进制数据,然后运用选择排序法对销售员进行排序,最后排序结果将会出现到屏幕上,通过break跳出switch()开关函数,继续执行for循环结构。
函数调用关系:
被主函数调用,由开关结构进去,并在文中无返回值的空值void函数。
3.4产品排序功能模块设计
注:
产品排序功能模块就是按销售额从高到低对产品排序
产品排序模块设计:
当主函数的switch()开关结构中的choice==3时开始,统计每种产品的总销售额,然后进行排序,最后将结果用标准输出函数输出,通过break跳出switch()开关函数,继续执行for循环结构。
函数调用关系:
被主函数调用,由开关结构进去,并在文中无返回值的空值void函数。
3.5输出功能模块设计
注:
输出功能模块就是输出统计报表
输出功能模块设计:
当主函数的switch()开关结构中的choice==4时开始,通过fopen()函数打开文件,进行数据处理,开始读取数据后,报表已显示出来,通过break跳出switch()开关函数,继续执行for循环结构。
函数调用关系:
被主函数调用,由开关结构进去,并在文中无返回值的空值void函数。
4测试
4.1测试方案
打开TurboC,先将各个功能函数的的内容清空,只保留main(),然后编译检验main()函数中是否有错,确认main()函数一切无误后,然后加入功能函数menu()函数与f1()函数,由于menu()函数比较简单,所以与f1()函数一起进行调试,f1()函数中主要注意读取文件、写入文件,都是二进制的形式。
若menu()函数与f1()函数编译、连接、运行没问题,继续加入f2()函数,就这样的方法依次检查调试f3()函数、f4()函数。
当所有的功能函数都加上且正确无误时,就可以进入下一个环节—程序的测试。
4.2测试结果
图4-1主菜单输出结果
图4-2统计模块输出结果
图4-3销售员排序结果
图4-4产品排序结果
图4-5输出统计报表结果
在调试中遇到的问题:
问题1:
标点符号在输入的时候,使用的是中文输入法,这种错误一般都难以发现,让修改的时候找不到目标。
解决方法:
用“替换”。
如果程序中的error很多,不管error是什么,先将标点替换成英文的标点。
问题2:
调试时,有的时候编译后没什么问题,就是在点击连接link时出现了问题。
解决方法:
将源程序保存(save),然后关掉win-tc,重新启动win-tc。
问题3:
输入时,scantf()函数中出现非地址项,某变量未进行类型定义,以及语句末尾缺少分号等常见的低等错误。
解决方案:
根据TurboC的错误提示(error)与警告(warning)回到源程序中,逐一对错误或警告进行修改,每修改一条就编译一次。
5小结
经过两周时间的C语言课程设计实践学习,使我对c语言有了进一步的认识和了解。
刚开始拿到这个课题时,曾经觉得很茫然,因为C语言是大一上学期学的,感觉只了解到它的表层,而这次课题竟然要我们自己动手设计一个系统的源程序,不过经过几天的去图书馆还有上网查找资料,自己头脑中有了些想法,不过即使有想法,也只能通过借鉴图书馆里的书,或者是网上的资料来帮助我表达出来程序,最终勉强完成了设计!
通过实践,我发现我的好多不足之处,在敲打源程序时,很不熟练,经常按错字母;还有对c语言的一些标准库函数还有函数的调用不太了解,经过锻炼,粗略的复习了C语言的基本知识:
数据类型、运算类型、程序结构、画功能模块图,系统流程图等。
我认为要学好c语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。
只有这样我们学到的知识才能更好地运用到实践。
参考文献
[1]谭浩强等.C语言程序设计教程.北京:
高等教育出版社,1997
[2]谭浩强.C程序设计.第2版.北京:
清华大学出版社,1999
[3]郭浩志.C语言程序设计.北京.北京邮电大学出版社,2005
[4]《C陷阱与缺陷》.北京:
人民邮电出版社,2008
[5]谭浩强、张基温.C语言程序设计教程.北京:
高等教育出版社,2006
[6]《C程序设计经典教程》.北京:
清华大学出版社,2006
附录
附录1源程序清单
#include
#include
#include
#include
#defineZ5
#defineR4/*定义宏常量便于程序的一般化*//*R表示销售员个数*/
typedefstruct/*缩短结构体变量名*/
{intshangpin[Z];/*定义结构体便于信息的存储和读写,辨别*/
}data;/*R是表示商品的种类,最后一个为该销售员商品总和*/
voidmenu()
{system("cls");/*清屏命令*/
printf("\n\n");
printf("\t┏━━━━━━━━━━━━主菜单━━━━━━━━━━┓\n");
printf("\t┃1.计算上个月每个人每种产品的销售额┃\n");
printf("\t┃2.按销售额对销售员进行排序,输出排序结果┃\n");
printf("\t┃3.统计每种产品的总销售额,输出排序结果┃\n");
printf("\t┃4.输出统计报表┃\n");
printf("\t┃5.结束操作┃\n");
printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
voidf1(data*x)/*计算上个月每个人每种产品的销售额*/
{FILE*fp;
charfname[10],hitkey;
intj,t;/*用于控制循环*/
inti,k,s;/*用于定义职工序号,产品序号,产品数量*/
system("cls");/*清屏命令*/
printf("您想计算哪个月?
\n");
printf("请输入月份:
");/*输入文件名,这样可以进行各个月份信息写入*/
scanf("%s",fname);
strcat(fname,".dat");
if((fp=fopen(fname,"wb"))==NULL)/*打开文件*/
{printf("不能打开文件!
!
!
\n");
exit(0);/*正常exit(0);结束程序*/
}
for(j=0;jfor(t=0;t(x+j)->shangpin[t]=0;
printf("请输入:
\n职工编号产品编号销售数量\n");/*提示用户写入信息的格式*/
for(j=0;hitkey!
=27;j++)
{scanf("%d%d%d",&i,&k,&s);
if(i>R||i<0||k>Z||k<0)
{printf("信息错误!
\n");/*提示语,避免输入信息出错*/
continue;
}
else
(x+i-1)->shangpin[k-1]=(x+i-1)->shangpin[k-1]+s;/*统计各个人的各种产品的数量,-1为了和数组中的序号相匹配*/
printf("继续输入请按回车,结束输入请按esc\n");
printf("━━━━━━━━━━━━━━━━━━━━━━\n");
hitkey=getch();
for(;hitkey!
=13&&hitkey!
=27;)
hitkey=getch();
}
for(j=0;jif(fwrite((x+j),sizeof(data),1,fp)!
=1)/*把信息写入文件中便有以后调用*/
printf("writeerror!
\n");
fclose(fp);/*关闭文件避免信息遗漏*/
printf("\n\n\n\n\n\n\t\t\t保存成功,按任意键返回主菜单!
");
getch();
}
voidf2(data*x)/*按销售额对销售员进行排序,输出排序结果*/
{FILE*fp;
charfname[10];
inti,k,j,t,bianhao[R]={0},z;
system("cls");/*清屏命令*/
printf("你要哪个月的?
\n");
printf("请输入月份:
");/*输入文件名,这样可以进行各个月份信息读入*/
scanf("%s",fname);
strcat(fname,".dat");
if((fp=fopen(fname,"rb"))==NULL)/*打开文件*/
{printf("不能打开文件!
!
!
\n");
exit(0);
}
for(i=0;iif(fread(x+i,sizeof(data),1,fp)!
=1)
printf("读入信息出错!
");/*读入信息提示*/
for(i=0;ibianhao[i]=i++;
printf("请输入按何种产品排序\n");
scanf("%d",&k);
k=k-1;/*便于与结构体中的数组值对应*/
for(i=0;i{t=i;
for(j=i+1;jif((x+bianhao[t])->shangpin[k]<(x+bianhao[j])->shangpin[k])/*调用职工各自对应的结构体内的产品数量*/t=j;
if(t!
=i)
{z=bianhao[i];
bianhao[i]=bianhao[t];
bianhao[t]=z;
}
}
printf("\t\t\t按%d产品对销售员排序为:
\n",k+1);
printf("━━━━━━━━━━━━━━━━━━━━━\n");
for(i=0;iprintf("\t\t\t第%d名是:
员工%d\n",i+1,bianhao[i]+1);
printf("\n\n\n\t\t\t按任意键返回上一主菜单!
");
getch();
fclose(fp);/*关闭读入的文件*/
}
voidf3(data*x)/*统计每种产品的总销售额,输出排序结果*/
{FILE*fp;
charfname[10];
inti,j,sum[Z]={0},bianhao[Z]={0},z,t,k;
system("cls");/*清屏命令*/
printf("您想计算哪个月的?
\n");
printf("请输入月份:
");/*输入文件名,这样可以进行各个月份信息读入*/
scanf("%s",fname);
strcat(fname,".dat");
if((fp=fopen(fname,"rb"))==NULL)/*打开文件*/
{printf("不能打开文件!
!
!
\n");
exit(0);
}
for(i=0;iif(fread(x+i,sizeof(data),1,fp)!
=1)
printf("读入信息出错!
");
for(i=0;ifor(j=0;jsum[i]=sum[i]+(x+j)->shangpin[i];
for(i=0;ibianhao[i]=i++;
for(i=0;iprintf("%3d",bianhao[i]);
for(i=0;i{t=i;
for(j=i+1;jif(sum[t]t=j;
if(t!
=i)
{k=sum[i];
sum[i]=sum[t];
sum[t]=k;
z=bianhao[i];
bianhao[i]=bianhao[t];
bianhao[t]=z;
}
}
printf("输出产品排序\n");
printf("产品编号数量\n");
printf("━━━━━━━━━━━━━\n");
for(i=0;iprintf("产品%-7d%-1d\n",bianhao[i]+1,sum[i]);
printf("\n\n\n\t\t\t按任意键返回主菜单!
");
getch();
fclose(fp);/*关闭读入的文件*/
}
voidf4(data*x)/*输出统计报表*/
{FILE*fp;
charfname[10];
inti,j,sum[Z+1]={0};
system("cls");/*清屏命令*/
printf("您想计算哪个月?
\n");
printf("请输入月份:
");/*实为输入一个文件名,这样可以进行各个月份的信息读入*/
scanf("%s",fname);
strcat(fname,".dat");
if((fp=fopen(fname,"rb"))==NULL)/*打开文件*/
{printf("不能打开文件!
!
!
\n");
exit(0);
}
for(i=0;iif(fread(x+i,sizeof(data),1,fp)!
=1)
printf("读入信息出错!
");
for(i=0;ifor(j=0;jsum[i]=sum[i]+(x+j)->shangpin[i];
for(i=0;isum[Z]=sum[Z]+sum[i];
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("输出统计报表如下:
\n");/*按要求输出统计表*/
printf("销售员代号产品代号销售之和\n");
for(i=0;ifor(j=0;jprintf("员工%-8d产品%-6d数量%-10d\n",i+1,j+1,(x+i)->shangpin[j]);
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
for(i=0;i{if(i==0)
printf("产品%d之和%-10d总和%-10d\n",i+1,sum[i],sum[Z]);
else
printf("产品%d之和%-10d\n",i+1,sum[i]);
}
printf("\n\n\n\t\t\t按任意键返回主菜单!
");
getch();
}
voidmain()
{inti,choice;
datasxy[R];/*R表示职工的个数,前面的宏常量*/
printf("\n\n\n\n\n\n\t━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("\t---------------欢迎进入商品销售系统!
-------------\n");
printf("\t━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("\n\n\n\n\n\n\t\t\t按任意键进入主菜单!
");
getch();
for(i=0;;i++)
{system("cls");/*清屏命令*/
menu();/*主菜单函数提示用户怎样选择*/
printf("你想做什么?
\n");
printf("请选择:
");/*输入要进行的操作*/
scanf("%d",&choice);
if(choice==5)
{system("cls");/*清屏命令*/
printf("\n\n\n\n\n\n\t━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\t---------------谢谢使用商品销售系统!
-------------\n\n");
printf("\t━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\n\n\n\n\n\n\t\t\t按任意键退出!
(^.^)");
getch();
break;/*退出整个程序*/
}
else
switch(choice)
{case1:
f1(sxy);break;/*计算上个月每个人每种产品的销售额*/
case2:
f2(sxy);break;/*按销售额对销售员的销售情况进行排序,并且输出排序的结果*/
case3:
f3(sxy);break;/*统计每种产品的总共得销售额,并且输出排序的结果*/
case4:
f4(sxy);break;/*输出统计报表*/
}
}
}
附录1.1统计功能模块源程序
voidf1(data*x)/*计算上个月每个人每种产品的销售额*/
{FILE*fp;
charfname[10],hitkey;
intj,t;/*用于控制循环*/
inti,k,s;/*用于定义职工序号,产品序号,产品数量*/
system("cls");/*清屏命令*/
printf("您想计算哪个月?
\n");
printf("请输入月份:
");/*输入文件名,这样可以进行各个月份信息写入*