根据求属性集闭包的算法,编写程序,要求如下:
1. 由用户输入函数依赖,当用户输入End时,表示所有依赖都输入完毕。(即函数依赖是由用户自己定的,程序中不能假定某个具体的依赖)。
2. 函数依赖的形式是ABàC, AàBE这样的形式,为了简单起见,我们假定所有的属性都是用英文的大写字母表示,由A到Z。(提示,你可以让用户先输入依赖左边的属性,然后再输入依赖右边的属性,用来表示AàB这样的形式)
3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集求闭包”,让用户继续输入属性,直到用户输入END后程序结束。
4. 在上面3步骤用户选择END退出后,根据求函数依赖闭包的算法,显示用户输入的函数依赖的闭包F+。
C++编写
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool include(string str1, string str2)
{
int count = 0;
int len1 = str1.length();
int len2 = str2.length();
if(len1 < len2)
return false;
for(int i=0; i<len1; i++)
{
for(int j=0; j<len2; j++)
{
if(str1[i]==str2[j])
{
count++;
break;
}
}
}
if(count==len2)
return true;
else
return false;
}
string add(string parStr, string subStr)
{
int len1 = parStr.length();
int len2 = subStr.length();
for(int i=0; i<len2; i++)
{
bool flag = false; // subStr[i]是否在parStr中存在
for(int j=0; j<len1; j++)
{
if(subStr[i]==parStr[j])
flag = true;
}
if(flag==false)
{
parStr += subStr[i];
}
}
return parStr;
}
void qiuYiLain(string left[10], string right[10], string subStr, int count)
{
}
string qiuShuXingBiBao(string left[10], string right[10], string str, int count)
{
string strt(str);
while(true)
{
for(int i=0;i<count/2;i++)
{
if(include(str, left[i]))
{
strt = add(strt, right[i]);
}
}
if(strt.compare(str)==0)
{
return str;
}
else
str = strt;
}
}
void qiuHanShuYiLaiBiBao(string left[10], string right[10], int count)
{
cout<<"F+:"<<endl;
string shuxingji; // 求属性集
for(int i=0; i<count/2; i++)
{
shuxingji = add(shuxingji, left[i]);
}
shuxingji = qiuShuXingBiBao(left, right, shuxingji, count);
int len = shuxingji.length();
string lStr[2000]; // 依赖的左边的集合
int countl = 0;
for(int i=0; i<len; i++)
{
lStr[countl] = shuxingji[i];
for(int j=0; j<countl; j++)
{
lStr[countl+j+1] = lStr[j] + shuxingji[i];
}
countl = countl + countl + 1;
}
for(int i=0; i<countl; i++)
{
cout<<"lStr["<<i<<"]:"<<lStr[i]<<endl;
}
for(int i=0; i<countl; i++)
{
// 求每个依赖的右边
string rStrArr[2000]; // 这个依赖的右边的集合
int countr = 0; // 集合个数
string rStr; // 属性闭包
rStr = qiuShuXingBiBao(left, right, lStr[i], count);
int lenr = rStr.length();
for(int j=0; j<lenr; j++)
{
rStrArr[countr] = rStr[j];
for(int k=0; k<countr; k++)
{
rStrArr[countr+k+1] = rStrArr[k] + rStr[j];
}
countr = countr * 2 + 1;
}
cout<<lStr[i]<<"->NULL"<<endl;
for(int j=0; j<countr; j++)
{
cout<<lStr[i]<<"->"<<rStrArr[j]<<endl;
}
}
}
int main()
{
string left[10];
string right[10];
int count = 0;
cout<<"请输入函数依赖,假定所有的属性都是大写字母A到Z表示"<<endl;
cout<<"先输入依赖左边的属性,然后再输入右边的属性,表示A->B。输入END结束。"<<endl;
while(true)
{
string strIn;
cin>>strIn;
if(strIn.compare("END")==0)
break;
count++;
if(count%2==1)
{
left[count/2] = strIn;
}
else
{
right[count/2-1] = strIn;
}
if(count%2==0)
{
cout<<"完成第"<<count/2<<"个依赖 "<<left[count/2-1]<<"->"<<right[count/2-1]<<endl;
}
}
while(true)
{
cout<<"请输入属性集求闭包"<<endl;
string strIn1;
cin>>strIn1;
if(strIn1.compare("END")==0)
break;
else
{
string str1 = qiuShuXingBiBao(left, right, strIn1,count);
cout<<strIn1<<"+:"<<endl;
cout<<str1<<endl;
}
}
qiuHanShuYiLaiBiBao(left,right,count);
system("PAUSE");
return 0;
}