软件学院实验报告
姓名: 白泽中 学号: 2025050006 专业: 软件工程 年级:2020级
课程名称 数据结构
实验名称 实验1 集合的交、并、差
实验的准备阶段 实验内容 (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}
实验类型 验证性
实验的重点、难点 重点: 数组或线性表的使用
难点: 去重操作和函数调用
实验环境 TDM-GCC 4.9.2 64-bit
实验的实施阶段 实验步骤及完成任务情况 一、设计思想

1. 采用模板实现泛型编程,可创建任意数据类型的集合
1. 对下标运算符进行重载,可以直接访问集合元素
1. 在主函数里实现菜单,验证算法正确性



二、主要源代码```cpp

include

define SETSIZE 10000

using std::cin; using std::cout; using std::endl;

template class Set { private: T val[SETSIZE]; int _length; void deweight();

public: Set() {_length = 0; } ~Set() {_length = 0; } T operator const {return val[pos]; } int getlength() const {return _length; } void scan(int size); void Intersection(Set const& A, Set const& B); void Union(Set const& A, Set const& B); void Except(Set const& A, Set const& B); };

template void Set::deweight() { for(int i = 0; i < _length; ++ i) for(int j = i + 1; j < _length; ++ j) if(val[i] == val[j]){ for(int k = j; k < _length - 1; ++ k) val[k] = val[k+1]; _length —; j —; } }

template void Set::scan(int size) { int i; for(i = 0; i < size; ++ i) cin>>val[i]; _length = i; deweight(); }

template void Set::Intersection(Set const& A, Set const& B) { int k = 0; for(int i = 0; i < A.getlength(); ++ i) for(int j = 0 ; j < B.getlength(); ++ j) { if(A[i] == B[j]) { val[k] = A[i]; k ++; } } _length = k; }

template void Set::Union(Set const& A, Set const& B) { int t; for(int i = 0; i < A.getlength(); ++ i) val[i] = A[i]; for(int j = 0; j < B.getlength() + 1; ++ j) { t = j + A.getlength(); val[t] = B[j]; } _length = t; deweight(); }

template void Set::Except(Set const& A, Set const& B) { int k = 0, flag; for(int i = 0; i < A.getlength(); ++ i) { flag = 1; for(int j = 0 ; j < B.getlength(); ++ j) { if(A[i] == B[j]) flag = 0; } if(flag){ val[k] = A[i]; k ++; } } _length = k; }

int main() { cout<<”实验1 集合的交、并、差\n”; cout<<”1—输入集合A和B\n”; cout<<”2—求集合A交B\n”; cout<<”3—求集合A并B\n”; cout<<”4—求集合A-B\n”; cout<<”退出,输入一个负数!\n”; int a, b; Set A, B, C, D, E; while(true) { int myOption; cout<<”\n请输入操作序号:”; cin>>myOption; switch(myOption) { case 1:{ cout<<”输入集合A和B的元素个数:”; cin>>a>>b; cout<<”输入集合A:”; A.scan(a); cout<<”输入集合B:”; B.scan(b); break; } case 2:{ if(A[0] == 0 && B[0] == 0){ cout<<”请先输入集合A和B的值\n”; break; } if(A[0] == 0){ cout<<”请先输入集合A的值\n”; break; }
if(B[0] == 0){ cout<<”请先输入集合B的值\n”; break; } C.Intersection(A, B); cout<<” A 交 B = { “; for(int i = 0; i < C.getlength(); ++ i){ cout< 4 || myOption == 0) cout<<”\n请输入小于4的正整数\n\n”; if(myOption < 0){ cout<<”\n退出程序!\n”; break; } } return 0; } ``` | | | 实验结果的处理阶段 | 实验结果总结 | 实验1 集合的交、并、差 - 图1 | | | | 实验结果的运用 | 学会:
(1)数组去重操作
(2)数组模拟集合 | | | 教师评价 | 总评 |   | | | | 得分 | | |