C++创建一个IntegerSet(整数集)类

【问题描述】


  • 创建类IntegerSet,它的每个对象可以存储0到100范围内的整数。集合在内部表示为0和1的数组。如果整数这个集合内,则数组元素a[i]是1。如果整数j不在这个集合内,则元素a[j]为0。默认的构造函数将集合初始化为所谓的“空集合”,即其数组表示中所有元素都是0的集合。
  • 提供常用集合操作的成员函数。例如,提供unionOfSets成员函数,它生成第三个集合,这个集合是两个现有集合论上的并集(即,如果两个现有集合中只要有一个集合的元素为1,第三个集合中的数组元素设置为1;如果在两个集合中的元素都为0,则第三个集合中的数组元素设置为0)。
  • 提供intersectionOfSets成员函数,该函数生成第三个集合,是两个现有集合论上的交集(即,如果两个现有集合中只要有一个集合的元素为0,则第三个集合中的数组元素设置为0,如果在两个集合中的两个元素都为1,第三个集合中的数组元素设置为1)。
  • 提供insertElement成员函数,它把一个新整数k插入到集合中(通过将a[k]设置为1)。
  • 提供deleteElement 成员函数,它删除整数m(将a[m]设为0)。
  • 提供printSet成员函数,它把集合打印为用空格隔开的数字列表。只打印集合中出现的元素(即,在数组对应位置上值为1的元素)。对于空集,则打印“ ”。
  • 提供isEqualTo 函数,判定两个集合是否相等。
  • 提供另一个设置函数,它接受一个整数的数组以及该数组的大小,并使用该数组初始化集合对象。
  • 现在编写一个驱动程序测试你的IntegerSet类。实例化几个IntegerSet对象并且测试你的所有成员函数是否工作正常。

在上面的问题描述中,已经把程序的结构以及内容说的很清楚了,所以下面我们将按照题目描述来编写程序

  1. 先编写出IntegerSet类的主要框架(成员函数,数据成员)。
    class IntegerSet
    {
    public:
    	IntegerSet();
    	void Set1(int array1_[],int end1);
    	void Set2(int array2_[],int end2);
    	void unionOfSets();    		//求并集 
    	void intersectionOfSets();	//求交集 
    	void insertElement(int);     				//插入 
    	void deleteElement(int);	 			    //删除 
    	void printSet(int);		  					//打印 
    	void isEqualTo();		  					//判断是否相等 
    private:
    	int array1[100];//可以存储0~100的整数,内部表示为0或1 
    	int array2[100];
    	int num; 
    }; 
  2. 无参构造函数:将集合初始化为所谓的“空集合”。
    IntegerSet::IntegerSet()
    {
    	for(int i=0;i<100;i++)
    	{
    		array1[i]=0;
    		array2[i]=0;
    	}
    	
    }
  3. 另一个设置函数,接受一个整数的数组以及该数组的大小,并使用该数组初始化集合对象。
    void IntegerSet::Set1(int array1_[],int end1) 
    {
    	for(int i=0;i<end1;i++)
    	{
    		for(int k=0;k<100;k++)
    		{
    			if(array1_[i]==k)
    			{
    				array1[k]=1;
    			}	
    		}	
    	}
    }
    void IntegerSet::Set2(int array2_[],int end2) 
    {
    	for(int i=0;i<end2;i++)
    	{
    		for(int k=0;k<100;k++)
    		{
    			if(array2_[i]==k)
    			{
    				array2[k]=1;
    			}
    		}	
    	}
    }
  4.  unionOfSets成员函数,求并集。
    void IntegerSet::unionOfSets()//两个现有集合的并集,两个集合只要一个为1就1,都为0才为0 
    {
    	int array3[100];
    	cout<<"两集合的并集为 :"<<endl; 
    	for(int i=0;i<100;i++)
    	{
    		if(array1[i]==1||array2[i]==1)
    		{
    			array3[i]=1;
    		}
    		else 
    		{
    			array3[i]=0;
    		}
    	}
    	for(int k=0;k<100;k++)
    	{
    		if(array3[k]==1)
    		{
    			cout<<k<<" ";
    		}	
    	}
    	
    }
  5. intersectionOfSets成员函数,求交集。
    void IntegerSet::intersectionOfSets() //交集 ,只要有一个集合的元素为0就0,都为1才为1 
    {
    	int array3[100];
    	cout<<endl;
    	cout<<"两集合的交集为 :"<<endl; 
    	for(int i=0;i<100;i++)
    	{
    		if(array1[i]==0||array2[i]==0)
    		{
    			array3[i]=0;
    		}
    		else
    		{
    			array3[i]=1;
    		}
    	}
    	for(int k=0;k<100;k++)
    	{
    		if(array3[k]==1)
    		{
    			cout<<k<<" ";
    		}	
    	}
    	cout<<endl;
    }
    
  6. insertElement成员函数,插入一个数。
    void IntegerSet::insertElement(int newNumber) //插入一个新整数 
    {
    	for(int i=0;i<100;i++)
    	{
    		if(newNumber==i)
    		{
    			array1[i]=1;
    			array2[i]=1;
    		}
    	}
    }
  7. deleteElement 成员函数,删除一个数。
    void IntegerSet::deleteElement(int newNumber)//删除一个整数 
    {
    	for(int i=0;i<100;i++)
    	{
    		if(newNumber==i)
    		{
    			array1[i]=0;
    			array2[i]=0;
    		}
    	}
    }
  8.  printSet成员函数,打印数字列表。
    void IntegerSet::printSet(int sort)
    {
    	if(sort==1)
    	{	
    		cout<<"集合1为:"; 
    		for(int i=0;i<100;i++)
    		{
    			if(array1[i]==1)
    			{
    				cout<<i<<" ";
    			}
    		}
    	}
    	else
    	{
    		cout<<"集合2为:";
    		for(int k=0;k<100;k++)
    		{
    			if(array2[k]==1)
    			{
    				cout<<k<<" ";
    			}
    		}
    	}
    }
    

  9. isEqualTo 函数,判定两个集合是否相等。
    void IntegerSet::isEqualTo()
    {
    	int flag=1; 
    	for(int i=0;i<100;i++)
    	{
    		if(array1[i]==array2[i]==1)
    		{
    			flag=1;
    		}
    		else
    		{
    			flag=0;
    		}
    	}
    	if(flag)
    	{
    		cout<<"两集合相等!"<<endl; 
    	}
    	else
    	{
    		cout<<"两集合不相等!"<<endl; 
    	} 
    }
  10. 编写一个驱动程序测试你的IntegerSet类。
    int main()
    {	
    	int array1[]={-10,0,5,9,23,26,45,65,88,105,120};
    	int array2[]={-5,-2,5,8,9,23,28,65,88,99,132};
    	int end1=sizeof(array1)/sizeof(array1[0]);
    	int end2=sizeof(array2)/sizeof(array2[0]);
    	IntegerSet text1;
    	text1.Set1(array1,end1);
    	text1.Set2(array2,end2);
    	text1.printSet(1); 
    	cout<<endl;
    	text1.printSet(2); 
    	cout<<endl;
    	text1.unionOfSets() ;
    	text1.intersectionOfSets() ; 
    	int number1;
    	cout<<"请输入你想插入的数 :"<<endl;
    	cin>>number1;
    	text1.insertElement(number1); 
    	int number2;
    	cout<<"请输入你想删除的数 :"<<endl;
    	cin>>number2;
    	text1.deleteElement(number2) ;
    	text1.printSet(1); 
    	cout<<endl;	
    	text1.printSet(2); 
    	cout<<endl;
    	text1.isEqualTo();
    	return 0;	
    } 

