慕风254 2022-01-13 14:10 采纳率: 80%
浏览 58
已结题

c++ 冒泡排序没有成功怎么回事,急

问题遇到的现象和发生背景

写到最后发现运行出的发牌结果还是乱序,冒泡也没有用错,也能成功输出,但就是乱序,感觉自己冒泡白加了。头文件,iostream,cstdio,cstdlib,cmath,ctime,string,以及using namespace std;

问题相关代码,请勿粘贴截图

struct card //定义结构card代表玩家拿到的卡牌
{

char huase[10];
int num;

};

void paimon(int n, card *m)
{

int a[52];//定义1~52随机排列的数组a[52]
int temp;
for (int i = 0; i < 52; i++) //给a[52]赋值
{
    a[i] = i + 1;
}
srand((int)time(NULL));//使用srand,rand函数将赋给a[52]的值打乱
for (int j = 0; j < 52; j++)
{
    temp = rand() % 52;
    int t = a[j];
    a[j] = a[temp];
    a[temp] = t;
}

for (int k = 0; k < 52; k++)
{
    if (a[n] <= 13)
    {
        *m = card{ "梅花",a[n] };
    }
    else if (a[n] > 13 && a[n] <= 26)
    {
        *m = card{ "方块",a[n] - 13 };
    }
    else if (a[n] > 26 && a[n] <= 39)
    {
        *m = card{ "红心",a[n] - 26 };
    }
    else
    {
        *m = card{ "黑桃",a[n] - 39 };
    }
}

}

void fun(card b[13],int g[13])//给玩家拿到手里的牌按照花色、大小进行排序
{

int f[13] = {};
for (int d = 0; d < 13; d++)
{
    if (b[d].huase == "梅花")
        f[d] = b[d].num;
    else if (b[d].huase == "方块")
        f[d] = b[d].num + 13;
    else if (b[d].huase == "红心")
        f[d] = b[d].num + 26;
    else if (b[d].huase == "黑桃")
        f[d] = b[d].num + 39;
}

for (int h = 0; h < 13; h++)
{
    g[h] = h;
}

int tep = 0, temp = 0;
for (int l = 0; l < 12; l++)
{
    for (int m = 0; m < 12 - l; m++)
    {
        if (f[m] > f[m+1])
        {
            tep = f[m];
            f[m] = f[m + 1];
            f[m + 1] = tep;
            temp = g[m];
            g[m] = g[m + 1];
            g[m + 1] = temp;
        }
    }
}

}

void simon(int klee)
{

if (klee == 0)
    cout << 'A';
else if (klee == 1)
    cout << 'K';
else if (klee == 2)
    cout << 'Q';
else if (klee == 3)
    cout << 'J';
else if (klee == 4)
    cout << 10;
else
    cout << klee - 4;

}

int main()
{

card p1[13] = { 0,0 }, p2[13] = { 0,0 }, p3[13] = { 0,0 }, p4[13] = {0,0};//初始化玩家
cout << "玩家1" << "\t" << "玩家2" << "\t" << "玩家3"  << "\t" << "玩家4" << endl;

for (int n = 0; n < 13; n++)//发牌
{
    paimon(4 * n, &p1[n]);
    paimon(4 * n + 1, &p2[n]);
    paimon(4 * n + 2, &p3[n]);
    paimon(4 * n + 3, &p4[n]);
}

int g[13], h[13], j[13], k[13];
fun(p1, g);
fun(p2, h);
fun(p3, j);
fun(p4, k);

for (int l = 0; l < 13; l++)//输出
{

    cout << p1[g[l]].huase << " ";
    simon(p1[g[l]].num);
    cout << "\t" << p2[h[l]].huase << " ";
    simon(p2[h[l]].num);
    cout << "\t" << p3[j[l]].huase << " ";
    simon(p3[j[l]].num);
    cout << "\t" << p4[k[l]].huase << " ";
    simon(p4[k[l]].num);
    cout << endl;
}

return 0;

}

运行结果及报错内容

img

我的解答思路和尝试过的方法

之前是用指针排序的,然后越界就又改回int了

我想要达到的结果

怎样改才能成功按顺序输出啊(一个人的牌要先按牌的花色(顺序为
梅花、方块、红心和黑桃)进行分类,同一类的牌要再按 A、K、Q、J、…、3、
2 牌的大小顺序排列)

  • 写回答

