C++面向对象程序设计上机期末模拟考

1.典型运算符重载之集合类填空

试题描述

定义集合Gather类,编写必要的构造函数,且重载加法运算符函数(实现集合并运算)、减法运算符函数(实现集合差运算)、输出运算符友元函数。请仔细阅读下面的代码,并填写空白。

   ①    //必要的头文件等,可能为多条语句
   ②    //定义类Gather
{
   protected:
      int m_data[100]; //数据成员
      int m_count; //集合元素个数

      ③   
         ④    //定义默认构造函数,函数体中调用Clear()函数

         ⑤    //清空集合函数Clear(),函数体中设置m_count为0

         ⑥    //定义返回集合元素个数函数int GetCount(),函数体中返回m_count

         ⑦    //定义集合元素位置函数int Find(),函数只有一个参数,即要查找的元素值。元素位置从0开始,找不到则返回-1。

         ⑧    //定义加入集合元素函数Add(),函数只有一个参数,即要加入集合的元素值。如果该元素在集合中已经存在,则返回false;否则加入该元素,并返回true。

         ⑨    //定义移出集合元素函数Remove(),函数只有一个参数,即要移出集合的元素值。如果该元素在集合中不存在,则返回false;否则移出该元素,并返回true。

         ⑩    //重载加号运算符,代表集合并运算,函数只有一个参数,即Gather类型集合g2对象的常引用。

         ⑪    //重载减法运算符,代表集合差运算,函数只有一个参数,即Gather类型集合g2对象的常引用。

         ⑫    //输出运算符<<重载友元函数,函数有两个参数,即ostream类型dout的引用、Gather类型集合g对象的常引用。
};
int main()
{
      ⑬    //创建Gather对象g1和g2
   int x, y, a, b;
      ⑭    //输入整数x和y,然后将[x, y]之间的所有整数放入集合g1中

      ⑮    //调用默认赋值运算符重载函数,将g1赋给g2
   cout << "集合g2内容如下:" << g2 << endl; //调用输出运算符重载函数

      ⑯    //调用默认拷贝构造函数,将g1赋给g3

   cin >> x >> y >> a >> b;
      ⑰    //从g3中移走集合元素函数x,y
      ⑱    //加入a和b到集合g3中

   cout << "集合g3内容如下:" << g3 << endl;
   cout << "集合g2与g3的差:" << g2 - g3 << endl;
   cout << "集合g2与g3的合:" << g2 + g3 << endl;
   return 0;
}

注意:1.请务必提交完整的程序代码,不要修改代码框架。2.请不要修改试题描述中的所有标识符,注意大小写敏感。

输入

输入六个整数,相邻两项之间用一个空格隔开。

输出

依据题意输出若干行。

输入示例

1 5 2 4 6 7

输出示例

集合g2内容如下:(1,2,3,4,5)
集合g3内容如下:(1,3,5,6,7)
集合g2与g3的差:(2,4)
集合g2与g3的合:(1,2,3,4,5,6,7)

数据范围

输入为int范围的整数

代码实现

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
class Gather//定义类Gather
{
   protected:
      int m_data[100]; //数据成员
      int m_count; //集合元素个数
   public:
      Gather()//定义默认构造函数,函数体中调用Clear()函数
      {
          Clear();
      }
      void Clear()//清空集合函数Clear(),函数体中设置m_count为0
      {
          m_count=0;
      }
      int GetCount()//定义返回集合元素个数函数int GetCount(),函数体中返回m_count
      {
          return m_count;
      }
      int Find(int a)//定义集合元素位置函数int Find(),函数只有一个参数,即要查找的元素值。元素位置从0开始,找不到则返回-1。
      {
          for(int i=0;i<m_count;i++)
          {
              if(m_data[i]==a)
                return a;
          }
          return -1;
      }
      int Add(int a)//定义加入集合元素函数Add(),函数只有一个参数,即要加入集合的元素值。如果该元素在集合中已经存在,则返回false;否则加入该元素,并返回true。
      {
          if(Find(a)!=-1) return false;
          else
          {
              m_data[m_count++]=a;
              return true;
          }
      }
      bool Remove(int a)//定义移出集合元素函数Remove(),函数只有一个参数,即要移出集合的元素值。如果该元素在集合中不存在,则返回false;否则移出该元素,并返回true。
      {
          if(Find(a)!=-1)
          {
              int i;
              for(i=0;i<m_count;i++)
              {
                  if(m_data[i]==a) break;
              }
              for(int j=i;j<m_count-1;j++)
              {
                  m_data[j]=m_data[j+1];
              }
              m_count--;
              return true;
          }
          else return false;
      }
      Gather& operator+(const Gather& g2)//重载加号运算符,代表集合并运算,函数只有一个参数,即Gather类型集合g2对象的常引用。
      {
          for(int i=0;i<g2.m_count;i++)
          {
              if(Find(g2.m_data[i])!=-1) continue;
              else
              {
                  Add(g2.m_data[i]);
              }
          }
          return *this;
      }
      Gather& operator-(const Gather& g2)//重载减法运算符,代表集合差运算,函数只有一个参数,即Gather类型集合g2对象的常引用。
      {
          for(int i=0;i<g2.m_count;i++)
          {
              if(Find(g2.m_data[i]))
                Remove(g2.m_data[i]);
              else continue;
          }
          return *this;
      }
      friend ostream& operator<<(ostream& dout,const Gather& g);//输出运算符<<重载友元函数,函数有两个参数,即ostream类型dout的引用、Gather类型集合g对象的常引用。
};
ostream& operator<<(ostream& dout,const Gather& g)
{
    Gather c=g;
    for(int i=0;i<c.m_count;i++)
    {
        for(int j=i;j<c.m_count;j++)
        {
            if(c.m_data[i]>c.m_data[j])
            {
                int t=c.m_data[i];
                c.m_data[i]=c.m_data[j];
                c.m_data[j]=t;
            }
        }
    }
    if(c.m_count==0) return dout;
    dout<<"(";
    for(int i=0;i<c.m_count-1;i++)
    {
        dout<<c.m_data[i]<<",";
    }
    dout<<c.m_data[c.m_count-1]<<")";
    return dout;
}
int main()
{
   Gather g1,g2;//创建Gather对象g1和g2
   int x, y, a, b;
   cin>>x>>y;//输入整数x和y,然后将[x, y]之间的所有整数放入集合g1中
   for(int i=x;i<=y;i++)
   {
       g1.Add(i);
   }
   g2=g1;//调用默认赋值运算符重载函数,将g1赋给g2
   cout << "集合g2内容如下:" << g1 << endl; //调用输出运算符重载函数

   Gather g3(g1);//调用默认拷贝构造函数,将g1赋给g3

   cin >> x >> y >> a >> b;
   g3.Remove(x);
   g3.Remove(y);
   //从g3中移走集合元素函数x,y
   //加入a和b到集合g3中
   g3.Add(a);
   g3.Add(b);
   cout << "集合g3内容如下:" << g3 << endl;
   cout << "集合g2与g3的差:" << g2 - g3 << endl;
   g2=g1;//必须写这句,因为g2在经过减操作后,其内容已经发生了改变
   cout << "集合g2与g3的合:" << g2 + g3 << endl;
   return 0;
}
说明:

当时测验中没有这道题写出来,初步认为最后的输出结果是经过排序了的,现在提交不了代码,暂时无法检验程序的绝对正确性。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值