includec 棋牌笔试题

includec 棋牌笔试题,

本文目录导读:

  1. 扑克牌的顺序
  2. 扑克牌的第n张牌
  3. 扑克牌的顺子(Straight)
  4. 扑克牌的 flush( flush )
  5. 扑克牌的组合

扑克牌问题一直是C语言编程中的经典题目,这类题目通常涉及扑克牌的顺序、计算第n张牌、检查是否为顺子(Straight)等,这些问题不仅考察了对扑克牌结构的理解,还考察了指针、数组、结构体等知识点,本文将通过几个典型的扑克牌问题,详细解析如何用C语言解决这些问题,并提供代码示例。


扑克牌的顺序

扑克牌的顺序是编程中经常涉及的问题,一副标准的扑克牌有52张,分为4种花色(黑桃、红心、梅花、方块),每种花色有13张牌,从A到K,在编程中,通常需要根据扑克牌的顺序来计算第n张牌是什么,或者根据给定的牌来确定其在扑克牌中的位置。

问题描述

假设扑克牌的顺序如下:

  1. A
  2. 2
  3. 3 ...
  4. 10
  5. J
  6. Q
  7. K

每种花色有13张牌,按顺序排列,我们需要根据给定的n(1-52),输出第n张牌的点数和花色。

解决思路

  1. 确定花色:扑克牌分为4种花色,每13张为一个周期,第n张牌的花色可以通过计算n除以13的余数来确定,余数为1-13分别对应四种花色。
  2. 确定点数:点数从A开始,依次到K,同样,可以通过计算n除以13的余数来确定点数,如果余数为0,则表示第13张牌(K)。

代码实现

