C语言用数组实现集合的交集、并集、差集、补集

该博客介绍了一个使用C语言编写的程序,用于实现集合的基本操作,包括输入集合元素、求集合的交集、并集、差集以及补集。用户可以先输入两个集合A和B,然后选择相应操作查看结果。程序还检查了输入集合中是否存在重复元素,并在输出结果时提供了友好的界面提示。
摘要由CSDN通过智能技术生成

先上结果图:

 

 完整代码:

#include <stdio.h>
//初始化集合
int a[1024] = {0}, b[1024] = {0}, c[1024] = {0}, d[1024] = {0}, e[1024] = {0};
int com[1024] = {0}, temp[1024] = {0}, temp1[1024] = {0};
//显示界面
void show()
{
    printf("\t**************集合操作界面**************\n");
    printf("\t\t**** 1-**请先输入集合A和B元素在进行以下操作******\n");
    printf("\t\t**** 2-**求集合A∩B******\n");
    printf("\t\t**** 3-**求集合AUB******\n");
    printf("\t\t**** 4-**求集合A-B******\n");
    printf("\t\t**** 5-**求集合CeA******\n");
    printf("\t\t**** 0-**退出操作页面******\n");

    printf("\t******************************************\n");
}
//集合AB元素的填充
void input(int x, int y)
{
    int i, j;
    printf("请输入A中元素:\n");
    for (i = 0; i < x; i++)
    {
        scanf("%d", &a[i]);
        getchar();
        for (j = 0; j < i; j++)
        {
            if (a[i] == a[j])
            {
                printf("出现重复元素");
                a[i] = 0;
            }
        }
    }
    printf("请输入B中元素:\n");
    for (i = 0; i < y; i++)
    {
        scanf("%d", &b[i]);
        getchar();
        for (j = 0; j < i; j++)
        {
            if (b[i] == b[j])
            {
                printf("出现重复元素");
                b[i] = 0;
            }
        }
    }
}
//集合A,B的交集
int Mixed(int x, int y)
{
    int i, j, k = 0;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            if (a[i] == b[j])
            {                //检测AB集合之间的相同元素
                c[k] = a[i]; //将相同的元素给空集合保存
                k++;         //统计c集合中的总个数
            }
        }
    }
    printf("A∩B={");
    for (i = 0; i < k - 1; i++)
    { //k-1作用:预留一个位置
        printf(" %d,", c[i]);
    }
    printf(" %d}\n", c[k - 1]); //输出最后一个元素并附上 }
    getchar();
}
//集合A,B的并集
int Union(int x, int y)
{

    int i, j, k = 0, m = 0, n;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            if (a[i] == b[j])
            {                //检测AB集合之间的相同元素
                c[k] = a[i]; //将相同的元素给空集合保存
                k++;         //统计c集合中的总个数
            }
        }
    }
    for (i = 0; i < x; i++)
    { //将A集合元素放在com集合中
        com[m] = a[i];
        m++;
    }
    for (i = 0; i < y; i++)
    { //将B集合元素放在com集合中
        com[m] = b[i];
        m++;
    }

    for (i = 0; i < x + y - k; i++)
    { //x+y-k为A,B集合所有元素去掉相同元素的总数
        for (j = i + 1; j < m; j++)
        { //
            if (com[j] == com[i])
            {
                for (n = j; n < m; n++)
                {
                    com[n] = com[n + 1];
                }
                break;
            }
        }
    }
    printf("AUB={");
    for (i = 0; i < x + y - k - 1; i++)
    {
        printf(" %d,", com[i]);
    }
    printf(" %d}\n", com[x + y - k - 1]);
    getchar();
}
//集合A,B的差运算
int Difference(int x, int y)
{
    int i, j, k = 0;
    int m;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            if (a[i] == b[j])
            {
                c[k] = a[i];
                k++;
            }
        }
    } //以上为交集部分,得出A,B集合中相同元素的总数

    for (i = 0; i < x; i++)
    { //将A集合元素放在D集合中
        d[i] = a[i];
    }
    for (i = 0; i < x - k; i++)
    { //去掉相同元素的个数,进行循环
        for (j = 0; j < k; j++)
        {
            if (d[i] == c[j]) //用D集合中的元素与A,B的交集集合C比较元素
            {
                for (m = i; m < x; m++)
                { //如果D集合中第i各元素与集合C相同,则i后的元素前移一位
                    d[m] = d[m + 1];
                }
                i--;
                break;
            }
        }
    }

    printf("A-B={");
    for (i = 0; i < x - k - 1; i++)
    {
        printf(" %d,", d[i]); //输出差集
    }
    printf(" %d}\n", d[x - k - 1]); //附上 }
    getchar();
}
//集合E的填充
void inputE(int elngth)
{
    int i, j;
    printf("请输入E中元素:\n");
    for (i = 0; i < elngth; i++)
    {
        scanf("%d", &e[i]);
        getchar();
        for (j = 0; j < i; j++)
        {
            if (e[i] == e[j])
            {
                printf("出现重复元素");
                e[i] = 0;
            }
        }
    }
}
//集合A的补集E
int Left(int x, int elength)
{  //与差集相同

    if (elength < x)
    {
        printf("E元素数应大于A中元素数\n");
        return 0;
    }
    int i, j, k = 0, m = 0;
    for (i = 0; i < elength; i++)
    {
        for (j = 0; j < x; j++)
        {
            if (e[i] == a[j])
            {
                temp1[k] = e[i];
                k++;
            }
        }
    }
    for (i = 0; i < elength; i++)
    {
        temp[i] = e[i];
    }

    for (i = 0; i < elength - k; i++)//去掉相同元素的个数,进行循环
    { 
        for (j = 0; j < k; j++)
        {
            if (temp[i] == temp1[j]) //用E集合中的元素与A,E的交集比较元素
            {
                for (m = i; m < elength; m++)
                { 
                    temp[m] = temp[m + 1];
                }
                i--;
                break;
            }
        }
    }
    printf("CeA={");
    for (i = 0; i < elength - k - 1; i++)
    {
        printf(" %d,", temp[i]); //输出补集
    }
    printf(" %d}\n", temp[elength - k - 1]); //附上 }
    //getchar();
}
//主函数
int main()
{
    int x, y, elngth, choice;
    while (1)
    {
        show();
        printf("请输入操作数字:\n");
        scanf("%d", &choice);
        if (choice == 0)
        {
            printf("退出操作页面\n");
            return 0;
        }

        else
        {
            switch (choice)
            {
            case 1:
                printf("请输入A,B集合元素数\n");
                scanf("%d %d", &x, &y);
                input(x, y);
                printf("请按回车继续!\n");
                getchar();
                break;
            case 2:
                Mixed(x, y);
                printf("请按回车继续!\n");
                getchar();
                break;
            case 3:
                Union(x, y);
                printf("请按回车继续!\n");
                getchar();
                break;
            case 4:
                Difference(x, y);
                printf("请按回车继续!\n");
                getchar();
                break;
            case 5:
                printf("A集合的长度:%d\n", x);
                printf("请输入集合E元素数:\n");
                scanf("%d", &elngth);
                inputE(elngth);
                Left(x, elngth);
                printf("请按回车继续!\n");
                getchar();
                break;
            default:
                break;
            }
        }
    }
}

