首页 > 其他分享 >离散数学_集合运算_容器实现

离散数学_集合运算_容器实现

时间:2024-05-12 14:53:42浏览次数:21  
标签:容器 end 运算 mi 离散数学 vector && input cout

define _CRT_SECURE_NO_WARNINGS 1

/*
1.求任意两个集合的交集、并集、差集
2.求任意一个集合的幂集
3.求任意一个集合的 m 元子集
*/

include

include

include

include

using namespace std;

//检验一个元素是否已经存在于集合中
bool existed(vectors,char a)
{
bool exist = false;

for (auto i = s.begin(); i != s.end();i++)
{
	if (*i == a)
	{
		exist = true;
	}
}

return exist;

}

//输入两个集合,用字符串存储它们的元素
vector input()
{
vectors1;
char in = '\0';
while (in != '\n')
{
scanf("%c", &in);
if (in != ' ' && in != '{' && in != '}' && in != ','
&& ((int)in >= 97 && (int)in <= 122 || (int)in >= 65 && (int)in <= 90))
{
if (existed(s1, in) == false)//集合中元素不能重复
{
s1.push_back(in);
}
}
}
return s1;
}

//交集
vector jiaoji(vectors1, vectors2)
{
vector jiao;

for (auto i = s1.begin(); i != s1.end(); i++)
{
	for (auto j = s2.begin(); j != s2.end(); j++)
	{
		if (*i == *j)
		{
			jiao.push_back(*i);
		}
	}
}
return jiao;

}

//(去重),求并集
vector bingji(vectors1, vectors2)
{
vector bing = s2;//以s2为副本插入
bool exist = false;

for (auto i = s1.begin(); i != s1.end(); i++)
{
	if (existed(s2, *i) == false)
	{
		bing.push_back(*i);
	}
}
return bing;

}

//差集
vector chaji(vectors1, vectors2)
{
vector cha = s1;

for (auto i = s2.begin(); i != s2.end(); i++)
{
	if (existed(cha, *i) == true)
	{
		auto it = find(cha.begin(), cha.end(), *i);//找到s1中与s2相同的元素 *i 的位置
		if (it != cha.end())
		{
			cha.erase(it);
		}
	}
}

return cha;

}

//幂集
vector<vector> miji(vectors)
{
vector<vector> mi;
int col = s.size();
int row = pow(2, col);

for (int i = 0; i < row; i++)
{
	vector<char> submit;
	for (int j = 0; j < col; j++)
	{
		if (i & (1 << j))//【最核心的代码】
		{
			submit.push_back(s[j]);
		}
	}
	mi.push_back(submit);
}

return mi;

}

//打印普通集合
void show(vector s)
{
sort(s.begin(), s.end());//集合排序
cout << '{';
for (auto i = s.begin(); i != s.end(); i++)
{
cout << i;
if (i != s.end() - 1)
{
cout << ',';
}
}
cout << '}' << endl;
}
// 打印幂集
void show_mi(vector<vector> mi)
{
cout << "{ ";
for (auto i = mi.begin(); i != mi.end(); i++) {
cout << "{ ";
for (auto j = (
i).begin(); j != (i).end(); j++) {
if (next(j) == (
i).end())
{
cout << *j;//末尾不加“,”
}
else
{
cout << *j << ",";
}
}
if (next(i) == mi.end())
{
cout << " }";
}
else
{
cout << " }, ";
}
}
cout << " }" << std::endl;
}
//重载打印幂集的m元子集
void show_mi(vector<vector> mi, int n)
{
vector<vector>mi_m;
bool success = false;

for (auto i = mi.begin(); i != mi.end(); i++)//把元素个数符合要求的都推进 mi_m 中
{
	if ((*i).size() == n)
	{
		mi_m.push_back(*i);
		success = true;
	}
}

if (success == true)//用迭代器输出元素
{
	cout << "{ ";
	for (auto i = mi_m.begin(); i != mi_m.end(); i++) {
		cout << "{";
		for (auto j = (*i).begin(); j != (*i).end(); j++)
		{
			if (next(j) == (*i).end())//避免在最后一个位置打印 “,”
			{
				cout << *j;
			}
			else
			{
				cout << *j << ",";
			}
		}
		if (next(i) == mi_m.end())
		{
			cout << "}";
		}
		else
		{
			cout << "},";
		}
	}
	cout << " }" << std::endl;
}
else
{
	cout << "该集合没有 " +to_string(n) + " 元子集";
}

}

