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

📄 valbase.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:
 // ValBase.cpp: implementation of the ValBase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ValBase.h"
#include"string.h"
#include"stdlib.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

int ValBase::Read_Head()//right return 1,else return -1;
{
	char tempstring[60];
	int i;		//循环变量
	fin.getline(tempstring,30,':');
	if(strcmp(tempstring,"Style")!=0)
		return -1;
	fin.getline(style,30,'\n');
	fin.getline(tempstring,30,':');
	if(strcmp(tempstring,"Stage")!=0)
		return -1;
	fin>>stage;				//读入stage
	fin.getline(tempstring,35,':');
	if(strcmp(tempstring,"\nCondition attributes number")!=0)
		return -1;
	fin>>AttCount;			//读入列数
	AttCount++;				//实际的列数比条件属性多1;
	fin.getline(tempstring,60,':');
	if(strcmp(tempstring,"\nThe Number of Condition attributes deleted")==0)
	{
		int n;
		fin>>atbcount;//int型  删除了的属性数目
		fin.getline(tempstring,60,':');
		if(strcmp(tempstring,"\nThe position of Condition attributes deleted")==0)
		{
			if(atbcount>0)
			{
				atb=new int[atbcount];
				for(n=0;n<atbcount;n++)
					fin>>atb[n];
			}
			else
				atb=NULL;
		}
		else
			return -1;
	}
	else
		return -1;
    fin.getline(tempstring,20,'\n');
	fin.getline(tempstring,30,':');
	if(strcmp(tempstring,"Records number")!=0)
		return -1;
	fin>>RecCount;			//读入行数
	if((datasign=new char *[AttCount])==0)//开辟AttCount(列数)个单元,存储类型标志符
	   return -1;
	for(i=0;i<AttCount;i++)
		datasign[i]=new char[20];
	for(i=0;i<AttCount;i++)		//读入属性名称
		fin>>datasign[i];
	datatype=new int[AttCount];//存储数据类型(1表示Integer,2为Float,3为String)
	for(i=0;i<AttCount;i++)
	{
		fin>>tempstring;
		switch (tempstring[0])
		{
		case 'i':
		case 'I':datatype[i]=1;break;
		case 'f':
		case 'F':datatype[i]=2;break;
		case 's':
		case 'S':datatype[i]=3;break;
		}
	}
	return 1;
}

int ValBase::Read_Data()//读入决策表,以字符串方式读入
{//wrong:return -1   success:return 1
	char tempstring[20];
	int i,j;
	tabstr=new char **[RecCount];
   	if (tabstr==NULL) return -1;
	for(i=0;i<RecCount;i++)
		tabstr[i]=NULL;
	for(i=0;i<RecCount;i++)
	{
		tabstr[i]=new char *[AttCount];
		if(tabstr[i]==NULL) return -1;
		for(j=0;j<AttCount;j++)
			tabstr[i][j]=NULL;
		for(j=0;j<AttCount;j++)//AttCount为所有属性的数目
		{
			fin>>tempstring;
			tabstr[i][j]=new char [strlen(tempstring)+1];
			if(tabstr[i][j]==NULL) return -1;
			strcpy(tabstr[i][j],tempstring);
		}
	}
	return 1;
}

int ValBase::Transfer_Tab()//wrong :return -1; success:return 1
{//把tabstr中字符串型的属性值转换成整形并存入数组tab中
	int i,j,k;		//循环变量
	tab=new int *[RecCount];//建立RecCount*AttCount的表
	if(tab==NULL) return -1;
	for(i=0;i<RecCount;i++)
		tab[i]=NULL;
	AttCount1=AttCount;
	delatt=new bool [AttCount1];
	for(j=0;j<AttCount1;j++)
		if(strcmp(tabstr[0][j],"-")==0)
		{
			delatt[j]=true;
			AttCount--;
		}
		else delatt[j]=false;
	for(i=0;i<RecCount;i++)
	{
		tab[i]=new int [AttCount];
		if(tab[i]==NULL) return -1;
		k=0;
		for(j=0;j<AttCount1;j++)		//按列循环
		{
			if(!delatt[j])
				tab[i][k++]=atoi(tabstr[i][j]);
			delete []tabstr[i][j];//删除存储的字符串临时变量
		}
		delete []tabstr[i];
	}
	delete tabstr;
	return 1;
}

