运动会课程设计报告.docx
《运动会课程设计报告.docx》由会员分享,可在线阅读,更多相关《运动会课程设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
![运动会课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-5/19/0359561a-5dfa-4bae-8f1f-29b76e7fa29f/0359561a-5dfa-4bae-8f1f-29b76e7fa29f1.gif)
运动会课程设计报告
课程设计报告
(2010--2011年度第2学期)
实验名称:
数据结构
题目:
运动会项目管理
院系:
控制与计算机工程
班级:
软件1002班
学号:
1101250224
学生姓名:
温裕青
指导教师:
林碧英
设计周数:
1周
成绩:
日期:
2011年6月25日
一、课程设计的目的与要求
1.目的:
应用数据结构和算法来设计相应的程序,培养学生问题求解模块的框架设计和详细设计、相关程序实现和调试能力,完成创新能力和实践能力的训练。
2.要求:
用高级程序设计语言C编码,用VC++开发平台调试。
二、设计正文
一)课程设计题目:
运动会项目管理。
二)需求分析:
运动会项目管理程序设计所需要的是整理出不可以同时举行的项目,然后把他们分到一组。
同时把程序运行过程中的信息存储到文件里面方便下次使用。
要求可以增减项目和参赛的同学,这过程中得考虑增减项目对学生报名信息的影响。
三)概要设计:
1)先定义一个游戏中要用到的抽象的数据类型。
ADTLIST{
数据对象D:
D是具有相同特性的数据袁术的集合,每个元素对应学生的一项信息名。
数据关系R:
数据元素同属一种类型
基本操作:
从文件读取学生信息;插入,删除学生信息。
}ADT;
2)本程序包含的函数有:
1.主函数main();//里面包含了一级菜单。
2.学生报名信息管理的二级菜单menu1();
3.运动会项目管理的二级菜单menu2();
4.插入学生信息的函数insertSTU();
5.删除学生信息的函数deleSTU(charname[]);//一次只能删除一个,且按姓名删除
6.把项目信息从文件里面导出Pdaochu();
7.把学生信息从文件里面导出Sdaochu();
8.给项目赋值一个整数以方便项目安排是的计算fuzhi(char[]);
9.插入运动项目Pinsert();
10.删除运动项目Pdele();//删除运动会项目是需要考虑到删除后对学生信息的各种影响
11.查看某同学所报的项目是否举行LOOK(student);
12.参看某项目是否存在Plook(char[]);
13.项目安排管理函数Program();
各函数之间的关系:
insertSTU
PdaochudeleSTU
dispSTU
Sdaochumenu1
MainLOOK
PinsertPlook
Pdele
menu2Programfuzhi
四)详细设计
(1)数据类型定义
typedefstruct
{
charschool[10];//院系
charsex[4];//性别
charsum[20];//学号
charname[20];//学生姓名
charitem[3][20];//所报项目且每人限报两项,只报一项的则第二项改为'不报'
}student;
操作:
Sdaochu-------导出学生信息
insertSTU-----增加学生信息
deleSTUI---------按姓名删除学生信息
Pdaochu---------导出项目信息
Pinsert---------插入项目信息
Pdele-----------删除项目信息
Program---------项目安排管理
//以上操作完成后都要把信息存入文件里面保存。
方便下次使用。
五)调试分析
1.开始在执行删除学生信息是每次都是把全部都删除了。
通过调试才发现原来从文件导出学生信息时久已经出现了错误。
用于导出学生信息的一个变量“i”没有初始化为1,所以一开始就为最后的一个。
所以存放信息的数据结构前面都为空了。
2.在执行Program函数是发现里面的data[]变化没有按照预期的进行。
通过调试是才发现赋值data[]的循环不能跳出。
所以我加了个限制他的循环条件。
3.开始在执行二级菜单时发现一级菜单的东西还留在屏幕上。
所以我在每个二级菜单前加了个清屏函数。
这样在二级菜单开始前一级菜单的信息都会从屏幕上清除.
4.在执行删除项目函数时,发现删除了一个项目后学生信息里面还有这个项目的信息。
所以经过考虑我删除了学生信息里面的不存在的信息,并且如果该学生所报的项目都不存在的话,则删除改学生的所有信息。
六)使用说明
开始运行后,显示为
下面我们先选择1:
我们先看下从文件里面导出的学生信息是否正确,所以选择3
可以看出信息成功的导出了.
下面我们退回到一级菜单。
选择2:
我们先看下项目是否正确了。
选择4
可以看出项目的导出也成功了。
选择3,看下项目安排正确不。
接下来再退回到一级菜单。
选择1
再选择1增加一个学生信息。
这里我们选择增加一个学生信息
接下来显示下看学生信息是否插入
因为插入了一个学生信息,冲突关系发生了改变,项目安排肯定也相应的发生了改变,我们再执行以下项目安排管理
可以看到男子200米和男子1000米被分到了不同组。
下面我们执行下删除学生信息。
输入删除的名字:
小刚。
再显示一遍看看。
退回到一级菜单,
选择2
来到运动会项目管理的二级菜单。
由于之前删除了小刚的信息。
所以项目安排也会改变
下面执行删除运动会项目。
选择2选择删除一个,因为本身数据里面项目就很少删除太多会导致数据不全面。
男子3级跳
删除后显示一次看看是否删除了。
这里可以看出删除成功。
接下来看下删除后对学生信息的影响
小谷那里原来是报有男子3级跳的,但是删除了3级跳之后变成了“不报”。
项目安排也会发生相应的改变。
增加一个运动项目‘
男子铁人
增加了项目当然相应的也有学生报。
回到项目安排管理的地方
男子铁人出现在了第二组。
附录:
#include
#include
#include
#include
#definemax50
typedefstruct
{
charschool[10];//院系
charsex[4];//性别
charsum[20];//学号
charname[20];//学生姓名
charitem[3][20];//所报项目且每人限报两项,只报一项的则第二项改为'不报'
}student;
studentSTU[20];
charsl[20][20];
intn,m;
voidinsertSTU();//插入报名学生
voiddeleSTU(charname[10]);//删除报名学生
voidPdaochu();//把项目从文件里导出
voidSdaochu();//把学生信息从文件里面导出
voidProgram();//项目安排
intfuzhi(char[]);//给项目附给一个整数方便比较
voidPinsert();//插入运动项目
voidPdele();//删除运动会项目
intLOOK(student);//查看某同学所报项目是否都不举办
intPlook(charp[20]);//查看项目是否存在
intPlook(charp[20])
{
inti;
for(i=1;i<=m;i++)
{
if(strcmp(p,sl[i])==0)
return1;
}
return0;
}
intLOOK(studenta)
{
inti;
for(i=1;i<=m;i++)
{
if(strcmp(a.item[1],sl[i])==0||strcmp(a.item[2],sl[i])==0)
return1;
}
return0;
}
voidPdele()
{
inti,j,k,q;
charpro[20];
printf("输入你要删除项目的个数:
\n");
scanf("%d",&k);
printf("输入要删除的项目:
\n");
for(i=1;i<=k;i++)
{
scanf("%s",pro);
for(j=1;j<=m;j++)
if(strcmp(pro,sl[j])==0)
{
strcpy(sl[j],sl[j+1]);
m--;
}
}
//把修改后的项目存入文件
FILE*fp,*p1;
fp=fopen("项目.txt","w");
for(j=1;j<=m;j++)
fprintf(fp,"%s\t",sl[j]);
fclose(fp);
//由于删除了项目后部分同学的参报项目也需改变,
//如果某同学所报的项目全部没有了就把该同学删掉
q=n;
for(i=1;i{
if(LOOK(STU[i])==0)
{
strcpy(STU[i].school,STU[i+1].school);
strcpy(STU[i].sex,STU[i+1].sex);
strcpy(STU[i].sum,STU[i+1].sum);
strcpy(STU[i].name,STU[i+1].name);
strcpy(STU[i].item[1],STU[i+1].item[1]);
strcpy(STU[i].item[2],STU[i+1].item[2]);
n--;
}
}
if(LOOK(STU[i])==0)
n--;
for(i=1;i<=q;i++)
{
if(Plook(STU[i].item[1])==0)
{
strcpy(STU[i].item[1],STU[i].item[2]);
strcpy(STU[i].item[2],"不报");
}
if(Plook(STU[i].item[2])==0)
strcmp(STU[i].item[2],"不报");//--------------------------------------------------------------------
}
//把学生信息存入文件
p1=fopen("学生报名信息","w");
for(i=1;i<=n;i++)
fprintf(p1,"%s\t%s\t%s\t%s\t%s\t%s\n",STU[i].school,STU[i].sex,STU[i].sum,STU[i].name,STU[i].item[1],STU[i].item[2]);
fclose(p1);
}
voidSdaochu()
{
inti=1;
FILE*p1;
if((p1=fopen("学生报名信息","r"))==NULL)
{
printf("文件文件读入失败!
!
!
!
\n");
exit(0);
}
while(!
feof(p1))
{
fscanf(p1,"%s%s%s%s%s%s",STU[i].school,STU[i].sex,STU[i].sum,STU[i].name,STU[i].item[1],STU[i].item[2]);
//如果只报一项,则第二个输入“不报”
i++;
}
n=i-2;
fclose(p1);
}
voidPinsert()
{
FILE*fp;
intk,i;
charb[20];
fp=fopen("项目.txt","at");
printf("输入增加的项目的个数\n");
scanf("%d",&k);
printf("输入增加项目名称--\n");
for(i=1;i<=k;i++)
{
scanf("%s",b);
fprintf(fp,"%s\t",b);
strcpy(sl[m+i],b);
}
fclose(fp);
m=m+k;
}
voidPdaochu()
{
inti=1;
FILE*fp;
fp=fopen("项目.txt","r");
while(!
feof(fp))
fscanf(fp,"%s",sl[i++]);
fclose(fp);
m=i-1;
}
voidinsertSTU()
{
intk,i;
FILE*fp;
fp=fopen("学生报名信息","at");
printf("输入增加学生的个数\n");
scanf("%d",&k);
printf("输入增加的学生的信息---\n");
for(i=1;i<=k;i++)
{
scanf("%s%s%s%s%s%s",STU[n+i].school,STU[n+i].sex,STU[n+i].sum,STU[n+i].name,STU[n+i].item[1],STU[n+i].item[2]);
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\n",STU[n+i].school,STU[n+i].sex,STU[n+i].sum,STU[n+i].name,STU[n+i].item[1],STU[n+i].item[2]);
}
fclose(fp);
n=n+k;
}
voiddeleSTU(charname[10])
{
FILE*p1;
inti=1,k;
for(i=1;i<=n;i++)
{
if(strcmp(name,STU[i].name)==0)
k=i;
}
//把学生信息存入文件
p1=fopen("学生报名信息","w");
for(i=1;i<=n;i++)
if(i!
=k)
{
fprintf(p1,"%s\t%s\t%s\t%s\t%s\t%s\n",STU[i].school,STU[i].sex,STU[i].sum,STU[i].name,STU[i].item[1],STU[i].item[2]);
}
fclose(p1);
for(i=k;i{
strcpy(STU[i].school,STU[i+1].school);
strcpy(STU[i].sex,STU[i+1].sex);
strcpy(STU[i].sum,STU[i+1].sum);
strcpy(STU[i].name,STU[i+1].name);
strcpy(STU[i].item[1],STU[i+1].item[1]);
strcpy(STU[i].item[2],STU[i+1].item[2]);
}
n--;
}
intfuzhi(chars[10])
{
intj=1;
while(sl[j])
{
if(strcmp(sl[j],s)==0)
returnj;
else
j++;
}
returnj;
}
voidProgram()
{
inti=1,j=1,k=1,l=1,data[20],q,num=0;
for(;i<=m;i++)
data[i]=l;//开始把代表运动项目安排的次序全部置为1
l++;
while(j!
=num)
{
num=j;
for(i=1;i<=n;i++)
{
if(data[fuzhi(STU[i].item[1])]==l-1&&data[fuzhi(STU[i].item[2])]==l-1)
{
data[fuzhi(STU[i].item[2])]=l;
j++;
}
}
l++;
}
q=l-2;
i=1;
FILE*fporder;
fporder=fopen("分组信息.txt","w");
while(i<=q)
{
printf("\n第%d组\n",i);
fprintf(fporder,"第%d组\n",i);
//把分组的信息读出来和存进文件里面
for(j=1;j<=m;j++)
{
if(data[j]==i&&strcmp(sl[j],"不报")!
=0)
{
printf("%s\t",sl[j]);
fprintf(fporder,"%s\t",sl[j]);
}
}
i++;
}
fclose(fporder);
}
voidSdisp()
{
inti=1;
printf("院系\t性别\t学号\t姓名\t第一个项目\t第二个项目\n");
while(i<=n)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",STU[i].school,STU[i].sex,STU[i].sum,STU[i].name,STU[i].item[1],STU[i].item[2]);
i++;
}
}
intmenu1()
{
charname[20];
while
(1)
{
intk;
printf("-------------------------------------------------\n");
printf("学生报名信息管理\n");
printf("------------------------------------------------\n");
printf("1-增加学生报名信息\n");
printf("2-按姓名删除学生报名信息\n");
printf("3-显示学生报名信息\n");
printf("0-退出\n");
printf("*************************************************\n");
printf("请输入你要进行的操作");
scanf("%d",&k);
switch(k)
{
case1:
insertSTU();
printf("\n按任意键继续\n");
getch();
break;
case2:
printf("输入要删除的学生的名字:
\n");
scanf("%s",name);
deleSTU(name);
printf("\n按任意键继续\n");
getch();
break;
case3:
Sdisp();
printf("\n按任意键继续\n");
getch();
break;
case0:
return0;
default:
printf("错误操作指令,请重新输入");
printf("\n按任意键继续\n");
getch();
break;
}
system("cls");//清屏函数
}
}
intmenu2()
{
while
(1)
{
intk,i;
printf("-------------------------------------------------\n");
printf("运动会项目管理\n");
printf("------------------------------------------------\n");
printf("1-增加运动会项目\n");
printf("2-减少运动会项目\n");
printf("3-运动会项目安排管理\n");
printf("4-显示比赛项目\n");
printf("0-退出\n");
printf("*************************************************\n");
printf("请输入你要进行的操作");
scanf("%d",&k);
switch(k)
{
case1:
Pinsert();
printf("\n按任意键继续\n");
getch();
break;
case2:
Pdele();
printf("\n按任意键继续\n");
getch();
break;
case3:
Program();
printf("\n按任意键继续\n");
getch();
break;
case4:
for(i=1;i<=m;i++)
printf("%s\t",sl[i]);
printf("\n按任意键继续\n");
getch();
break;
case0:
return0;
default:
printf("错误操作指令,请重新输入");
printf("\n按任意键继续\n");
getch();
break;
}
system("cls");
}
}
voidmain()
{
inti=1;
Pdaochu();
Sdaochu();
while
(1)
{
intk;
//菜单----------菜单
printf("-------------------------------------------------\n");
printf("运动会项目管理系统\n");
printf("------------------------------------------------\n");
printf("1-学生报名信息管理\n");
printf("2-运动会项目管理\n");
printf("0-退出\n");
printf("*************************************************\n");
printf("请输入你要进行的操作");
scanf("%d",&k);
switch(k)
{
case0:
exit(0);
case1:
system("cls");//清屏函数
menu1();
printf("\n按任意键继续\n");
getch();
break;
case2:
system("cls");//清屏函数
menu2();
printf("\n按任意键继续\n");
getch();
break;
}
system("cls");