免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2605 | 回复: 12
打印 上一主题 下一主题

[C] 求解毒 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-23 15:41 |只看该作者 |倒序浏览
劣质代码评析[url]http://www.cnblogs.com/pmer/archive/2012/10/20/2731910.html[/url]
一时手痒写了几行代码,但是觉得很难看,求解毒

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<time.h>

  4. #define MASK                    1
  5. #define MARK_SET(inNum,mark)    (mark|=(MASK<<(inNum)))
  6. #define CHECK_EXIST(inNum,mark) (mark&(MASK<<(inNum)))
  7. #define RESET_MARK(mark)        mark=0
  8. #define CREATE_MARK(mark)       int mark=0
  9. #define RESET_TIPS(ti)          ti.num=0;ti.A_Counts=0;ti.B_Counts=0

  10. #define NUM_LENGTH 4
  11. #define NUM_MOD    10
  12. #define MAX_TIMES  10

  13. typedef struct _tips_info{
  14.         int num;
  15.         int A_Counts;
  16.         int B_Counts;
  17. }tips_info,*ptips_info;

  18. int  generate(int*);
  19. void tips(int,int*,int,ptips_info);
  20. int  show_tips(ptips_info,int);
  21. void show_num(int*);

  22. int main(void)
  23. {
  24.         srand((unsigned)time(NULL));  //这句是抄袭
  25.         int num[NUM_LENGTH];
  26.         int mark = generate(num);
  27.         tips_info ti;
  28.         int input;
  29.         int i = 0;
  30.         for(;i<MAX_TIMES;i++)
  31.         {
  32.                 printf("guess num(%d):",NUM_LENGTH);
  33.                 scanf("%d",&input);        //此处不知如何处理。假定输入的就是4位整数
  34.                 RESET_TIPS(ti);
  35.                 tips(input,num,mark,&ti);
  36.                 if(show_tips(&ti,1))return 0;
  37.         }
  38.         printf("game over!");
  39.         show_num(num);
  40.         return 0;
  41. }

  42. void show_num(int * numAr)
  43. {
  44.         int num = 0;
  45.         int i = NUM_LENGTH;
  46.         for(;i>0;i--) num = num*10+numAr[i-1];
  47.         printf("%d\n",num);
  48. }

  49. int show_tips(ptips_info ti,int reset)
  50. {
  51.         if(ti->A_Counts==NUM_LENGTH)
  52.         {
  53.                 printf("congratulations!(%d)\n",ti->num);
  54.                 return 1;
  55.         }
  56.         else
  57.                 printf("%dA%dB:[%d]\n",ti->A_Counts,ti->B_Counts,ti->num);
  58.         return 0;
  59. }

  60. void tips(int num,int* numAr,int mark,ptips_info ti)
  61. {
  62.         ti->num = num;
  63.         CREATE_MARK(submark);
  64.         int i = 0;
  65.         for(;i<NUM_LENGTH;i++)
  66.         {
  67.                 int sub = num%NUM_MOD;
  68.                 num /= NUM_MOD;

  69.                 if(sub==numAr[i])
  70.                 {
  71.                         ti->A_Counts++;
  72.                         if(CHECK_EXIST(sub,submark))ti->B_Counts--;
  73.                 }
  74.                 else if(!CHECK_EXIST(sub,submark)&&CHECK_EXIST(sub,mark))ti->B_Counts++;

  75.                 MARK_SET(sub,submark);
  76.         }
  77. }

  78. int generate(int * numAr)
  79. {
  80.         CREATE_MARK(mark);
  81.         int i = NUM_LENGTH;
  82.         for(;i>0;i--)
  83.         {
  84.                 int num;
  85.                 do
  86.                 {
  87.                         num = rand()%NUM_MOD;
  88.                 }while(CHECK_EXIST(num,mark)&&(mark||num));
  89.                 numAr[i-1] = num;
  90.                 MARK_SET(num,mark);
  91.         }
  92.         return mark;
  93. }
