一、问题描述
1、问题描述
集合元素类型可以是整数、字符串和小数,实现集合的交、并、差运算。
2、功能要求
(1)用户能够输入两个集合元素;
(2)能够完成集合的交、并、差运算;
(3)集合元素的类型可以为整数、字符串和小数;
(4)输出运算结果。
二、解决思路
图2.1 系统模块流程图
图2.2 用户操作流程图
1.主函数先建立一个菜单可根据处理用户输入并根据用户选择执行整数、小数、字符串和退出的不同操作并通过运用do while循环 与switch选择程序要运行是什么数字类型的集合,若是无效的输入则通过default直接退出。
2. case1是整数集合交、并、差集运算的实现,调用function1() function2() function3()函数。
case2是小数集合交、并、差集运算的实现,调用function4() function5() function6()函数。
case3是字符串集合交、并、差集运算的实现,调用function7() function8() function9()函数。
case0 是退出。
3.交集的实现:
定义一个函数 function()以及四个参数。指向数组a1、数组b1的指针,指向数组a1、数组b1的长度m1、n1,再定义一个数组c1并将结果存储在动态分配的数组 c1 中。定义一个变量len,其值为两个数组长度m1和n1中较大的一个作为数组c1的长度。 然后用嵌套的 for 循环用于历遍数组 a1 和 b1。对于数组 a1 中的每个元素,检查它是否在数组 b1 中出现过。如果出现过,则将该元素添加到交集数组 c1 中。如果没有出现过,则不管该元素。下一个循环遍历交集数组 c1,并打印其中的每个元素。总之,这个函数的主要目的是找出两个数组的交集,并将结果存储在动态分配的数组中。然后,它将交集数组中的元素打印出来。
4.并集的实现:
定义一个函数名为function()以及四个参数。指向数组a1、数组b1的指针,指向数组a1、数组b1的长度m1、n1,再定义一个数组c1并将结果存储在动态分配的数组 c1 中,用于计算两个数组a1和b1的并集函数。数组a1将其元素依次添加到数组c1中,再看数组b1对于每个元素检查是否已经在数组c1中出现过,如果未出现过,则将其添加到数组c1中,然后再创建一个临时数组temp用于储存最终的并集结果,并打印其中的每个元素。
5.差集的实现:
定义一个函数名为function()以及四个参数。指向数组a1、数组b1的指针,指向数组a1、数组b1的长度m1、n1,再定义一个数组c1并将结果存储在动态分配的数组 c1 中,通过循环将数组a1的元素复制到数组c1中,然后看数组b1,并检查是否在c1中。通过嵌套循环检查数组b1中的每个元素是否存在于数组c1中,如果不存在,则将该元素添加到数组c1中 ,并将数组c1的有效元素复制到临时数组temp中,最终输出数组中的每个元素。
,
,
,
四、核心程序
运行结果:
整数 小数 字符串
核心代码:
//交集运算 //数返回类型为void,表示该函数没有返回值。
void function1(int *a1, int *b1, int m1, int n1)
{ int len = m1 > n1 ? m1 : n1; // 定义一个变量len,其值为两个数组长度m和n中较大的一个 int *c1 = (int*)malloc(sizeof(int)*len); // 使用malloc函数动态分配一个长度为len的数组c的内存空间 int d1 = 0; // 定义一个变量d,初始值为0,用于记录交集数组c中的元素个数 for (int i = 0; i < m1; i++) // 使用两层嵌套循环遍历数组a和b。对于数组a中的每个元素,检查数组b中出现过,//则将该元素添加到交集数组c中。 { for (int j = 0; j < n1; j++) { if (a1[i] == b1[j]) { c1[d1++] = a1[i]; // 这里直接将a[i]赋值给c[d] } } } cout << "输出a1与b1的交集:" << endl; for (int i = 0; i < d1; i++) { cout << c1[i] << " "; // 这里添加了一个空格来分隔不同的元素 } cout << endl; delete[] c1; // 释放动态分配的内存空间,避免内存泄漏
}
//并集运算
void function2(int *a1,int *b1,int m1,int n1)
{ //使用malloc动态分配一个长度为m1+n1的整数数组的内存空间,int *c1 = (int*)malloc(sizeof(int) * (m1+ n1));//并将指针c1指向这块内存。int k = 0; //定义一个变量k并初始化为0。这个变量用于记录并集数组c1中的元素个数。for (int i = 0; i < m1; i++) { c1[k++] = a1[i]; } for (int i = 0; i < n1; i++) { bool found = false; for (int j = 0; j < k; j++) // 检查b[i]是否在已添加的元素中重复 { if (b1[i] == c1[j]) { found = true; break; } } if (!found) // 如果b[i]不在已添加的元素中,则将其添加到结果数组c中 { c1[k++] = b1[i]; } } // 裁剪c数组到有效长度k int *temp = (int*)malloc(sizeof(int) * k); for (int i = 0; i < k; i++) //一个循环用于将并集数组c1的内容复制到临时数组temp中。{ temp[i] = c1[i]; } delete[] c1; c1 = temp; //将指针c1指向临时数组。cout << "输出集合a1,b1的并集:" << endl; for (int i = 0; i < k; i++) { cout << c1[i] << " "; } cout << endl; delete[] c1; // 释放动态分配的内存空间,避免内存泄漏
}
//差集运算
void function3(int *a1, int *b1, int m1, int n1)
{ int k = 0; int *c1 = (int *)malloc(sizeof(int) * m1); //使用malloc动态分配一个长度为m1的整数数组c1,用于存储结果for(int i = 0; i < m1; i++) { c1[i] = a1[i]; } for(int i = 0; i < n1; i++) //检查数组b1中的每个元素是否存在于数组c1中。//如果不存在,则将该元素添加到数组c1中,并增加计数器k。{ bool found = false; for(int j = 0; j < m1; j++) { if(b1[i] == c1[j]) { found = true; break; } } if(!found) { c1[k] = b1[i]; k++; // 当在集合b中找到不在集合a中的元素时,k自增 } } // 裁剪c数组到有效长度k int *temp = (int*)malloc(sizeof(int) * k); for(int i = 0; i < k; i++) { temp[i] = c1[i]; } delete[] c1; c1 = temp; cout << "输出集合a2与集合b2的差集:" << endl; for(int i = 0; i < k; i++) { cout << c1[i] << " "; } cout << endl; delete[] c1; //释放动态分配的内存空间,避免内存泄漏
}
主函数:
int main()
{ int choice; do { cout << "--------------------------------"<< endl; //菜单cout << "| 选择输入数字类型对应的数字: |"<< endl; cout << "| 1. 整数 |"<< endl; cout << "| 2. 小数 |"<< endl; cout << "| 3. 字符串 |"<< endl; cout << "| 0. 退出 |"<< endl; cout << "--------------------------------"<< endl; cin >> choice; switch (choice) { case 1:int *a1,*b1; int m1,n1; //集合a,b的个数 cout<<"输入集合a1的长度:"<<endl;cin>>m1;cout<<"输入集合b1的长度:"<<endl;cin>>n1; a1=(int*)malloc(sizeof(int)*m1); //使用动态内存分配函数为a分配内存空间b1=(int*)malloc(sizeof(int)*n1); //使用动态内存分配函数为b分配内存空间cout<<"输入集合a1:"<<endl;for(int i=0;i<m1;i++){cin>>a1[i]; }cout<<"输入集合b1:"<<endl;for(int i=0;i<n1;i++){cin>>b1[i]; } function1(a1,b1,m1,n1); function2(a1,b1,m1,n1);function3(a1,b1,m1,n1); delete[] a1; //释放动态分配的内存空间,避免内存泄漏 delete[] b1; break; case 2:double *a2, *b2; int m2, n2; //集合a,b的个数 cout << "输入集合a的长度:" << endl; cin >> m2; cout << "输入集合b的长度:" << endl; cin >> n2; a2 = (double*)malloc(sizeof(double) * m2); //使用动态内存分配函数为a分配内存空间 b2 = (double*)malloc(sizeof(double) * n2); //使用动态内存分配函数为b分配内存空间 cout << "输入集合a2:" << endl; for(int i = 0; i < m2; i++) { cin >> a2[i]; } cout << "输入集合b2:" << endl; for(int i = 0; i < n2; i++) { cin >> b2[i]; } function4(a2, b2, m2, n2); function5(a2, b2, m2, n2);function6(a2, b2, m2, n2); break; case 3: string *a3, *b3; int m3, n3; // 集合a3,b3的个数 cout << "输入集合a3的长度:" << endl; cin >> m3; cout << "输入集合b3的长度:" << endl; cin >> n3; a3 = new string[m3]; // 使用动态内存分配函数为a分配内存空间 b3 = new string[n3]; // 使用动态内存分配函数为b分配内存空间 cout << "输入集合a1:" << endl; for (int i = 0; i < m3; i++) { cin >> a3[i]; } cout << "输入集合b3:" << endl; for (int i = 0; i < n3; i++) { cin >> b3[i]; } function7(a3, b3, m3, n3); function8(a3, b3, m3, n3);function9(a3, b3, m3, n3); delete[] a3; // 释放动态分配的内存空间,避免内存泄漏 delete[] b3; break; case 0: cout << "退出程序" << endl; break; default: cout << "无效的输入" << endl; break; } } while (choice != 0); return 0; }
五、总结
1、对实习的过程和解决思路以及编程实现进行总结。
A:实习的过程总结:
(1)首先对于集合的交、并、差运算的概念进行了学习。
(2)对c++基础知识进行了巩固复习和加强学习了更深的知识。
(3) 解决问题:在实习期间,参与了集合交、并、差运算的实现的认为,首先学会了合理分配时间,会遇到各种实际问题需要解决。首先要找到问题,然后通过上网查询,改错得到了进一步的知识的提高。通过C++实习的提升了自己的能力,掌握多种解决问题的方法。
(4)通过本次实验,我们成功实现了集合的交、并、差运算,并输出了结果。实验过程中,我们加深了对集合运算的理解,并熟练掌握运用循环语句、函数、数组、指针提高了编程能力。同时,我们也发现了一些需要注意的问题,避免出现错误。在未来的学习和实践中,我们将继续努力,提高自己的编程能力和解决问题的能力。
B:解决思路的过程总结:
首先学会了合理分配时间,合理分配每日学习内容、熟悉使用C++的开发环境和常用的工具,编写清晰、简洁、的代码,遵循编码规范,进行多次的调试和测试,完成初步的实现后,再对代码进行优化和改进,并且使功能更强,界面更美。且掌握多种解决问题的方法。先设置一个菜单,后用switch语句来分别进行交、并、差的实现,再通过函数调用等实现。
C:编程实现的过程总结:
在编程实现过程中,我主要使用了C++语言进行开发。通过使用do while语句 、switch语句、 调用function()函数、数组、指针等,成功地实现了集合的交、并、差运算。在这个过程中,我不仅提高了自己的编程能力,而且还学会了多种方法解决实际问题。并代码的注释帮助理解,严格规范自己代码的规范性。
2、写出对程序设计综合实习的体会,自己在哪些方面有所提高,学到了哪些知识。
(1)理论与实际的相异性:在实习过程中,我发现许多编程,与在实际应用中不同,增加了更多实践的经验。
(2)团队学习合作与沟通:在实习过程中,我们经常需要与团队成员进行沟通并协作。在老师的点拨下,向组长,同学请教,学习他们的经验和技巧。明白了团队合作的重要性,每个人的专长和优点都被充分利用,以实现共同的目标。
(3)编程技能的提升:通过这次实习,我深入学习了c++编程语言。以及如何编写和调试代码。这些技能不仅让我在实习期间能够高效地完成任务,而且对我未来的职业发展也大有裨益。
(4)问题解决能力提升:面对复杂的问题和挑战,我学会了如何进行有效的分析和寻找解决方案。这种能力不仅来自于编程知识,也来自于我在实习过程中学会的如何使用调试工具、查阅文档和寻求帮助。
(5)自我学习、主动提出问题:在实习过程中,我学会了主动提问并寻求帮助。当遇到问题时,我会先尝试自己解决,查阅典籍但如果无法解决,我会寻求同学或老师的指导和帮助,提高效率解决问题。
(6)代码质量与可维护性:在实习过程中,我深刻理解了高质量代码和可维护性的重要性。编写清晰、简洁且可读性强的代码不仅可以提高工作效率,而且也有利于团队成员之间的协作,代码注释也非常重要。
(7)持续学习:技术领域的发展非常迅速,我需要不断学习新的技术和工具。在实习过程中,我明白了持续学习和适应新技术的重要性。
总的来说,这次程序设计综合实习让我学到了很多知识和技能,学会了如何使用C++语言进行编程,并熟悉了C++的基本语法和常用库函数。我不仅提高了我的技术能力、学会了如何分析问题,也增强了我在团队中的合作能力和解决问题的能力。这次实习是我学习生涯中一个重要的里程碑,我将珍视这次经验并继续努力提高我的编程技能。