int ValBase::Read_Cut()
{//wrong:return -1;else 1
	char sign[100];
	char temp[20];
	int x,y;
	int i;
	if((cuttab=new MyCut *[AttCount1])==NULL)
		return -1;
	for(i=0;i<AttCount1;i++)
		cuttab[i]=NULL;
	if(fin.eof()) return 1;//没有断点,返回
	fin.getline(sign,100,']');
	while(!fin.eof())
	{
		temp[0]='!';
		fin>>temp;
		if(temp[0]!='!')
		{
			x=atoi(temp);
			fin>>y;
			if((cuttab[x]=new MyCut[y])==NULL)
				return -1;
			for(i=0;i<y;i++)
			{
				fin>>cuttab[x][i].string;
				fin>>cuttab[x][i].x;
			}
		}
	}
	return 1;
}
ValBase::ValBase()
{

}

ValBase::~ValBase()
{

}

int ValBase::RunOne(char *s)
{//从文件中读取全部的信息  success :return 1 ; else return -1
	fin.open(s,ios::in|ios::nocreate);
	if(fin.fail())
	{
		fin.close();
		return -1;
	}
	if(Read_Head()!=1)
	{
		fin.close();
		return -1;
	}
	if(Read_Data()!=1)
	{
		fin.close();
		return -1;
	}
	if(Transfer_Tab()!=1)
	{
		fin.close();
		return -1;
	}
	if(Read_Cut()!=1)
	{
		fin.close();
		return -1;
	}

	fin.close();
	return 1;
}

void ValBase::Save_File(char *r)
{
	fout.open(r,ios::out|ios::trunc);
	int i,j,m,k;//循环变量
	int tempcount=0;
	//输出文件头
	fout<<"Style:rule"<<'\n';		//表示为规则文件
	fout<<"Stage:0"<<'\n';			//为规则文件这个值无用
	fout<<"Condition attributes number:"<<AttCount1-1<<'\n';//列数
    fout<<"The Number of Condition attributes deleted: "<<atbcount<<'\n';
	fout<<"The position of Condition attributes deleted: ";
	for(i=0;i<atbcount;i++)
		fout<<atb[i]<<' ';
	fout<<'\n';
	for(i=0;i<RecCount;i++)//除去冗余记录个数
		if(!delrec[i]) tempcount++;
	fout<<"Rules number:"<<tempcount<<'\n';//行数
    fout<<"Blocks number:0\n";//块数
	for(j=0;j<AttCount1;j++)
		fout<<datasign[j]<<' ';//属性名称
	fout<<'\n';
	for(j=0;j<AttCount1;j++)
	{
		switch (datatype[j])
		{
		case 1:fout<<"Integer"<<' ';break;
		case 2:fout<<"Float"<<' ';break;
		case 3:fout<<"String"<<' ';break;
		}
	}
//	fout<<"满足规则的记录数";
	fout<<'\n';
	//输出正文
	for(i=0;i<RecCount;i++)//RecCount为记录数
	{
		if (!delrec[i])
		{
			k=0;//表示记录i的第k个属性
			for(j=0;j<AttCount1;j++)//AttCount1属性数目
			{
				if(delatt[j])//delatt标记在属性约简中去掉的属性列  原始信息表中已经'-'
				{
					fout<<'-'<<' ';
					continue;
				}
				if(!flagtab[i][k])//flagtab标记哪些条件属性可以去掉
				{//flagtab=false表示不能去掉
					if(cuttab[j]!=NULL)
					{//有断点
						for(m=0;m<RecCount;m++)
							if(cuttab[j][m].x==(tab[i][k]))
							{
								fout<<cuttab[j][m].string<<' ';
								break;
							}
					}
					else
						fout<<tab[i][k]<<' ';//决策值
				}

				else //该属性值可以去掉
					fout<<'-'<<' ';
				k++;
			}
        	fout<<float(same_rec[i]+1)/float(same_att[i]+1)<<' ';
			fout<<same_rec[i]+1<<' ';
			fout<<same_att[i]+1<<' ';
			fout<<'\n';
		}
	}
   //写入文件尾部	while(!fin)
   fout.close();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -