版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
保龄球计分系统C语言优秀课程设计目录TOC\o"1-3"\h\z1需求分析 11.1 问题描述 11.2 输入数据要求 11.3 输出数据要求 21.4 开发环境和工具 21.5 成员分工 22总体设计 32.1总体设计思路 32.2模块结构图 32.3模块说明 43详细设计 63.1数据类型定义 63.2Scan模块实现 63.3Save以及Read模块实现 83.4Count模块实现 94测试结果与分析 114.1.输入数据计算结果 114.2数据的文件保存 124.3从文件读入数据并计算结果 125个人总结 146附录 156.1源代码 15保龄球计分系统C语言优秀课程设计全文共23页,当前为第1页。保龄球计分系统C语言优秀课程设计全文共23页,当前为第1页。-PAGE2-1需求分析问题描述从键盘读入比赛数据;从文件读入比赛数据;将从键盘输入的比赛数据存入文件(一个文件可存放多局比赛的数据)。将比赛数据显示在屏幕上计算比赛结果及统计数据,并显示在屏幕上。一局(GAME)保龄球分为10格,每格里有两次投球机会,如在第一次投球时全中,就不需要投第二球。每一格可能出现三种情况:
1.失球(MISS)
无论何种情况,在一格的两次投球时,未能击倒10个瓶,此格的分数为击倒的瓶数,未击中用一个(-)符号表示。
2.补中(SPARE)
当第二次投球击倒该格第一球余下的全部瓶子,称为补中,用一个(/)符号表示。补中的记分是10分加上下一次投球击倒的瓶数。
3.全中(STRIKE)当每一格的第一次投球击倒全部竖立的十个瓶时,称为全中,用一个(×)符号表示。全中的记分是10分(击倒的瓶)加该球员下两次投球击倒的瓶数。
但在第十格中情况比较特殊:(1)如第二次投球未补中,则第十格得分为第九格得分加上第十格所击倒瓶数。(2)如第二次投球补中,则追加一次投球机会,第十格得分为第九格得他加上10加上追加一次投球击倒瓶数。(3)如第一球为全中,则追上加二次投球机会,第十格得分为第九格得分加上10加追加二次投球击倒的瓶数。因此从第一格到第十格的两次追加投球,都为全中,则为12个全中,得分为满分300分。输入数据要求 第一格第一次击倒瓶数: 第一格第二次击倒瓶数: 第二格第一次击倒瓶数: 第二格第二次击倒瓶数:保龄球计分系统C语言优秀课程设计全文共23页,当前为第2页。 …………保龄球计分系统C语言优秀课程设计全文共23页,当前为第2页。输出数据要求输入数据显示格式:序号123456789109|16|38|27|210|010|0
10|04|58|210|7|3积分输出数据显示格式:序号123456789109|/6|38|/7|2×|×|
×|4|58|/×|7|/得分1625425181105124133153173开发环境和工具开发环境:Windows7开发工具:VisualC++6.0成员分工保龄球计分系统C语言优秀课程设计全文共23页,当前为第3页。
2总体设计保龄球计分系统C语言优秀课程设计全文共23页,当前为第3页。2.1总体设计思路设计思路因为这是一个计分系统,所以在主函数中采用switch结构来达到输入数字来进行选项操作。然后通过定义大量的函数,然后在swtich中来一个个调用函数,来进行运算和处理。由于要使得系统能一次输入多局比赛并保存,读写文件时,先把每局数据存入一个最多能存10局比赛数据的结构体中,然后将整个结构体存入文件,读取文件时,可以自由选择载入保存比赛数据的文件,并自行选择需要显示和计算的比赛局数,然后进行显示,读写文件一律采用二进制方式读写。输入比赛数据以及输出比赛数据时,利用循环语句依次输出;对于保龄球第十格击球的特殊性,再加入if语句判断,然后根据不同情况进行输入或者计算。显示部分先定义count函数用来在得到比赛数据后进行计算积分,然后一种显示是输入数据后直接计算显示;还有一种是读取文件中比赛数据,然后再进行积分运算,再显示结果。在现实中,充分运用清屏函数,使程序显得直观简洁。数据存储在不退出程序的时候,如不进行将比赛数据存入文件的选项,每局比赛都存在个最多包含10局比赛数据的结构体中,然后可以选择是否把整个结构体读入文件并存储以便下次直接读取并计算显示。2.2模块结构图保龄球计分系统C语言优秀课程设计全文共23页,当前为第4页。根据需求将系统划分为两个个功能模块,函数之间的调用关系如图1.1所示。Main(switch)保龄球计分系统C语言优秀课程设计全文共23页,当前为第4页。Main(switch)ScanReadPrintSaveCountPrintCountChangeinChangeout图1.1保龄球计分系统模块结构图1)Scan:初始化比赛,输入比赛数据。2)Save:将比赛数据读入文件(只保存每局比赛击倒瓶数而不保存积分数据)。3)Count:通过计算得到比赛积分。4)Print:调用Count计算后得到比赛积分结果并输出。5)Read:读取存储了比赛数据的文件。Changein:将比赛数据由数组存入结构体,便于读入文件。Changeout:将结构体中数据赋值给数组,方便读取文件得到数据后的计算、处理。2.3模块说明Scan模块函数原型:voidscan();功能:提示输入局数以及每格击倒球数,即输入比赛数据。输入参数:a[11][4],二维数组,存放比赛数据。输出参数:a[11][4],已经赋值了的二维数组,存有一局比赛数据。Save模块函数原型:voidsave();功能:将小于等于十局数量的比赛数据存入自己命名的文件。输入参数:charch,infile[15],字符串数组,输入文件名字。输出参数:charch,infile[15],字符串数组,已经输入的文件名字。Count模块保龄球计分系统C语言优秀课程设计全文共23页,当前为第5页。函数原型:voidcount(intp[][4],intn);保龄球计分系统C语言优秀课程设计全文共23页,当前为第5页。功能:按保龄球比赛规则计算比赛积分。输入参数:intp[][4],已经赋值了二维数组,包含比赛数据。输出参数:intp[][4],已经赋值了二维数组,包含比赛数据以及每格所得分数。Print模块函数原型:voidprint();功能:按格式输出比赛数据并加和总分并按格式显示积分结果;输入参数:inta[11][4],已经赋值了二维数组,包含比赛数据以及每格所得分数。输出参数:inta[11][4],已经赋值了二维数组,包含比赛数据以及每格所得分数以及总分。5. Read模块
函数原型:voidread();
功能:读取存在文件中的比赛数据;
输入参数:outfile,字符串,需要读取的文件名;
t,整形变量,需要读取的比赛的局数。
输出参数:game[t],结构体,包含所需比赛的数据。6. Changein模块
函数原型:voidchangein();
功能:将二维数组转化为结构体;
输入参数:inta[11][4],已经赋值了二维数组,包含比赛数据以及每格所得分数。
输出参数:game[10].turn[11][2],结构体,包含比赛数据以及每格所得分数。7. Changeout模块
函数原型:voidchangeout();
功能:将结构体转化为二维数组;
输入参数:game[10].turn[11][2],结构体,包含比赛数据以及每格所得分数。
输出参数:inta[11][4],已经赋值了二维数组,包含比赛数据以及每格所得分数。保龄球计分系统C语言优秀课程设计全文共23页,当前为第6页。
3详细设计保龄球计分系统C语言优秀课程设计全文共23页,当前为第6页。3.1数据类型定义1.数据类型定义charch,infile[15],outfile[15];/*定义两个字符数组,用来输入存储以及读取的文件名*/structgame_number{intturn[11][2];}game[10];/*定义结构体,最多包含10局比赛数据*/inta[11][4];intt;/*定义两个全局变量,分别用于进行数据输入以及计算和输入选择比赛局数*/3.2Scan模块实现算法思想用for循环来给数组赋值;用if以及dowhile语句同进行,来进行输入判断,避免输入错误;在第十格用if语句判断接下来的击球情况。具体实现for(i=0;i<=8;i++)/*用for循环来给数组赋值*/ { printf("请输入第%d格第一次击倒瓶数:",i+1);scanf("%d",&a[i][0]); do { if(a[i][0]>10||a[i][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[i][0]);} elsem=1;}while(m==0);/*用if、do-while来避免输入错误*/} printf("请输入第十格第一次击倒瓶数:"); 保龄球计分系统C语言优秀课程设计全文共23页,当前为第7页。 scanf("%d",&a[9][0]);保龄球计分系统C语言优秀课程设计全文共23页,当前为第7页。 do { if(a[9][0]>10||a[9][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[9][0]); } elsem=1; }while(m==0); if(a[9][0]==10) { printf("请输入追加第一次击倒瓶数:"); scanf("%d",&a[10][0]); do { if(a[10][0]>10||a[10][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][0]); } elsem=1; }while(m==0); printf("请输入追加第二次击倒瓶数:");scanf("%d",&a[10][1]); do { if(a[10][1]>10||a[10][1]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][1]); } elsem=1; }while(m==0);}else { printf("请输入第十格第二次击倒瓶数:"); scanf("%d",&a[9][1]); do {保龄球计分系统C语言优秀课程设计全文共23页,当前为第8页。 if(a[9][1]>10||a[9][1]<0||a[9][0]+a[9][1]>10||a[9][0]+a[9][1]<0)保龄球计分系统C语言优秀课程设计全文共23页,当前为第8页。 { m=0; printf("错误,请再次输入:"); scanf("%d",&a[9][1]); } elsem=1; }while(m==0); if(a[9][0]+a[9][1]==10) { printf("请输入追加一次击倒瓶数:"); scanf("%d",&a[10][0]); do { if(a[10][0]>10||a[10][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][0]); } elsem=1; }while(m==0); } }/*用if和do-while语句按照比赛规则判断第十格第一次击球后所有输入情况*/3.3Save以及Read模块实现1.算法思想定义两个字符串组以及一个包含10个二维数组的结构体,前者用来输入文件名,后者用来包含10局以内数量的比赛数据,然后通过二进制读写方式,将整个结构体存储进自己命名的文件中;读取文件时也采用二进制将整个结构体读取。读入、读取文件时采用for循环方式全部读入、读写。注意:Save模块保存的只是比赛数据,即几局比赛每局每格击倒的瓶数;并不是直接保存比赛积分结果;所以Read模块读取后,还要再将数据进行计算然后得出积分结果。2.具体实现structgame_number{intturn[11][2];}game[10];charch,infile[15],outfile[15];voidsave()保龄球计分系统C语言优秀课程设计全文共23页,当前为第9页。{保龄球计分系统C语言优秀课程设计全文共23页,当前为第9页。 FILE*fp1; inti; printf("请输入保存比赛数据的文件名:");/*自己命名保存数据的文件名*/ scanf("%s",infile); if((fp1=fopen(infile,"wb+"))==NULL) {printf("cannotopenfile\n"); return; } for(i=0;i<=9;i++)fwrite(&game[i],sizeof(structgame_number),1,fp1); fclose(fp1);}voidread(){ FILE*fp2; inti; printf("请输入读取比赛数据的文件名:");/*输入比赛数据所在文件命以读取数据*/ scanf("%s",outfile);printf("\n"); printf("请输入要查询的比赛局数:"); scanf("%d",&t); if((fp2=fopen(outfile,"rb+"))==NULL) {printf("cannotopenfile\n"); }for(i=0;i<=9;i++) fread(&game[i],sizeof(structgame_number),1,fp2);/*用for循环读取整个结构体的数据*/}3.4Count模块实现1.算法思想根据题目要求的积分格式,在Count模块中,我只算出每轮所得分数,然后供Print模块调用,Print模块再用for循环即可加和求总积分,所以Count模块中我只利用ifelse语句判断击球情况来根据规则积分。2.具体实现voidcount(intp[][4],intn)/*定义形式参数,方便已经赋值的二维数组进行计算*/{if(n==9)/*由于比赛规则特殊性,所以从第9格后的积分算法要专门判断计算*/p[n][2]=p[n][0]+p[n][1]+p[n+1][0]+p[n+1][1];/*将每轮分数赋值到p[][2]中去*/else保龄球计分系统C语言优秀课程设计全文共23页,当前为第10页。{保龄球计分系统C语言优秀课程设计全文共23页,当前为第10页。if(p[n][0]==10) {if(p[n+1][0]!=10)p[n][2]=10+p[n+1][0]+p[n+1][1];elsep[n][2]=10+p[n+1][0]+p[n+2][0];}elseif(p[n][0]+p[n][1]==10)p[n][2]=10+p[n+1][0];elseif(p[n][0]+p[n][1]<10)p[n][2]=p[n][0]+p[n][1];}}保龄球计分系统C语言优秀课程设计全文共23页,当前为第11页。
4测试结果与分析保龄球计分系统C语言优秀课程设计全文共23页,当前为第11页。4.1.输入数据计算结果主页面,按照提示,测试输入数据计算结果这一项。保龄球计分系统C语言优秀课程设计全文共23页,当前为第12页。看到如果输入有误会立即提示并重新输入保龄球计分系统C语言优秀课程设计全文共23页,当前为第12页。这次输入数据后计算出的结果,并且按照要求格式输出;4.2数据的文件保存接下来测试能否保存文件。再继续又输入一局比赛数据后,将两句的比赛数据一起保存进了名为“2game”的文件中:4.3从文件读入数据并计算结果现在继续测试是否能选择读取文件数据,然后同样计算得积分。保龄球计分系统C语言优秀课程设计全文共23页,当前为第13页。保龄球计分系统C语言优秀课程设计全文共23页,当前为第13页。选择载入2game.dat这个文件,要查询的是第二局比赛的数据:可以看到得到的是之前输入的第二局比赛的数据,然后系统再次运算得出了相同的积分结果。保龄球计分系统C语言优秀课程设计全文共23页,当前为第14页。
5个人总结保龄球计分系统C语言优秀课程设计全文共23页,当前为第14页。虽然能在输入数据时报错,但是由于定义的输入数据为int型,所以如果输入字母等其他的话,就会有错误,所以还要继续改进。定义太多全局变量,而且定义结构体有些多余,完全可以通过定义三维数组达到。有些界面不能直接返回主界面,所以还需在一些数据输入的界面上加上这一选项。保龄球计分系统C语言优秀课程设计全文共23页,当前为第15页。
6附录保龄球计分系统C语言优秀课程设计全文共23页,当前为第15页。6.1源代码#include<stdio.h>#include<stdlib.h>structgame_number{intturn[11][2];}game[10];inta[11][4];intt;charch,infile[15],outfile[15];voidscan(){inti,m; printf("请输入比赛局数:"); scanf("%d",&t);for(i=0;i<=8;i++) { printf("请输入第%d格第一次击倒瓶数:",i+1);scanf("%d",&a[i][0]); do { if(a[i][0]>10||a[i][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[i][0]); } elsem=1; }while(m==0); printf("请输入第%d格第二次击倒瓶数:",i+1); scanf("%d",&a[i][1]); do { if(a[i][1]>10||a[i][1]<0||a[i][0]+a[i][1]>10||a[i][0]+a[i][1]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[i][1]); }保龄球计分系统C语言优秀课程设计全文共23页,当前为第16页。 elsem=1;保龄球计分系统C语言优秀课程设计全文共23页,当前为第16页。 }while(m==0); } printf("请输入第十格第一次击倒瓶数:"); scanf("%d",&a[9][0]); do { if(a[9][0]>10||a[9][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[9][0]); } elsem=1; }while(m==0); if(a[9][0]==10) { printf("请输入追加第一次击倒瓶数:"); scanf("%d",&a[10][0]); do { if(a[10][0]>10||a[10][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][0]); } elsem=1; }while(m==0); printf("请输入追加第二次击倒瓶数:");scanf("%d",&a[10][1]); do { if(a[10][1]>10||a[10][1]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][1]); } elsem=1; }while(m==0);}else { printf("请输入第十格第二次击倒瓶数:");保龄球计分系统C语言优秀课程设计全文共23页,当前为第17页。 scanf("%d",&a[9][1]);保龄球计分系统C语言优秀课程设计全文共23页,当前为第17页。 do { if(a[9][1]>10||a[9][1]<0||a[9][0]+a[9][1]>10||a[9][0]+a[9][1]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[9][1]); } elsem=1; }while(m==0); if(a[9][0]+a[9][1]==10) { printf("请输入追加一次击倒瓶数:"); scanf("%d",&a[10][0]); do { if(a[10][0]>10||a[10][0]<0) { m=0; printf("错误,请再次输入:"); scanf("%d",&a[10][0]); } elsem=1; }while(m==0); } }}voidchangein(){inth;for(h=0;h<=10;h++) {game[t].turn[h][0]=a[h][0]; game[t].turn[h][1]=a[h][1]; }}voidchangeout(){inth;for(h=0;h<=10;h++) {a[h][0]=game[t].turn[h][0]; a[h][1]=game[t].turn[h][1]; }}voidsave(){保龄球计分系统C语言优秀课程设计全文共23页,当前为第18页。 FILE*fp1;保龄球计分系统C语言优秀课程设计全文共23页,当前为第18页。 inti; printf("请输入保存比赛数据的文件名:"); scanf("%s",infile); if((fp1=fopen(infile,"wb+"))==NULL) {printf("cannotopenfile\n"); return; } for(i=0;i<=9;i++)fwrite(&game[i],sizeof(structgame_number),1,fp1); fclose(fp1);}voidread(){ FILE*fp2; inti; printf("请输入读取比赛数据的文件名:"); scanf("%s",outfile);printf("\n"); printf("请输入要查询的比赛局数:"); scanf("%d",&t); if((fp2=fopen(outfile,"rb+"))==NULL) {printf("cannotopenfile\n"); }for(i=0;i<=9;i++) fread(&game[i],sizeof(structgame_number),1,fp2);}voidcount(intp[][4],intn){if(n==9)p[n][2]=p[n][0]+p[n][1]+p[n+1][0]+p[n+1][1];else{if(p[n][0]==10) {if(p[n+1][0]!=10)p[n][2]=10+p[n+1][0]+p[n+1][1];elsep[n][2]=10+p[n+1][0]+p[n+2][0];}elseif(p[n][0]+p[n][1]==10)p[n][2]=10+p[n+1][0];elseif(p[n][0]+p[n][1]<10)p[n][2]=p[n][0]+p[n][1];}保龄球计分系统C语言优秀课程设计全文共23页,当前为第19页。}保龄球计分系统C语言优秀课程设计全文共23页,当前为第19页。voidprint(){ inti,k; printf("第%d局比赛数据及结果:\n",t);printf("\n");printf("\n");printf("\n"); printf("轮数:"); for(i=0;i<10;i++) printf("%6d",(i+1));printf("\n"); printf("击倒瓶数:"); for(k=0;k<=10;k++) { if(k<=9) {printf("%4d|%d",a[k][0],a[k][1]); } elseif(a[9][0]==10) printf("|%d|%d\n",a[k][0],a[k][1]); elseif(a[9][0]+a[9][1]==10) printf("|%d\n",a[k][0]); elseprintf("\n"); } printf("\n\n\n"); for(i=9;i>=0;i--)count(a,i);for(i=0;i<10;i++) {if(i==0)a[i][3]=a[i][2];elsea[i][3]=a[i-1][3]+a[i][2];} printf("轮数:"); for(i=0;i<10;i++) printf("%6d",(i+1));printf("\n"); printf(""); for(k=0;k<=10;k++) { if(k<=9) {if(a[k][0]==10) if(k==9)printf("×"); elseprintf("×|"); else 保龄球计分系统C语言优秀课程设计全文共23页,当前为第20页。 if(a[k][0]+a[k][1]==10)保龄球计分系统C语言优秀课程设计全文共23页,当前为第20页。 printf("%4d|/",a[k][0]); else if(a[k][0]==0) if(a[k][1]==0) printf("-|-"); else printf("-|%d",a[k][1]); else if(a[k][1]==0) printf("%4d|-",a[k][0]); else printf("%4d|%d",a[k][0],a[k][1]); } elseif(a[9][0]==10) if(a[10][0]==0) if(a[10][1]==0) printf("|-|-\n"); else printf("|-|%d\n",a[10][1]); else if(a[10][1]==0) printf("|%d|-\n",a[10][0]); else if(a[10][0]==10) if(a[10][1]==10) printf("|×|×\n"); else printf("|×|%d\n",a[10][1]); else if(a[10][1]==10) printf("|%d|×\n",a[10][0]); else printf("|%d|%d\n",a[k][0],a[k][1]); else if(a[9][0]+a[9][1]==10) if(a[10][0]==0) printf("|-\n"); elseif(a[10][0]==10)printf("|×\n"); elseprintf("|%d\n",a[k][0]); elseprintf("\n"); } printf("总计得分:"); for(i=0;i<10;i++)保龄球计分系统C语言优秀课程设计全文共23页,当前为第21页。printf("%6d",a[i][3]);printf("\n");printf("\n");printf("\n");printf("\n");保龄球计分系统C语言优秀课程设计全文共23页,当前为第21页。}voidmain(){ intx,y,z; do { system("cls"); printf("\n"); printf("欢迎使用保龄球计分系统\n"); printf("\n"); printf("**********************\n"); printf("**************\n"); printf("*******************\n"); printf("********
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高温气冷堆行业创新技术发展与政策分析报告
- 2026年智能医疗设备技术创新发展报告
- 2026年锻压机械行业前沿技术突破与创新报告
- 2026年防水涂料行业创新材料深度报告
- 2026年食用冰醋酸产品创新研发动态报告
- 2026年铁红行业创新研发报告
- 2026年人工智能在医疗领域的应用报告及未来趋势
- 2026年区块链在环保行业确权与溯源的应用报告
- 2026年交通行业专利转化与智慧交通发展报告
- 2026年吸尘器行业市场发展研究报告
- 2026年广东省公需课《人工智能赋能高质量发展》试题及答案
- 门球教练入门知识培训课件
- 铁路扫雪除冰安全培训课件
- 乡土中国各章题目及答案
- 《机械设计》课件-ch04第四章 带传动
- UNIC优丽可UC30投影仪说明书
- DZ/T 0221-2006崩塌、滑坡、泥石流监测规范
- 浙江省公路工程质量检验评定用表
- 国家电网有限公司输变电工程通 用设计(330~750kV输电线路绝缘子金具串通 用设计分册)2024版
- 《自动化生产线安装与调试》课件-项目二 供料单元安装与调试
- 检验科质量控制课件
评论
0/150
提交评论