📄 ccj2.cpp
字号:
{ str2+=fun.substr(lkuohao,rkuohao-lkuohao+1);//取子串,子串为该组全部元素,包括括号 lkuohao=rkuohao+3;//由于合取、析取符号为2个字符。+3将此时的左括号标指向后一组元素的左括号 str=""; n=lkuohao;//将下一次比较的元素下标重新赋值,赋为下一组元素左括号的下标 break; } else {//与核进行比较,看每组元素中可含有与核相同的元素 if(he[m]==str[p])//若含与核相同元素,则不用比较 { str=""; lkuohao=rkuohao+3;//直接指向下一组元素 n=lkuohao; break; } else {//若与核不同,判断是否将此组元素比较完了 if(p==str.length()-1)//比较完了依据:元素个数 { str2+=fun.substr(lkuohao,rkuohao-lkuohao+1);//若比较完了,无核元素,则取子串 lkuohao=rkuohao+3;//指向下一组元素 str=""; break; } p++;//进行此组的下一个元素的比较 continue; } str=""; } } n=rkuohao+3; } else {//若取得元素不是括号,则是待比较元素,保存下来 str+=fun[n]; n++; } }//以上部分是根据吸收律约简后得到新的分辨函数 fun=str2;//将一次约简后的分辨函数传回}//约简完毕void delrongyu(string &fun)//定义消除冗余函数。即将约简后得到的函数中有相同的组元素去掉{ string rongyu[10],str="";//定义一个数组(为了方便保存和比较)保存约简后的每组元素,进行冗余消除 int m,n,num=0;//num为消除冗余项前约简后分辨函数的组数 void xiqu(int num,string fun[]);//申明将合取式化成析取式的函数 for(m=0;m<fun.length();)//提取约简后的每组元素值,存入rongyu数组中 { if(fun[m]=='(') { m++; continue; } if(fun[m]==')')//以右括号为每组元素结束判断标志 { rongyu[num]=str;//取第i组元素存入rongyu数组第i个位置 m++; num++; str=""; } else { str+=fun[m];//将每组元素值依次保存到字符串str中 m++; } } str=""; for(m=0;m<num;m++)//开始从rongyu数据中依次取数据进行冗余消除 //若是冗余数据,则用空串清除原始数据;若不是,则跳过 { if(rongyu[m]=="") break; for(n=m+1;n<num-m+1;n++) { if(rongyu[n]!="") if(rongyu[m]==rongyu[n]) rongyu[n]=""; } } n=0; for(m=0;m<num;m++) //计算还剩下待进行析取计算的元素组数 { if(rongyu[m]!="") n++;//n为组数 } xiqu(n,rongyu); fun=rongyu[0];}void xiqu(int num,string fun[])//定义进行析取计算函数//将第一组与第二组进行运行,将运算结果存放在第一组中。再将第一组与第三组进行运算,依次类推。最后结果在rongyu[0]中{ string str,str2,buf,buf2,buf3;//str保存第一组全部元素,str2保存其余组全部元素 //buf保存第一组读入的元素,buf2保存其余组读入的元素,buf3保存一次运算后的结果 int m,n,i; for(n=1;n<num;n++) { str=fun[0];//将第一组元素读入 str2=fun[n];//把将与第一组进行运算的组中的元素读入 for(i=0;i<str.length();i++) { while(str[i]>='A'&&str[i]<='z'&&i<str.length()) //判断读入的元素是否为字母(跳过符号∨),并且判断否该组元素是否读完了 { buf+=str[i];//将读入的元素存放到buf中保存 i+=2;//符号∨占2个字符 } for(m=0;m<str2.length();m++) //判断其余组读入的元素 { while(str2[m]>='A'&&str2[m]<='z'&&m<str2.length()) { buf2+=str2[m]; m+=2; } buf3=buf3+buf+buf2+"∨";//将一次运算后的结果整理保存 buf2=""; } buf=""; } buf3=buf3.substr(0,buf3.length()-2);//由于上面整理后保存的结果最后多个符号∨,将其去掉 fun[0]=buf3; buf3=""; }}void yuejiantable(string strs,string juece[][L],string juecetable[][L],int lieshu,int hangshu)//定义构建约简后的表S'{ int m,n,i,num=1;//num为约简后属性列的个数 string str,str2; ofstream outfile("result.txt",ios::app);//建立并打开一个文本输出文件result,用于保存推导出的规则式 //ios::app为在文件末尾进行追加,如果需要,创建文件 for(n=0;n<strs.length();n++)//将约简后的条件属性列保存到juecebiao中 { m=1; str=strs[n]; while(m<=lieshu) { if(str==juece[m][0]) { for(i=0;i<=hangshu;i++) juece[i][num]=juecetable[i][m]; num++; } m++; } str=""; } for(i=0;i<=hangshu;i++)//将决策属性加入到约简后的表中 juece[i][num]=juecetable[i][lieshu-1]; str=""; for(m=1;m<=hangshu;m++)//将条件属性与决策数据构成的新的约简表进行冗余消除 { if(juece[m][1]=="")//如果元素为空,跳过,进行一下行的比较 continue; for(n=m+1;n<=hangshu;n++) { for(i=1;i<=num;i++) { str+=juece[m][i];//保存被比较的一行元素 str2+=juece[n][i];//保存比较的一行元素 } if(str==str2) { for(i=1;i<=num;i++) juece[n][i]="";//如有冗余,将其置空 } str2=""; } str=""; } cout<<"\n生成的约简表为:\n-------------------------------------------------------------------------------\n"; cout<<"\t"; for(m=1;m<=num;m++)//输出约简后的属性列 cout<<juece[0][m]<<"\t"; cout<<"\n-------------------------------------------------------------------------------\n"; for(m=1;m<hangshu;m++)//将除去冗余行的约简表输出 { if(juece[m][1]=="") continue; for(n=1;n<=num;n++) cout<<"\t"<<juece[m][n]; cout<<"\n"; } cout<<"-------------------------------------------------------------------------------\n"; cout<<"由上面约简表推导出的规则为:\n"; cout<<"-------------------------------------------------------------------------------\n"; str=""; if(!outfile)//判断文件是否打开 { cout<<"result.txt can`t open.\n"; exit(0); } for(m=1;m<=hangshu;m++)//求出约简规则式并显示出来 //显示形式:(条件属性,值)and(条件属性,值)and ……->(决策属性,值) { if(juece[m][1]=="") continue; for(n=1;n<num;n++) str+="("+juece[0][n]+","+juece[m][n]+") and ";//加入条件属性 cout<<str.substr(0,str.length()-5)<<" -> ";//将最后一个and(多余)去掉 cout<<"("+juece[0][num]+","+juece[m][num]+")";//加入决策属性 outfile<<str.substr(0,str.length()-5)+" -> "+"("+juece[0][num]+","+juece[m][num]+")\n";//输出到文件中 cout<<"\n"; str=""; } outfile.close();//关闭输出文件}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -