| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1031 人关注过本帖
标题:详细说明下这个程序中的层层代码~
只看楼主 加入收藏
我不信佛
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-5-15
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
详细说明下这个程序中的层层代码~
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
  int a[4][13],d,i,j,m,num=0,b[52]={0};
  srand(time(NULL));
  for(i=0;i<4;i++)
{
      for(j=0;j<13;j++)
{
            a[i][j]=j+1;
          }
  }
  for(;num<=52;)
{
      d=rand()%52;
      for(m=0;m<num;m++)
{
            if(d==b[m])
{
                break;
            }
      }
      if(m==num)
{
            b[num]=d;
            switch(d/13)
{
                case 0:printf("红桃");break;//1
                case 1:printf("方块");break;//2
                case 2:printf("梅花");break;//3
                case 3:printf("黑桃");break;//4
            }
            num++;
            printf("%2d\%c",a[d/13][d%13],num%13==0 && num!=0?'\n':' ');
      }
  }
  return 0;
}
这是个随机发牌程序,请大神从头到尾向我解释下每层代码都是什么意思 .我只看的懂标记1~4行  能帮我改进下再说明下更好了~谢啦~
搜索更多相关主题的帖子: num for break case printf 
2018-05-15 22:47
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:10 
详细的我都看不下去了,其实每次都扫描是否有重复并不是一个高效的算法。
模仿真实洗牌的乱序就不需要每轮都扫描是否有重复牌了。而且a这个牌库数组实际上也没有必要。
程序代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int a[4][13], d, i, j, m, num = 0;
    int b[52] = { 0 };    //这个数组用来记忆已经生成了哪些牌
    srand(time(NULL));
    /* 初始化牌,共有4种花色13种点数,所以有a[4][13]二维数组表示牌库 */
    for (i = 0; i<4; i++)
    {
        for (j = 0; j<13; j++)
        {
            a[i][j] = j + 1;
        }
    }
    /*循环生成52张牌*/
    for (; num <= 52;)
    {
        d = rand() % 52;    //求一个随机数,范围是在0-51(共52种可能,对应52张牌)

        //num为已成功发牌数,也就是每次循环都扫描一遍已经发过的牌
        for (m = 0; m<num; m++)
        {
            //如果发现这次的随机数之前已经出现过,那么跳出循环
            if (d == b[m])
            {
                break;
            }
        }
        // 这个条件需要联合上方循环一起看,m代表上方循环扫描过的数,如果m等于num,那么意味着没有重复的牌,这次就是一次成功的发牌
        // 反之,如果条件不成立,证明上方循环中发现重复的牌,提前跳出了,那么该牌就要丢弃,于是if内代码不执行,直接开始下一轮随机
        if (m == num)
        {
            //放入该数组,意味着该牌已经发过
            b[num] = d;
        
            switch (d / 13)
            {
            case 0:printf("红桃"); break;//1
            case 1:printf("方块"); break;//2
            case 2:printf("梅花"); break;//3
            case 3:printf("黑桃"); break;//4
            }
            num++;
            //由于d的值域是0-51,且不可能重复,所以只要简单除以13就能得出一个0-3的值,正好对应了4种花色。
            //d mod 13则能得出0-12的值,正好对应了13种点数。
            //num % 13 == 0 && num != 0 ? '\n' : ' '
            //该表达式是为了控制输出美观的,当num=13, 26, 39, 52时换行,例外是 num!=0。
            //也就是结果是每13张牌输出一个换行符,否则输出的是空格,0要例外是因为0%13等于0
            printf("%2d\%c", a[d / 13][d % 13], num % 13 == 0 && num != 0 ? '\n' : ' ');
        }
    }
    return 0;
}
2018-05-15 23:54
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:10 
检查重复的操作 写的非常不好
这样后面会出现很多次重复 要循环非常多次才能完成发牌

其实直接随机一个数然后交换一下数组就好了
多交换几次

https://zh.
2018-05-16 00:48
快速回复:详细说明下这个程序中的层层代码~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024812 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved