
一弊搜.需求分析
1问题描述
运动会分数统计
参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目租简历,和w个女子项目。项目编号为男子1~m,女子m+1~m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些项目取前五名或前三名由学生自己设定。(m<=20,n<=20)
2. 基本要求:
1) 可以输入各个项目的前三名或前五名的成绩;
2) 能统计各学校总分;
3) 可以按学校编号、学校总分、男女团体总分排序输出;
4) 可以按学校编号查询学校某个项目的情况;
5) 可以按项目编号查询取得前三或前五名的学校。
3.测试数据
1)首先进入成绩录入界面,先输入学校编号1,再输入学校1各个项目成绩0或1(‘0’表示没获得该项目的该名次,‘1’表示获得了该项目的该名次)
然后再输入第二个学校编号2,再输入成绩;当输入其他的学校编号和成绩会提示错误输入,重新输入。
2)然后进入总目录,输入 :1 统计各学校总分并输出;
3)输入:2 按学校编号排序输出;
4)输入:3 按学校总分排序输出;
5)输入:4 按男团体总分排序输出;
6)输入: 5 按女团体总分排序输出
7) 输入:6 按学校编号查询学校某个项目情况;
8)输入:7 按项目编号查询取得名次的学校;
9)输入:0 退出系统;
10)输入其他数据会提示错误输入,重新输入。
二、概要设计
1 结构体
运动项目
{ 项目编号 ;名次;};
学校
{ 学校编号;项目;团体总分;男团体总分;女团体总分;};
2 主程序(main)
包括登陆欢迎程序,分数录入程序,咐胡查询程序,退出程序
3 程序模块机之间的调用关系
流程图
三、详细设计
1、宏定义:
#define N 2
#define bm 4
#define gm 3
2、数据类型定义
(1)运动项目的定义:
struct match
{
int matchnum
int rank[3]
}mat[bm+gm]
(2)学校的定义:
struct school
{
int schoolnum
struct match mat[bm+gm]
int total
int boytotal
int girltotal
}sch[N]
3、函数之间的调用关系
4、算法设计
主要算法的设计思想:
本程序主要是使用顺序表来实现 *** 作。一个运动会包括运动项目和参加运动会的学校。因此构造顺序表match,school。为了 *** 作的方便,设计了一个总目录,选择相应序号进入各个 *** 作,并有错误提示,每完成一个 *** 作程序会提示选择返回目录或退出程序,对于总分的排序使用了冒泡排序。为了使整个程序界面看起来更加惬意,又添加了背景和字体颜色设置的程序语句。每个 *** 作前都有 *** 作指南,易于使用。
四、调试分析
1、由于刚开始程序比较简单,虽能运行,但处理错误的能力很低,后来经过反复的添加修改,使程序能处理了错误,提高了健壮性。
2、开始编时由于不太规范,编译出错后由于程序长,很难找到错误,后来规范了格式,错误容易找到了,以后编程要规范。
3、算法的时空分析
线性表使用的是顺序结构,各种算法的时间复杂度相对比较合理
4、本程序相对来说比较容易看明白,其中涉及到的一些函数相对来说比较容易。通过调试,运行,基本上达到了要求,但还存在一些缺点。如:不够人性化等。
五、测试结果
<1>数据输入(输入成绩如图)
输入:
请输入学校编号:1
项目编号 1 2 3 4 5 6 7
第<1>名: 1 0 0 1 1 0 0
第<2>名: 1 1 1 0 0 1 0
第<3>名: 0 0 0 0 1 1 1
请输入学校编号: 2
项目编号 1 2 3 4 5 67
第<1>名:0 1 1 0 0 11
第<2>名:0 0 0 1 1 01
第<3>名:1 1 1 1 0 00
输入成绩后出现总目录(下图);
(1)输入:1
输出:
(2)输入:1 返回总目录,再输入:2
输出:
(3)输入:1 返回总目录,再输入:3
输出:
(4)输入:1 返回总目录,再输入:4
输出:
(5)输入:1 返回总目录,再输入:5
输出:
(6)输入:1 返回总目录,再输入:6,学校编号输入:1,项目编号输入:5
输出:
(7)输入:2,返回上一级,再输入学校编号:2,项目编号:1
输出:
(8)输入:1,返回总目录;再输入:7,输入项目编号:7
输出:
(9)如果输入提示外的数字,例如输入:4
则输出错误提示:
(10)输入:0
输出:
六、用户手册
1、运行环境
Windows,VC++6.0
2、用户界面
3、 *** 作过程
(1)用户进入运动会分数统计系统程序欢迎界面
(2)录入成绩,先输入要输入的学校编号,1或2;再输入对应学校的1-7项目的成绩(成绩用0或1:‘0’表示没获得该项目的该名次,‘1’表示获得了该项目的该名次)当成绩录入错误时会有错误提示。
(3)进入总目录,按提示,输入0--7中的一个数;
输入:0 则推出系统;
输入:1 统计各学校总分并输出;然后选择‘0’或‘1’(‘0’表示退出系统,‘1’表示返回总目录);
输入:2 按学校编号排序输出;然后选择‘0’或‘1’(‘0’表示退出系统,‘1’表示返回总目录);
输入:3 按学校总分排序输出;然后选择‘0’或‘1’(‘0’表示退出系统,‘1’表示返回总目录);
输入:4 按男团体总分排序输出;然后选择‘0’或‘1’(‘0’表示退出系统,‘1’表示返回总目录);
输入:5 按女团体总分排序输出;然后选择‘0’或‘1’(‘0’表示退出系统,‘1’表示返回总目录);
输入:6 按学校编号查询学校某个项目编号;选择学校编号1或2;然后选择项目编号1--7;输出项目成绩;然后选择0或1或2(‘0’表示退出系统,‘1’表示返回总目录,‘2’表示返回上一级);
输入:7 按项目编号查询取得名次的学校;选择项目编号1--7;输出成绩;然后选择0或1或2(‘0’表示退出系统,‘1’表示返回总目录,‘2’表示返回上一级);
七、参考文献
(1)《C程序设计》(第三版) 谭浩强 著 清华大学出版社
(2)《数据结构》(C语言版)作者:严蔚敏,吴伟民 出版社:清华大学出版社
(3)《数据结构题集》(C语言版)作者:严蔚敏,吴伟民 出版社:清华大学出版社
八、附录
1、源程序
#include<stdio.h>
#include<process.h>
#define N 2//学校个数
#define bm 4 //男团体个数
#define gm 3//女团体个数
void xuanze()
void xunhuan()
struct match //项目
{
int matchnum
int rank[3]
}mat[bm+gm]
struct school //学校
{
int schoolnum
struct match mat[bm+gm]
int total
int boytotal
int girltotal
}sch[N]
void huanyingni() /*开始界面,欢迎使用*/
{
printf("\n\n 东华大学信息科学与技术学院电气0910班 周涛涛\n\n\n")
printf("\t***^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^***\n\n")
printf(" 欢迎使用运动会分数统计系统\n\n")
printf("\t***^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^***\n\n ")
}
void input() //输入成绩
{
int i,j,k
for(i=0i<Ni++) //初始化分数
{
sch[i].total=0
sch[i].boytotal=0
sch[i].girltotal=0
for(k=0k<bm+gmk++)
{
sch[i].mat[k].rank[0]=0
sch[i].mat[k].rank[1]=0
sch[i].mat[k].rank[2]=0
sch[i].mat[k].matchnum=k+1
}
}
printf(" *********输入成绩**********\n")
printf("###输入说明:\n")
printf(" 1.学校编号为1--%d项目编号为1--%d (1-%d为男子项目,%d-%d为女子项目).\n",N,bm+gm,bm,bm+1,bm+gm)
printf(" 2. 成绩只能是‘0’或‘1’\n(‘0’表示没获得该项目的该名次,‘1’表示获得了该项目的该名次.以'Tab'键前进。)\n",N)
for(i=0i<Ni++)
{
printf("******请输入学校编号: ")
loop3:scanf("%d",&sch[i].schoolnum)
if(sch[i].schoolnum<0||sch[i].schoolnum>N)
{
printf("输入错误(只能是1-%d)请重新输入:",N)
goto loop3
}
printf("项目编号 ")
for(k=0k<bm+gmk++)
printf("%d ",sch[i].mat[k].matchnum)
printf("\n")
for(j=0j<3j++)
{
loop: printf("第(%d)名:",j+1)
for(k=0k<bm+gmk++)
scanf(" %d",&sch[i].mat[k].rank[j])
for(k=0k<bm+gmk++)
if(sch[i].mat[k].rank[j]!=0&&sch[i].mat[k].rank[j]!=1)
{
printf("输入错误,请重新输入,成绩只能是‘0’或‘1’\n")
goto loop
}
}
}
}
void totaljisuan()
{
int i,k,b
for(i=0i<Ni++)
for(k=0,b=0k<bm+gmk++)
{
b=sch[i].mat[k].rank[0]*5+sch[i].mat[k].rank[1]*3+sch[i].mat[k].rank[2]*2
sch[i].total=sch[i].total+b
if(k<bm)
sch[i].boytotal=sch[i].boytotal+b
if(k>=bm)
sch[i].girltotal=sch[i].girltotal+b
}
}
void mulu(){
printf("\n\n **系统目录**\n") //目录
printf("\t\t ************************************\n")
printf("\t\t* 1.统计各学校总分 *\t \n")
printf("\t\t* 2.按学校编号排序输出 *\t \n")
printf("\t\t* 3.按学校总分排序输出 *\t \n")
printf("\t\t* 4.按男团体总分排序输出 *\t \n")
printf("\t\t* 5.按女团体总分排序输出 *\t \n")
printf("\t\t* 6.按学校编号查询学校某个项目情况 *\t \n")
printf("\t\t* 7.按项目编号查询取得名次的学校 *\t \n")
printf("\t\t* 0.退出 *\t \n")
printf("\t\t ************************************\n")
}
void funct0() //退出系统
{
printf("\n\t\t*******谢谢使用! *******\n")
printf("\n\t\t*******谢谢使用! *******\n")
exit(0)
}
void funct1() //统计各学校总分
{ int i,q
printf(" **********统计各学校总分**********\n")
printf(" **学校编号**\t\t\t\t**总分**\n")
for(i=0i<Ni++)
printf("\t%d\t\t\t\t%d\n",sch[i].schoolnum,sch[i].total)
printf("\n")printf("\n")
printf("##########0:退出;1:返回目录。\n")
printf("****请选择: ")
loop2:scanf("%d",&q)
if(q==0) funct0()
if(q==1) xunhuan()
else {
printf("输入错误(只能是0或1),请重新输入:")
goto loop2
}
}
void funct2() //按学校编号排序
{
struct school sch1
int i,j,q
for(j=0j<N-1j++)
for(i=0i<N-j-1i++)
if(sch[i].schoolnum>sch[i+1].schoolnum)
{
sch1=sch[i]
sch[i]=sch[i+1]
sch[i+1]=sch1
}
printf(" **********按学校编号排序**********\n")
printf(" **学校编号**\t\t\t\t**总分**\n")
for(i=0i<Ni++)
printf("\t%d\t\t\t\t%d\n",sch[i].schoolnum,sch[i].total)
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录。\n")
printf("****请选择: ")
loop2: scanf("%d",&q)
if(q==0) funct0()
if(q==1) xunhuan()
else {
printf("输入错误(只能是0或1),请重新输入:")
goto loop2
}
}
void funct3() //按学校总分排序
{
struct school sch1
int i,j,q
for(j=0j<N-1j++)
for(i=0i<N-j-1i++)
if(sch[i].total<sch[i+1].total)
{
sch1=sch[i]
sch[i]=sch[i+1]
sch[i+1]=sch1
}
printf(" **********按学校总分排序**********\n")
printf(" **学校编号**\t\t\t\t**总分**\n")
for(i=0i<Ni++)
printf("\t%d\t\t\t\t%d\n",sch[i].schoolnum,sch[i].total)
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录。\n")
printf("****请选择: ")
loop2: scanf("%d",&q)
if(q==0) funct0()
if(q==1) xunhuan()
else {
printf("输入错误(只能是0或1),请重新输入:")
goto loop2
}
}
void funct4()//按男团体总分排序
{
struct school sch1
int i,j,q
for(j=0j<N-1j++)
for(i=0i<N-j-1i++)
if(sch[i].boytotal<sch[i+1].boytotal)
{
sch1=sch[i]
sch[i]=sch[i+1]
sch[i+1]=sch1
}
printf(" **********按男团体总分排序**********\n")
printf(" **学校编号**\t\t**总分**\n")
for(i=0i<Ni++)
printf("\t%d\t\t\t\t%d\n",sch[i].schoolnum,sch[i].boytotal)
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录。\n")
printf("****请选择: ")
loop2: scanf("%d",&q)
if(q==0) funct0()
if(q==1) xunhuan()
else {
printf("输入错误(只能是0或1),请重新输入:")
goto loop2
}
}
void funct5() //按女团体总分排序
{
struct school sch1
int i,j,q
for(j=0j<N-1j++)
for(i=0i<N-j-1i++)
if(sch[i].girltotal<sch[i+1].girltotal)
{
sch1=sch[i]
sch[i]=sch[i+1]
sch[i+1]=sch1
}
printf(" **********按女团体总分排序**********\n")
printf(" **学校编号**\t\t**总分**\n")
for(i=0i<Ni++)
printf("\t%d\t\t\t\t%d\n",sch[i].schoolnum,sch[i].girltotal)
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录。\n")
printf("****请选择: ")
loop2:scanf("%d",&q)
if(q==0) funct0()
if(q==1) xunhuan()
else {
printf("输入错误(只能是0或1),请重新输入:")
goto loop2
}
}
void funct6() //按学校编号查询学校某个项目情况
{
int i,n,m,q
printf(" **********按学校编号查询学校某个项目情况**********\n")
loop1: printf("*******请输入所要查询的学校编号: ")
scanf("%d",&n)
if(n!=1&&n!=2)
{
printf("!!!!!输入错误,学校编号只能是“0”或“1”,请重新输入!!!!\n")
goto loop1
}
printf("*******请输入所要查询的项目编号: ")
scanf("%d",&m)
for(i=0i<Ni++)
if(n==sch[i].schoolnum)
{
printf("学校编号: %d 项目编号: %d\n",n,m)
if(sch[i].mat[m].rank[0]==1)
printf("第一名(获得) ")
if(sch[i].mat[m].rank[1]==1)
printf("第二名(获得) ")
if(sch[i].mat[m].rank[2]==1)
printf("第三名(获得) ")
else
printf("本校该项目未进入前三名")
}
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录;2:返回上一级。\n")
printf("****请选择: ")
loop2: scanf("%d",&q)
if(q==1) xunhuan()
if(q==0) funct0()
if(q==2) goto loop1
else {
printf("输入错误(只能是0或1或2),请重新输入:")
goto loop2
}
}
void funct7() //按项目编号查询取得名次的学校
{
int i,t,q
printf(" **********按项目编号查询取得名次的学校**********\n")
loop1: printf("*****请输入所要查询的项目编号: ")
scanf("%d",&t)
printf("项目编号:%d\n",t)
for(i=0i<Ni++)
{
if(sch[i].mat[t-1].rank[0]==1)
printf("获得第一名的学校编号是:%d \n",sch[i].schoolnum)
if(sch[i].mat[t-1].rank[1]==1)
printf("获得第二名的学校编号是:%d \n",sch[i].schoolnum)
if(sch[i].mat[t-1].rank[2]==1)
printf("获得第三名的学校编号是:%d \n",sch[i].schoolnum)
}
printf("\n")printf("\n")
printf("########## 0:退出;1:返回目录;2:返回上一级。\n")
printf("****请选择: ")
loop2: scanf("%d",&q)
if(q==1) xunhuan()
if(q==0) funct0()
if(q==2) goto loop1
else {
printf("输入错误(只能是0或1或2),请重新输入:")
goto loop2
}
}
void xunhuan()//返回目录
{
int t
mulu()
printf("\t\t请选择(输入0--7)序号:\t")
scanf("%d",&t)
while(t!=0&&t!=1&&t!=2&&t!=3&&t!=4&&t!=5&&t!=6&&t!=7)
{
printf("输入有误,请重新选择:")
scanf("%d",&t)
}
switch(t)
{
case 0:funct0()break
case 1:funct1()break
case 2:funct2()break
case 3:funct3()break
case 4:funct4()break
case 5:funct5()break
case 6:funct6()break
case 7:funct7()break
}
}
void main()
{
system("Color 1e") //改变背景,前景色
huanyingni()
input()
totaljisuan()
xunhuan()
}
九、课程设计体会
本次课程设计检验了我的实践能力,感觉自己还有许多东西要学习,并不仅限于课本上的知识,实践才是真理,在学习中实践,实践中去学习。学习的路很长。
再有要多问,几个人共同讨论会有意想不到的效果
有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等。为了更好的优化程序性能,我们必须找到性能瓶颈点,好钢用在刀刃上才能取得好的效果,否则可能白做工作。为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以厅尺毕使用gprof和oprofile工具。 gprof是GNU工具之一,它在编译的时候在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程序,gprof不适合。 oprofile也是一个开源的profiling工具,它使用硬件调试寄存器来统计信息,进行profiling的开销比较小,而且可以对内核进行profiling。它统计的信息非常的多,可以得到cache的缺失率,memory的访存信息,分支预测错误率等等,这些信息gprof是得不到的,但是对于函数调用次数,它是扮芹不能够得到的。。 简单来说,gprof简单,适合于查找用户级程序的瓶颈,而oprofile稍显复杂,但是得到的信息更多,更适合调试系统软件。 我们以编译运行hello/doc/困世opreport/doc/opannotate/doc/opgprof/binutils/docs-2/ 使用 GNU profiler 来提高代码运行速度www-128/developerworks/cn/linux/l-gnuprof/developerworks/cn/linux/l-pow-oprofile/ 摘自:txgc1009的专栏1.负载压力测试工具这类测试工具的主要目的是度量应用系统的可扩展性和性能,是一种预测系统行为和性能的自动化测试工具。
在实施并发负载过程中,通过实时性能监测来确认和查找问题,并针对所发现问题对系统性能进行优化,确保应用的成功部署。
负载压力测试工具能够对整个企业架构进行测试,通过这些测试,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
2.功能测试工具通过自动录制、检测和回放用户的应用 *** 作,将被测系统的输出记录同预先给定的标准结果比较,功能测试工具能够有效地帮助测试人员对复杂的企业级应用的不同发布版本的功能进行测试,提高测试人员的工作效率和质量。
其主要目的是检测应用程序散圆是否能够达到预期的功能并正常运行。
3.白盒测试工具白盒测试工具一般是针对代码进行测试,测试中发现的缺陷可以定位到代码级。
根据测试工具原理的不同,又可以分为静态测试工具和动态测试工具。
静态测试工具直接对代码进行分析,不需要运行代码,也不需要对代码编译链接和生成可执行文件。
静态测试工具一般是对代码进行语法扫描,找出不符合编码规范的地方,根据某种质量模型评价代码的质量,生成系统的调用关系图等。
动态测试工具一般采用“插桩差掘搭”的方式,在代码生成的可执行文件中插入一些监测代码,用来统计程序运行时的数据。
它与静态测试工具最大的不同是,动态测虚拿试工具要求被测系统实际运行。
4.测试管理工具一般而言,测试管理工具对测试需求、测试计划、测试用例、测试实施进行管理,并且测试管理工具还包括对缺陷的跟踪管理。
测试管理工具能让测试人员、开发人员或其他的IT人员。
昌平电脑培训http://www.kmbdqn.cn/认为通过一个中央数据仓库,在不同地方就能交互信息。
5.测试辅助工具这些工具本身并不执行测试,例如它们可以生成测试数据,为测试提供数据准备。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)