实验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}

重点: 数组或线性表的使用
难点: 去重操作和函数调用

一、设计思想
  1. 首先在main函数中设置while循环,打印菜单,switch分支判断输入,在分支中调用相应函数完成功能。

  2. 设置全局变量 input_a[99]input_b[99]存储相应集合,int i,int m 集合元素个数(至于为什么要用全局变量,不用局部变量,全局变量生存周期随程序,下面打印集合等功能更加方便)

  3. 声明函数
    3.1 输入集合函数
    3.2 求并集
    3.3 求交集
    3.4 求差集
    3.5 打印集合

  4. 其中比较复杂的地方
    4.1 选用全局变量而不是成员变量
    4.2 求集合并集函数功能实现

二、主要源代码
# include<iostream>
# include<stdio.h>
# include<stdlib.h>
using namespace std;

int in_a();
int in_b();



int jiao_a_b();
int bing_a_b();
int cha_a_b();


//定义全局变量 
int input_a[99] = {0};
int input_b[99] = {0};



//集合A、B的元素下标 
int i = 0;
int m = 0;



int main()
{
	
	int n = 1;//退出菜单的标记 
	
	while(n){
		int s;
		cout<<"====欢迎使用集合运算小工具~~===="<<endl;
		cout<<"++输入对应数字指令实现相应功能++"<<endl;
		cout<<"********1---输入集合A和B********"<<endl;
		cout<<"********2---求集合A交B********"<<endl;
		cout<<"********3---求集合A并B********"<<endl;
		cout<<"********4---求集合A差B********"<<endl;
		cout<<"********5---输出集合A、B******"<<endl; 
		cout<<"*****输入一个负数退出程序~*****"<<endl;
		
		cout<<"请输入指令:\n";
		
		scanf("%d",&s);
		switch(s){
			case 1:
				system("cls");
				cout<<"输入集合A和B"<<endl;
				in_a();
				in_b();
				break;
			case 2:
				system("cls");
				cout<<"求集合A交B"<<endl;
				jiao_a_b();
				printf("\n");
				break;
			case 3:
				system("cls");
				cout<<"求集合A并B"<<endl;
				bing_a_b();
				printf("\n");
				break;
			case 4:
				system("cls");
				cout<<"求集合A差B"<<endl;
				cha_a_b();
				printf("\n");
				break;
			case 5:
				system("cls");
				cout<<"输出集合A、B"<<endl;
				//输出集合A 
				printf("集合A:"); 
				for(int  k = 0; k <i;k++){
					printf("%d ",input_a[k]);
				}
				printf("\n");
				//输出集合B 
				printf("集合B:"); 
				for(int  k = 0; k <m;k++){
					printf("%d ",input_b[k]);
				}
				printf("\n");
				
				break; 
			default:
				system("cls");
				if(s<0){
					n = 0;
					cout<<"程序退出成功,欢迎下次使用~~"<<endl; 
					break;
					
				}
				
				else
					cout<<"您输入的指令有误,请重新输入~"<<endl;
			 
		}
		
		
	}
	
}

//1. 输入集合a函数 
int in_a(){	
	int num;
	//集合a的输入 
	cout<<"请输入集合a,以负数为结束的记号结束输入~"<<endl;
	while(scanf("%d",&num) > 0  && getchar() != '\n'){
		i++;
		if(i == 1)
			input_a[i-1] = num;
		else{
			for(int y = 0;y <= i-2; y++){
				//判断输入的数和前面的是否相等 
				if(num != input_a[y]){
					input_a[i-1] = num;
				}
				else{
					printf("你输入的集合a含重复的元素,请重新输入集合a~\n");
					i = 0;
					in_a(); 
				}
	
			}		
		}		
	}
}



//2. 输入集合b函数 
int in_b(){


	int num;

	//集合b的输入 
	cout<<"请输入集合b,以负数为结束的记号结束输入~" <<endl;
	while(scanf("%d",&num) > 0  && getchar() != '\n'){
		m++;
		if(m == 1)
			input_b[m-1] = num;
		else{
			for(int y = 0;y <= m-2;y++){
				if(num != input_b[y]){
					input_b[m-1] = num;
				}
				else{
					printf("你输入的集合b含重复的元素,请重新输入集合b~\n");
					m = 0;
					in_b(); 
					 
					
				}
			}
			
			
		}
		
	}
 
} 

//3. 交函数 
int jiao_a_b(){
	printf("集合A交B为:");
	for(int k = 0; k < i;k++){
		for(int j = 0; j< m;j++){
			if(input_a[k] == input_b[j]){
				printf("%d ",input_a[k]);
			}
		}
	}
	printf("\n");

	
	
}
//4. 并函数 
int bing_a_b(){
	int t = 0;
	printf("集合A并B为:");
	for(int k = 0; k < i;k++){
		printf("%d ",input_a[k]);
		
	}
	for(int j = 0;j< m;j++){
		for(int k = 0;k<i;k++){
			if(input_b[j] != input_a[k]){
				t++;
			}
			
		}
		if(t == i)
			printf("%d ",input_b[j]);
		
			t = 0;
		
	}
	
	printf("\n");
	
	
}

//5. 差函数 
int cha_a_b(){
	int t = 0;
	printf("集合A差B为:");
	for(int k = 0; k < i;k++){
		for(int j = 0; j< m;j++){
			if(input_a[k] != input_b[j])
				t++;
		}
		if(t == m)
			printf("%d ",input_a[k]);
			
		t = 0;
	}
	printf("\n");
	
}


部分截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

求并集的原理调试图

就是使用t记录B集合内的某元素是否和A中的每一个元素都不同(A中共i个元素),不同就输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、实验总结
  1. 巩固了菜单小程序的总体体系(while + switch + 功能函数)
  2. 查阅学习了C中全局变量和局部变量的区别,参考:http://c.biancheng.net/view/1858.html
  3. 熟悉了while(scanf(…) != EOF){…}等语法操作
  4. 求并集函数和求差集函数采用 计数判断 法
  • 求并集:先打印A集合全部,然后嵌套循环判断集合B的元素,是否计数为5
    (找出和A中完全不等的元素)打印
  • 求交集:嵌套判断A集合中多余B集合的元素,是否计数为5(找出A中独有的元素)打印
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