Bootstrap

河南大学数据结构实验1

(1)实验目的

通过该实验,让学生复习巩固C语言中的分支结构、循环结构、数组、链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。

(2)实验内容

通过键盘,分别输入集合A和B中的数据元素,要求数据元素类型为整数类型,输出两个集合的交、并、差。

(3)实验要求

a)从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组存储,也可以用链表存储。

b)实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。

c)使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:

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}

一、设计思想

首先,先定义了所需的A,B两个数组,全局变量,声明了所用到的交并差函数;其次定义主函数main,通过两个菜单来实现利用数字进行函数调用;又用Switch case调用交并差函数;然后,先编写输入enter函数,输入A,B两个数组,再分别编写交并差函数。

交,通过对比两个集合数组内的元素来发现相同的元素,然后输出全部相同的元素。先将A中第一个元素与B中所有元素对比,找出相同;然后再将A中第二个与B中所有元素对比,找相同;以此类推找出所有相同的数。

并,先定义了一个新的数组C,先将A中的元素给C,再将B中的元素给C,之后运用冒泡排序,升序排列,之后输出数组C。

差,把A中的元素给C,引入一个x=1,然后将C数组和B数组中的对比,当有相同时,x=0,就不打印出该数。最后输出数组C。

二、主要源代码

#include<stdio.h>

#include<math.h>

#include <stdlib.h>

#include<iostream>   

using namespace std;           

int a[100], b[100];           //定义数组

int n, m;                     //定义全局变量

int menu1();                  //提前声明函数

int menu2(int i);

int enter();                  

void jiao();                  //交集函数

void bing();                  //并集函数

void M();                     

int main()                    //主函数

{

 int a = 0;

 while (a >= 0)

 {

  a = menu2(menu1());//通过两个菜单来实现利用数字进行函数调用。

 }

}

int menu1()

{

 int i;

 cout << "———————————————————————" << endl;

 cout << "|     1          输入集合A和B                |" << endl;

 cout << "|     2            求集合A交B                |" << endl;

 cout << "|     3            求集合A并B                |" << endl;

 cout << "|     4             求集合A-B                |" << endl;

 cout << "|         输入任意负数可以退出程序           |" << endl;

 cout << "|           请通过数字进行操作               |" << endl;

 cout << "|        通过“Enter”进行下一步操作         |" << endl;

 cout << "———————————————————————" << endl;

 cin >> i;

 return i;

}

int menu2(int i)        

{

 switch (i)

 {

 case 1:enter(); break;       //输入1调用enter()函数

 case 2:jiao(); break;        //输入2调用jiao()函数

 case 3:bing(); break;        //输入3调用bing()函数

 case 4:M(); break;           //输入4调用M()函数

 default:cout << "成功退出程序"; break;        //switch case调用函数

 }

 return i;

}

int enter()                      //定义enter()函数的用法,输入A,B两个集合

{

 cout << "集合A的元素个数为:" << endl;

 cin >> n;

 cout << "集合A为:" << endl;

 for (int i = 0; i < n; i++)   

  cin >> a[i];               

 for (int i = 0; i < n; i++)

 {

  for (int j = i + 1; j < n; j++)   

  {

   if (a[i] == a[j])

   {

    cout << "A中的元素出现重复" << endl;

    return 0;

   }

  }

 }

 cout << "集合B的元素个数为:" << endl;

 cin >> m;

 cout << "集合B为:" << endl;

 for (int i = 0; i < m; i++)

  cin >> b[i];

 for (int i = 0; i < m; i++)

 {

  for (int j = i + 1; j < m; j++)

  {

   if (b[i] == b[j])

   {

    cout << "B中的元素出现重复" << endl;

    return 0;

   }

  }

 }

}

void jiao()          //通过对比两个集合数组内的元素来发现相同的元素,然后输出全部相同的元素

{

 cout << "AB集合的交集为:" << endl;

 for (int i = 0; i < n; i++)

 {

  for (int j = 0; j < m; j++)

  {

   if (a[i] == b[j])

    cout << a[i] << " ";

  }

 }         //先将A中第一个元素与B中所有元素对比,找出相同;然后再将A中第二个与B中所有元素对比,找相同;以此类推。

 cout << endl;

};

void bing()        

{

 int t;

 int c[100];         //定义一个新的数组c

 for (int i = 0; i < n; i++)

  c[i] = a[i];           //先将 A中的元素给C

 for (int i = n; i < n + m; i++)      

  c[i] = b[i - n];       //再将B中元素给C

 for (int i = 0; i < n + m; i++)        

 {

  for (int j = 0; j < n + m - i; j++)

  {

   if (c[j] > c[j + 1])

   {

    t = c[j];

    c[j] = c[j + 1];

    c[j + 1] = t;

   }

  }

 }         //排序(冒泡排序) ,升序排序,这样可以消除C中汇合A B两个集合时有相同元素的情况

 cout << "AB集合的并集为:" << endl;

 for (int i = 0; i <= n + m; i++)       

 {

  if (c[i-1] != c[i])          

   cout << c[i] << " ";     //输出数组C

 }

 cout << endl;

};

void M()                //A-B,属于A但不属于B

{

 int c[100];

 for (int i = 0; i < n; i++)

  c[i] = a[i];    //把A中元素给C

 cout << "A集合减B集合为:";

 for (int i = 0; i < n; i++)

 {

  int x = 0;

  for (int j = 0; j < m; j++)

  {

   if (c[i] == b[j])

    x = 1;     //若 B中元素和C(也就是A)中元素一样,使x=1

  }

  if (x == 0)

   cout << c[i] << " ";      

 }

 cout << endl;

};

一、用键盘输入1,进行数组的输入,先输入A,B两个数

二、进行并集运算

输入2,进行A交B

三、进行并集运算

输入3,开始运算

四、输入4,进行A-B

五、输入一个负数,退出程序

一、不是很理解怎么判断一个数组中有重复的数。

二、差集运算不太会,查找了网上的一个代码,引入了一个判断条件x。运用两个循环,一个if条件,遍历两个数组中的数并进行比较运算。

三、通过本次实验,对函数有了更近一步的了解,巩固并加强了对C语言知识的了解和应用;我个人还应该增强自己的动手能力,多多实践,不能只停留在书本上。

本次实验word版本见主页资源,图片由于格式问题无法加载

;