C语言编程问题~

在扑克牌的21点游戏中,纸牌2到10以它们的面值记分,不考虑同花色的一组牌,所有人头牌(JQK)按10记分,A根据玩家手中的所有纸牌的总计分可记为1分或11分。如果玩家手... 在扑克牌的21点游戏中,纸牌2到10以它们的面值记分,不考虑同花色的一组牌,所有人头牌(JQK)按10记分,A根据玩家手中的所有纸牌的总计分可记为1分或11分。如果玩家手中的所有纸牌的总分没有超过21,纸牌A就按11记分,反之则按1记分。使用这个信息,编写一个C语言程序,接受输入的三张纸牌的数值(A对应纸牌A,2对应纸牌2,等等),适当地计算手上的纸牌的总数值,用一个打印的消息显示这三张纸牌的计分值。

紧急求助啊啊啊啊啊~
我们老师要求,JQK必须输入的时候就是JQK!感谢~~~会加分的~~~
那个……我们才学C语言循环语句,所以复杂了就不明白了……
小伏飞刀,你的那个我完全看不懂……
zhuxingfu0528,你的哪个我看懂了一点,还是有点糊涂……是每输入一个字符就进行判断么?
我自己编过,但是总是出问题,所以求助……
再次提高分数,拜托各位,最好能解释一下代表性语言的意思,十分感谢!
我们是用Microsoft Visual C++ 6.0编程的,再次拜托各位!

如果1个为A的话,其他总和没过10那么就把A看成11;如果2个以上的话,如果2A都看成11那么一定超过21,所以它完全可以当作1个A的来计算~
展开
 我来答
宁波祝老师
2008-10-25 · TA获得超过849个赞
知道小有建树答主
回答量:455
采纳率:100%
帮助的人:291万
展开全部
#include<stdio.h>
int main()
{
int s=0,flag=0,i;
char c;
for(i=0;i<3;i++)//3张牌,读入一个字符就进行判断
{
scanf("%c",&c);
if(c-' ')//读入的是空格,跳过,,后面的else i--回复i值,保证读到3张牌
{
if(c=='A')//读入'A',按1分计算,并用flag做标记,最后看s值决定是否以11分计算
s+=1,flag++;
else if(c=='J'||c=='Q'||c=='K')//读入"JQK",10分
s+=10;
else if(c=='1')//读入'1',
{
scanf("%c",&c);//继续读入,可能读到空格或者0,以此判断是10还是1
if(c=='0')
s+=10;
else
s+=1;
}
else if(c>'1'&&c<='9')//读入2——9
s+=(c-'0');
else
{
printf("输入错误,请重新输入:\n");
while(scanf("%c",&c),c-'\n');//读取 错误输入 的后面部分
i=-1;s=0; flag=0;
}
}
else
i--;
}
if(s<12&&flag>0)//决定'A'的分值
s+=10;
printf("%d\n\n",s);
return 0;
}
44733 0799
我没有考虑容错,谢谢 AdrianLY 指出问题。但对于初学者来说容错要求似乎高了。而且既然考虑容错就应该全面,比如 1 2 111 , 11 2 3这些情况,如果真考虑起来可能超出他们能力范围
goto 语句还是不要用为好。。。,还有你的程序在输出错误后提示“继续输入”,然后就任意键结束了,—,—!
考虑后感觉初步容错是必要的,稍微修改了下,欢迎大家继续批评指正
AdrianLY
2008-10-25 · TA获得超过1486个赞
知道大有可为答主
回答量:1238
采纳率:100%
帮助的人:1455万
展开全部
我这个是在zhuxingfu0528 的基础上修改的,我把他的if..else模式修改为了switch!并且增加了输入非法字符的判断!! 它这个的原理就是每次读一个字符,根据ASCII码来判断该字符是否合法!
zhuxingfu0528 的能正确计算出结果!但容错机制不是很好!
小伏飞刀 的则根本无法正确计算出结果!

