问题描述:
用c语言实现保龄球的计分程序。
保龄球:每一局共有10小格,每格可有两次投球机会.击脊帆知倒的瓶数,即为其分樱消数,满分为10分;定义设每格击球的数据结构为:
struct strike {int first:int second;struct strike*next;}
按要求完成程序:
1)编写函数creat(void)建立一个包含11格击球组成的单向链表,返回指向链表的指针;
2)编写函数setScore(struct strike *head)读取从键盘上连续录轿拍入的击球得分将得分存入链表并返回实际击球的格数:(注:如果每格第1次全击倒10瓶,将直接进入下1格;若不全击倒可以补击一次:在第10格第1次若是全击倒,将在第11格再击2球,若是补中全击倒则在11格再击1球:若补击仍然未全击倒,则没有第11格的击球机会;)
3)编写函数getScore(struct strike *head)计算出该局实际总得分;(注:每格计分规则为:每格若未满10分按实际分记;若1次全击倒,该格成绩累加后两击的成绩;若补击全击倒,则累加后一击成绩,最后再累加各格成绩。)
4)编写main()函数完成整个程序。
解析:
记分函数我不太懂所以没有写
struct strike
{
int first
int second
struct strike *next
}
struct strike *creat()
{
struct strike *head
struct strike *p
struct strike *last
int n=0
while(n++<11)
{
p=(struct strike*)malloc(sizeof(struct strike))
if(head=NULL)
head=p
else
last->next=p
last=p
}
return head
}
void setScore(struct strike *head)
{
struct strike *p
p=head
int n=0
int num
int num2
while(n++<10)
{
printf("qing shuru %n ju de diyicichengji:",n+1)
scanf("%d",&num)
p->first=num
if(num==10)
{
p++continue
}
else
{
printf("qing shuru %n ju de diyierchengji fenshuxiaoyu%n:",n+1,10-num)
scanf("%d",&num2)
p->second=num2
p++
}
}
p--
if(p->first==10)
{
scanf("%d",&num)
p->next->first=num
if(num==10)
p->next->second=0
else{
scanf("%d",&num2)
p->next->second=num2
}
else
{
if(p->first+p->second==10)
{
scanf("%d",&num)
p->next->first=num
p->next->second=0
}
}
}
}
额,时间不太够,只能写一部分代码,然后给你思路了,先抱歉。下面是代码:#include<stdlib.h>
static int a[1000] = {0}
main()
{
int i
for(i = 0i<1000i++)
{
a[i] = (int)(999*rand())/(RAND_MAX + 1.0)//产生随机数并写入数组中。
printf("%d\n", a[i]) //打印
}
//本来满足你题目意思的线性表应该用指针表滚山示,不过我习惯用数组了,你改为指针
//然埋森后让它=NULL就满足题意了。
//后面是删除的部分,也很简单,看一下C语言教程链表的删除方弯备亩式就行了;
// 大概就是这样了,希望能满足你的要求。
}
#include <stdio.h>//包含基本输入输出头文件#define N 13 //宏定义13为N(N就是数字13)
struct { int n: /* 一轮内滚球次数 */
int f/* 第一轮击倒吵棚柱数 */
int s/* 第二次击倒柱数 */
int score/* 本轮得分 */
int total/* 至本轮累计总分 */
int m/* 完成本轮得分计算, 还需要滚球次数 */
} s[N]//结构体
int ok = 0/* 已完成完整计算的轮次数 */
int ball(int i, int n, int max) /* 完成一次滚//定义函数球, 输入正确击倒柱数 */
{ if (i<= 10) //如果 i小于等于 10
printf("输入第%d轮的第%d次滚球击倒柱数"), (<=%d)//输出\n",i,n,max)
else //否则
printf("输入附加的第%d次滚球击倒柱数"),(<=%d)//输出\n",c++,max)
scanf("%d", &d)获得输入
if (d>=0 &&d<=max) break如果 d大于等于0并且d小于等于max 中断
printf("咐碰不合理的击倒柱数, 请重新输入, \n")//输出
}
if ( OK<c-1) 如果ok小于 c-1
{ /* 对以前未完成计算的轮次分别计算衡碰谈得分与累计总分 */
for (j = ok+1j<i/j<=i-1j++) j初始化为ok+1 每次循环加一,当j小于...错误
{a[j].scre+=da[j].scre=a[j].scre+d
if (--a[j].m==0) [j].m 减1 如果[j].m等于0
那么
{//错误
a[j]. total = (j>i?a[j-1].total(:0/)j==1?0a[j-1].total)+a[j].scoreok=j/ok+1}
a[j]. total =
}
}
return d返回d
}
main0
{int i,/*轮次 */ first.second k
for(i=1ok<10i++)
{ /*处理第一次滚球 */
a[i].score = a[i].f=first = ball(i,1,10)
if (first==10) a[i].m=2
a[i].n=1
if (first<10 &&(i <=10 || i==11 &&ok<10))
{ /*处理第二次滚球 */
a[i].score+=a[i]. s=score=ball(i,2,10-first)
if(first+second==10) a[i].m=1
a[i].n++/a[i].n=a[i].n+1/a[i].n=2 //错误
}
if (i <=10 &&first <10 &&first+second <10)
{ a[i].total = (i>1 ? a[i-1].total:0)+a[i].score
ok=1
}
printf("各轮第一次得分")
for(k=1k<=ik++) printf("%5d",a[k].f)
printf("\n各轮第二次得分")
for(k=1k<= ik++)
if (a[k].n<2) printf(" /")else printf("%5d", a[k].s)
printf("\n 各轮得分 ")
for (k=1k<= okk++) printf("%5d", a[k].score)
printf("\n 累计总分 ")
for(k=1k <= okk++) printf("%5d", a[k].total)
printf("\n\n")
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)