注册 登录
编程论坛 C语言论坛

扑克牌比大小

宇宙66 发布于 2021-12-15 17:58, 2479 次点击
扑克牌式数字排序
扑克牌中有以下几个牌面:3 4 5 6 7 8 9 0(0代表10) J Q K A 2 S(代表司令),假定有一些数字是由如上的扑克牌牌面组成,则假设3<4<5<6<7<8<9<0<J<Q<K<A<2<S,给定一组扑克牌数,请按照从小到大的顺序进行排序!
例如:给定数字序列234  589 523  KS2 K2Q  2KS J98 0KA,则排序后的结果为:589<523<0KA<J98<K2Q<KS2<234<2KS,演示代码稍后会发放!
12 回复
#2
宇宙662021-12-15 20:37
有人会这个嘛
#3
apull2021-12-15 23:15
程序代码:


#include <stdio.h>
#include <stdlib.h>

int getint(char c)
{
    if (c >= '3' && c <= '9')
    {
        return c - '0';
    }
    switch (c)
    {
    case '0':
        return 10;

    case 'J':
        return 11;

    case 'Q':
        return 12;

    case 'K':
        return 13;

    case 'A':
        return 14;

    case '2':
        return 15;

    case 'S':
        return 16;
    }
    return 0;
}

int mystrcmp(const char *s1, const char *s2)
{
    int cmp = 0;
    while (*s1)
    {
        cmp = getint(*s1) - getint(*s2);
        if (cmp != 0)
            return cmp;
        s1++;
        s2++;
    }

    return cmp;
}

int main()
{
    char pk[8][4] = {"234", "589", "523", "KS2", "K2Q", "2KS", "J98", "0KA"};
    int pkIndex[8] = {0, 1, 2, 3, 4, 5, 6, 7};

    for (int i = 0; i < 7; i++)
    {
        for (int j = i; j < 8; j++)
        {
            if (mystrcmp(pk[pkIndex[i]], pk[pkIndex[j]]) > 0) //对调字符串,拿索引打捷路。
            {
                int t = pkIndex[i];
                pkIndex[i] = pkIndex[j];
                pkIndex[j] = t;
            }
        }
    }
    for (int i = 0; i < 8; i++)
    {
        printf("%s ", pk[pkIndex[i]]);
    }
    printf("\n");

    return 0;
}
#4
吹水佬2021-12-16 05:14
就当是密文转明文字符串排序
#5
rjsp2021-12-16 08:35
看不懂,题目只给出了 单个字符 的比较规则。
但比如 3456 与 456 比较谁大谁小,是像字符串那样依次比较,于是 3456<456,还是把它看成十五进制比较数值,于是 3456>456 ???

[此贴子已经被作者于2021-12-16 08:42编辑过]

#6
宇宙662021-12-16 08:50
回复 5楼 rjsp
就是三个数跟三个数进行比较,不用四个数跟三个数比较
#7
宇宙662021-12-16 08:51
回复 3楼 apull
谢谢我看看
#8
宇宙662021-12-16 08:57
回复 3楼 apull
请问如果让我们自己输入几个数比较这些大小,这应该怎么写
#9
diycai2021-12-16 11:55
程序代码:
#include <stdio.h>
#include <string.h>
void main()
{
    int i, j, n;
    int map[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,13,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,11,0,0,0,0,0,10,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
    char result[4096][4] = {0};
    int count[4096] = {0};
    char pk[1024][4];
    printf("请输入序列个数:");
    scanf("%d", &n);
    printf("请输入所有序列:\n");
    for (i=0; i<n; i++)
    {
        scanf("%s", pk[i]);
    }
    for (i=0; i<n; i++)
    {
        j = (map[pk[i][0]]<<8) | (map[pk[i][1]]<<4) | (map[pk[i][2]]);
        memcpy(result[j], pk[i], 4);
        count[j]++;
    }
    for (i=0; i<4096; i++)
    {
        if (result[i][0])
        {
            for (j=0; j<count[i]; j++)
            {
                printf("%s ", result[i]);
            }
        }
    }
    printf("\n");
}
#10
宇宙662021-12-16 14:59
回复 9楼 diycai
没怎么看懂
#11
吹水佬2021-12-16 18:17
只有本站会员才能查看附件,请 登录

程序代码:
#include <stdio.h>
#include <string.h>

void pk_bm(char *bm)
{
    char *s ="34567890JQKA2S";
    for (int i=0; s[i]; ++i)
        bm[s[i]] = i+'A';
}

char *pk2bm(char *bm, char *in, char *out)
{
    int i;
    for (i=0; in[i]; ++i)
        out[i] = bm[in[i]];
    out[i] = '\0';
    return out;
}

int main()
{
    char bm[128]= {0};
    pk_bm(bm);

    char pks[8][4]= {"234","589","523","KS2","K2Q","2KS","J98","0KA"};
    char *ps[8],*pt;
    for (int i=0; i<8; ++i)
        ps[i] = pks[i];
    char sm[4]= {0},dm[4]= {0};
    for (int i=0; i<7; ++i)
        for (int j=i+1; j<8; ++j)
            if (strcmp(pk2bm(bm,ps[i],sm),pk2bm(bm,ps[j],dm))==1)
            {
                pt = ps[i];
                ps[i] = ps[j];
                ps[j] = pt;
            }
    printf("\n %s",ps[0]);
    for (int i=1; i<8; ++i)
        printf(" < %s",ps[i]);
    return 0;
}



[此贴子已经被作者于2021-12-16 20:00编辑过]

#12
宇宙662021-12-16 21:51
回复 11楼 吹水佬
要用户输入他想要的数,然后把这些多个三位数比较怎么写呢
#13
吹水佬2021-12-17 08:26
以下是引用宇宙66在2021-12-16 21:51:11的发言:

要用户输入他想要的数,然后把这些多个三位数比较怎么写呢

输入是最基本的东西,随便看看C教程就可以,不要在这浪费时间。


[此贴子已经被作者于2021-12-17 08:27编辑过]

1