完整代码如下: 

//
//创建IntegerSet(整数集)类 
//
#include<iostream>
using namespace std;
class IntegerSet
{
public:
	IntegerSet();
	void Set1(int array1_[],int end1);
	void Set2(int array2_[],int end2);
	void unionOfSets();    		//求并集 
	void intersectionOfSets();	//求交集 
	void insertElement(int);     				//插入 
	void deleteElement(int);	 			    //删除 
	void printSet(int);		  					//打印 
	void isEqualTo();		  					//判断是否相等 
private:
	int array1[100];//可以存储0~100的整数,内部表示为0或1 
	int array2[100];
	int num; 
}; 
IntegerSet::IntegerSet()
{
	for(int i=0;i<100;i++)
	{
		array1[i]=0;
		array2[i]=0;
	}
	
}
void IntegerSet::Set1(int array1_[],int end1) 
{
	for(int i=0;i<end1;i++)
	{
		for(int k=0;k<100;k++)
		{
			if(array1_[i]==k)
			{
				array1[k]=1;
			}	
		}	
	}
}
void IntegerSet::Set2(int array2_[],int end2) 
{
	for(int i=0;i<end2;i++)
	{
		for(int k=0;k<100;k++)
		{
			if(array2_[i]==k)
			{
				array2[k]=1;
			}
		}	
	}
}