//选择运算方式
void choice(char fuhao, vectorinput_1, vectorinput_2)
{
vector jiao = jiaoji(input_1, input_2);
vector bing = bingji(input_1, input_2);
vector cha_1 = chaji(input_1, input_2);
vector cha_2 = chaji(input_2, input_1);
vector<vector> mi_1 = miji(input_1);
vector<vector> mi_2 = miji(input_2);
char xuanze = '\0';
bool done = true;

switch (fuhao)
{
case'&':
	cout << "******************************" << endl;
	cout << "交集= ";show(jiao);
	cout << "******************************" << endl;
	break;
case'|':
	cout << "******************************" << endl;
	cout << "并集= ";show(bing);
	cout << "******************************" << endl;
	break;
case'-':
	while (done)
	{
		cout << "集合(1) - 集合(2)请输入 1,集合(2) - 集合(1)请输入 2" << endl;
		cin >> xuanze;
		if (xuanze == '1')
		{
			cout << "******************************" << endl;
			cout << "集合(1) - 集合(2)= ";show(cha_1);
			cout << "******************************" << endl;
			done = false;
		}
		else if (xuanze == '2')
		{
			cout << "******************************" << endl;
			cout << "集合(2) - 集合(1)= ";show(cha_2);
			cout << "******************************" << endl;
			done = false;
		}
		else
		{
			cout << "请重新输入:" << endl;
		}
	}
	break;
case'm':
	while (done)
	{
		cout << "求集合(1)的幂集请输入 1,求集合(2)的幂集请输入 2" << endl;
		cin >> xuanze;
		if (xuanze == '1')
		{
			cout << "******************************" << endl;
			cout << "集合(1)的幂集= ";show_mi(mi_1);
			cout << "******************************" << endl;
			done = false;
		}
		else if (xuanze == '2')
		{
			cout << "******************************" << endl;
			cout << "集合(2)的幂集= ";show_mi(mi_2);
			cout << "******************************" << endl;
			done = false;
		}
		else
		{
			cout << "请重新输入:" << endl;
		}
	}
	break;
case'n':
	while (done)
	{
		int m_yuan = 0;
		int len_1 = input_1.size();
		int len_2 = input_2.size();
		bool shuru = true;
		cout << "求集合(1)的幂集请输入 1,求集合(2)的幂集请输入 2" << endl;
		cin >> xuanze;
		if (xuanze == '1')
		{
			while (shuru)
			{
				cout << "您选择的是集合(1),请输入所求集合元素的个数:" << endl;
				cout << "元素个数应该在 0 到 " + to_string(len_1) + " 的范围内。" << endl;
				cin >> m_yuan;
				if (m_yuan >= 0 && m_yuan <= len_1)
				{
					cout << "******************************" << endl;
					cout << "集合(1)的幂集= ";show_mi(mi_1,m_yuan);
					cout << "******************************" << endl;
					shuru = false;
				}
				else
				{
					cout << "元素个数不在正确范围内,请重新输入\n" << endl;
				}
			}
			
			done = false;
		}
		else if (xuanze == '2')
		{
			while (shuru)
			{
				cout << "您选择的是集合(2),请输入所求集合元素的个数:" << endl;
				cout << "元素个数应该在 0 到 " + to_string(len_2) + " 的范围内。" << endl;
				cin >> m_yuan;
				if (m_yuan >= 0 && m_yuan <= len_2)
				{
					cout << "******************************" << endl;
					cout << "集合(1)的幂集= ";show_mi(mi_2, m_yuan);
					cout << "******************************" << endl;
					shuru = false;
				}
				else
				{
					cout << "元素个数不在正确范围内,请重新输入" << endl;
				}
			}

			done = false;
		}
		else
		{
			cout << "请重新输入:" << endl;
		}
	}
	break;
case'A':
	cout << "******************************" << endl;
	cout << "交集= ";show(jiao);
	cout << "并集= ";show(bing);
	cout << "集合(1) - 集合(2)= ";show(cha_1);
	cout << "集合(2) - 集合(1) = ";show(cha_2);
	cout << "集合(1)的幂集= ";show_mi(mi_1);
	cout << "集合(2)的幂集= ";show_mi(mi_2);
	cout << "******************************" << endl;
	break;
}

}

