VC++洗牌程序报告(类编写)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

学院、系:吉林大学珠海学院

专业名称:软件工程

课程设计科目VC++程序课程设计学生姓名:

指导教师:

完成时间:2013年12月

题目

模拟人工洗牌

编写一个模拟人工洗牌的程序,将洗好的牌分别发给四

个人。

使用结构card 来描述一张牌,用随机函数来模拟人工洗牌的过程,最后将洗好的52张牌顺序分别发给四个人。

对每个人的牌要按桥牌的规则输出。即一个人的牌要先按牌的花色(顺序为梅花、方块、红心和黑桃)进行分类,同一类的牌要再按A、K、Q、J、…、3、2牌的大小顺序排列。

另发牌应按四个人的顺序依次分发。

注:C++随机数函数有:

void srand(unsigned seed)

一、设计任务与目标

我选择的题目是模拟人工洗牌的题目,上一学期的C语言设计中我已经使用过rand函数和scrand函数,所以此次设计来说是有一些相对的优势。希望通过课程设计来查看自己半学期来的学习情况,不断完善和学习课程的学习经验,加强自己的动手实践能力,增加知识,强化学习,是自己获得进步。

二、方案设计与论证

1:设计思想:

第一:根据题目要求,设置一个结构体card,因为一张牌有花色和数字的不同,所以结构体card包括了flag和value两个成员,其中flag通过取0,1,2,3来分别表示梅花,方块,红心和黑桃四种花色;value取值2-10、J(11)、Q(12)、K(13)、A(14)来表示牌上的数字。因此一张牌可以由flag和value的组合来唯一确定。

第二:洗牌(shuffle)。由于洗牌时牌的顺序是随机的,所以用到了void srand(unsigned seed)和int rand(void)函数。通过srand函数设置rand 函数所用得到随机数产生算法的种子值来不断改变rand函数的随机数的启动种子值,以产生最佳的随机数。又由于相同的种子后面的rand()函数会出现一样的随机数。所以为了防止随机数每次重复常常使用系统时间来初始化,即使用time函数来获得系统的时间,将time_t型数据转化为(unsigned)型再传给srand 函数,即srand((unsigned)time(&t));而在这里所用的则是srand(time(NULL)),直接传入一个空指针。用0到51的整数分别对应52张牌随机产生0到51之间的一个整数,将该整数所对应的那张牌与0对应的那张牌交换,然后随机产生1到51之间的一个整数,重复该过程,每次随机数的最大范围减1,直到洗牌完毕。

第三:排序(sort)。排序包括按花色排序和按大小排序。在按花色排序中,利用sort函数,根据冒泡排序法,从第一张牌开始依次与其后面的牌比较flag 的大小,若第一张牌的flag大于后面的,则两者交换,否则继续。同理:在按照大小排序时,按照冒泡排序法,大的值在前,小的在后。而在花色排好之后,只需要在某种花色的内部进行大小排序即可。即函数sortvalue().

第四:牌的显示(show())。牌的显示包括花色和数字。花色用switch函数分为四

种情况分别输出。数字则直接定义一个字符型数组,通过数组value来表示输出即可。

第五:主函数:(1)设置四个数组A[u], B[u], C[u], D[u]来反别表示四个人的牌。

然后模拟出52张牌。(2)洗牌。(3)发牌:发牌时是根据memcpy函数随机将牌发给四个人。(4)排序。将牌发好之后再根据排序函数分别对四个人的牌进行花色和大小的排序。(5)输出。即用show函数将牌输出。结束。

三、程序框图或流程图,程序清单与调用关系

class ArtificialShuffle

int flag value

四、全部源程序清单

#include

#include

#include

#include

using namespace std;

enum SortType {flag, value};

typedef class CARD //据题目要求,设置一个结构体card

{

Public:

int flag;

int value;

} Card;

class ArtificialShuffle //根据实验要求,设置一个ArtificialShuffle类

{

public:

void shuffle(Card *cards); //洗牌

void sort(Card *cards, int size, SortType stype); //排序

void show(int flag, int value); //显示牌的花色和数字

void sortValue(Card *cards); //排序

void print(); //打印至屏幕

private:

Card cardst[52]; //模拟出52张牌

Card At[13], Bt[13], Ct[13], Dt[13]; //设置四个数组来分别表示四个人的牌

};

void ArtificialShuffle::shuffle(Card *cards)

{

int i, j, t;

Card c;

srand(time(NULL)); //使用time函数来获得系统时间,并使用srand产生种子值提供给rand使用

for (i = 0; i < 52; ++i)

for (j = 0; j < 52; ++j)

{

t = rand() % 52;

if (j != t)

{

memcpy(&c, &cards[t], sizeof(Card)); //void *memcpy(void *dest, const void *src, size_t n);

memcpy(&cards[t], &cards[j], sizeof(Card)); //从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

memcpy(&cards[j], &c, sizeof(Card));

}

}

}

void ArtificialShuffle::sort(Card *cards, int size, SortType stype) {

int i, j, k;

Card t;

for (i = 0; i < size-1; ++i) //根据冒泡排序法,从第一张牌开始依次与其后面的牌比较flag的大小

{

k = i;

for (j = i + 1; j < size; ++j)

{

相关文档
最新文档