#include <stdio.h>
#include <malloc.h>
//#include <time.h>#define LEN 8
#define COL 9
#define X_COORDINATE {1,2,3,4,5,6,7,8}
#define Y_COORDINATE {'a','b','c','d','e','f','g','h','i'}//节点结构体
typedef struct LNode{
int s[LEN];
struct LNode *next;
}LNode, *LinkList;//函数声明
void output(LinkList head);
bool equal(const int s1[LEN], const int s2[LEN]);
bool intersaction(const int s1[LEN], const int s2[LEN], int s[LEN]);
bool subtraction(const int s1[LEN], const int s2[LEN], int s[LEN]);
bool find(const int s[LEN], const int e);
void copy(const int s1[LEN], int s[LEN]);
bool empty(const int s[LEN]);
void init(int i, int s[LEN]);
void read_file(FILE *fp, int dest[COL][LEN]);
void f_attribute(const char s_y[COL], const int s_xy[COL][LEN], const int material[LEN], char attr[COL]);
void g_material(const int s_x[LEN], const int s_xy[COL][LEN], const char attr[COL], int material[LEN]);
//double t = clock();
//遍历输出链表
void output(LinkList head)
{
  LinkList p;
  p = head;
  while(p != NULL)
  {
  int i = 0;
  for(i=0; i<LEN; i++)
  {
  printf("%d ", *(p->s+i));
  }
  printf("%c",'\n');
  p = p->next;
  }
}//判断s1和s2两个数组是否相等
//如果相等返回true,否则返回false
bool equal(const int s1[LEN], const int s2[LEN])
{
int i;
for(i=0;i<LEN;i++)
{
if(s1[i] != s2[i])
{
return false;
}
}return true;
}//取s1在s2上的非零值交集,如果有交集则将交集保存至s,返回true
//否则返回false
bool intersaction(const int s1[LEN], const int s2[LEN], int s[LEN])
{
bool flag = false;
for(int i=0;i<LEN;i++)
{
int j;
for(j=0;j<LEN;j++)
{
if(s1[i] == s2[j] && s1[i] != 0)
{
break;
}
}
if(j < LEN)
{
s[i] = s1[i];
flag = true;
}
else
{
s[i] = 0;
}
}return flag;
}//取s1在s2上的非零值差集(S1-S2),如果有差集则将差集保存至s,
//返回true,否则返回false
bool subtraction(const int s1[LEN], const int s2[LEN], int s[LEN])
{
  bool flag = false;
for(int i=0;i<LEN;i++)
{
int j;
for(j=0;j<LEN;j++)
{
if(s1[i] == s2[j] && s1[i] != 0)
{
break;
}
}
if(j >= LEN)
{
s[i] = s1[i];
flag = true;
}
}return flag;
}//在数组s中查找元素e
//如果找到返回true,否则返回false
bool find(const int s[LEN], const int e)
{
  for(int i=0; i<LEN; i++)
  {
  if(e == s[i])
  {
  return true;
  }
  }
  return false;
}//把数组s1复制到s中
void copy(const int s1[LEN], int s[LEN])
{
for(int i=0; i<LEN; i++)
{
s[i] = s1[i];
}
}//清空集合s(置零清空)
void clear(int s[LEN])
{
for(int i = 0; i<LEN; i++)
{
s[i] = 0;
}
}
//判断集合是否为空(0代表空)
bool empty(const int s[LEN])
{
bool flag = true;
for(int i=0; i<LEN; i++)
{
if(s[i] != 0)
{
flag = false;
break;
}
}
return flag;
}//并集S1+S2=S,将s1加上s2保存至s
//注意S的元素数量不超过LEN的大小
/*******************************
void unions(const int s1[LEN], const int s2[LEN], int s[LEN])
{
for(int i=0; i<LEN; i++){
s[i] = s1[i];
}for(int i=0; i<LEN; i++){
if(!find(s, s2[i]))
{
  s[i] = s2[i];
}
}
}
**********************************///数组初始化为{1,……,i-1}
void init(int i, int s[LEN])
{
for(int j=0; j<LEN; j++)
{
if(j < i-1)
{
s[j] = j+1;
}
else
{
s[j] = 0;
}
}
}//从文件中读取数据到二维数组
void read_file(FILE *fp, int dest[COL][LEN])
{
  int i,j=0;
  for (i=0;i<COL;i++)
  for(j=0;j<LEN;j++)
  {
  if(!feof(fp))
  {
  fscanf(fp,"%d",&dest[i][j]);
  }
  }
}//数组s中物质具有的属性
//s_y为Y_COORDINATE数组
//s_xy为物质属性关系对应数组
//material要查找的物质数组
//attr保存属性结果(下标值)
void f_attribute(const char s_y[COL], const int s_xy[COL][LEN], const int material[LEN], char attr[COL])
{
int sub_index[LEN]; //material[LEN]中不等于0的下标值
//初始化sub_index
for(int i=0; i<LEN; i++)
{
sub_index[i] = -1;
}int j = 0;
  for(i=0; i<LEN; i++)
  {
  if(material[i] != 0)
  {
sub_index[j] = i;
j++;
  }
  }for(i=0; i<COL; i++)
{
bool flag = false;
for(int j=0; j<LEN; j++)
{
if(-1 == sub_index[j])
{
if(j != 0)
{
flag = true;
}
break;
}
if(0 == s_xy[i][sub_index[j]])
{
break;
}
}if(flag)
{
attr[i] = s_y[i];
}
else
{
attr[i] = '0';
}
}
}//数组s中具有属性的物质
//s_x为X_COORDINATE数组
//s_xy为物质属性关系对应数组
//attr要查找的属性(下标值)
//material保存具有相应属性的物质
void g_material(const int s_x[LEN], const int s_xy[COL][LEN], const char attr[COL], int material[LEN])
{
int sub_index[COL]; //attr[COL]中不等于‘0’的下标值
//初始化sub_index
for(int i=0; i<COL; i++)
{
sub_index[i] = -1;
}
int j=0;
  for(i=0; i<COL; i++)
  {
  if(attr[i] != '0')
  {
sub_index[j] = i;
j++;
  }
  }for(i=0; i<LEN; i++)
{
bool flag = false;
for(int j=0; j<COL; j++)
{
if(-1 == sub_index[j])
{
if(j != 0)
{
flag = true;
}
break;
}
if(0 == s_xy[sub_index[j]][i])
{
break;
}
}if(flag)
{
material[i] = s_x[i];
}
else
{
material[i] = 0;
}
}
}int main()
{/*读入物质和属性关系表
如下表:
物质 |1 2 3 4 5 6 7 8  
--------|----------------
属性 a|1 2 3 4 5 6 7 8
b|0 2 0 0 0 6 0 0
c|0 2 0 0 0 6 0 0
d|0 2 3 4 0 0 7 0
e|1 0 0 4 5 0 0 8
f|0 0 3 0 5 0 7 8
g|1 0 0 0 5 6 0 8
h|0 0 0 0 5 0 0 8
i|1 0 0 0 0 0 0 8
读入的数组为:
1 2 3 4 5 6 7 8
0 2 0 0 0 6 0 0
0 2 0 0 0 6 0 0
0 2 3 4 0 0 7 0
1 0 0 4 5 0 0 8
0 0 3 0 5 0 7 8
1 0 0 0 5 6 0 8
0 0 0 0 5 0 0 8
1 0 0 0 0 0 0 8
*/FILE *fp; //要读入的文件指针//如果读入文件失败,打印错误信息
  if((fp=fopen("f:\\test.txt","rb+"))==NULL)
  {
  printf("Open file error!");
  }  int s_xy[COL][LEN] = {{0}}; //存放读入的关系表的数组//读入文件到数组
  read_file(fp, s_xy);
int s_x[LEN] = X_COORDINATE; //总的物质集合U
char s_y[COL] = Y_COORDINATE; //总的属性集合
int i_material = sizeof(s_x)/sizeof(int); //求得有多少种物质
int i_loop = i_material; //i_loopint s_i[LEN] = {0}; //{1,...,i-1}集合s_i
int s_result[LEN] = {0}; 
int s_current[LEN] = {0}; //当前集合
int material[LEN] = {0}; //物质LNode head; //外延头
LinkList p = &head; //链表指针//初始化链表首节点
for(int i=0;i<LEN;i++)
  {
  *(p->s+i) = 0;
  }
p->next = NULL;do{
if(find(s_current, i_loop))
{
--i_loop;
continue;
}//初始化{1,...,i-1}集合s_i
init(i_loop, s_i);//求 *n{1,...,i-1}u{i},其中n表示交集,u表示并集
//先求*n{1,...,i-1}
intersaction(s_current, s_i, s_result);//然后u{i},只有一个元素i,相当于把s_result的i-1位置设置为i
s_result[i_loop-1] = i_loop;//求f()
char attr[COL] = {'0'};
f_attribute(s_y, s_xy, s_result, attr);
    
//求g(f())
g_material(s_x, s_xy, attr, material);//比较*和ig(f()),如果结果为YES,则置入外延链表中
int s_sub[LEN] = {0}; //s_sub 差集
subtraction(material, s_current, s_sub);bool flag = false;if(find(s_sub,i_loop))
{
int sa_inter_i[LEN] = {0}; //s_now和s_i的交集
int sb_inter_i[LEN] = {0}; //material和s_i的交集结果
intersaction(s_current, s_i, sa_inter_i);
intersaction(material, s_i, sb_inter_i);if(equal(sa_inter_i, sb_inter_i))
{
flag = true;
}
}--i_loop;if(flag)
{
LinkList q = (struct LNode *)malloc(sizeof(struct LNode));
copy(material, q->s);
p->next = q;
q->next = NULL;
p = q;copy(material, s_current);
i_loop = i_material;
}
else
{
clear(material);
}//判断外延是否等于全集,如果不是继续循环,否则循环结束
}while(!equal(material, s_x));//输出外延结果
//第一行全为零是链表头结点,设置为空
printf("第一行全为零是链表头结点,设置为空:\n");
output(&head);/***********************************************************
char attr[COL] = {'a','0','0','d','0','f','0','0','0'};
int material[LEN] = {0};
g_material(s_x, s_xy, attr, material);for(int i=0; i<LEN; i++)
{
printf("%d ", material[i]);
}
***********************************************/
//printf("\n");
//rintf("%f", clock()-t);
  return 0;}

解决方案 »

  1.   

    你这个要这样做,用一个按钮的响应函数来实现,把上面的函数内容都放到响应函数中,逐一实现,你表跟我将你没有使用过MFC
      

  2.   

    快速浏览了代码  这里是一个算法是吧。个人做法是吧返回值和变量进行关联控件。将main函数改为别的函数往里面传参数应该就可以完成了。 不知道对否
      

  3.   

    湖北的........?
    代码好多哦,看着头疼呢    看看MFC吧