#include<stdio.h>
#include<string.h>
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;i<j-1;i++){
if(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<k;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<k-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<j;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<in;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语言算法相关推荐

  1. 蓝桥杯集合运算问题c语言,蓝桥杯 集合运算(set)

    算法训练 集合运算 时间限制:1.0s   内存限制:512.0MB 问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. ...

  2. c语言集合运算有菜单,怎样用C语言实现集合运算

    [转]STL算法-合并(集合) hechao322514692017-02-24 R:集合运算 thoixy29792014-10-27 C++ STL 集合运算 weixin_42993054605 ...

  3. R语言︱集合运算——小而美法则

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 集合运算的一般规则如下:     union( ...

  4. 【安全算法之SHA1】SHA1摘要运算的C语言源码实现

    [安全算法之SHA1]SHA1摘要运算的C语言源码实现 概述 头文件定义 C语言版本的实现源码 测试用例 github仓库 更多参考链接 概述 大家都知道摘要算法在安全领域,也是一个特别重要的存在,而 ...

  5. 离散集合运算c语言程序,离散数学集合运算c语言.doc

    离散数学集合运算c语言 离散数学集合运算(第一次作业) C语言写法: #include //求长度的运算 void main() { int i,j,n; float A[]; float B[]; ...

  6. 【安全算法之SHA512】SHA512摘要运算的C语言源码实现

    [安全算法之SHA512]SHA512摘要运算的C语言源码实现 概述 头文件定义 C语言版本的实现源码 测试用例 github仓库 更多参考链接 概述 大家都知道摘要算法在安全领域,也是一个特别重要的 ...

  7. java+实现集合并运算_JAVA程序设计报告+集合运算

    JAVA程序设计报告+集合运算 JAVA程序设计报告集合的运算(交并差)学生学号专业信息工程(系统工程方向)院系信息与控制学院实习时间三周:指导老师陈金辉目录实验目的试验设计实验源程序程序设计调试不足 ...

  8. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

    C语言算法与数据结构.ppt 第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解.历次试题分值在0 ...

  9. 离散数学实验三则(关系元算,集合运算与操作,最短路)

    前言 前段时间才做了离散实验的实验报告,为防止在本地遗失,所以上传到CSDN上一份,欢迎大家一起学习 实验1 关系元算 实验报告内容 一.实验目的 熟悉掌握命题逻辑中的联结词.真值表.主范式等,进一步 ...

最新文章

  1. 【Linux】- 获取root权限命令
  2. 串口通信模块2:串口通信编程基础(打开、配置)
  3. 代码规范利器-阿里代码规范插件
  4. mysql nutch_nutch2.2+mysql部署
  5. mac配置adb环境变量
  6. Phython是什么?
  7. 华为无线portal服务器,portal服务器配置
  8. 阿里企业邮箱的POP地址
  9. 粉笔公考——判断推理
  10. 跟想这台计算机usb无法识别,跟这台计算机连接的前一个usb设备工作不正常,windows 无法识别它。 这是怎么回事急!!...
  11. Python+OpenCV 调用手机摄像头并实现人脸识别
  12. OpenCV3_C++_Erode()图像的收缩 实例
  13. 私有云服务器搭建教程(保姆级)——台式电脑+ubuntu+docker+nextcloud+mysql+花生壳内网穿透
  14. [转] 理解Web路由
  15. 在iview中render函数使用Switch功能
  16. 使用pgAdmin3 调试存储过程
  17. 地图跑步轨迹回放动画实现
  18. 理解 RxJava 线程模型
  19. 检查两个字符串数组是否相等
  20. python儿童命令_《与孩子一起学编程》第一章出发吧之指令学习、与Python交互|中国少儿编程网...

热门文章

  1. PLC学习第一篇:PLC程序架构
  2. Linux文件系统类型
  3. 【胖张】献给跟我一样的菜鸟
  4. 敬畏崛起,王自如的传奇人生
  5. Android传感器之-方向传感器Orientation功能实现与源码
  6. 博客搬家至 utensil.github.io
  7. Git使用时无.ssh目录:/.ssh: No such file or directory
  8. 批量分析中通快运单号物流,并查看是否签收
  9. c语言*p和**p,c语言分析(*p)++和*p++的不同含义
  10. 钻石图案JAVA语言