爱你的三万天 爱你的三万天
其实知道自己是很笨的,反应很慢,记忆也不好,从小时候读书读得那样吃力辛苦,学东西学得那么慢就已经一清二楚了,何必不甘心呢,各有各的天赋,快不是我的强项,兜兜转转还在原地踏步,现在该把偏离的方向修正回自己的路上去,不要急躁,不要悲伤
关注数: 9 粉丝数: 11 发帖数: 360 关注贴吧数: 5
给 Rob Pike 编写的正则表达式程序 写测试用例 Rob Pike 编写的正则表达式 实现是优美代码的一个极好的例子:紧凑、优雅、高效、有用。这是我看过的最好的递归的例子,它也展示了C指针的威力。虽然当时我们最关心的是说明记法(notation)的重要性,好的记法可以使程序更容易使用,也更容易编写,正则表达式的代码也是阐释算法、数据结构、测试、性能改善和其它重要主题的极好的例子。(原话引自 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.oschina.net%2Ftranslate%2Fregular-expression-matcher-code-by-rob-pike&urlrefer=89f2c8674817c88360c72f545a5c5a32) 正则表达式匹配器是模仿grep的一段程序,我用C写了一个测试,供大家讨论, int matchhere(char *regexp,char *text); int matchstar(int c,char *regexp,char *text); int match(char *regexp,char *text); 以上三个是Rob Pike 编写的正则表达式代码,我加入全局变量char sbuf[100]={};int sb=0; 临时存放搜索词。 代码如下: 1 #include <stdio.h> 2 #include 3 #include 4 char sbuf[100]={};//临时存放搜索词 5 int sb=0;//sbuf的下标 6 int matchhere(char *regexp,char *text); 7 int matchstar(int c,char *regexp,char *text); 8 9 int match(char *regexp,char *text) 10 { 11 if (regexp[0] == '^') 12 return matchhere(regexp+1,text); 13 do 14 { 15 if (matchhere(regexp,text)) 16 return 1; 17 sb=0; 18 }while (*text++ != '\0'); 19 return 0; 20 } 21 22 int matchhere(char *regexp,char *text) 23 { 24 if (regexp[0] == '\0') 25 return 1; 26 if (regexp[1] == '*') 27 { 28 return matchstar(regexp[0],regexp+2,text); 29 } 30 if(regexp[0] == '$' && regexp[1] == '\0') 31 return *text == '\0'; 32 if(*text != '\0' && (regexp[0] == '.' || regexp[0]==*text)) 33 { 34 sbuf[sb] = *text; 35 sb++; 36 return matchhere(regexp+1,text+1); 37 } 38 return 0; 39 } 40 41 int matchstar(int c,char *regexp,char *text) 42{ 43 do 44 { 45 if (matchhere(regexp,text)) 46 return 1; 47 }while(*text != '\0' && ((*text++ == c) || (c == '.'))); 48 return 0; 49 } 50 51 int guo_sbuf(char *pdii , char *sbuff) 52 { 53 if(*sbuff=='\0') 54 return 1; 55 if(*sbuff==*pdii) 56 return guo_sbuf(pdii+1,sbuff+1); 57 return 0; 58 } 59 60 int guo_diwei(char *regexp,char *text) 61 { 62 char pdi[100]={}; 63 int i=0; 64 do 65 { 66 i=0; 67 68 while(*text!='\n' && *text!='\0') 69 pdi[i++]=*text++; 70 if(match(regexp,pdi)) 71 { 72 printf("\n"); 73 74 char *ppdi=pdi; 75 char *psbuf=sbuf; 76 while(*ppdi != '\0') 77 { 78 if(*ppdi == *psbuf) 79 { 80 if(guo_sbuf(ppdi,psbuf)) 81 { 82 while(*psbuf++!='\0') 83 { 84 printf("\033[31m%c\033[0m",*ppdi++); 85 } 86 } 87 else 88 { 89 printf("\033[34m%c\033[0m",*ppdi++); 90 91 } 92 93 } 94 else 95 { 96 printf("\033[33m%c\033[0m",*ppdi++); 97 } 98 } 99 100 } 101 sb=0; 102 103 memset(pdi,0,sizeof(pdi)); 104 }while(*text++ != '\0'); 105 return 0; 106 } 107 108 int guo_test() 109 { 110 char regexp[100]={},text[100]={}; 111 printf("input regexp and text:"); 112 scanf("%s",regexp); 113 scanf("%s",text); 114 115 FILE *R = fopen(text,"r"); 116 if(R == NULL) 117 { 118 printf("file %s cannnot be opened\n",text); 119 return 0; 120 } 121 122 if(R != NULL) 123 { 124 long int Fs; 125 char *buff=NULL; 126 fseek(R,0L,SEEK_END); 127 Fs=ftell(R); 128 printf("ftell(R) len:%ld\n",Fs); 129 fseek(R,0L,SEEK_SET); 130 buff=(char *)malloc(sizeof(char) * Fs+1); 131 fread(buff,sizeof(char),Fs,R); 132 guo_diwei(regexp,buff); 133 printf("\n"); 134 free(buff); 135 } 136 137 fclose(R); 138 return 0; 139 } 140 141 142 int main() 143 { 144 return guo_test(); 145 } 1,9 顶端
贝格尔法排列赛程表 不成熟的代码,后面会精简修改,但因为是第一次独立写出来的代码,所以倍感珍惜。 后面有个数组定义问题也会放出来研究下。 先按百度说一下贝格尔法: 采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边;后一半的数自下而上写在右边,然后用横线把相对的号数连接起来。这即是第一轮的比赛。第二轮将第一轮右上角的编号(“0”或最大的一个代号数)左角上,第三轮又移到右角上,以此类推。即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角。如下表示(表1): 7个队比赛的编排方法 第一轮 第二轮 第三轮 第四轮 第五轮 第六轮 第七轮 1-0 0-5 2-0 0-6 3-0 0-7 4-0 2-7 6-4 3-1 7-5 4-2 1-6 5-3 3-6 7-3 4-7 1-4 5-1 2-5 6-2 4-5 1-2 5-6 2-3 6-7 3-4 7-1 无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。 根据参赛队的除数不同,“1”朝逆时针方向移动一个位置时,应按规定的间隔数移动(见表2)“0”或最大 代号数应先于“1”移动位置。 表2 间隔移动 参赛队数 间隔数 4队以下 0 5~6队 1 7~8队 2 9~10队 3 11~12队 4 “1”进行间隔移动时,凡遇到“0”或最大代号数时应先越过,不作间隔计算。
1 下一页