用MFC实现的简单的集合运算程序(原创)
2010-05-10 22:25 xiao蜗牛 阅读(538) 评论(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);
}
最后,如果有什么地方不对请大家指正,谢谢。