c语言程序设计--保龄球计分系统,绝对可用,完美测试

c语言程序设计--保龄球计分系统,绝对可用,完美测试
c语言程序设计--保龄球计分系统,绝对可用,完美测试

#include"stdio.h"

#include"stdlib.h"

int totscore();

void paixu(struct people st[],int n);/*排序函数*/

struct people

{ int num;

int score;

};/*定义结构体存储人和其对应的分数*/

int K=1;

void main()

{

int J;

printf("第%d局比赛成绩录入:\n",K);

printf("\n");

FILE *fp;/* FILE *fp 是声明,声明fp是指针,用来指向FILE类型的对象*/ int i,n;/*n是参加比赛人数*/

struct people st[80];

puts("------请输入总人数:");

scanf("%d",&n);

for(i=0;i

{

printf(" 请输入第%d人击倒的瓶数\n",i+1);

st[i].num=i+1;

st[i].score= totscore();/*引用结构体元素的形式a[i].b*/

}

for(i=0;i

{ printf("\n");

printf("第%d人击倒的瓶数是:%d\n",st[i].num,st[i].score);

printf("\n");

}

/*将存储后的数据排序*/

paixu(st,n);

puts("======================排序后========================");

printf("\n");

printf("第%d局的比赛结果排序情况:\n",K);

printf(" 排名\t 选手\t 得分\n");

printf("\n");

for(i=0;i

{ printf("第%d名\t 第%d人\t %d\n",i+1,st[i].num,st[i].score);

printf("\n");

}

/*排序后的结果存储到Result.txt */

if((fp=fopen("Result.txt","a+"))==NULL)

{

puts("====不能打开文件====");

exit(0);

}

/* int fprintf( FILE *stream, const char *format, ... );

fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值. */

fprintf(fp,"以下是第%d局比赛结果的排名:",K);

fprintf(fp,"\n");

fprintf(fp," 排名\t 选手\t 得分\n");

for(i=0;i

{

fprintf(fp,"第%d名\t 第%d人\t %d\n",i+1,st[i].num,st[i].score);

fprintf(fp,"\n");

}

fclose(fp);

K++;

printf("是否继续录入下一局数据?1/0");

printf("\n");

scanf("%d",&J);

while((J!=1)&&(J!=0))

{

printf("输入错误,请重新输入:1/0 ?");

scanf("%d",&J);

}

printf("\n");

printf("\n");

if(J==1)

{

main();

}

else

{system("Result.txt");

system("pause"); /*使输出窗口暂停*/

}

}

/*排序子函数,实现以总分为标准,将结构体成员按分数降序排列*/

void paixu(struct people st[],int n)

{ int i,j;

struct people t;/*声明中间量t也是结构体*/

for(i=0;i

for(j=i+1;j

{

if(st[i].score

{ t=st[i];

st[i]=st[j];

st[j]=t;

}

}

}

/*求每局总分数的子函数*/

int totscore()

{

int a[19][5],i,j,t,m,k,x,q,w,sum=0,y=0,r=0,p=0;

/*i控制第几轮数目,j控制第几次数目,t为寄存第一次击倒瓶子数变量,m为第二次击倒瓶子数变量,k为第十轮第三次击倒瓶子数目变量,x为寄存k的变量,最后要t+m+x统计第十轮总数*/

for(i=1;i<=10;i++)

{

for(j=0;j<1;)/*用i表示第i轮,j表示第i轮的第(j+1)次*/

{

printf(" 请输入第%d轮第一次击倒的瓶数:\n",i);

puts("------注意输入击倒的瓶数不要高于10------");

scanf("%d",&a[i][j]);

/*上面是第i论的(j+1)次击球数目,根据第一次的击球数又分为下面三种情况决定第二次击球,主要讨论a[i][j]<=0两种情况*/

while(a[i][j]>10)

{

printf("error数值溢出,请重新输入第%d轮第一次击倒的瓶数:\n",i);

puts(" ------请输入击倒的瓶数不要大于10-----");

scanf("%d",& a[i][j]);

}

t=a[i][j];

/*只有数据正确才会脱离while语句,

赋值给变量t,放便于数据的变化,

而数组专门用来存放每轮每次的击倒球数目,所以具体分以下两种情况*/

/*情况一,第一次击球少于10个时*/

if(a[i][j]<10)

{

printf(" 请输入第%d轮第二次击倒的瓶数:\n",i);

printf("------注意输入击倒的瓶数不要高于%d------\n",10-t);

j++;

/*此时下面这个a[i][j]已经是第i轮的第二次击球了,

并且又分为第十轮以下第十轮以上的情况*/

scanf("%d",&a[i][j]);

if(a[i][j]<=10-t)

{

m=a[i][j];

}

else

{

while(a[i][j]>10-t)

{

printf("error数值溢出,请输入第%d轮第二次击倒的瓶数:\n",i);

printf("------注意输入击倒的瓶数不要高于%d------\n",10-t);

scanf("%d",&a[i][j]);

}/*如果输入的一直大于10-t就一直显示错误*/

m=a[i][j];

}

/*由于第10轮又有特殊情况,所以下面又加以区分:*/

if((m<=10-t)&&(i<10))/*在第十轮以下时,直接计算两次总和输出*/

{

printf("第%d轮击倒的瓶数是%d\n",i,m+t);

printf("\n");

x=0; /*防止最后结果是随机数以下一样*/

}

if((m<10-t)&&(i==10))

/*第十轮的第二次击球如果少于10-t个,

将失去第三次击球机会所以也是直接输出结果*/

{

printf("第%d轮击倒的瓶数是%d\n",i,m+t);

printf("\n");

x=0;

}

if((m==10-t)&&(i==10))

/*第十轮第二次正好击倒10-t个瓶子,

则第十轮第一第二次总和为10瓶子,

所以获得第三次击球奖励,之后再计算三次总和*/

{

puts(" 请再次输入一次击倒的瓶数");

puts("------输入击倒的瓶数不要大于10------");

scanf("%d",&k);

if(k<=10)

x=k;

/*引入K便于最后总分的计算,

因为只是希望数组a[i][j]存储两次的击球数目,

否则不利于总分的计算*/

else

{ while(k>10)

{

puts("error数据溢出,请再次输入一次击倒的瓶数:");

printf("------输入击倒的瓶数不要大于10------");

scanf("%d",&k);

}

x=k;

}

printf("第%d轮击倒的瓶数是%d\n",i,m+t+x);

printf("\n");

}

}/*至此情况1完毕*/

/* 情形2,第一次击球就已经够10个时*/

if(t==10) /*t表示第一次的击球数目,在前面已经有写,这里注释提醒*/

{

if(i==10)/*第10论的第一次击球够10个时*/

{

puts(" 输入额外的第一次击倒的瓶数:");

puts("------注意输入击倒的瓶数不要高于10 ------");

scanf("%d",&w);

while(w>10)

{

puts("error数据溢出,请重新输入第一次额外击倒的瓶数:");

puts(" ------请输入击倒的瓶数不要大于10-----");

scanf("%d",&w);

}

if(w<=10)

{ y=w;

if(y==10)

{ puts(" 输入第二次额外击倒的瓶数!");

puts(" ------请输入击倒的瓶数不要大于10-----");

scanf("%d",&p);

if(p<=10)

r=p;/*引入r的作用与引入k的作用是一样的,便于计算总分*/

else

{

while(p>10)

{

puts("error数据溢出,请输入第二次额外击倒的瓶数:");

puts(" ------请输入击倒的瓶数不要大于10-----");

scanf("%d",&p);

}

r=p;

x=0;/*防止最后结果是随机数*/

}

}

else

/*是y=w<=10的<10情况,即是第一次额外击

球不够10个,这里第二次就是把剩下的进行击球*/

{

puts(" 输入第二次额外击倒的瓶数!");

printf(" ------请输入击倒的瓶数不要大于%d的分数!------\n",10-y);

scanf("%d",&p);

if(p<=10-y)

r=p;

else

{

while(p>10-y)

{

puts(" 输入第二次额外击倒的瓶数!");

printf(" ------请输入击倒的瓶数不要大于%d的分数!------\n",10-y);

scanf("%d",&p);

}

r=p;

x=0;/*避免计算结果时产生随机数*/

}

}

}

printf("第%d轮击倒的瓶数是%d\n",i,10+y+r);

printf("\n");

printf("\n");

j++;

a[i][j]=0;

}

if(i<10) /*如果第十轮之前的第一次击球已经10个,直接到省去二次击球*/ {

printf("第%d轮击倒的瓶数是%d\n",i,a[i][j]);

printf("\n");

j++;

a[i][1]=0;

x=0;

r=0;y=0;/*防止最后结果是随机数*/

}

}

}

}

/*该局总分的计算*/

for(i=1;i<=10;i++)

{

for(j=0;j<2;j++)

{

q=a[i][j];

sum=sum+q;

}

}

printf("¥该局总分:%d¥\n",sum+x+y+r);

printf("\n");

return (sum+x+y+r);

}

相关主题
相关文档
最新文档