⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccj2.cpp

📁 该系统实现粗糙集合中的分辨矩阵与分辨函数的约简方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				{					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 + -