资源描述
软 件 学 院
课程设计报告书
2010 年 12 月
目录
1 设计时间 3
2 设计目的 3
3 设计任务 3
4 设计内容 3
4.1 需求分析 3
4.2 总体设计 4
4.3 详细设计 6
4.4 测试与分析 9
4.4.1 测试 8
4.4.2 分析 8
4.5 附录 9
5 总结与展望 14
5.1设计总结 14
5.2优化展望 14
参考文献 15
成绩评定 15
1 设计时间 2010-12-27
2 设计目的
1. 通过设计、编码、调试等各环节的训练,深刻理解、牢固掌握数据结构和算法设计 技术,掌握分析、解决实际问题的能力。
2. 综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,逐步 掌握软件开发的基本思想、方法和实现步骤,提高实际应用水平。
3. 初步树立正确的程序设计思想,培养分析问题、解决问题的能力,提高查询资料和撰写书面文件的能力。
3设计任务
参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
设计程序达到以下要求:
(1)产生各院系的成绩单,内容包括各院系取得的每项成绩的项目号、名次(成绩)、姓名和得分;
(2)产生团体总分报表,内容包括院系编号、男子团体总分和团体总分。
4 设计内容
4.1需求分析
本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。应具备一定的实用性。
4.1.1功能实现
(1)记录功能。能记录一次运动会的所有项目信息,如其编号,名称,是男子项目还是女子项目,是取前三名还是前五名,以及取得名次的学校编号;能记录参加本次运动会的学校个数,以及学校的编号。并能添加,修改,删除其中的信息。
(2)查询功能。能根据项目编号查询在该项目上获得名次的学校编号,并按名次先后顺序输出;能根据学校编号和项目编号查询该学校在该项目上获得的名次以及得分情况。
(3)统计功能。能统计各个学校的总分,男子团体总分,女子团体总分。
4.1.2相关规定:输入数据形式和范围:20以内的整数,也可以输入学校的名称,运动项目的名称
4.1.3输出形式:有中文提示,各学校分数为整形。
4.1.4界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
4.2总体设计
4.2.1定义程序所用到的抽象变量及结构体
int n,m,w;
struct Result /* 定义项目比赛结果名次列表元素结构体 */
{
int scnum; /* 学院编号*/
char name[20]; /* 姓名 */
int position; /* 名次 */
int score; /* 得分 */
};
struct Match /* 定义运动项目结构体 */
{
int matnum; /* 项目编号 */
int num; /* 项目名次个数 */
struct Result list[5]; /* 名次列表数组 */
};
struct SchoolList /* 定义学院成绩单元素 */
{
int matnum; /* 项目编号 */
int position; /* 名次 */
char name[20]; /* 姓名 */
int score; /* 得分 */
};
struct School /* 定义学院结构体 */
{
int scnum; /* 学院校号 */
struct SchoolList list[50]; /* 成绩单列表数组 */
int team; /* 团体总分 */
int mteam; /* 男子团体总分 */
int fteam; /* 女子团体总分 */
int num; /* 累加数 */
};
struct Match ma[50]; /* 定义运动项目结构数组 */
struct School sc[20];
int a,b; /* 项目编号,项目名次个数 */
4.2.2定义程序所用函数
void Input (int c) /* 输入比赛数据函数 */
void Index ( void ) /* 整理比赛数据函数 */
void Teamsco ( void ) /* 团体成绩计算函数 */
void Output ( int a ) /* 输出学院成绩列表函数 */
void TeamOutput ( void ) /* 输出团体报表函数 */
void MatchOutput ( int t ) /* 输出比赛项目名次列表函数 */
4.2.3 各程序模块之间的层次(调用)关系
Input()
Index()
Teamsco()
Output()
TeamOutput()
Main()
图 4.3.1 模块层次关系
4.3详细设计
主函数主要流程为:
1. 输入学院个数n,并输入男子m和女子项目个数w;
2. 调用input函数对m+n个项目分别选择名次类型并录入学院,姓名和成绩;
3. 在程序后台调用index函数处理录入的数据;
4. 在程序后台调用teamsco函数将成绩汇总,计算团体总分。
5. 调用TeamOutput函数输出团体报表;
6. 调用Output函数按学院查看报表;
7. 调用MatchOutput函数按项目查看报表;
8. 选择继续录入、返回按学院查看报表或按项目查看报表;
9. 结束;
输入学院个数n,并输入男子m和女子项目个数w;
TeamOutput()
Teamsco()
Index()
Input()
图4.3.2 函数调用图
结束
继续录入、返回查看
MatchOutput()
Output()
)
输入学院数n输入男子项目数m, 女子项目数w
输入男子项目数m
输出学院数n,比赛项目m+w个,男子项目m个,女子项目w个
开始
输入已结束的项目编号c 和输入名次类型rank
Input(c)
Index()
Teamsco()
Teamoutput()
输入学院编号查询成绩列表c
输入项目编号查询成绩列表c
如果继续输入,输入1. 返回查看学院比赛结果输入2,返回查看项目结果输入3
结束
图4.3.3 流程图
4.4测试与分析
4.4.1测试
1. 输入参加比赛的学院个数8,男子项目数2,女子项目数2。
2. 输入已结束的项目编号1,并选择前5名。(输出:项目1取前5名)。
3.输入学院编号、姓名、得分。输入另一已结束项目编号2(输出:项目2取前3名)。
4.输入另一已结束项目编号3,并选择前5名。(输出:项目3取前5名)。
5.输入另一已结束项目编号4(输出:项目4取前3名)。
6.输入0,系统输出报表。
7.输入学院编号查询成绩列表(输入3)。系统产生报表。
8. 输入需要查询排名的项目编号(输入2)。系统产生报表。
9. 输入0完成
10.输入0结束
4.4.2分析
该程序运行时需要逐步按照提示输入和判断,做出与系统相悖的输入或选择将返回重新与机器互动。程序运行时比较慢,可能是因为有些函数的时间复杂度较高。
1. input函数只有一次循环,且循环次数由选择的名次类型来定。时间复杂度O(n).
2. index函数是将运动员得分按学院和性别汇总。最多用到3次循环嵌套。时间复杂度O(n3)。
程序运行较慢的原因可能在于此。
3. teamsco函数用于计算团体总分。时间复杂度O(n2)。
4. Output函数用于输出报表,循环一次,时间复杂度O(n)。
5. TeamOutput 和MatchOutput函数分别用于输出团体报表和项目报表。时间复杂度均为O(n)。
4.5 附录
源程序
#include < conio.h >
#include < stdlib.h >
#include < stdio.h >
int n,m,w; /* 定义代表学院、男子项目、女子项目数量的变量 */
struct Result /* 定义项目比赛结果名次列表元素结构体 */
{
int scnum; /* 学院编号*/
char name[20]; /* 姓名 */
int position; /* 名次 */
int score; /* 得分 */
};
struct Match /* 定义运动项目结构体 */
{
int matnum; /* 项目编号 */
int num; /* 项目名次个数 */
struct Result list[5]; /* 名次列表数组 */
};
struct SchoolList /* 定义学院成绩单元素 */
{
int matnum; /* 项目编号 */
int position; /* 名次 */
char name[20]; /* 姓名 */
int score; /* 得分 */
};
struct School /* 定义学院结构体 */
{
int scnum; /* 学院校号 */
struct SchoolList list[50]; /* 成绩单列表数组 */
int team; /* 团体总分 */
int mteam; /* 男子团体总分 */
int fteam; /* 女子团体总分 */
int num; /* 累加数 */
};
struct Match ma[50]; /* 定义运动项目结构数组 */
struct School sc[20];
int a,b; /* 项目编号,项目名次个数 */
void Input (int c) /* 输入比赛数据函数 */
{
int i,a,rank;
a=c;
do
{
printf("选择名次类型:取前3名输入3,取前5名输入5:");/* 判断名次类型 */
scanf("%d",&rank);
if (rank==3)
ma[a-1].num=3;
if(rank==5)
ma[a-1].num=5;
else if(rank!=3&&rank!=5)
printf("输入错误,请重新");
} while (rank!=3&&rank!=5);
printf("\n第%d项:取前%d名",a,ma[a-1].num);
for(i=0;i<ma[a-1].num;i++)
{
ma[a-1].list[i].position=i+1;
do
{
printf("\n输入第%d名所在学院编号(1-%d):",i+1,n);
scanf("%d",&ma[a-1].list[i].scnum);
if(ma[a-1].list[i].scnum<1 || ma[a-1].list[i].scnum>n)
printf("\n错误!输入的编号应为1-%d之间!",n); /* 输出出错信息 */
}
while (ma[a-1].list[i].scnum<1 || ma[a-1].list[i].scnum>n);
printf("请输入此项获奖运动员姓名:");
scanf("%s",&ma[a-1].list[i].name);
printf("请输入该运动员得分");
scanf("%d",&ma[a-1].list[i].score);
printf("该运动员得分为:%d",ma[a-1].list[i].score);
}
return;
}
void Index ( void ) /* 整理比赛数据函数 */
{
int i,j,k,t;
for(i=0;i<n;i++)
{
sc[i].scnum=i+1; /* 初始化学院编号 */
sc[i].num=0; /* 初始化累加数 */
}
for(i=0;i<m+w;i++) /* 项目个数 */
for(j=0;j<ma[i].num;j++) /* 项目名次 */
for(k=0;k<n;k++) /* 学院编号 */
if(ma[i].list[j].scnum==sc[k].scnum) /* scnum学院编号 */
{
sc[k].list[sc[k].num].matnum=ma[i].matnum; /*matnum项目编号*/
sc[k].list[sc[k].num].position=ma[i].list[j].position;
for(t=0;t<20;t++) /* 学院编号 */
sc[k].list[sc[k].num].name[t]=ma[i].list[j].name[t];
sc[k].list[sc[k].num].score=ma[i].list[j].score;
sc[k].num++;
}
return;
}
void Teamsco ( void ) /* 团体成绩计算函数 */
{
int i,j;
for(i=0;i<n;i++)
{
sc[i].team=0;
sc[i].mteam=0;
sc[i].fteam=0;
} /* 初始化 */
for(i=0;i<n;i++)
for(j=0;j<sc[i].num;j++)
{
sc[i].team=sc[i].team+sc[i].list[j].score; /* 团体总分成绩计算 */
if(sc[i].list[j].matnum<=m)
sc[i].mteam=sc[i].mteam+sc[i].list[j].score; /* 男子团体成绩计算 */
else sc[i].fteam=sc[i].fteam+sc[i].list[j].score; /* 女子团体成绩计算 */
}
return;
}
void Output ( int a ) /* 输出学院成绩列表函数 */
{
int i;
printf("\n成绩报表 学院编号:%d\n",a);
printf("比赛项目编号 名次 姓名 得分\n");
for(i=0;i<sc[a-1].num;i++)
printf
("%6d%10d%10s%15d\n",sc[a-1].list[i].matnum,sc[a-1].list[i].position,
sc[a-1].list[i].name,sc[a-1].list[i].score);
return;
}
void TeamOutput ( void ) /* 输出团体报表函数 */
{
int i;
printf("\n团体成绩报表\n");
printf("学院编号 团体总分 男子团体总分 女子团体总分\n");
for(i=0;i<n;i++)
printf("%5d%10d%11d%13d\n",sc[i].scnum,sc[i].team,sc[i].mteam,sc[i].fteam);
return;
}
void MatchOutput ( int t ) /* 输出比赛项目名次列表函数 */
{
int i;
printf ( "\n项目名次列表 项目编号:%d\n",t);
printf ( "\n比赛项目编号 名次 获奖者姓名 获奖者所在学院编号 得分\n");
for ( i=0;i<ma[t-1].num;i++ )
printf( "%6d%12d%12s%16d%14d\n",ma[t-1].matnum,ma[t-1].list[i].position,
ma[t-1].list[i].name,ma[t-1].list[i].scnum,ma[t-1].list[i].score);
return;
}
void main ( void )
{
int i,c,t,k; /* c为项目编号 */
printf("\n\n********************运动会分数统计系统********************\n");
printf("请根据提示进行操作");
do
{
printf( "\n请输入参加运动会的学院个数:(1-20)" );
scanf("%d",&n);
if( n<=0 || n>20 ) /* 输出出错信息 */
printf(" \n输入的学院数目不正确!请重新输入!(1-20)\n" );
}while ( n<=0 || n>20 );
do
{
printf("\n有多少个男子项目:(1-20)");
scanf("%d",&m);
if ( m<0 || m>20 ) /* 输出出错信息 */
printf("\n输入的男子项目数目不正确!请重新输入!(1-30)\n");
}while ( m<0 || m>20 );
do
{
printf("\n有多少个女子项目:(1-20)");
scanf("%d",&w);
if ( w<0 || w>20 ) /* 输出出错信息 */
printf ( "\n输入的女子项目数目不正确!请重新输入!(1-20)\n" );
}while ( w<0 || w>20 );
printf
("\n本次有%d个学院参加,共%d个比赛项目,男子项目%d个,女子项目%d个。\n",n,m+w,m,w);
SCANFDATA: /* 比赛数据输入定位点 */
printf("请输入比赛结果资料\n");
for(i=0;i<m+w;i++)
ma[i].matnum=i+1; /* 初始化项目编号 */
c=1; /* 初始化a */
do
{
printf("\n请输入已结束的比赛项目编号(1-%d)('0'=完成):",m+w);
scanf("%d",&c);
if((c>0)&&(c<=m+w))
Input(c); /* 调用输入函数 */
else if(c==0) break; /* 输出出错信息 */
else printf("\n!error:输入的数应为1-%d之间的整数!\n",m+w);
}while(c!=0);
printf("\n正在进行整理数据,请稍候......\n"); /* 稍候 */
Index(); /* 调用整理函数 */
Teamsco(); /* 调用团体成绩计算函数 */
TeamOutput(); /* 调用输出团体报表函数 */
SEESCHOOL: /* 查看学院数据定位点 */
c=1; /*初始化c*/
while ( c!=0 )
{
printf("\n\n请输入学院编号查询成绩列表(1-%d)(0=完成):",n);
scanf("%d",&c);
if(c==0) break;
else if((c>0)&&(c<=n))
Output(c); /* 调用输出学院成绩列表函数 */
else printf("\n!错误!输入的数应为1-%d之间的整数!\n",n); /*输出出错信息 */
}
SEEMATCH: /* 查看项目结果数据定位点 */
t=1;
while ( t!=0 )
{
printf ( "\n\n请输入需要查询排名的项目编号(1-%d)(0=完成):",m+w );
scanf ( "%d",&t);
if ( t==0 ) break;
else if ( (t>0)&&(t<=m+w))
MatchOutput(t); /* 调用输出项目排名列表函数 */
else printf ( "\n\n!错误!输入的数应为1-%d之间的整数!\n",m+w );
/*输出错误信息 */
}
do
{
printf
( "继续输入数据输入1,返回查看学院比赛结果输入2,返回查看项目比赛结果输入3.\n");
printf("退出请按0.");
scanf ( "%d",&k);
if ( k==0 ) break; /* 跳出程序 */
else if ( k==1 ) goto SCANFDATA;/* 回到输入数据点继续进行输入数据 */
else if ( k==2 ) goto SEESCHOOL;/* 回到查看学院比赛结果点 */
else if ( k==3 ) goto SEEMATCH; /* 回到查看项目比赛结果点 */
else
printf ( "\n\n!错误!输入的数应为对应操作的整数!\n" ); /*输出出错信息 */
}while (k!=0&&k!=1&&k!=2&&k!=3);
system ("cls"); /* 清屏函数 */
printf ("\n程序运行完毕!谢谢!按任意键退出!\n");
getchar ();
exit (1); /* 退出程序 */
return;
}
5总结与展望
5.1设计总结
本程序主要用结构体和数组储存数据,通过循环套用和选择结构实现运动会各项目各学院成绩的处理并输出。在设计程序过程中逐渐体验到数据结构对程序实现的巨大作用,可以说数据结构使C程序更加灵活多变,功能更强大。调试程序时无数次的失败也曾让我垂头丧气,但我咬牙坚持了下来。当一个问题解决时,例如解决了在选择名次类
型和最后输出报表时发生冲突,我也体验到了独立完成任务并解决问题的乐趣。本次课程设计给了我发挥能力的平台,也使我的编程能力和调试能力得到了提高。
5.2优化展望
该程序在人机互动时输入量较大,且提示太多,界面不够干净利落。可尝试将得分在程序中依次赋给各名次,免去录入成绩的过程,同时也减少了错误的发生。另外最好产生一个txt文件将报表保存,以增强该系统的实用性。
参考文献
[1] 谭浩强· c程序设计(第三版)·清华大学出版社, 2005年7月第3版:216~221
[2] 严蔚敏,吴伟民 ·数据结构(c语言版)·清华大学出版社,2010年3月:458~508
[3] 王娣,安剑,孙秀梅·c语言程序开发·人民邮电出版社,2010年1月:1~4000
成绩评定
成绩 教师签字
20
展开阅读全文