C++求两个整数集合交集代码修复:isEmpty添加与单次打印问题
问题解答
原代码核心问题
你现有代码的逻辑存在明显错误:内层重名定义的i变量会篡改外层循环的计数,且交集判断逻辑完全混乱,isEmpty和isFirstIntersectedElem两个标记的使用位置完全不对。
需求实现说明
1. 提示语仅打印一次的实现逻辑
用isFirstIntersectedElem作为打印开关:
- 第一次找到交集元素时,先打印提示语,再输出元素,随后将该标记设为
false - 后续再找到交集元素时,直接输出元素即可,不再重复打印提示语
2. isEmpty逻辑的添加位置
isEmpty用来标记是否存在交集元素,需要在所有元素遍历完成后再判断:
- 遍历过程中只要找到一个交集元素,就将
isEmpty设为false - 所有遍历结束后如果
isEmpty仍为true,再打印无交集的提示,避免循环中重复输出错误提示
3. 额外优化(集合特性适配)
因为是集合,同一个交集元素不需要重复输出,代码中增加了已输出元素的去重判断,避免重复打印相同值。
修正后完整代码
#include <iostream> using namespace std; int main() { int A[10], B[10]; // 用来存储已经输出过的交集元素,避免重复打印 int printed[10] = {0}; int printedCount = 0; cout << "请输入集合A的10个整数元素:" << endl; for (int i = 0; i < 10; i++) { cin >> A[i]; } cout << "请输入集合B的10个整数元素:" << endl; for (int i = 0; i < 10; i++) { cin >> B[i]; } bool isFirstIntersectedElem = true; bool isEmpty = true; for (int i = 0; i < 10; i++) { // 先判断当前A[i]是不是已经输出过了,避免重复 bool alreadyPrinted = false; for (int k = 0; k < printedCount; k++) { if (A[i] == printed[k]) { alreadyPrinted = true; break; } } if (alreadyPrinted) continue; for (int j = 0; j < 10; j++) { if (A[i] == B[j]) { // 找到交集元素 isEmpty = false; if (isFirstIntersectedElem) { // 第一次找到时打印提示,只打印一次 cout << "集合A和集合B的交集元素如下:" << endl; isFirstIntersectedElem = false; } cout << A[i] << " "; // 加入已输出数组 printed[printedCount++] = A[i]; // 匹配到就跳出B的循环,不用再找 break; } } } // 所有遍历结束后判断是否为空 if (isEmpty) { cout << "未找到集合A和集合B的交集元素。" << endl; } else { cout << endl; } return 0; }
如果你需要保留英文提示,只需要把对应输出语句替换为你要求的英文内容即可,开关逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

