集合运算的C语言算法

#include
#include
char *e[10],*f[10];
struct point{
char str[20];
char oper;
    char *p[10];
}u[10][10];
//字符串任意片段拷贝函数 
void copy(char temp1[], char st[], int start, int end)
{
    int i, j = 0;
    for (i = start; i <= end; i++)
    {
        temp1[j++] = st[i];
    }
    temp1[j] = '\0';
}
/***************输入集合*****************/
void input_jihe(char *p[10],char *h){
int i,j=0,d=0,n=0,m=0,k=1,r=0;
char s[50]; 
printf("请输入集合%s:",h);
scanf("%s",s);
p[0]="{";
j=strlen(s);
//带括号的元素
for(i=1;iif(s[i]=='}') {
n--;
if(n==0) {
p[k]=new char[10];
copy(p[k],s,d,i);
k++;
}
}
if(s[i]=='{') {
n++;
if(n==1) d=i;
}
//不带括号的元素
if(n==0) {
if(k==1){
if(s[i+1]==','||i==j-2){
p[k]=new char[10];
     copy(p[k],s,1,i);
k++;
}
}
 else if(k!=1&&s[i]!='}'&&s[i]!=',') {
r++;
if(r==1)m=i;
if((s[i+1]==',')||(i==j-2)){
p[k]=new char[10];
copy(p[k],s,m,i);
k++;
r=0;
}
}
}
}
p[k]="}";
}
//  输出集合
void output_jihe(char *sum[10]){
int i;
if(!strcmp(sum[1],"}")) printf("空集\n");
else {
printf("{");
for(i=1;i<50;i++){
if(i==1) printf("%s",sum[i]);
else if(strcmp(sum[i],"}")) printf(",%s",sum[i]);
if(!strcmp(sum[i],"}")) {
printf("}");
break;
}
}
}
}
//  集合并集
void bing(char *p[10],char *q[10],char *sum[10]){
int i,j,k=0,t=0,f=0;
sum[0]="}";
for(k=1;k<20;k++){
if(strcmp(p[k],"}"))
{   sum[k]=new char[10];
strcpy(sum[k],p[k]);
}
else break;
}
t=k;
for(j=1;j<20;j++){
if(strcmp(q[j],"}")) 
{
for(i=1;i if(!strcmp(q[j],p[i])) break;
if(i==k-1){
sum[f+t]=new char[10];
strcpy(sum[f+t],q[j]);
f++;
}
}
}
else {
sum[t+f]="}";
break;
}
}
}
//  集合交集
void jiao(char *p[10],char *q[10],char *sum[10]){
int i,j,k=0,f=1;
sum[0]="}";
for(i=1;i<20;i++)
{
if(strcmp(p[i],"}")) 
for(j=1;j<20;j++)
{
if(strcmp(q[j],"}"))
{
if(!strcmp(q[j],p[i])) 
    {
sum[f]=new char[10];
strcpy(sum[f],q[j]);

f++;
}
}
else break;
}
else {
sum[f]="}";
break;
}
}
}
//  A-B(B对A的相对补集)
void jian(char *p[10],char *q[10],char *sum[10]){
int i,j,k=0,f=1;
sum[0]="}";
for(i=1;i<20;i++)
{
if(strcmp(p[i],"}")) 
for(j=1;j<20;j++)
{
if(strcmp(q[j],"}"))
{
if(!strcmp(q[j],p[i])) break;
    
if(!strcmp(q[j+1],"}")){
sum[f]=new char[10];
strcpy(sum[f],p[i]);
f++;
}

}
else break;
}
else {
sum[f]="}";
break;
}
}

//  求对称差  
void duichencha(char *p[10],char *q[10],char *sum[10]){
jian(p,q,e);
jian(q,p,f);
bing(e,f,sum);
}
/*********************建树***********************/
int build_tree(char *s) {
int i,j=0,k=0,g,th,len,m=0;
strcpy(u[0][0].str,s);


for(j=1;j<7;j++){
len=th=g=0;
for(g=0;g<7;g++){
k=strlen(u[j-1][g].str);
if(k<2){
strcpy(u[j][th].str,u[j-1][g].str);
th++;
}

if((u[j-1][g].str[0]=='(')&&(u[j-1][g].str[k-1]==')'))
{
for(i=1;i{
if(u[j-1][g].str[i]=='('||i==k-2)

copy(u[j-1][g].str,u[j-1][g].str,1,strlen(u[j-1][g].str)-2); 
k=k-2;
break;
}
if(u[j-1][g].str[i]==')')  break;
}
}
//由于集合二类运算是从左到右结合的,故从右向左检索运算符以分叉树结构。 
   for(i=k-1;i>=0;i--)
{
if(u[j-1][g].str[i]==')') {m++; continue;}
if(u[j-1][g].str[i]=='('&&(m==1)) {m--; continue;}


if(m==0)
{
switch(u[j-1][g].str[i])
{
case '&':u[j-1][g].oper='&';goto open;
case '|':u[j-1][g].oper='|';goto open;
case '-':u[j-1][g].oper='-';goto open;
case '+':u[j-1][g].oper='+';goto open;
   open: copy(u[j][th].str,u[j-1][g].str,0,i-1);
copy(u[j][th+1].str,u[j-1][g].str,i+1,k-1);
th+=2;
len++;
goto begin;
}
}
}
begin:;
}
if(len==0)
break;
}
return j;
}
//展示树结构 
void show_tree(int j){
int i,d;
for(i=0;i printf("第%d层  ",i);
for(d=0;d<10;d++){
if(strlen(u[i][d].str)<1) break;
printf("%s  ",u[i][d].str);
}
printf("\n");
}
}
//为树结构中的树叶赋予具体的集合。 
void embody_tree(int j){ 
int i,k,in,m,n;
input_jihe(u[j-1][0].p,u[j-1][0].str);
for(in=1;in<10;in++){
if(strlen(u[j-1][in].str)!=1){
break;
}
//如果树叶中集合与前面树叶的重复,则检索下一个树叶。 
for(k=0;k if(u[j-1][in].str[0]==u[j-1][k].str[0]) {
memcpy(u[j-1][in].p,u[j-1][k].p, sizeof(u[j-1][k].p)); 
break;
}  
    if(k==in-1){
input_jihe(u[j-1][in].p,u[j-1][in].str);
   }
 }
}
//通过树结构,由树叶向树根递推
for(m=j-2;m>=0;m--){
i=0;
for(n=0;n<10;n++){
switch(u[m][n].oper){
case '&':jiao(u[m+1][i].p,u[m+1][i+1].p,u[m][n].p) ;i+=2;break;
case '|':bing(u[m+1][i].p,u[m+1][i+1].p,u[m][n].p) ;i+=2;break;
case '-':jian(u[m+1][i].p,u[m+1][i+1].p,u[m][n].p) ;i+=2;break;
case '+':duichencha(u[m+1][i].p,u[m+1][i+1].p,u[m][n].p) ;i+=2;break;
default:
if((strlen(u[m][n].str))==1){
memcpy(u[m][n].p, u[m+1][i].p, sizeof(u[m+1][i].p));
i+=1;
}
break;
}
}
}

/****************主函数******************/
int main(){
int j; 
char s[20]; 
printf(" this program is used to set operation \n");
printf("  并运算符:|   交运算符:&   相对补运算符:-   对称差符:+  空集:#\n");
printf("*******************************************************************************\n");
printf("请输入集合公式:");
scanf("%s",s);  
// 构建树 返回j记录树的层数
j=build_tree(s); 
// 输出树结构 
show_tree(j);
//  输入集合 
embody_tree(j);
//打印树根 
printf("运算结果为: ");
output_jihe(u[0][0].p);
}

你可能感兴趣的:(程序,集合运算,集合表达式,C语言,算法,离散数学的编程实现)