假设集合 A 和 B 分别用数组 a 和 b 表示,数组长度分别为 n 和 m。下面是 C 语言求解两个集合交集并集差集和环集的代码示例: 1. 交集 交集是指包含在集合 A 和集合 B 中的相同元素。可以通过遍历 a 和 b 数组,将它们中相同的元素添加到结果数组中即可。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i] == b[j]) { result[count++] = a[i]; break; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 2. 并集 并集是指包含在集合 A 或集合 B 中的所有元素。可以将 a 和 b 数组中的元素全部添加到结果数组中,最后去重即可。 ``` int result[200]; int count = 0; // 将 a 数组中的元素添加到结果数组中 for (int i = 0; i < n; i++) { result[count++] = a[i]; } // 将 b 数组中的元素添加到结果数组中 for (int i = 0; i < m; i++) { result[count++] = b[i]; } // 去重 for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { if (result[i] == result[j]) { // 将重复的元素删除 for (int k = j; k < count - 1; k++) { result[k] = result[k + 1]; } count--; j--; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 3. 差集 差集是指包含在集合 A 中但不在集合 B 中的元素。可以遍历 a 数组,将不在 b 数组中的元素添加到结果数组中。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { int flag = 1; for (int j = 0; j < m; j++) { if (a[i] == b[j]) { flag = 0; break; } } if (flag == 1) { result[count++] = a[i]; } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 4. 环集 环集是指同时属于集合 A 和集合 B 的元素。可以遍历 a 数组,将同时存在于 a 和 b 数组中的元素添加到结果数组中。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i] == b[j]) { result[count++] = a[i]; break; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 以上就是 C 语言求解两个集合交集并集差集和环集的代码示例,希望能够对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LCH南安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值