//首先判断是否为空格,是则直接对下一个字符进行判断,并且循环变量i值减去1;
//然后如果是字符,则判断是否为1,如果是1,则还要判断其后的字符,是0,则输入的10,否则为1;
//再判断是否为2、3...9以及JQK,按照相应字符,给s增加相应数值;
//最后判断A,并给其添加标记flag!
#include<stdio.h>

int main()
{
int s=0,flag=0,i;
char c;

printf("请输入3张扑克牌值,以空格隔开:");
for(i=0;i<3;i++)//3张牌,读入一个字符就进行判断
{
scanf("%c",&c);
if(c-' ')//读入的是空格,跳过,,后面的else i--回复i值,保证读到3张牌
{
//判断输入的字符c!
switch(c)
{
case '1':
scanf("%c", &c); //再取一个字符!用于判断输入的是10还是1
if (c=='0')
{
s +=10;
}
else
{
s +=1;
}
break;
case '2':
s +=2;
break;
case '3':
s +=3;
break;
case '4':
s +=4;
break;
case '5':
s +=5;
break;
case '6':
s +=6;
break;
case '7':
s +=7;
break;
case '8':
s +=8;
break;
case '9':
s +=9;
break;
case 'A':
s +=1;
flag++;
break;
case 'J':
case 'Q':
case 'K':
s +=10;
break;
default:
printf("您的输入有误,请重新输入!");
goto END; //如果输入的是非A、J、Q、K、1、2、...9、10的值,则报错!并直接退出!
}
}
else
i--;
}

if(s<12&&flag>0)//决定'A'的分值
s+=10;
printf("3张牌的总数为:%d\n",s);

END:
printf("\n");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郁高明抗艾
游戏玩家

2020-01-29 · 非著名电竞玩家
知道大有可为答主
回答量:1.1万
采纳率:26%
帮助的人:750万
展开全部
#include
<stdio.h>
int
main(void)
{
int
a;int
b;int
c;int
d;
printf("请输入你的出生月,如1月——1\n")
;
scanf("%d",&a);
if(a<0||a>12)
{
printf("错误!");getchar();
}
else
if(a==8)
{
printf("请输入你的出生日,如1日——1.\n");
scanf("%d",&b);
if(b<0||b>31)
{
printf("错误!");getchar();
}
else
if(b==18)
{
printf("请输入你的出生日,如1日——1.\n");
scanf("%d",&c);
if(c<0||c>12)
{
printf("错误!");getchar();
}
else
if(c==7)
{
printf("请输入XXX的出生日,方法同上\n");
scanf("%d",&d);
if(d<0||d>31)
{
printf("错误!");getchar();
}
else
if(d==20)
printf("恭喜你完成了测试,验证码为xxxx,请回复客服领取奖品!\n");getchar();
}
}}}
运行结果为:请输入你的出生日,如1日——1.
8
请输入你的出生日,如1日——1.
18
请输入xxx的出生月,方法同上.
7
请输入xxx的出生日,方法同上.
20
恭喜你完成了测试,验证码为xxxx,请回复客服领取奖品!
这是你要完成的功能吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
俞春雪佛田
2020-02-29 · TA获得超过3万个赞
知道小有建树答主
回答量:1.1万
采纳率:26%
帮助的人:602万
展开全部
主要原因在于你再进行if语句的逻辑判断时,将“==”的写成了“=”。对于编译器来说没有语法错误,但是会有逻辑错误。在执行该语句时,只会执行赋值操作,因此每次的运行都只走一个分支,所以只有一个运行结果。
另外,你在防错处理方面没有考虑到用户输入的数据为0的情况,这样容易出现Bug。
不知为这样说你能否明白。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
务浩桖C
2019-02-03 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:29%
帮助的人:857万
展开全部
if语句可以用&来解决
if(a<0)
{printf("错误!");getchar();}
else
if(a>12)
{printf("错误!");getchar();}
else
if(a=8)
{printf("请输入你的出生日,如1日——1.\n");
改写为
if(a>0&a<12);
printf(”错误“);
这样代码少多了,多看几遍书再编程
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(9)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式