资源描述
软 件 学 院
综合训练项目报告书
·
课程名称 数据结构
项目名称 运动会分数统计
专业班级 软件14-2班
组 别 第7组
成 员 李松,倪天舒,梅艳霜
任课教师 孙宁
目 录
1 设计时间...............................................1
2 设计任务...............................................1
3 设计内容...............................................1
3.1问题分析 ..........................................1
3.2程序设计...........................................1
3.3测试与分析.........................................3
3.3.1测试.............................................3
3.3.2分析.............................................6
3.4 代码...............................................6
4 总结与展望.............................................14
5 参考文献...............................................14
1 设计时间
2015年10月22日-2015年11月12日
2 设计任务
编辑出一个运动会分数统计系统,可以应用于小型运动会各学院、团体的计分
3 设计内容
3.1问题分析
参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1~m,女子m+1~m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;
3.2程序设计
3.2.1抽象数据类型的定义
(1)基本操作:
Inputinformation()
操作结果:输入信息,建立系统
Output()
操作结果:输出元素。
Inquiry()
初始条件:查询函数
操作结果:通过查询方式输出结果
Writedata()
操作结果:把数据储存到文件中
Readdata()
操作结果:读出文件中数据的函数
(2)创建结构体
typedef struct
{
int itemnum;//项目编号
int top;//取名次的数目
int range[5];//名次
int mark[5];//分数
}itemnode;//定义项目结点的类型
typedef struct
{
int schoolnum;//学院编号
int score;//学学院总分
int mscore;//男团体总分
int wscore;//女团体总分
itemnode c[m+w];//项目数组
}headnode;//定义头结点类型
3.2.2主程序功能图
图1功能模块图
3.2.3主函数算法
void main()
{
int choice;
printf("======================欢迎使用======================\n");
printf("\n\n*****************运动会分数统计系统********************\n");
printf("\n\n********************1.输入信息*************************\n");
printf("********************2.输出信息*************************\n");
printf("********************3.查询信息*************************\n");
printf("********************4.调用信息*************************\n");
printf("********************5.退出系统*************************\n\n\n");
printf("================================================\n\n");
printf("********请选择要实现步骤的编号:\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1: inputinformation();writedata();readdata();main();
case 2: output();main();
case 3: inquiry();main();
case 4: readdata();main();
case 5: exit(0);
default: exit(0);
}
}
3.3测试与分析
3.3.1测试
图2主函数调用-输入信息
图3输入信息
图4输出各学院得分情况
图5 查询得分情况
图6 调用已储存分数
图7 退出系统
3.3.2分析
调试过程中对函数调用掌握不熟,经过反复读程序对程序有了清楚地认识之后重新调试程序才有了进步,在while循环时指针移动容易出错,因此多次出现内存错误,对于涉及的循环的操作开始和结束条件设置很关键。本次实验熟悉了栈数据结构的表示与实现方法。
算法时间和空间分析:算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据,若后缀表达式由n个数据组成,则 此算法的时间复杂度为O(n)。此算法在运行时所占用的临时空间主要取决于栈S的大小,显然,它的最大深度不会超过表达式中操作数的个数,因为操作数的个数与运算符的个数相等,所以此算法的空间复杂度也同样为O(n)。
3.4 代码
#include<stdio.h>
#include<math.h>
#include <conio.h>
#include <process.h>
#define n 2//学院数目
#define m 1//男子项目数目
#define w 1//女子项目数目
#define null 0
typedef struct
{
int itemnum; //项目编号
int top; //取名次的数目
int range[5]; //名次
int mark[5]; //分数
}itemnode; //定义项目结点的类型
typedef struct
{
int schoolnum; //学院编号
int score; //学学院总分
int mscore; //男团体总分
int wscore; //女团体总分
itemnode c[m+w]; //项目数组
}headnode;//定义头结点类型
headnode h[n];//定义一个头结点数组
void inputinformation() //输入信息,建立系统
{
int i,j,k,s;
for(i=0;i<n;i++)
{
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
}//初始化头结点
for(i=0;i<n;i++)
{
printf("*****学院编号:");
scanf("%d",&h[i].schoolnum);//输入头结点信息
for(j=0;j<m+w;j++)
{
printf("*****项目编号:");
scanf("%d",&h[i].c[j].itemnum);
printf("*****取前3名或者前5名:");
scanf("%d",&h[i].c[j].top);
printf("*****获得几个名次:");
scanf("%d",&k);//输入项目信息
for(s=0;s<5;s++)
h[i].c[j].range[s]=0, h[i].c[j].mark[s]=0;//初始化排名和分数
for(s=0;s<k;s++)
{
printf("*****名次:");
scanf("%d",&h[i].c[j].range[s]);//输入所获名次信息
if(h[i].c[j].top==3)
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=5; break;
case 2: h[i].c[j].mark[s]=3; break;
case 3: h[i].c[j].mark[s]=2; break;
}
else
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=7; break;
case 2: h[i].c[j].mark[s]=5; break;
case 3: h[i].c[j].mark[s]=3; break;
case 4: h[i].c[j].mark[s]=2; break;
case 5: h[i].c[j].mark[s]=1; break;
}
h[i].score=h[i].score+h[i].c[j].mark[s];
//按取前三名还是取前五名分别记分
if(j<=m-1)
h[i].mscore=h[i].mscore+h[i].c[j].mark[s];
//是男子项目则记到男子分数里面去
else
h[i].wscore=h[i].wscore+h[i].c[j].mark[s];
//是女子项目则记到女子项目里面去
}
printf("\n");
}
}
}
void output()//输出函数
{
int choice,i,j,k;
int remember[n];
int sign;
do
{
printf("*******************1.按学院编号输出.*******************\n");
printf("*******************2.按学院总分输出.*******************\n");
printf("*******************3.按男团总分输出.*******************\n");
printf("*******************4.按女团总分输出.*******************\n");
printf("\n\n******************* 请选择编号*************************\n\n:");
scanf("%d",&choice);
switch(choice)
{
case 1:
for(i=0;i<n;i++)
{
printf("\n\n*****学院编号:%d\n",h[i].schoolnum);
printf("*****学校总分:%d\n" ,h[i].score);
printf("*****男团总分:%d\n",h[i].mscore);
printf("*****女团总分: %d\n\n\n",h[i].wscore);
}//按编号顺序输出
break;
case 2:
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].score<h[j].score)
k=remember[i];
remember[i]=remember[j],remember[j]=k;
} // 用冒泡排序方法,用辅助数组记住头结点下标
for(i=0;i<n;i++)
{
printf("*****学院总分:%d\n" ,h[remember[i]].score);
printf("*****男团总分:%d\n",h[remember[i]].mscore);
printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);
//按所记下标顺序输出
}//按学院总分输出
break;
case 3:
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].mscore<h[j].mscore)
k=remember[i];remember[i]=remember[j];remember[j]=k;
}
for(i=0;i<n;i++)
{
printf("\n\n*****学院编号:%d\n",h[remember[i]].schoolnum);
printf("*****学院总分:%d\n" ,h[remember[i]].score);
printf("*****男团总分:%d\n",h[remember[i]].mscore);
printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);
} //按男团总分输出
break;
case 4:
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].wscore<h[j].wscore)
k=remember[i];
remember[i]=remember[j];remember[j]=k;
}
for(i=0;i<n;i++)
{
printf("\n\n*****学院编号:%d\n",h[remember[i]].schoolnum);
printf("*****学院总分:%d\n" ,h[remember[i]].score);
printf("*****男团总分:%d\n",h[remember[i]].mscore);
printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);
}
break;//按女团总分输出
}
printf("请选择 2 继续,0 跳出\n");
scanf("%d",&sign);
}while(sign==2);//循环执行输出语句
}
void inquiry()//查询函数
{
int choice;
int i,j,k,s;
printf("\n*****1:按学院编号查询\n");
printf("\n*****2:按项目编号查询\n");
printf("\n\n*****请选择查询方式:");//提供两种查询方式
scanf("%d",&choice);
switch(choice)
{
case 1:
do
{
printf("要查询的学院编号:");
scanf("%d",&i);
if(i>n)
printf("错误:这个学院没有参加此次运动会!\n\n\n");
else
{
printf("要查询的项目编号:");
scanf("%d",&j);
if(j>m+w||j==0)
printf("此次运动会没有这个项目\n\n\n");
//学校编号超出范围,则输出警告
else
{
printf("这个项目取前 %d名,该学院的成绩如下:\n", h[0].c[j-1].top);
for(k=0;k<5;k++)
if(h[i-1].c[j-1].range[k]!=0)
printf("名次:%d\n",h[i-1].c[j-1].range[k]);
//输出要查询学院项目的成绩
}
}
printf("请选择 2 继续 , 0 跳出\n");
scanf("%d",&s);
printf("\n\n\n");
}while(s==2);//循环执行输出语句
break;
case 2:
do
{
printf("要查询的项目编号:");
scanf("%d",&s);
if(s>m+w||s==0)
printf("此次运动会不包括这个项目.\n\n\n");
//项目编号超出范围则输出警告
else
{
printf("该项目取前 %d名,取得名次的学院\n",h[0].c[s-1].top);
for(i=0; i<n;i++)
for(j=0;j<5;j++)
if(h[i].c[s-1].range[j]!=0)
printf("学院编号:%d,名次:%d\n",h[i].schoolnum,
h[i].c[s-1].range[j]);
} //输出该项目取得名次学校的成绩
printf("\n\n\n继续 2,跳出 0\n");
scanf("%d",&i);
printf("\n\n\n");
}while(i==2);
break;
}
}
void writedata()//把数据存储在文件中
{
FILE *report;
int i;
if((report=fopen("sportsdata.txt","w"))==null)
{
printf("不能打开文件\n");
exit(1);
}
for(i=0;i<n;i++)
fwrite(&h[i],sizeof(headnode),1,report);
fclose(report);
}//按头结点块写入
void readdata()//读出文件中数据的函数
{
FILE *report;
int i,j,k,s;
if((report=fopen("sportsdata.txt","r"))==null)
{
printf("file can not be opened\n");
exit(1);
}
for(i=0;i<n;i++)
{
printf("******学院编号:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
printf("******学院总分:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
printf("******男团总分:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
printf("******女团总分:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
printf("\n\n\n");
getch();
for(j=0;j<m+w;j++)
{
printf("******项目编号:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
printf("******所取名次数量:");
fread(&k,sizeof(int),1,report);
printf("%d\n",k);
for(s=0;s<5;s++)
{
fread(&k,sizeof(int),1,report);
if(k!=0)
printf("******名次:"),
printf("%d\n",k);
}
for(s=0;s<5;s++)
{
fread(&k,sizeof(int),1,report);
if(k!=0) printf("******分数:"),
printf("%d\n",k);
}
}
printf("\n\n\n");
getch();
}
fclose(report);//关闭文件
}//按照读一个数据就输出一个数据的方式显示数据内容
void main()
{
int choice;
printf("======================欢迎使用======================\n");
printf("\n\n*****************运动会分数统计系统********************\n");
printf("\n\n********************1.输入信息*************************\n");
printf("********************2.输出信息*************************\n");
printf("********************3.查询信息*************************\n");
printf("********************4.调用信息*************************\n");
printf("********************5.退出系统*************************\n\n\n");
printf("================================================\n\n");
printf("********请选择要实现步骤的编号:\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
inputinformation();writedata();readdata();main();
case 2:
output();main();
case 3:
inquiry();main();
case 4:
readdata();main();
case 5:
exit(0);
default:
exit(0);
}
}
4 总结与展望
这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。
程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。
参考文献
[1] 《数据结构(C语言版)》 严蔚敏 清华大学出版社
[2] 《C语言程序设计》 李俊 电子工业出版社
[3] 百度文库 程序设计范例:
成员分工
姓名
主要工作
备注
李松
程序分析,文档编写,报告排版
第七组
梅艳霜
程序修改,查找资料,程序总结
第七组
倪天舒
程序调试,查找资料,分析讨论
第七组
成绩评定
成绩 教师签字
14
展开阅读全文