简介整个程序大致分为两个部分集合解析部分和集合运算部分其中集合解析部分是难点这里也只讲讲我是这么实现这一部分的集合解析部分封装到了一个类里输入一个集合如“{1,2,3,{5,9,{5}},6}”然后把集合元素如{1},{2},{3},{{5,9,{5}},6},都存到一个setstring中方便调用在这过程中会识别出“非法的”集合并返回错误码0。这个类完成集合解析由两个函数完成stringtocontent和is_elementstringtocontent函数int stringtocontent(string input) { int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; } } else { return -1;//{1,2 } return 0; }函数首先剥离最外面的{}int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { ...... } else { return -1; }对不同字符(‘{’,‘,’,default)进行不同处理len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { ...... break; } case ,: { ...... break; } default: break; } }对’{的处理case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; }if(dh1!i)用于排除’{‘前不为’,‘的集合(除了第一个元素就带有’{dh首先就被初始话为0)kh i;记录’{的下标int ret is_element(input, i 1, len);:is_element返回与kh位置相匹配的’}的下标对返回的下标进行处理当ret0时返回错误码ret当kh1ret时说明’{‘和’}之间没有元素是非法集合返回错误码if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; }当集合合法时iret对’,的处理case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; }dh1i时说明两个’,连在一起返回错误码temp存放上一个’,‘到这一个’,的全部元素并存入setstring Content中如果Content中有了一样的元素返回错误码更新dhi对default不做处理对剩余的未放入setstring Content处理if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; }dh1len说明逗号和最后的’}连在一起返回错误码is_element函数int is_element(string input, int a, int len) { int kh - 1,dha-1; string temp; setstring scontent; for (int i a; i len; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } } return i; break; } case ,: { if (i dh1) { return -6; } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (scontent.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } return -5;//{{1,2,3 } }接收input(整个集合字符串),i1(‘{‘之后的第一个元素的下标),len(集合字符串长度-1减去了最后的’}’)初始化int kh - 1,dha-1;string temp;setstring scontent;分别对{,,,}和default进行处理switch (input[i]) { case {: { ...... break; } case }: { ...... break; } case ,: { ...... break; } default: break; }对’{进行处理和stringtocontent函数中处理逻辑相同对’,进行处理和stringtocontent函数中处理逻辑相同对’}‘进行处理dh1i说明存在未处理元素如({1,2,2})如果没有未处理的元素说明是{1,2,3,{1,2,}}这种情况返回错误码如果这个元素合法就返回’}的下标case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } return i; } else { return -9; } }对default不进行处理完整代码#define _CRT_SECURE_NO_WARNINGS 1 #includestring #includeiostream #includeset using namespace std; class Set { public: setstring Content; int stringtocontent(string input) { int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; } } else { return -1;//{1,2 } return 0; } int is_element(string input, int a, int len) { int kh - 1,dha-1; string temp; setstring scontent; for (int i a; i len; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } return i; } else { return -9; } break; } case ,: { if (i dh1) { return -6; } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (scontent.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } return -5;//{{1,2,3 } } }; void printset(int n,setstring all) { bool first true; for (setstring::reverse_iterator a all.rbegin(); a ! all.rend(); a) { if (n % 2) { if (!first) { cout ,; } cout *a; first false; } n / 2; } } void memu() { Set set1; Set set2; cout 输入两个集合 endl; while (1) { string arr1; cout 集合1:; cin arr1; //arr1 {1,2,3,4,5,6}; if (set1.stringtocontent(arr1) 0) { cout 集合不合法请重新输入! endl; } else { break; } } while (1) { string arr2; cout 集合2:; cin arr2; //arr2 {1,2,5,9,8,6}; if (set2.stringtocontent(arr2) 0) { cout 集合不合法请重新输入! endl; } else { break; } } setstring allset1.Content; all.insert(set2.Content.begin(), set2.Content.end()); int value1 0, value2 0; for (const string elem : all) { value1 1; if (set1.Content.count(elem)) value1 | 1; value2 1; if (set2.Content.count(elem)) value2 | 1; } while (1) { cout 选择操作 endl; cout 1,求并集 endl; cout 2,求交集 endl; cout 3,求差集 endl; cout 4,求对称差 endl; cout 5,求集合1的补集 endl; cout 0,退出 endl; cout 请选择(0~4):; int opt 0; cin opt; switch (opt) { case 0: { return; break; } case 1: { int n value1 | value2; cout 集合1和集合2的并集为: {; printset(n, all); cout }endl; break; } case 2: { int n value1 value2; cout 集合1和集合2的交集为: {; printset(n, all); cout } endl; break; } case 3: { int n value1 - (value1 value2); cout 集合1和集合2的差集为: {; printset(n, all); cout } endl; break; } case 4: { int n (value1 | value2) - (value1 value2); cout 集合1和集合2的对称差为: {; printset(n, all); cout }endl; break; } case 5: { int n (value1 | value2) - value1; cout 集合1的补集为: {; printset(n, all); cout } endl; break; } default: { cout 非法输入请重新输入! endl; break; } } } } int main() { memu(); return 0; }
C++实现的带集合解析功能的集合运算器
简介整个程序大致分为两个部分集合解析部分和集合运算部分其中集合解析部分是难点这里也只讲讲我是这么实现这一部分的集合解析部分封装到了一个类里输入一个集合如“{1,2,3,{5,9,{5}},6}”然后把集合元素如{1},{2},{3},{{5,9,{5}},6},都存到一个setstring中方便调用在这过程中会识别出“非法的”集合并返回错误码0。这个类完成集合解析由两个函数完成stringtocontent和is_elementstringtocontent函数int stringtocontent(string input) { int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; } } else { return -1;//{1,2 } return 0; }函数首先剥离最外面的{}int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { ...... } else { return -1; }对不同字符(‘{’,‘,’,default)进行不同处理len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { ...... break; } case ,: { ...... break; } default: break; } }对’{的处理case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; }if(dh1!i)用于排除’{‘前不为’,‘的集合(除了第一个元素就带有’{dh首先就被初始话为0)kh i;记录’{的下标int ret is_element(input, i 1, len);:is_element返回与kh位置相匹配的’}的下标对返回的下标进行处理当ret0时返回错误码ret当kh1ret时说明’{‘和’}之间没有元素是非法集合返回错误码if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; }当集合合法时iret对’,的处理case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; }dh1i时说明两个’,连在一起返回错误码temp存放上一个’,‘到这一个’,的全部元素并存入setstring Content中如果Content中有了一样的元素返回错误码更新dhi对default不做处理对剩余的未放入setstring Content处理if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; }dh1len说明逗号和最后的’}连在一起返回错误码is_element函数int is_element(string input, int a, int len) { int kh - 1,dha-1; string temp; setstring scontent; for (int i a; i len; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } } return i; break; } case ,: { if (i dh1) { return -6; } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (scontent.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } return -5;//{{1,2,3 } }接收input(整个集合字符串),i1(‘{‘之后的第一个元素的下标),len(集合字符串长度-1减去了最后的’}’)初始化int kh - 1,dha-1;string temp;setstring scontent;分别对{,,,}和default进行处理switch (input[i]) { case {: { ...... break; } case }: { ...... break; } case ,: { ...... break; } default: break; }对’{进行处理和stringtocontent函数中处理逻辑相同对’,进行处理和stringtocontent函数中处理逻辑相同对’}‘进行处理dh1i说明存在未处理元素如({1,2,2})如果没有未处理的元素说明是{1,2,3,{1,2,}}这种情况返回错误码如果这个元素合法就返回’}的下标case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } return i; } else { return -9; } }对default不进行处理完整代码#define _CRT_SECURE_NO_WARNINGS 1 #includestring #includeiostream #includeset using namespace std; class Set { public: setstring Content; int stringtocontent(string input) { int kh -1, len input.size(), dh 0; if (input[0] { input[len - 1] }len2) { len--; string temp; for (int i 1; i len ; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case ,: { if (dh 1 i) { return -6;//{1,,} } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (Content.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } if (dh 1 len) { return -7;//{1,2,} } temp.clear(); for (int j dh1; j len ; j) { temp.push_back(input[j]); } if (Content.insert(temp).second false) { return -2; } } else { return -1;//{1,2 } return 0; } int is_element(string input, int a, int len) { int kh - 1,dha-1; string temp; setstring scontent; for (int i a; i len; i) { switch (input[i]) { case {: { if (dh 1 ! i) { return -8; } kh i; int ret is_element(input, i 1, len); if (ret 0) { return ret; } else { if (kh 1 ret) { return -4;//{{}} } i ret; } break; } case }: { if (dh 1 i) // 存在未处理的元素 { temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } if (!scontent.insert(temp).second) { return -2; } return i; } else { return -9; } break; } case ,: { if (i dh1) { return -6; } temp.clear(); for (int j dh 1; j i; j) { temp.push_back(input[j]); } dh i; if (scontent.insert(temp).second false) { return -2;//{1,1} } break; } default: break; } } return -5;//{{1,2,3 } } }; void printset(int n,setstring all) { bool first true; for (setstring::reverse_iterator a all.rbegin(); a ! all.rend(); a) { if (n % 2) { if (!first) { cout ,; } cout *a; first false; } n / 2; } } void memu() { Set set1; Set set2; cout 输入两个集合 endl; while (1) { string arr1; cout 集合1:; cin arr1; //arr1 {1,2,3,4,5,6}; if (set1.stringtocontent(arr1) 0) { cout 集合不合法请重新输入! endl; } else { break; } } while (1) { string arr2; cout 集合2:; cin arr2; //arr2 {1,2,5,9,8,6}; if (set2.stringtocontent(arr2) 0) { cout 集合不合法请重新输入! endl; } else { break; } } setstring allset1.Content; all.insert(set2.Content.begin(), set2.Content.end()); int value1 0, value2 0; for (const string elem : all) { value1 1; if (set1.Content.count(elem)) value1 | 1; value2 1; if (set2.Content.count(elem)) value2 | 1; } while (1) { cout 选择操作 endl; cout 1,求并集 endl; cout 2,求交集 endl; cout 3,求差集 endl; cout 4,求对称差 endl; cout 5,求集合1的补集 endl; cout 0,退出 endl; cout 请选择(0~4):; int opt 0; cin opt; switch (opt) { case 0: { return; break; } case 1: { int n value1 | value2; cout 集合1和集合2的并集为: {; printset(n, all); cout }endl; break; } case 2: { int n value1 value2; cout 集合1和集合2的交集为: {; printset(n, all); cout } endl; break; } case 3: { int n value1 - (value1 value2); cout 集合1和集合2的差集为: {; printset(n, all); cout } endl; break; } case 4: { int n (value1 | value2) - (value1 value2); cout 集合1和集合2的对称差为: {; printset(n, all); cout }endl; break; } case 5: { int n (value1 | value2) - value1; cout 集合1的补集为: {; printset(n, all); cout } endl; break; } default: { cout 非法输入请重新输入! endl; break; } } } } int main() { memu(); return 0; }