代码改变世界

用MFC实现的简单的集合运算程序(原创)

2010-05-10 22:25  xiao蜗牛  阅读(536)  评论(0编辑  收藏  举报

    昨天学院举行的程序设计比赛有一个关于界面的程序,由于时间有限,而且本人基础还不够扎实,所以没有完成。赛后我查阅了一些资料,把它完成了,在这里发出来,总结一下。

在vc++6.0中实现,界面如下:

 

 

1用到的控件: 编辑框、单选按钮、按钮。

2步骤:

(1)设置控件属性。

三个编辑框的ID分别设为IDC_STRA、IDC_STRB、IDC_STRC。单选按钮只需设置一个ID,保持并集的ID:IDC_RADIO1不变,将其属性“组”勾上。

(2)关联变量。

ID:IDC_STRA 类型:CString 名称:m_strA;ID:IDC_STRB 类型:CString 名称:m_strB;ID:IDC_STRC 类型:CString 名称:m_strC;ID:IDC_ RADIO1类型:int 名称:m_iChoice。

(3)添加“确定”按钮的响应函数。

    这一步是核心的东西。在这里我用到了STL(标准模板库)中的集合处理函数。所以要在头文件中添加 #include <algorithm>  using namespace std;处理并集、交集、差集的函数分别是set_union、set_intersection 、set_symmetric_difference/set_difference。

    当然,在用到集合处理函数之前要先得到需要操作的两个集合,也就是将strA,strB中的数取出来放到字符数组里即可。我用到了strtok函数,当然也可以不要该函数,自己取数字。基本思想就这些,其实关键的东西都让库函数做了,呵呵。

    注意:理解单选按钮的用法,选择第一项时,m_iChoice = 0,依此类推。赋值过程自动完成,不需要添加按钮响应函数赋值。

    OnOK函数代码如下:

void CContestMFCDlg::OnOK()

{

    UpdateData(TRUE);

 

    char setA[50], setB[50]; // 集合

    int size1=0, size2=0;    // 集合大小

 

    char szBuf1[50], szBuf2[50];  // 将strA、strB存入字符数组中。

          // 突然发现定义CString类型变量更简单,不知实现起来有没有问题。

    char *szTemp = m_strA.GetBuffer(m_strA.GetLength());

    memcpy(szBuf1, szTemp, (m_strA.GetLength()+1)*sizeof(TCHAR));

 

    szTemp = m_strB.GetBuffer(m_strB.GetLength());

    memcpy(szBuf2, szTemp, (m_strA.GetLength()+1)*sizeof(TCHAR));

 

    char szSep[] = ",";

    char *szInfo1 = strtok(szBuf1,szSep);

    while(szInfo1 != NULL)

    {

        setA[size1] = szInfo1[0];

        size1++;

        szInfo1 = strtok(NULL, szSep);

    }

    setA[size1] = '\0';

 

    char *szInfo2 = strtok(szBuf2,szSep);

    while(szInfo2 != NULL)

    {

        setB[size2] = szInfo2[0];

        size2++;

        szInfo2 = strtok(NULL, szSep);

    }

    setB[size2] = '\0';

 

    //m_strC.Format("%s", setA);

    char * szEnd = NULL;

    char setC[50] = {0};

    switch(m_iChoice)

    {

    case 0:

        {

            szEnd = set_union(setA, setA+size1, setB, setB+size2, setC);

            // 注意:参数不是 (setA, setA+size1-1, setB, setB+size2-1, setC)

            break;

        }

    case 1:

        {

            szEnd = set_intersection(setA, setA+size1, setB, setB+size2, setC);

            break;

        }

    case 2:

        {

            szEnd = set_symmetric_difference(setA, setA+size1, setB, setB+size2, setC);

            break;

        }

    default:

        break;

    }

    char szRes[50];

    int i=0;

    for(i=0, szTemp=setC; szTemp<=szEnd; ++szTemp)

    {

        szRes[i++] = *szTemp;

        szRes[i++] = ',';

    }

    m_strC.Format("%s", szRes);

 

    UpdateData(FALSE);

}

    最后,如果有什么地方不对请大家指正,谢谢。