1条回答 默认 最新

  • 广大菜鸟 2022-01-13 14:23
    关注

    老铁,你上个问答,我已经给你发了修改后的,你倒是看看先啊,还有这个冒泡排序你的问题是字符串不能直接等于号判断,要用strcmp

    img

    #include<iostream>
    #include<time.h>
    using namespace std;
    struct card //定义结构card代表玩家拿到的卡牌
    {
        char huase[10];
        int num;
    };
    void paimon(int n, card* m)
    {
        int a[52];//定义1~52随机排列的数组a[52]
        int temp;
        for (int i = 0; i < 52; i++) //给a[52]赋值
        {
            a[i] = i + 1;
        }
        srand((int)time(NULL));//使用srand,rand函数将赋给a[52]的值打乱
        for (int j = 0; j < 52; j++)
        {
            temp = rand() % 52;
            int t = a[j];
            a[j] = a[temp];
            a[temp] = t;
        }
        for (int k = 0; k < 52; k++)
        {
            if (a[n] <= 13)
            {
                *m = card{ "梅花",a[n] };
            }
            else if (a[n] > 13 && a[n] <= 26)
            {
                *m = card{ "方块",a[n] - 13 };
            }
            else if (a[n] > 26 && a[n] <= 39)
            {
                *m = card{ "红心",a[n] - 26 };
            }
            else
            {
                *m = card{ "黑桃",a[n] - 39 };
            }
        }
    }
    void fun(card b[13], int g[13])//给玩家拿到手里的牌按照花色、大小进行排序
    {
        int f[13];
        for (int d = 0; d < 13; d++)
        {
            if (strcmp(b[d].huase, "梅花") == 0)//if (b[d].huase == "梅花")
                f[d] = b[d].num;
            else if (strcmp(b[d].huase, "方块") == 0) //else if (b[d].huase == "方块")
                f[d] = b[d].num + 13;
            else if (strcmp(b[d].huase, "红心") == 0) //else if (b[d].huase == "红心")
                f[d] = b[d].num + 26;
            else if (strcmp(b[d].huase, "黑桃") == 0) //else if (b[d].huase == "黑桃")
                f[d] = b[d].num + 39;
        }
    
        for (int h = 0; h < 13; h++)
        {
            g[h] = h;
        }
    
        int tep = 0;
        for (int l = 0; l < 13; l++)
        {
            for (int m = l; m < 13; m++)
            {
                if (f[l] > f[m])
                {
                    tep = f[l];
                    f[l] = f[m];
                    f[m] = tep;
                    tep = g[l];
                    g[l] = g[m];
                    g[m] = tep;
                }
            }
        }
    }
    
    char simon(int klee)
    {
        if (klee == 0)
            return 'A';
        else if (klee == 1)
            return 'K';
        else if (klee == 2)
            return 'Q';
        else if (klee == 3)
            return 'J';
        else
            return klee - 4 + '1';
    }
    
    int main()
    {
        card p1[13] = { 0,0 }, p2[13] = { 0,0 }, p3[13] = { 0,0 }, p4[13] = { 0,0 };//初始化玩家
        cout << "玩家1" << "\t" << "玩家2" << "\t" << "玩家3" << "\t" << "玩家4" << endl;
    
        for (int n = 0; n < 13; n++)//发牌
        {
            paimon(4 * n, &p1[n]);
            paimon(4 * n + 1, &p2[n]);
            paimon(4 * n + 2, &p3[n]);
            paimon(4 * n + 3, &p4[n]);
        }
    
        int g[13], h[13], j[13], k[13];
        fun(p1, g);
        fun(p2, h);
        fun(p3, j);
        fun(p4, k);
    
        for (int l = 0; l < 13; l++)//输出
        {
    
            cout << p1[g[l]].huase << " " << simon(p1[g[l]].num) << "\t"
                << p2[h[l]].huase << " " << simon(p2[h[l]].num) << "\t"
                << p3[j[l]].huase << " " << simon(p3[j[l]].num) << "\t"
                << p4[k[l]].huase << " " << simon(p4[k[l]].num) << endl;
        }
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月13日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改