复制代码
{:3_190:}

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-01-23 16:14 |只看该作者
LZ对宏有癖好?

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
3 [报告]
发表于 2013-01-23 16:43 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <time.h>


  6. int main(void)
  7. {
  8.         time_t time_now;
  9.         int i, j, k;
  10.         int ran_n[4];
  11.         int guess_a, guess_b;
  12.         char buf_n[100];
  13.         
  14.         int debug_n;
  15.         

  16.         
  17.         debug_n = 0;
  18.         time_now = time(NULL);
  19.         srand(time_now);
  20.         /* random number gen */
  21.         for ( i = 0; i < 4; ) {

  22.                 ran_n[i] = rand()%10;
  23.                 switch (i) {
  24.                 case 0:
  25.                         break;
  26.                 case 1:
  27.                         if ( ran_n[1] == ran_n[0] )
  28.                                 goto rang;
  29.                         break;
  30.                 case 2:
  31.                         if ( ran_n[2] == ran_n[0] || ran_n[2] == ran_n[1] )
  32.                                 goto rang;
  33.                         break;
  34.                 case 3:
  35.                         if ( ran_n[3] == ran_n[0] || ran_n[3] == ran_n[1] || \
  36.                              ran_n[3] == ran_n[2])
  37.                                 goto rang;
  38.                         break;
  39.                 }
  40.                 i++;
  41.         rang:   debug_n++;
  42.         }
  43.         
  44.         printf("guess the number:\n");  
  45.         for ( i = 0; i < 10 ;) {
  46.                 memset(buf_n, 0, sizeof(buf_n));
  47.                 scanf("%s", buf_n);
  48.                 if ( strlen(buf_n) != 4 ) {
  49.                         printf("not 4 number, ");
  50.                 cc:printf("input not legal, again please:\n");
  51.                         continue;
  52.                 }
  53.                 for (j = 0; j < 3; j++) {
  54.                         if (buf_n[j] > 0x39 || buf_n[j] < 0x30) {
  55.                                 printf("--%c-- not number, ", buf_n[j]);
  56.                                 goto cc;
  57.                         }
  58.                 }
  59.                 if ( buf_n[0] == buf_n[1] || buf_n[0] == buf_n[2] || \
  60.                      buf_n[0] == buf_n[3] || buf_n[1] == buf_n[2] || \
  61.                      buf_n[1] == buf_n[3] || buf_n[2] == buf_n[3]) {
  62.                         printf("the four cala should be different, ");
  63.                         goto cc;
  64.                 }
  65.                
  66.                 /* count the A B */
  67.                 guess_a = 0;
  68.                 guess_b = 0;
  69.                 for ( j = 0; j < 4; j++)  {
  70.                         for ( k = 0; k < 4; k++) {
  71.                                 if ( ran_n[j] == buf_n[k]-48 ) {
  72.                                         if ( j == k)
  73.                                                 guess_a ++;
  74.                                         else
  75.                                                 guess_b ++;
  76.                                         break;
  77.                                 }
  78.                         }
  79.                 }
  80.                 if ( guess_a == 4) {
  81.                         printf("Congratu--, You are right. The answer is:--%s--\n", buf_n);
  82.                         return 0;
  83.                 }
  84.                 printf("%2d--%s--, --%d--A--%d--B\n", 10-i, buf_n, guess_a, guess_b);
  85.                 i++;
  86.         }

  87.         printf("You are so stupid!! The right answer is:--%d%d%d%d--\n", ran_n[0], ran_n[1], ran_n[2], ran_n[3]);
  88.         return 0;
  89. }
复制代码
自己写的垃圾代码..
猜数字还是xAxB的好玩..

代码虽然差点但平时玩下还是很不错的.

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
4 [报告]
发表于 2013-01-23 16:55 |只看该作者
前排围观。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2013-01-23 22:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2013-01-23 22:25 |只看该作者
回复 5# pmerofc

用宏来定义变量
linux内核代码,google的开源代码,经常这么干
一是可以稍微缩短代码长度
二是可以在宏里封装复杂的命名方式,防止命名冲突
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
7 [报告]
发表于 2013-01-23 22:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2013-01-23 22:53 |只看该作者
回复 7# pmerofc

那也不至于看不懂吧
你是挑刺挑太久了,现在看什么都是刺
其实很多风格问题,实际项目中有编码规范在手,这些都不成问题

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2013-01-23 23:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
10 [报告]
发表于 2013-01-24 09:17 |只看该作者
hellioncu 发表于 2013-01-23 16:14
LZ对宏有癖好?

有点控
pmerofc 发表于 2013-01-23 23:21
我说的是看不懂他为什么这样写

习惯了。主要是在工程中别人使用时不需要关心mark是个啥东西。方便使用。其次是tips本来也想加个宏。但是懒得动了。如果说不该这么写(脱裤子放屁)。我接受意见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP