设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1939|回复: 9
打印 上一主题 下一主题

扑克牌排序问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 23:55:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
试题一:
有6副带不同底色的扑克牌, 其底色分别为红、绿、蓝、白、粉、紫6种颜色. 现要求编写程序对这6副牌进行排序, 排序规则及做题要求如下:

排序规则:
排序优先度为:
1. 属性优先度:  点数 > 底色 > 花色 (即: 在排序时, “点数”要比“颜色”和“花色”重要, 而“颜色”又比“花色”重要);
2. 点数优先度:  3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > J > Q > K > A > 2 > 小王 > 大王
3. 底色优先度:  红 > 绿 > 蓝 > 白 > 粉 > 紫
4. 花色优先度:  红心 > 黑桃 > 方块 > 梅花

要求:
1. 编写合理的数据结构表示每张牌, 并说明数据结构中每个域的含意; (5分)
2. 编写用来产生供排序使用的初始排列的6副牌(可以是任意顺序)的函数, 并对关键性语句进行必要的注释; (25分)
3. 编写对6副牌进行排序的函数, 并在适当位置进行注释, 以增强程序的可读性. (60分)
4. 编写主函数, 调用上述函数对6副牌进行排序. (5分)
5. 将排序前和排序后的扑克牌的排序情况, 分别输出到源程序所在目录(或称文件夹)中的两个文本文件中 (排序前的牌放在“Before.txt”中, 排序后的牌放在“After.txt”中); (5分)
2#
发表于 2009-11-3 23:55:57 | 只看该作者
第一,二问我写成下面这样,编译通不过,请问错哪了呀?要怎么改?
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
enum dotnum{three,four,five,six,seven,eight,nine,ten,J,Q,K,A,two,sking,bking};
enum dise{red,green,blue,white,pink,purple};
enum huase{hongxi,heitiao,fangkuai,meihua};
void creatno();

struct card
{
enum dotnum a;
enum dise b;
enum huase c;
} cards[330];


void creatno()
{
    int i;
    for(i=0;i<324;i++)
    { cards[i].a=(enum dotnum)(rand()%13+1);
      cards[i].b=(enum dise)(rand()%6+1);
      cards[i].c=(enum huase)(rand()%5+1);
    }
    ofstream outfile("before.txt");
    if(!outfile)
    {cerr<<"can't open file."<<endl;
    exit(1);
    }
    for(i=0;i<324;i++)
    {
        outfile<<cards[i].a<<"    ";
        outfile<<cards[i].b<<"    ";
        outfile<<cards[i].c<<"    ";
        outfile<<endl<<endl;
    }
}

void main()
{
    creatno();
}
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 23:55:58 | 只看该作者
你的符号有问题....都换成英语的逗号
冒昧问一下..这个题目最后不就是全部相同的数字在一起了吗?在一起的数字按花色排好了
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 23:55:59 | 只看该作者
没看清楚题意,到底是从before.txt的文件读数据,还是自己用6副牌洗牌?
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 23:56:02 | 只看该作者
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
void sort(struct card cards[]);
enum dotnum{three,four,five,six,seven,eight,nine,ten,J,Q,K,A,two,sking,bking};
enum dise{red,green,blue,white,pink,purple};
enum huase{hongxi,heitiao,fangkuai,meihua};
void creatno();

struct card
{
enum dotnum a;//代表点数
enum dise b;//代表底色
enum huase c;//代表花色
} cards[324],showcard;


void creatno()
{
    int i;
    for(i=0;i<324;i++)
    { cards[i].a=(enum dotnum)(rand()%15);
      cards[i].b=(enum dise)(rand()%6);
      cards[i].c=(enum huase)(rand()%4);
    }
    ofstream outfile1("before.txt");
    if(!outfile1)
    {cerr<<"can't open file."<<endl;
    exit(1);
    }
    outfile1<<"dotnum"<<"     ";
    outfile1<<"dise"<<"     ";
    outfile1<<"huase"<<"     "<<endl;

    for(i=0;i<324;i++)
{

        outfile1<<cards[i].a<<"         ";
        outfile1<<cards[i].b<<"         ";
        outfile1<<cards[i].c<<"         ";
        outfile1<<endl<<endl;
}
}


void sort(struct card cards[])
{
    int i,j;
    for(i=0;i<323;i++)
        for(j=0;j<324;j++)
            if(cards[i].a>cards[i+1].a)
            {showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
            else {if(cards[i].b>cards[i+1].b)
                        { showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
                  else if(cards[i].c>cards[i+1].c)
                  {showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
            }
}

void arrayout(struct card cards[])
{
        ofstream outfile2("after.txt");
    if(!outfile2)
    {
        cerr<<"can't open file."<<endl;
        exit(1);
    }
        outfile2<<"dotnum"<<"     ";
    outfile2<<"dise"<<"     ";
    outfile2<<"huase"<<"     "<<endl;

    for(int i=0;i<324;i++)
    {    outfile2<<cards[i].a<<"         ";
        outfile2<<cards[i].b<<"         ";
        outfile2<<cards[i].c<<"         ";
        outfile2<<endl<<endl;
    }
}

void main()
{
    creatno();
    sort(cards);
    arrayout(cards);

}
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 23:56:04 | 只看该作者
自已,洗好放在before,排序好后放在after
我上面写的好像排序有问题,提议一下吧!
谢谢了!
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 23:56:06 | 只看该作者
这排序到底应该怎么写呢???下面这样排序后没一点规则呢-:(
    for(i=0;i<323;i++)
        for(j=0;j<324;j++)
        {   
            if(cards[i].c>cards[i+1].c)
                 {showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
        
            if(cards[i].b>cards[i+1].b)
                { showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
            
            if(cards[i].a>cards[i+1].a)
              {showcard=cards[i];cards[i]=cards[i+1];cards[i+1]=showcard;}
            
        }
}
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 23:56:07 | 只看该作者
以下是引用 sunkaidong 在 2008-3-29 19:20 的发言:

你的符号有问题....都换成英语的逗号
冒昧问一下..这个题目最后不就是全部相同的数字在一起了吗?在一起的数字按花色排好了

应该是这样的吧!

排序怎么实现,能否帮忙编一下,^_^
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 23:56:09 | 只看该作者
for(i=0;i<324;i++)
    { cards[i].a=(enum dotnum)(rand()%13+1);
      cards[i].b=(enum dise)(rand()%6+1);
      cards[i].c=(enum huase)(rand()%5+1);
    }
这段代码不能保证得到6副牌,只能保证324张牌

你的设计显然不好,你应该单独用个函数比较两个结构体大小,再将它作为参数给 sort调用,或者直接在sort内部调用。
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 23:56:11 | 只看该作者
还有,不应该选择数组实现(排序中太多拷贝和临时变量),链表比较合适。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 22:34 , Processed in 0.093212 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表