1、摘要1.实验目的编斗地主洗发牌的程序可以让我们了解随机数的生成,全局变量和指针的用法,熟悉线性表的基本操作,以及排序的基本思路和方法。2.实验方法本程序主要是利用全局变量来统筹整个程序,辅之的是指针变量。总共有三个子函数,分别为洗牌子函数,排序子函数,发牌子函数。洗牌这个子函数利用了随机数的生成,而主函数通过指针变量把生成的随机数赋值给全局变量,再通过冒泡排序法对全局变量进行排序,最后按编号换算进行输出。3.实验结果由运行出来的结果可以看出,此洗牌发牌符合斗地主的规则,是合法的。随机发的牌没有重复,没有遗漏,且按照斗地主的牌的大小进行排列,即从小到大分别为:3,4,5,6,7,8,9,10,J
2、,Q,K,A,2,小鬼,大鬼。所以此程序是正确的,成功的。内容一问题重述设计一个程序生成一副总共54张的牌,来给三个玩家发牌,发给每位玩家17张牌,剩下三张作为底牌。每次发出的牌都不一样,而且按从小到大的顺序显示每个玩家拿到的牌和底牌。二算法描述本程序除了运用一些条件语句,判断语句之外,主要运用了两个算法,一个是随机数的生成,一个是冒泡排序法。随机数的生成的复杂度为O(N),其中N=54,这是在运行结果最佳的状况下才会出现的,一旦生成的随机数相同的话,通过if语句会重新生成随机数,直到生成不同的随机数。冒泡排序法的空间复杂度为O(1),时间复杂度为O(N2),本程序中的N为54,而且运行了两次
3、冒泡排序法,分别为牌数和花色进行排序,所以空间复杂度为2O(1),时间复杂度为2O(542)。开始 利用srand(time(0),rand()来随机生成54个不同的数把随机生成的1到54的数赋值给a17,b17,c17,d3这四个全局变量的数组中运用for语句和if语句对1到54的数进行变换,变换成3到17结束输出结果运用switch语句对已经排好序的1到54进行换算,运用冒泡排序法对数组中的随机数进行排序,第一次运用解决牌数排序问题,第二次运用解决花色排序问题三变量说明a17,b17,c17,d3为全局变量的数组,分别存放玩家一,二,三的牌,以及三个底牌。四函数与思路说明本程序总共有3个子
4、函数,1个主函数,其中3个子函数分别为Xipai()子函数,Paxu()子函数,Fapai()子函数。Xipai()这个子函数利用了srand(time(0),rand()来生成随机数1到54。当然,为了使生成的数都不一样,还使用if的判断语句。主函数把洗牌得到的54位随机数分成四组数组赋值到全局变量a17,b17,c17,d17当中去,然后通过Paxu(),Fapai()这两个子函数来进行排序输出。数组中的数为1到54的随机排列,而Paxu()子函数首先把1到52的数对应化成1到13的数,即是1到13对应化成1到13;14到26对应化成1到13;如此类推而53,54就对应化成16,17。然后
5、把已经化成1,2的数再对应化成14,15的数,其化法如下:3 3 3;26 13 13;14 1 14;28 2 15;53 16然后用冒泡排序法对变化后的3到17的数进行从小到大的排序,而最初的全局变量的数组也跟着排序,最后也是用冒泡排序法对相同牌数的花色进行从小到大的排序,即方块,梅花,红桃,黑桃。Fapai()这个子函数就是把排号序的数进行换算输出。其换算输出如下:12345678910111213方块A方块2方块3方块4方块5方块6方块7方块8方块9方块10方块J方块Q方块K14152324252640525354梅花A梅花2梅花10梅花J梅花Q梅花K红桃A黑桃K小鬼大鬼五程序执行结果
6、1.第一次运行结果:第一位的牌是:梅花3 红桃3 方块4 黑桃4 方块5 红桃5 黑桃5 方块7 红桃7黑桃7 红桃10 方块J 梅花Q 梅花K 黑桃K 方块2 黑桃2第二位的牌是:方块3 梅花4 红桃4 方块6 黑桃6 梅花8 红桃9 黑桃9 方块10黑桃10 红桃J 黑桃J 方块K 方块A 黑桃A 红桃2 小鬼第三位的牌是:黑桃3 梅花6 红桃6 梅花7 方块8 黑桃8 梅花9 梅花10 梅花J方块Q 红桃Q 黑桃Q 红桃K 梅花A 红桃A 梅花2 大鬼底牌是:梅花5 红桃8 方块9 2.第二次运行结果:第一位的牌是:红桃3 方块4 梅花5 红桃5 方块6 梅花6 方块7 红桃7 红桃10
7、梅花J 红桃J 黑桃J 梅花Q 红桃K 方块A 红桃A 梅花2第二位的牌是:方块3 红桃4 黑桃4 黑桃6 梅花7 红桃8 方块9 梅花9 红桃9黑桃9 方块10 梅花10 方块J 红桃Q 黑桃A 红桃2 大鬼第三位的牌是:黑桃3 梅花4 方块5 黑桃5 红桃6 黑桃7 方块8 梅花8 黑桃10方块Q 黑桃Q 方块K 梅花K 黑桃K 梅花A 方块2 黑桃2底牌是:梅花3 黑桃8 小鬼3.第三次运行结果:第一位的牌是:梅花3 红桃3 黑桃4 红桃5 梅花6 梅花7 红桃7 黑桃7 梅花8红桃8 红桃10 方块J 黑桃J 梅花K 梅花A 梅花2 大鬼第二位的牌是:方块3 方块4 方块5 梅花5 黑
8、桃5 黑桃6 方块7 方块8 方块9黑桃10 红桃J 方块Q 红桃Q 黑桃Q 方块A 红桃A 方块2第三位的牌是:黑桃3 梅花4 方块6 红桃6 黑桃8 梅花9 黑桃9 方块10 梅花J梅花Q 方块K 红桃K 黑桃K 黑桃A 红桃2 黑桃2 小鬼底牌是:红桃4 红桃9 梅花10六结论由前面的分析得知,虽然此程序的复杂度比较大,可是其基本思路是正确的,运行结果也是合法的,故本程序可以作为斗地主的洗牌发牌程序。七编程中遇到的问题以及解决方法在编程过程中,因为对指针的运用不是很熟练,所以导致运行多次都得不出正确结果,后来在指针的基础上加上全局变量,才把这个问题解决。刚刚开始我是想用归并排序法对每位玩
9、家的牌进行排序的,但是运行过程中叶遇上了一些小麻烦,后来改用冒泡排序法就轻易解决这个问题了。八附录#include#include#includevoid Xipai();void Paixu();void Fapai();int a17,b17,c17,d3;int *p ,q;void Xipai()int m54,n54,r54,i,j=0,k;srand(unsigned)time(NULL); for(i=0;i54;i+)mi=i+1; for(i=0;i54;)k=rand()%54; if(mk!=0)ni=mk;rj+=ni;mk=0;+i; p=&r0;void Paixu
10、(int t) int pai17,i,j=0,s,p; for(i=0;i17;i+)if(ti=0) break;for(i=0;i17&ti!=0;i+)if(ti14) paii=ti;else if(ti27) paii=ti-13; else if(ti40) paii=ti-26; else if(ti53) paii=ti-39;if(ti=53) paii=16;if(ti=54) paii=17;if(paii=1) paii=14;if(paii=2) paii=15;for(i=0;i16&ti!=0;i+)for(j=i+1;jpaij) p=paii;paii=pa
11、ij;paij=p;s=ti;ti=tj;tj=s; if(paii=paij&titj) p=paii;paii=paij;paij=p;s=ti;ti=tj;tj=s;void Fapai(int t)int i;for(i=0;i17;i+)if(ti=0) break;for(i=0;i17&ti!=0;i+)switch(ti-1)/13) case 0:printf(方块);if(ti=1) printf(At);else if(ti=11) printf(Jt);else if(ti=12) printf(Qt);else if(ti=13) printf(Kt);else pr
12、intf(%dt,ti);break; case 1:printf(梅花); if(ti-13=1) printf(At);else if(ti-13=11) printf(Jt);else if(ti-13=12) printf(Qt);else if(ti-13=13) printf(Kt);else printf(%dt,ti-13);break; case 2:printf(红桃); if(ti-26=1) printf(At);else if(ti-26=11) printf(Jt);else if(ti-26=12) printf(Qt);else if(ti-26=13) pri
13、ntf(Kt);else printf(%dt,ti-26);break; case 3:printf(黑桃); if(ti-39=1) printf(At);else if(ti-39=11) printf(Jt);else if(ti-39=12) printf(Qt);else if(ti-39=13) printf(Kt);else printf(%dt,ti-39);break;case 4:if(ti%13=1) printf(小鬼t);else printf(大鬼t);break;void main() int i; p=&q; Xipai(); for(i=0;i54;i+) if(i17) ai=*(p+); else if(i34) bi-17=*(p+); else if(i51) ci-34=*(p+); else di-51=*(p+); printf(第一位的牌是:n); Paixu(a); Fapai(a); printf(nn第二位的牌是:n); Paixu(b); Fapai(b); printf(nn第三位的牌是:n); Paixu(c); Fapai(c); printf(nn底牌是:n); Paixu(d); Fapai(d);8