2017-04-01 41 views
0

工作在一個簡單的C編程問題,我有點卡住了。問:編寫一個函數,它將一張雙卡二十一點HAND的值作爲輸入,並返回手的點總數。牌'2'到'9'的值爲 等於它們的面值,牌'T','K','Q','J'值10分,而ace('A')是值得11分 除非它與另一個王牌,那麼第二個王牌是值得1分。該程序應該能夠捕捉到不正確的輸入。添加卡的價值 - C

實施例: 輸入卡:T 7 的分數是17

輸入卡:在一隻5 的分數是16

注:我用 'T' 的值爲10因此您只需傳入兩個字符即 而不是字符串作爲此函數的參數。

#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(ace)卡。想知道我是否在正確的軌道上,任何幫助將不勝感激!

+0

你正在發送'10'和'2' ......那些與案例'T''和''2''不匹配。在主 –

+0

中'char card1 ='T';'等'point_total'的用途是什麼?你有什麼要傳遞給它? – Olaf

+0

Goddness,我怎麼能忽略這個... 2. Point_total是假設採取雙卡大酒杯的雙手作爲輸入的值,並返回手的點總數。 – supperforpupper

回答

0

該算法不正確。

另外,還有一些在你的代碼的幾個問題(按遞減的嚴重性順序排列):

  1. 你是不是,把「10」,並在例如「2」,但對應於10 ASCII字符和2(檢查ASCII table
  2. return -1;
  3. 你是不是在考慮你的算法的「A」的情況下return value;dead code
  4. 你正在寫兩遍(WET),這是一種不好的做法。這種做法是don't repeat yourself (DRY)
  5. 變量int card1_v相反,int card2_v不是必需

的代碼可以通過分組在不同的等價類的開關的情況下,並且使用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; 
} 
+0

哦,哇,謝謝!我會研究你的代碼和解釋,以便我可以改進。 – supperforpupper