❶ 如果用正则表达式 匹配一串二进制数,其中0有偶数个,1有奇数个.接受空串
/^(?:$|(?=0*1(?:0*10*1){0,}0*$)1*(?:01*0)+1*$)/
❷ 编译原理中的正规表达式
0+表示至少有一个0
0+10表示010、0010、00010等情形
(0+10)*表示(0+10)的闭包
❸ 编译原理:写出正规式包含奇数个1或奇数个0的二进制数串
((0*10*)(0*10*))*(0*10*) | ((1*01*)(1*01*))*(1*01*)
通过(AA)*A的方式保证表达式A出现奇数次,此处的A又可以替换成0*10*和1*01*表示只含一个1或0的任意二进制串。综合起来可以满足只出现奇数个1或奇数个0的要求
❹ 设计一个三变量的偶校验电路,即三个变量中,偶数个1输出为1,用与非门
设输入逻辑变量为A、B、C。根据输入偶数个逻辑1输出为1,否则输出为0的题意,就是说A、B、C中有两个或0个为1,其余的为0时输出为逻辑1, 那么输出逻辑表达式就应该是
以上逻辑器件全部采用4输入与非门,不用的输入端强制接"1"电平并用.1μ电容旁路,以提高抗干扰性能。
❺ 课本上有道题是这样说的:用正则表达式 表示偶数个0奇数个1的字符串。我知道该如何表达
这是陈意云老师习题集上的答案 :
even_0_even_1→(00|11)*((01|10)(00|11)*(01|10)(00|11)*)*
even_0_odd_1→1even_0_even_1|0(00|11)*(01|10)even_0_even_1
对于偶数个0和奇数个1构成的串,其第一个字符可能是0或1。
(1)如果是1,那么剩下的部分一定是偶数个0和偶数个1
(2)如果是0,那么经过若干个00或11,一定会出现一个01或10,才能保证0的个数是偶数,1的个数是奇数。若串还没有结束,剩余部分一定是偶数个0和偶数个1。
这样,正确的正规定义是:
even_0_odd_1→1even_0_even_1|0(00|11)*(01|10)even_0_even_1
注意:*均应在其左面第一个右括号的右上角,为书写方便直接写在了后面 :)
❻ 编译原理编程
1)0*10*10*
2)0*(10+)*(1|0)
3)(0*10*10*)*
第一题跟第三题是差不多的
这时候可以发现,只要用一个count来做对错的识别就能解决,并不是没有用到state状态,而是该状态变为隐性了,如下
/**
*@fnintcheck_data(char*d_line,intn)
*@brief检查资列串是否符合给定的正则表达式
*@return0不符;1符合
*/
intcheck_data(char*d_line,intn){
inti,count;
for(count=0,i=0;i<n;i++){//只要算出1的个数即可
if(d_line[i]=='1')count++;
}
return(1-(count&1));//当count奇数表示失败;当count偶数成功
}
第二题的话,就会用到state来纪录状态,
而最后离开状态S4还是被隐含在执行判断的过程中
#defineS10
#defineS21
#defineS32
#defineS43
intcheck_data(char*d_line,intn){
inti,state;
state=S1;
for(i=0;i<n;i++){
switch(state){
caseS1:
if(d_line[i]=='1')state=S2;break;
caseS2:
if(d_line[i]=='1')return0;//失败了
/*d_line[i]为'0'*/state=S3;break;
caseS3:
if(d_line[i]=='1')state=S2;break;
caseS4:break;
}
}
return1;
}
基本上上述程式对照自动机就可以比较清楚了
❼ 编译原理:所有由偶数个0和偶数个1所组成的符号串的集合
(00|11)*((01|10)(00|11)*(01|10)(00|11)*)*
❽ 正则表达式匹配奇偶数
区分奇数和偶数其实就是在整数的基础上看最后一位嘛
(假如不考虑正负号)
偶数:
一位偶数就是0/2/4/6/8,用正则表达式表示就是:[02468]
两位偶数就是个位是0/2/4/6/8,十位是1-9(非0),用正则表达式表示就是:[1-9][02468]
三位偶数就是在两位中间加一个任意数字,用正则表达式表示就是:[1-9]d[02468]
……
全部合起来之后就是:([1-9]d*)?[02468]
奇数同理。
假如开头需要正负号,奇数直接加上就行了,而偶数中0需要单独处理(因为不存在-0)。
❾ 编译原理-用正则表达式表示下面的内容
(1)[a-z]
(2)^[24680]+$ 所有数字都为偶数 ^(?=[1-9])\d*[02468]$|^[02468]$ 所有偶数
(3)^(?=[a-zA-Z0-9]+).*@[^\.]+\.[a-z]+$
测试有效
❿ 编译原理偶数个0和偶数个1转换图
嘛,差不多就是这样了。思路是分析所有0和1的组合画出存在的状态,然后判断转移条件,找出可接受的状态。