求函数依赖闭包 C++


根据求属性集闭包的算法,编写程序,要求如下:

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值