数据结构 实验1 集合的交并差

这篇博客介绍了如何通过C语言实现数据结构中的集合交、并、差运算。实验目的是复习C语言基础和数组/链表操作,要求输入两个无重复元素的集合,输出它们的交集、并集和差集。程序设计包括输入检查、函数实现及菜单驱动的交互式界面,验收测试着重于元素重复情况的处理。

(1)实验目的

通过该实验,让学生复习巩固C语言中的循环结构、循环控制条件、分支结构和数组/链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。

(2)实验内容

通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。

(3)实验要求

从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组也可以用链表存储。
实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。
使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:
1—输入集合A和B
2—求集合A交B
3—求集合A并B
4—求集合A-B
退出,输入一个负数!

(4)验收/测试用例

输入: A={1,2,3,4,5} B={3,4,5,6,7}
要注意输入的过程中,每输入一个元素都要检查输入的这个元素是否和前面的元素重复,如果重复,要求用户重新输入当前元素。
验收测试时要测试这种重复的情况。
输出 A交B={3, 4, 5} A并B={1,2,3,4,5,6,7} A-B={1, 2}

运行环境

Dev C++

主要代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int m = 0;
int n = 0;
int a[99];
int b[99];
int jiao(){
	cout << "集合A交B为:" << endl;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (a[i] == b[j]) {
				cout << a[i];
			}
		}
	}
	cout<<endl;
}
int bing() {
	int x=0;
	cout << "集合A并B为:" << endl;
	for (int i = 0; i < m; i++) {
		cout << a[i];
	}
	for (int j = 0; j < n; ++j) {
		for (int i = 0; i < m; ++i) {
		    if (b[j]!=a[i]) {
			    ++x;
		    }
		}
		if(x==m){
		    cout<<b[j];
		}
		x=0;
	}
	cout<<endl; 
}
int cha() {
	int x=0;
	cout << "集合A差B为:" << endl;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (a[i] != b[j]) {
				x++; 
			}
		}
		if(x==n){
		    cout<<a[i];  
	    }
	    x=0;
	}
	cout<<endl;
}
int inputa() {
	int num;
	cout << "请输入集合A,以负号作为结束输入的标志" << endl;
	while (cin >> num > 0 && getchar() != '\n') {
		m++;
		if (m == 1) {
			a[m - 1] = num;
		}else {
			for (int y = 0; y <= m - 2; y++) {
				if (num != a[y]) {
					a[m - 1] = num;
				}else{
					cout << "您输入的集合A含有重复的元素,请重新输入" << endl;
					m = 0;
					inputa();
				}
			}
		}
	}
}
int inputb() {
	int num;
	cout << "请输入集合B,以负号作为结束输入的标志" << endl;
	while (cin >> num > 0 && getchar() != '\n') {
		n++;
		if (n == 1) {
			b[n - 1] = num;
		}
		else {
			for (int y = 0; y <=n - 2; y++) {
				if (num != a[y]) {
					b[n - 1] = num;
				}
				else {
					cout << "您输入的集合B含有重复的元素,请重新输入" << endl;
					m = 0;
					inputb();
				}
			}
		}
	}
}
int main() {
	int p = 1;
	while (p) {
		int x;
		cout << "1---输入集合A和B" << endl;
		cout << "2---求集合A交B" << endl;
		cout << "3---求集合A并B" << endl;
		cout << "4---求集合A-B" << endl;
		cout << "退出,输入一个负数!" << endl;
		cout << "请输入指令" << endl;
		cin >> x;
		switch (x) {
		case 1:
			system("cls");//清屏
			cout << "输入集合A和B" << endl;
			inputa();
			inputb();
			break;
		case 2:
			system("cls");
			cout << "求集合A交B" << endl;
			jiao();
			break;
		case 3:
			system("cls");
			cout << "求集合A并B" << endl;
			bing();
			break;
		case 4:
			system("cls");
			cout << "求集合A差B" << endl;
			cha();
			break;
		default:
			system("cls");
			if (x < 0) {
				p = 0;
				cout << "程序退出成功" << endl;
			}
			else {
				cout << "您输入的指令有误,请重新输入" << endl;
			}
		}
	}
}



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值