gpt4 book ai didi

c - 卡片增值 - C

转载 作者:行者123 更新时间:2023-11-30 16:47:58 26 4
gpt4 key购买 nike

正在解决一个简单的 C 编程问题,但我有点卡住了。

问:编写一个函数,将两张牌二十一点手牌的值作为输入,并返回该手牌的总点数。值(value) 牌“2”到“9”等于其面值,牌“T”、“K”、“Q”、“J”值(value) 10 点,A(“A”)值(value) 11 点 除非有另一张 A,那么第二张 A 就值 1 分。该程序应该能够捕获不正确的输入。

示例:输入牌:T 7得分为17

输入卡片:A 5 分数是16

注意:我对 10 张卡使用了“T”值,因此您可以简单地传递两个字符, 而不是字符串,作为该函数的参数。

#define CASE_VALUE(str,val,card) case str: card = val;break;
int point_total(char card1,char card2){
int card1_v;
int card2_v;
switch(card1){
CASE_VALUE('2',2,card1_v);
CASE_VALUE('4',4,card1_v);
CASE_VALUE('5',5,card1_v);
CASE_VALUE('6',6,card1_v);
CASE_VALUE('7',7,card1_v);
CASE_VALUE('8',8,card1_v);
CASE_VALUE('9',9,card1_v);
CASE_VALUE('T',10,card1_v);
CASE_VALUE('K',10,card1_v);
CASE_VALUE('Q',10,card1_v);
CASE_VALUE('J',10,card1_v);
default:
return -1;
break;
}
switch(card2){
CASE_VALUE('2',2,card2_v);
CASE_VALUE('3',3,card2_v);
CASE_VALUE('4',4,card2_v);
CASE_VALUE('5',5,card2_v);
CASE_VALUE('6',6,card2_v);
CASE_VALUE('7',7,card2_v);
CASE_VALUE('8',8,card2_v);
CASE_VALUE('9',9,card2_v);
CASE_VALUE('T',10,card2_v);
CASE_VALUE('K',10,card2_v);
CASE_VALUE('Q',10,card2_v);
CASE_VALUE('J',10,card2_v);
default:
return -1;
break;
}
int value=card1_v+card2_v;
return value;
return -1;
}

// to test if it works
int main(void) {
char card1 = 10;
char card2 = 2;
printf("%i\n", point_total(card1, card2));
return 0;

}

现在它只返回-1,这意味着这手牌无效。我确信我忽略了一些小事。我也不确定如何实现 A(王牌)卡。想知道我是否走在正确的道路上,如果有任何帮助,我们将不胜感激!

最佳答案

算法不正确。

此外,您的代码中存在几个问题(按严重程度降序列出):

  1. 您在示例中没有传递“10”和“2”,而是传递与 10 和 2 相对应的 ASCII 字符(检查 ASCII table )
  2. 您没有考虑算法中的“A”情况
  3. return -1;return value; 之后是 dead code
  4. 您将所有内容都写了两次(WET),这是一种不好的做法。这种做法与 don't repeat yourself (DRY) 相反。
  5. 变量 int card1_vint card2_v 不是必需的

可以通过将 switch case 分组到不同的等价类并使用 ASCII 表值的十进制表示来改进代码。

以下代码是您在问题中描述的算法的正确实现,它也解决了我之前指出的问题。注释解释了代码。

#include <stdio.h>

int calculate_std_score(char card){
/* use the ASCII decimal values to group ['2'...'9'] in the same equivalence class;
shift the ASCII representation using '0' as "shifting value" to
obtain the corresponding decimal representation.
Example: '2' is 50 in ASCII, '0' is 48 in ASCII;
return (50 - 48)*/
if(49 < (int) card && (int) card < 58)
return (card - '0');
/* check for all the figures whose value is 10 */
if(card == 'T' || card == 'J' || card == 'Q' || card == 'K')
return 10;
/* we already checked the particular case of (A,A);
Now the card A can only have 11 as value */
if(card == 'A')
return 11;
/* error: unrecognized character; we ensure to obtain always a negative sum */
return -22;
}

int calculate_total_score(char card1, char card2){
/* check (A,A) case : the ASCII decimal value of char 'A' is 65 */
if((int) card1 + (int) card2 == 130)
return 11;/* (A,A) = 10 + 1 */
/* calculate the standard sum of the 2 card values */
int result= calculate_std_score(card1) + calculate_std_score(card2);
/* check erroneous result */
if(result < 0)
return -1;
/* return standard result : no error detected */
return result;
}

// to test if it works
int main(void) {
char card1 = 'T';
char card2 = '2';
printf("%i\n", calculate_total_score(card1, card2));
return 0;
}

关于c - 卡片增值 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com