奥运会奖牌统计系统04070刘鑫.docx
《奥运会奖牌统计系统04070刘鑫.docx》由会员分享,可在线阅读,更多相关《奥运会奖牌统计系统04070刘鑫.docx(23页珍藏版)》请在冰豆网上搜索。
奥运会奖牌统计系统04070刘鑫
沈阳航空航天大学
课程设计
学号__________
班级__________
姓名__________
指导教师__郭建新________
年月日
沈阳航空航天大学
课程设计任务书
系:
自动化专业:
自动化班级:
14070202
学号:
2011040702067题目:
奥运会奖牌统计系统
一、课程设计时间
2012~2013第1学期第2周,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
(1)录入国家的信息,并且保存到一个磁盘文件;
(2)录入国家的金牌,银牌和铜牌数;
(3)统计国家的总成绩(计算方法:
总成绩=金牌数+银牌数+铜牌数);
(4)先按照金牌数对国家排序,再按照总成绩进行排序;
(5)查询某个国家的成绩(按照国家名、金牌数、总成绩等关键词进行查询)。
三、课程设计要求
程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“录入国家信息”、“录入成绩”、“统计”、“退出”等项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
✧课程结束后,上交课程设计说明书和源程序。
课程设计说明书的内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、成绩
六、教师评语
一、需求分析
根据任务书给定的“课程设计内容”和“课程设计要求”作如下的需求分析。
该系统是一个较为典型数据管理与查询系统.使用对象是面向奥运会组委会以及关心热爱奥运的普通民众。
因此该系统应当具备操作简单、稳定、功能齐全等特点。
1.操作简单性分析:
该系统进入与退出都给出了简单易懂的操作提示。
而且在每一个功能执行时也都给出了简单明了的操作提示。
可以说只要实字你就可以很熟练的使用该系统。
2.稳定性分析:
该系统源程序采用模块化设计思想,对每一个功能都利用独立函数实现各模块不相互影响。
因此保证了在用户操作合理的情况下,系统不会出现错误操作提示,更不会出现系统崩溃的情况。
3.主要功能分析:
(1)数据输入
对及时更新的数据输入文本并保存。
系统允许输入国家名。
对及时更新的奖牌数包括金牌、银牌、铜牌进行输入性修改并自动计算奖牌总数。
奖牌数数以整型数据输入。
(2)数据查询
点击查询选项系统会给出多种查找方式并给出相应提示,使用者可以根据自己的需要选择不同的查询对象查询自己所需要的数据。
(3)数据输出
点击主菜单的输出奖牌榜,系统将自动将文件中所包含的信息打印在屏幕上,使用者将得到奖牌的全部情况。
一目了然。
二、设计分析
主要有5个功能模块,每个模块对应一个C语言自定义函数。
这些函数原型及其功能简述如下:
(1)voidmenu();//操作指南//
介绍本系统并对功能及操作方法给出简单提示
(2)voidadd();//添加国家信息//
用于添加要录入的国家信息并保存到相应的文件夹中为后续的成绩录入和查询提供载体。
(3)voidmedal();//录入国家成绩//
用于添加对应国家的奖牌数据,并保存到对应文件夹中。
voidstatistic();//总奖牌榜//
打印文件中以录入国家成绩的排行榜。
voidseek();//成绩查询//
查找用户需要查找的国家奖牌情况。
可通过国家名、金牌数、总成绩数三种方式查询。
voidgold();//金牌查询//
通过金牌数查找相应的国家奖牌情况。
voidname();//国名查询//
通过国家名称查找对应国家的奖牌情况。
voidgrade();//总成绩查询//
通过输入的总奖牌数查找对应国家的奖牌信息。
1、程序总体结构图(传统流程图或N-S框图)
2、主要功能模块框图(传统流程图或N-S框图)
(1)添加国家信息函数add():
(2)录入国家成绩medal():
(4)国名查询函数name():
(4)总奖牌榜函数statistic():
三、主要界面截图
图3-1系统主界面
图3-2录入国家信息
图3-3录入国家成绩
图3-4打印总奖牌榜
图3-5按国名查询
图3-6按金牌数查询
图3-7按总成绩查询
图3-8退出界面
四、技术要点
1、结构体的应用
定义了结构体用来描述国家姓名、金牌数、银牌数、铜牌数。
具体的定义如下:
structcountry{charname[10];intgold;intsilver;intbronze;}cou={"0",0,0,0};
所定义的结构体主要用于定义数组,文件数据输入输出及处理的载体。
2、文件操作
包括了文件的追加和读取与三个方面。
文件的追加操作,用于录入国家信息,也用于保存所修改的数据。
例如如下程序段用于录入的国家信息:
FILE*fp;
intn,i;
fp=fopen("奥运会金牌统计信息.txt","a");
if((fp=fopen("奥运会金牌统计信息.txt","a"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
文件的读取用于读出文件中满足要求的数据。
进而进行下一步的数据处理。
像奖牌信息修改。
以下一段程序就是采用读取文件操作:
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
3、关于排序算法
实现将系统中随机输入的数据进行奖牌总数、金牌数、银牌数和铜牌数的排序,实现奖牌榜的输出。
算法的实现关键在于文件数据读取与贮存于适当的结构体成员中。
应当注意的是下一个排序是建立在前一个排序的基础上。
例如下面程序段就是排序算法:
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
}
for(j=0;j
sum[j]=cou[j].gold+cou[j].silver+cou[j].bronze;
for(i=0;ifor(n=i;nif(sum[i]{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
4、关于查询算法
本系统主要目的就是查找数据。
数据处理和修改首要任务就是找到要修改数据的位置。
这就需要运用到字符串对比函数将输入的数据和文本中的数据尽心比较。
例如以下程序段就运用了此算法:
for(i=0;!
feof(fp);i++)
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
for(j=0;j
if(strcmp(cou[j].name,name)==0)
{
五、个人总结
本次课设是对C语言全方位考查。
既是学校对学生学习情况的考查,也是学生自己对自己C语言掌握情况的一次真正的检验。
在这一周的课设过程当中及时为完成学校交给的任务股市对自己在基本知识和实践能力的一次全方位的提升。
在课设过程中同学们充分发挥了互相帮助互相交流、互相学习的良好学习方法。
但我觉得系统的编写更多的应该是独立的思考编写出自己对题目对程序的理解,编出自己的特色。
自我感觉课设一周的学习比我一年的理论的学习学到的东还要多。
像这种实践环节对于理工科的学生来说还是多多益善。
无论是学校还是老师或者是同学都应当给予足够的重视。
而我编写的系统首先不管好坏他完全出自我个人的想法。
代表了我个人对C语言的理解,对这个系统的理解。
我编写的系统源程序可能有点长,但是它很好地体现了模块化的思想。
合理的运用不同的操作语句,使程序的主线思路非常明了。
而缺点则是一方面在数据的输入时可能会出现重复的情况。
另一方面,由于程序较长在编译和运行时刻能反应稍慢。
对题目的评价方面,我觉得在排序要求方面不应当先执行总奖牌数的排序,应先进行金牌排序。
六、参考文献
谭浩强.C程序设计.北京:
清华大学出版社,2005
七、源程序
//奥运会奖牌统计系统//
#include
#include
#include
voidmenu();//操作指南//
voidadd();//添加国家信息//
voidmedal();//录入国家成绩//
voidstatistic();//总奖牌榜//
voidseek();//成绩查询//
voidgold();//金牌查询//
voidname();//国名查询//
voidgrade();//总成绩查询//
structcountry{charname[10];intgold;intsilver;intbronze;}cou={"0",0,0,0};
voidmain()
{
menu();
intn;
scanf("%d",&n);
switch(n)
{
case1:
add();break;
case2:
medal();break;
case3:
statistic();break;
case4:
seek();break;
case5:
exit(0);break;
default:
printf("请按照操作指南输入正确的操作代号\n");
}
}
voidmenu()//操作指南//
{
printf("***************奥运会奖牌统计系统操作指南***************\n");
printf("1录入国家信息\n");
printf("2录入国家成绩\n");
printf("3总奖牌榜\n");
printf("4查找国家成绩\n");
printf("5退出\n");
printf("请输入以上代号进行您所需要的操作\n\n");
}
voidadd()//添加国家信息//
{
FILE*fp;
intn,i;
fp=fopen("奥运会金牌统计信息.txt","a");
if((fp=fopen("奥运会金牌统计信息.txt","a"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
printf("请输入您想录入的国家数并按回车键确认\n");
scanf("%d",&n);
printf("请录入国家名并按回车键确认\n");
for(i=0;i{
scanf("%s",cou.name);
fprintf(fp,"%s%d%d%d\n",cou.name,cou.gold,cou.silver,cou.bronze);
}
}
fclose(fp);
main();
}
voidmedal()//录入国家成绩//
{
FILE*fp;
inti,n,j;
charname[10];
structcountrycou[100];
printf("请录入国家名并按回车键确认\n");
scanf("%s",name);
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
for(i=0;!
feof(fp);i++)
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
for(j=0;j
if(strcmp(cou[j].name,name)==0)
{
printf("请录入金牌数、银牌数、铜牌数中间用空格隔开并按回车键确认\n");
scanf("%d%d%d",&cou[j].gold,&cou[j].silver,&cou[j].bronze);break;
}
if(j>=i)
{printf("无此国家信息!
请先执行操作1录入国家信息。
\n");exit(0);}
}
fclose(fp);
fp=fopen("奥运会金牌统计信息.txt","w");
if((fp=fopen("奥运会金牌统计信息.txt","w"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
for(n=0;nfprintf(fp,"%s%d%d%d\n",cou[n].name,cou[n].gold,cou[n].silver,cou[n].bronze);
fclose(fp);
main();
}
voidseek()//成绩查询//
{
printf("***************查询指南*****************\n");
printf("1国名查询\n");
printf("2金牌查询\n");
printf("3总成绩查询\n");
printf("请输入你要查询的项目\n");
intn;
scanf("%d",&n);
switch(n)
{
case1:
name();break;
case2:
gold();break;
case3:
grade();break;
default:
printf("请按照操作指南输入正确的操作代号\n");
}
main();
}
voidname()//国名查询//
{
FILE*fp;
inti,j,n;
structcountrycou;
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
charname[100][10];
printf("请输入您想查询的国家数并按回车键确认\n");
scanf("%d",&n);
printf("请输入欲查询的国家名并按回车键逐一确认\n");
for(j=0;jscanf("%s",name[j]);
printf("国名金银铜\n\n");
for(i=0,j=0;!
feof(fp);i++)
{
fscanf(fp,"%s%d%d%d\n",cou.name,&cou.gold,&cou.silver,&cou.bronze);
if(strcmp(name[j],cou.name)==0)
{
printf("%s%d%d%d\n\n",cou.name,cou.gold,cou.silver,cou.bronze);
j++;
rewind(fp);
}
else
continue;
}
}
fclose(fp);
main();
}
voidgold()//金牌查询//
{
inti,j,s,n,t,sum[200];
structcountrycou[200],T;
FILE*fp;
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
}
for(j=0;j
sum[j]=cou[j].gold+cou[j].silver+cou[j].bronze;
for(i=0;ifor(n=i;nif(sum[i]{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
n=0;
loop:
printf("请输入您需查询的金牌数并按回车键确认\n");
scanf("%d",&s);n=0;
printf("国名金银铜总成绩\n\n");
for(i=0;iif(cou[i].gold==s)
{
printf("%s%d%d%d%d\n\n",cou[i].name,cou[i].gold,cou[i].silver,cou[i].bronze,sum[i]);
n++;
}
if(n==0)
{printf("抱歉!
无此金牌信息。
请重新输入……\n\n");gotoloop;}
}
fclose(fp);
main();
}
voidgrade()//总成绩查询//
{
inti,j,s,n,t,sum[200];
structcountrycou[200],T;
FILE*fp;
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
}
for(j=0;j
sum[j]=cou[j].gold+cou[j].silver+cou[j].bronze;
for(i=0;ifor(n=i;nif(sum[i]{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
n=0;
loop:
printf("请输入您需查询的总成绩并按回车键确认\n");
scanf("%d",&s);n=0;
printf("国名金银铜总成绩\n\n");
for(i=0;iif(sum[i]==s)
{
printf("%s%d%d%d%d\n\n",cou[i].name,cou[i].gold,cou[i].silver,cou[i].bronze,sum[i]);
n++;
}
if(n==0)
{printf("抱歉!
无此金牌信息。
请重新输入……\n\n");gotoloop;}
}
fclose(fp);
main();
}
voidstatistic()//总奖牌榜//
{
inti,n,j,sum[200],t;
structcountrycou[200],T;
FILE*fp;
fp=fopen("奥运会金牌统计信息.txt","r");
if((fp=fopen("奥运会金牌统计信息.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else
{
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%d%d%d",cou[i].name,&cou[i].gold,&cou[i].silver,&cou[i].bronze);
}
for(j=0;j
sum[j]=cou[j].gold+cou[j].silver+cou[j].bronze;
for(i=0;ifor(n=i;nif(sum[i]{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
for(i=0;ifor(n=i;nif((sum[i]==sum[n])&&(cou[i].gold{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
for(i=0;ifor(n=i;nif((sum[i]==sum[n])&&(cou[i].gold==cou[n].gold)&&(cou[i].silver{
T=cou[i];t=sum[i];
cou[i]=cou[n];sum[i]=sum[n];
cou[n]=T;sum[n]=t;
}
printf("***************奖牌榜***************\n\n");
printf("国名金银铜总成绩\n\n");
for(i=1;iprintf("%s%d%d%d%d\n\n",cou[i].name,cou[i].gold,cou[i].silver,cou[i].bronze,sum[i]);
}
fclose(fp);
main();
}