void IntegerSet::unionOfSets()//两个现有集合的并集,两个集合只要一个为1就1,都为0才为0 
{
	int array3[100];
	cout<<"两集合的并集为 :"<<endl; 
	for(int i=0;i<100;i++)
	{
		if(array1[i]==1||array2[i]==1)
		{
			array3[i]=1;
		}
		else 
		{
			array3[i]=0;
		}
	}
	for(int k=0;k<100;k++)
	{
		if(array3[k]==1)
		{
			cout<<k<<" ";
		}	
	}
	
}
void IntegerSet::intersectionOfSets() //交集 ,只要有一个集合的元素为0就0,都为1才为1 
{
	int array3[100];
	cout<<endl;
	cout<<"两集合的交集为 :"<<endl; 
	for(int i=0;i<100;i++)
	{
		if(array1[i]==0||array2[i]==0)
		{
			array3[i]=0;
		}
		else
		{
			array3[i]=1;
		}
	}
	for(int k=0;k<100;k++)
	{
		if(array3[k]==1)
		{
			cout<<k<<" ";
		}	
	}
	cout<<endl;
}
void IntegerSet::insertElement(int newNumber) //插入一个新整数 
{
	for(int i=0;i<100;i++)
	{
		if(newNumber==i)
		{
			array1[i]=1;
			array2[i]=1;
		}
	}
}
void IntegerSet::deleteElement(int newNumber)//删除一个整数 
{
	for(int i=0;i<100;i++)
	{
		if(newNumber==i)
		{
			array1[i]=0;
			array2[i]=0;
		}
	}
}
void IntegerSet::printSet(int sort)
{
	if(sort==1)
	{	
		cout<<"集合1为:"; 
		for(int i=0;i<100;i++)
		{
			if(array1[i]==1)
			{
				cout<<i<<" ";
			}
		}
	}
	else
	{
		cout<<"集合2为:";
		for(int k=0;k<100;k++)
		{
			if(array2[k]==1)
			{
				cout<<k<<" ";
			}
		}
	}
}
void IntegerSet::isEqualTo()
{
	int flag=1; 
	for(int i=0;i<100;i++)
	{
		if(array1[i]==array2[i]==1)
		{
			flag=1;
		}
		else
		{
			flag=0;
		}
	}
	if(flag)
	{
		cout<<"两集合相等!"<<endl; 
	}
	else
	{
		cout<<"两集合不相等!"<<endl; 
	} 
}
int main()
{	
	int array1[]={-10,0,5,9,23,26,45,65,88,105,120};
	int array2[]={-5,-2,5,8,9,23,28,65,88,99,132};
	int end1=sizeof(array1)/sizeof(array1[0]);
	int end2=sizeof(array2)/sizeof(array2[0]);
	IntegerSet text1;
	text1.Set1(array1,end1);
	text1.Set2(array2,end2);
	text1.printSet(1); 
	cout<<endl;
	text1.printSet(2); 
	cout<<endl;
	text1.unionOfSets() ;
	text1.intersectionOfSets() ; 
	int number1;
	cout<<"请输入你想插入的数 :"<<endl;
	cin>>number1;
	text1.insertElement(number1); 
	int number2;
	cout<<"请输入你想删除的数 :"<<endl;
	cin>>number2;
	text1.deleteElement(number2) ;
	text1.printSet(1); 
	cout<<endl;	
	text1.printSet(2); 
	cout<<endl;
	text1.isEqualTo();
	return 0;	
} 

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
将这段 C++ 代码翻译为 Java 代码如下: ``` import java.io.*; import java.util.*; public class Main { static class Node { double r, c; int j, next; Node(int j, double r, double c, int next) { this.j = j; this.r = r; this.c = c; this.next = next; } } static final int INF = 0x3f3f3f3f; static final int N = 106; static int[] head = new int[N]; static int I; static Node[] side = new Node[N * 2]; static double[] dist = new double[N]; static void add(int i, int j, double r, double c) { side[I] = new Node(j, r, c, head[i]); head[i] = I++; } static boolean spfa(int s, double k, int n) { int[] num = new int[N]; boolean[] in = new boolean[N]; Arrays.fill(num, 0); Arrays.fill(in, false); Queue<Integer> qt = new LinkedList<>(); for (int i = 1; i <= n; ++i) { dist[i] = 0.0; } dist[s] = k; qt.offer(s); num[s] = 1; while (!qt.isEmpty()) { int x = qt.poll(); in[x] = false; if (x == s && dist[x] > k) { return true; } for (int t = head[x]; t != -1; t = side[t].next) { int j = side[t].j; if (dist[j] < (dist[x] - side[t].c) * side[t].r) { dist[j] = (dist[x] - side[t].c) * side[t].r; while (!in[j]) { ++num[j]; if (num[j] >= n) { return true; } in[j] = true; qt.offer(j); } } } } return false; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n, m, s; double k; while (scanner.hasNext()) { n = scanner.nextInt(); m = scanner.nextInt(); s = scanner.nextInt(); k = scanner.nextDouble(); Arrays.fill(head, -1); I = 0; while (m-- > 0) { int a = scanner.nextInt(); int b = scanner.nextInt(); double rab = scanner.nextDouble(); double cab = scanner.nextDouble(); double rba = scanner.nextDouble(); double cba = scanner.nextDouble(); add(a, b, rab, cab); add(b, a, rba, cba); } if (spfa(s, k, n)) { System.out.println("YES"); } else { System.out.println("NO"); } } scanner.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值