(1)实验目的
通过该实验,让学生复习巩固C语言中的分支结构、循环结构、数组、链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。
(2)实验内容
通过键盘,分别输入集合A和B中的数据元素,要求数据元素类型为整数类型,输出两个集合的交、并、差。
(3)实验要求
a)从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组存储,也可以用链表存储。
b)实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。
c)使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:
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}
一、设计思想 首先,先定义了所需的A,B两个数组,全局变量,声明了所用到的交并差函数;其次定义主函数main,通过两个菜单来实现利用数字进行函数调用;又用Switch case调用交并差函数;然后,先编写输入enter函数,输入A,B两个数组,再分别编写交并差函数。 交,通过对比两个集合数组内的元素来发现相同的元素,然后输出全部相同的元素。先将A中第一个元素与B中所有元素对比,找出相同;然后再将A中第二个与B中所有元素对比,找相同;以此类推找出所有相同的数。 并,先定义了一个新的数组C,先将A中的元素给C,再将B中的元素给C,之后运用冒泡排序,升序排列,之后输出数组C。 差,把A中的元素给C,引入一个x=1,然后将C数组和B数组中的对比,当有相同时,x=0,就不打印出该数。最后输出数组C。 二、主要源代码 #include<stdio.h> #include<math.h> #include <stdlib.h> #include<iostream> using namespace std; int a[100], b[100]; //定义数组 int n, m; //定义全局变量 int menu1(); //提前声明函数 int menu2(int i); int enter(); void jiao(); //交集函数 void bing(); //并集函数 void M(); int main() //主函数 { int a = 0; while (a >= 0) { a = menu2(menu1());//通过两个菜单来实现利用数字进行函数调用。 } } int menu1() { int i; cout << "———————————————————————" << endl; cout << "| 1 输入集合A和B |" << endl; cout << "| 2 求集合A交B |" << endl; cout << "| 3 求集合A并B |" << endl; cout << "| 4 求集合A-B |" << endl; cout << "| 输入任意负数可以退出程序 |" << endl; cout << "| 请通过数字进行操作 |" << endl; cout << "| 通过“Enter”进行下一步操作 |" << endl; cout << "———————————————————————" << endl; cin >> i; return i; } int menu2(int i) { switch (i) { case 1:enter(); break; //输入1调用enter()函数 case 2:jiao(); break; //输入2调用jiao()函数 case 3:bing(); break; //输入3调用bing()函数 case 4:M(); break; //输入4调用M()函数 default:cout << "成功退出程序"; break; //switch case调用函数 } return i; } int enter() //定义enter()函数的用法,输入A,B两个集合 { cout << "集合A的元素个数为:" << endl; cin >> n; cout << "集合A为:" << endl; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (a[i] == a[j]) { cout << "A中的元素出现重复" << endl; return 0; } } } cout << "集合B的元素个数为:" << endl; cin >> m; cout << "集合B为:" << endl; for (int i = 0; i < m; i++) cin >> b[i]; for (int i = 0; i < m; i++) { for (int j = i + 1; j < m; j++) { if (b[i] == b[j]) { cout << "B中的元素出现重复" << endl; return 0; } } } } void jiao() //通过对比两个集合数组内的元素来发现相同的元素,然后输出全部相同的元素 { cout << "AB集合的交集为:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i] == b[j]) cout << a[i] << " "; } } //先将A中第一个元素与B中所有元素对比,找出相同;然后再将A中第二个与B中所有元素对比,找相同;以此类推。 cout << endl; }; void bing() { int t; int c[100]; //定义一个新的数组c for (int i = 0; i < n; i++) c[i] = a[i]; //先将 A中的元素给C for (int i = n; i < n + m; i++) c[i] = b[i - n]; //再将B中元素给C for (int i = 0; i < n + m; i++) { for (int j = 0; j < n + m - i; j++) { if (c[j] > c[j + 1]) { t = c[j]; c[j] = c[j + 1]; c[j + 1] = t; } } } //排序(冒泡排序) ,升序排序,这样可以消除C中汇合A B两个集合时有相同元素的情况 cout << "AB集合的并集为:" << endl; for (int i = 0; i <= n + m; i++) { if (c[i-1] != c[i]) cout << c[i] << " "; //输出数组C } cout << endl; }; void M() //A-B,属于A但不属于B { int c[100]; for (int i = 0; i < n; i++) c[i] = a[i]; //把A中元素给C cout << "A集合减B集合为:"; for (int i = 0; i < n; i++) { int x = 0; for (int j = 0; j < m; j++) { if (c[i] == b[j]) x = 1; //若 B中元素和C(也就是A)中元素一样,使x=1 } if (x == 0) cout << c[i] << " "; } cout << endl; }; |
一、用键盘输入1,进行数组的输入,先输入A,B两个数 二、进行并集运算 输入2,进行A交B 三、进行并集运算 输入3,开始运算 四、输入4,进行A-B 五、输入一个负数,退出程序 |
一、不是很理解怎么判断一个数组中有重复的数。 二、差集运算不太会,查找了网上的一个代码,引入了一个判断条件x。运用两个循环,一个if条件,遍历两个数组中的数并进行比较运算。 三、通过本次实验,对函数有了更近一步的了解,巩固并加强了对C语言知识的了解和应用;我个人还应该增强自己的动手能力,多多实践,不能只停留在书本上。 本次实验word版本见主页资源,图片由于格式问题无法加载 |