int main() {
    int n;
    printf("请输入n(1-52):");
    scanf("%d", &n);
    int suit = n % 13;
    int rank = n % 13;
    // 花色对应数组
    char suit_map[] = {"\heartsuit", "\diamondsuit", "\clubsuit", "\spadesuit"};
    // 点数对应数组
    char rank_map[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
    if (suit == 0) {
        suit = 13;
    }
    if (rank == 0) {
        rank = 13;
    }
    printf("第%d张牌是:%s %s\n", n, rank_map[rank], suit_map[suit]);
    return 0;
}

代码解释

  • 输入处理:读取用户输入的n值。
  • 计算花色和点数:通过取模运算确定花色和点数,如果余数为0,则表示第13张牌。
  • 数组映射:使用数组将点数和花色映射到相应的字符串表示。
  • 输出结果:根据计算结果输出第n张牌的点数和花色。

测试示例

  • 输入:1,输出:A \heartsuit
  • 输入:13,输出:K \heartsuit
  • 输入:2,输出:2 \heartsuit
  • 输入:14,输出:A \diamondsuit
  • 输入:26,输出:K \clubsuit
  • 输入:39,输出:10 \spadesuit
  • 输入:40,输出:J \spadesuit
  • 输入:52,输出:K \spadesuit

扑克牌的第n张牌

这个问题是扑克牌顺序问题的扩展,需要根据给定的n,输出第n张牌的点数和花色,与上一个问题类似,但需要处理更大的n值。

问题描述

假设扑克牌的顺序如下:

  1. A
  2. 2
  3. 3 ...
  4. 10
  5. J
  6. Q
  7. K

每种花色有13张牌,按顺序排列,我们需要根据给定的n(1-52),输出第n张牌的点数和花色。

解决思路

与上一个问题相同,只是n的范围扩大到1-52,代码实现与上一个问题完全相同。

代码实现

int main() {
    int n;
    printf("请输入n(1-52):");
    scanf("%d", &n);
    int suit = n % 13;
    int rank = n % 13;
    // 花色对应数组
    char suit_map[] = {"\heartsuit", "\diamondsuit", "\clubsuit", "\spadesuit"};
    // 点数对应数组
    char rank_map[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
    if (suit == 0) {
        suit = 13;
    }
    if (rank == 0) {
        rank = 13;
    }
    printf("第%d张牌是:%s %s\n", n, rank_map[rank], suit_map[suit]);
    return 0;
}

测试示例

  • 输入:1,输出:A \heartsuit
  • 输入:13,输出:K \heartsuit
  • 输入:2,输出:2 \heartsuit
  • 输入:14,输出:A \diamondsuit
  • 输入:26,输出:K \clubsuit
  • 输入:39,输出:10 \spadesuit
  • 输入:40,输出:J \spadesuit
  • 输入:52,输出:K \spadesuit

扑克牌的顺子(Straight)

扑克牌的顺子是指牌的点数连续,例如A-2-3-4-5,或10-J-Q-K-A,需要注意的是,A既可以作为1,也可以作为14,但不能同时作为两种情况。

问题描述

给定5张扑克牌,判断它们是否构成顺子。

解决思路

  1. 提取点数:将每张牌的点数提取出来,并转换为整数(A=1,2-10为2-10,J=11,Q=12,K=13)。
  2. 排序:将点数进行排序,以便检查是否连续。
  3. 检查顺子:检查排序后的点数是否连续,如果连续,则为顺子;否则,不是。

代码实现


int main() {
    int n;
    printf("请输入5张牌的点数(A到K):");
    scanf("%d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4]);
    // 将点数转换为整数
    int rank[] = {n[0], n[1], n[2], n[3], n[4]};
    for (int i = 0; i < 5; i++) {
        if (rank[i] == 1) {
            rank[i] = 14;
        }
    }
    // 排序
    qsort(rank, 5, sizeof(int), compare);
    // 检查顺子
    int is_straight = 1;
    for (int i = 0; i < 4; i++) {
        if (rank[i+1] - rank[i] != 1) {
            is_straight = 0;
            break;
        }
    }
    if (is_straight) {
        printf("是顺子\n");
    } else {
        printf("不是顺子\n");
    }
    return 0;
}
// 比较函数
int compare(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

代码解释

  • 输入处理:读取5张牌的点数。
  • 转换点数:将A转换为14,方便排序和检查。
  • 排序:使用qsort函数对点数进行排序。
  • 检查顺子:遍历排序后的点数,检查是否连续,如果连续,则为顺子;否则,不是。
  • 输出结果:根据检查结果输出是否为顺子。

测试示例

  • 输入:A 2 3 4 5 → 转换为14,2,3,4,5 → 排序后为2,3,4,5,14 → 检查发现不连续 → 不是顺子
  • 输入:10 J Q K A → 转换为10,11,12,13,14 → 排序后为10,11,12,13,14 → 连续 → 是顺子
  • 输入:2 3 4 5 6 → 转换为2,3,4,5,6 → 排序后为2,3,4,5,6 → 连续 → 是顺子
  • 输入:A 2 3 4 6 → 转换为14,2,3,4,6 → 排序后为2,3,4,6,14 → 不连续 → 不是顺子
  • 输入:K Q J 10 9 → 转换为13,12,11,10,9 → 排序后为9,10,11,12,13 → 连续 → 是顺子

扑克牌的 flush( flush )

扑克牌的 flush 是指5张牌的花色相同,需要注意的是,如果5张牌的花色相同,则为 flush。

问题描述

给定5张扑克牌,判断它们是否为 flush。

解决思路

  1. 提取花色:将每张牌的花色提取出来。
  2. 检查花色:统计每种花色出现的次数,如果有一种花色出现5次,则为 flush。

代码实现


int main() {
    int n;
    printf("请输入5张牌的花色(0-3):");
    scanf("%d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4]);
    // 统计花色出现的次数
    int suit_count[4] = {0};
    for (int i = 0; i < 5; i++) {
        suit_count[n[i]]++;
    }
    // 检查是否为 flush
    int is_flush = 0;
    for (int i = 0; i < 4; i++) {
        if (suit_count[i] == 5) {
            is_flush = 1;
            break;
        }
    }
    if (is_flush) {
        printf("是 flush\n");
    } else {
        printf("不是 flush\n");
    }
    return 0;
}

代码解释

  • 输入处理:读取5张牌的花色。
  • 统计花色次数:使用数组统计每种花色出现的次数。
  • 检查 flush:遍历花色次数数组,如果有一种花色出现5次,则为 flush。
  • 输出结果:根据检查结果输出是否为 flush。

测试示例

  • 输入:0 0 0 0 0 → 花色全为0 → 是 flush
  • 输入:0 1 2 3 0 → 花色不全相同 → 不是 flush
  • 输入:1 1 1 1 1 → 花色全为1 → 是 flush
  • 输入:0 0 1 2 3 → 花色不全相同 → 不是 flush
  • 输入:2 2 2 2 2 → 花色全为2 → 是 flush

扑克牌的组合

扑克牌的组合是指5张牌中有至少3张点数相同,或者至少4张点数相同,或者至少5张点数相同,需要注意的是,组合包括 flush 和 straight。

问题描述

给定5张扑克牌,判断它们是否为组合。

解决思路

  1. 提取点数:将每张牌的点数提取出来。
  2. 统计点数频率:统计每种点数出现的次数。
  3. 检查组合:如果有一种点数出现3次或更多,则为组合。

代码实现


int main() {
    int n;
    printf("请输入5张牌的点数(A到K):");
    scanf("%d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4]);
    // 统计点数频率
    int rank_count[14] = {0}; // 点数范围1-13
    for (int i = 0; i < 5; i++) {
        int r = n[i];
        if (r == 1) {
            r = 14;
        }
        rank_count[r]++;
    }
    // 检查组合
    int is_straight = 1;
    for (int i = 0; i < 14; i++) {
        if (rank_count[i] >= 3) {
            is_straight = 1;
            break;
        }
    }
    if (is_straight) {
        printf("是组合\n");
    } else {
        printf("不是组合\n");
    }
    return 0;
}

代码解释

  • 输入处理:读取5张牌的点数。
  • 统计点数频率:使用数组统计每种点数出现的次数。
  • 检查组合:遍历点数频率数组,如果有一种点数出现3次或更多,则为组合。
  • 输出结果:根据检查结果输出是否为组合。

测试示例

  • 输入:A A A 2 3 → 点数频率为A:3 → 是组合
  • 输入:2 2 3 3 4 → 点数频率为2:2, 3:2, 4:1 → 不是组合
  • 输入:5 5 5 5 6 → 点数频率为5:4 → 是组合
  • 输入:K K K Q Q → 点数频率为K:3, Q:2 → 是组合
  • 输入:10 J Q K A → 点数频率为10:1, J:1, Q:1, K:1, A:1 → 不是组合
includec 棋牌笔试题,

发表评论