int main(void)
{
cout << "请输入集合 1 中的元素,以回车结束(仅支持单个字符):" << endl;
vector input_1 = input();
cout << "请输入集合 2 中的元素,以回车结束(仅支持单个字符):" << endl;
vector input_2 = input();

char fuhao = '\0';
while (fuhao != 'q')
{
	cout << "******************************" << endl;
	cout << "******** & 代表交运算*********" << endl;
	cout << "******** | 代表并运算*********" << endl;
	cout << "******** - 代表差运算*********" << endl;
	cout << "******** m 代表求幂集*********" << endl;
	cout << "**** n 代表求幂集的m元子集****" << endl;
	cout << "******** A 代表输出所有*******" << endl;
	cout << "******** q 代表退出运算*******" << endl;
	cout << "******************************" << endl;
	cout << "请输入运算符号(输入 q 退出):" << endl;
	cin >> fuhao;

	if (fuhao != 'q' && fuhao != '&' && fuhao != '|' && fuhao != '-' && fuhao != 'A' && fuhao != 'm' && fuhao != 'n')
	{
		cout << "\n请输入正确的符号" << endl;
	}
	else
	{
		choice(fuhao, input_1, input_2);
		cout << endl;
	}
	system("pause");
}

return 0;

}

标签:容器,end,运算,mi,离散数学,vector,&&,input,cout
From: https://www.cnblogs.com/Autumnker/p/18187820

相关文章

  • set 容器详解 附大根堆题解
    声明本文中题解部分内容大部分转载自@sonnety的这篇博客中,本文为为方便复习而写的结论类文章,读者可自行跳转至原文处阅读。PART1set什么是set——来源cppreference简言之,它就是一种存进去就可以自动按升序排列的特殊容器,通常的set还具有自动去重的功能。定义方......
  • Docker容器定时备份MySQL数据库
    1.系统环境mysql8、centos7.92.创建mysql_backup.sh文件#!/bin/bash#获取容器idcontainer_id=`/usr/bin/dockerps-aqf"name=mysql-8.0"`echo"mysql的镜像IDis$container_id"#登录用户名mysql_user="xxx"#登录密码(注意如果密码包含特殊符号前面要用'......
  • Docker容器与守护进程运维 --项目四
    一、Docker容器配置进阶 1、容器的自动重启Docker提供重启策略控制容器退出时或Docker重启时是否自动启动该容器。容器默认不支持自动重启,要使用 --restart 选项指定重启策略。作用:容器自动重启;重启策略能够确保关联的多个容器按照正确的顺序启动。容器重启选项值:重启......
  • C#.Net筑基-运算符Family
    C#运算符内置了丰富的运算符操作类型,使用方便,极大的简化了编码,同时还支持多种运算符重载机制,让自定义的类型也能支持运算符行为。01、运算符概览运算符分类描述数学运算基础的加减乘除,及++、--赋值运算=,及各种复合赋值op=,x+=20;等效于x=x+20;比较运算比较......
  • [转帖]Java程序在K8S容器部署CPU和Memory资源限制相关设置
    https://developer.aliyun.com/article/700701  简介: 背景在k8sdocker环境中执行Java程序,因为我们设置了cpu,memory的limit,所以Java程序执行时JVM的参数没有跟我们设置的参数关联,导致JVM感知到的cpu和memory是我们k8s的worknode上的cpu和memory大小。背景在......
  • 关于远程开发容器一点思考
    最近很多大公司,都布局了云开发。githubcodespacesgitpodjetbrainsspacesgooglecolabReplit  个人思考===========================它们底层全部是基于Linux的docker容器(除了colab),只是尽可能看起来像虚拟机。好处: 环境统一,好迁移,开发方便缺点有很多:1. 价格......
  • 第 1 节 向量及其线性运算
    第一节向量及其线性运算一、向量的概念向量:既有大小,又有方向的量自由向量:与起点无关的向量向量的大小叫做向量的模.向量\(\vec{AB}\),a和\(\vec{a}\)的模依次记作\(|\vec{AB}|\),|a|和\(|\vec{a}|\).模等于1的向量叫做单位向量.模等于零的向量叫做零向量,记作0......
  • 【C语言】---- 三目运算符
    C语言中的三目运算符是一种简化版的条件语句,它允许您在一行代码中编写ifelse语句。三目运算符的语法如下:condition?expression1:expression2;如果condition为真,则表达式expression1被求值并作为整个表达式的结果;如果condition为假,则表达式expression2被求值并作为整个表达......
  • 从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离
    本文为从零开始写Docker系列第十四篇,实现容器间的rootfs隔离,使得多个容器间互不影响。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心原理:Namespace、Cgroups和Rootfs基于n......
  • GEE C25 高级矢量运算
    主要内容介绍GEE中可视化和处理矢量的高级技巧。 1、可视化要素集;一、可视化要素集1.可使用的函数Map.addLayer:draw:paint:style:2.创建等值线图ChoroplethMapvarblocks=ee.FeatureCollection('TIGER/2010/Blocks');varroads=ee.FeatureCollection('TIGER/2......