请使用菜单命令或直接用VC6打开考生文件夹下的工程proj2,其中有元素类Element和集合类MySet的定义。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的输出结果应为: 0 3 5 8 0 3 8

admin2020-10-21  36

问题 请使用菜单命令或直接用VC6打开考生文件夹下的工程proj2,其中有元素类Element和集合类MySet的定义。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的输出结果应为:
    0  3  5  8
    0  3  8
    注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不能删除或移动“//**********found **********”。
#include
#include
using namespace std;
#define MaxElement 100
class Element{  //“元素”类
public:
    int n;
    Element(int i=0):n(i){}
};
class MySet{//“集合”类
    Element水element;//指向存储元素的数组的指针
    int size://数组大小
    int counter;//数组中元素的个数
    int current;  //属于表示扫描位置,及当前被扫描元素在数组中的下标
public:
  MySet():element(new Element[100]),size(100),counter(0),current(0){}
  ~MySet(){delete[]element;}
  void add(Element ele);//向集合中添加一个元素,保持由小到大的顺序。
  void remove(Element ele);//删除集合中指定的元素
  void scanFirst(){current=0;}
//将扫描位置定位于首元素
    //**********found**********
    void scanNext(){_____;}  //将扫描位置定位于下一个元素
    Element get()const{return element[current];}  //返回当前被扫描的元素
    bool isEnded()const{return current>=counter;}  //如果已经没有更多的元素可扫描了,返回true。
    void show();//显示集合中所有元素
}:
void MySet::add(Element ele){
    int DOs=counter;  //pos用于确定元素应插入的位置
    while(pos>0){  //从后往前寻找该位置
    if(ele.n>element[pos-1].n)break;//找到应插入的位置,退出循环
    //**********found**********
    if(______)return;  //发现相同元素,终止添加过程。
    pos______:
    }
    if(counter>=size){  //如果没有足够空间,扩充空间(增加100个元素的容量)
    Element*tmp=element;//tmp指向原来的数组
    //********** found**********
    element=_______;  //请一个新的数组,容量扩大100个元素的容量
    for(int i=0;i=tmp
    size+=100:
    delete[]tmp;
    }
    for(int i=counter;i>Dos;i--)element=element[i-1];  //后移相关元素,腾出存放新元素的空间
  element[Dos]=ele;//插入新元素
counter++;
}
void MySet::show(){
    scanFirst();//扫描位置定位于首元素
while(!isEnded()){
    coat<    //**********found**********
    _______;//扫描定位于下一个元素
    }
    cout<}
void MySet::remove(Element ele){
    int Dos=counter-1;  //pos用于确定要删除的元素的位置
    while(pos>=0){  //从后往前寻找该位置
    if(ele.n>element[DOs].n)return;//集合中没有该元素,终止删除过程。
    if(ele.n=element[DOs].n)break;//找到删除的元素,退出循环。
   pos______;
    }
    if(pos<0)return;//集合中没有该元素,终止删除过程。
    for(int i=pos;i=element[i+1];  //删除该元素,后面的元素顺序前移。
    counter______;
    if(counter+100<=size){  //如果未使用的存储单元超过100,缩减存储空间,减少100个单元
    Element* tmp=element;
    element=new Element[size-100];
for(int i=0;i=tmp
    size-=100;
    delete[]trap;
    }
}
int main()t
    MySet set;
    set.add(Element(3));
    set.add(Element(8));
    set.add(Element(5));
    set.add(Element(0));
    set.show();
    set.remove(Element(5));
    set.remove(Element(4));
    set.add(Element(8));
    set.show();
    return 0;
}

选项

答案(1)++current (2)ele.n==element[pos-1].n (3)new Element[size+100] (4)scanNext()

解析 (1)主要考查考生对数组和自增运算符的掌握情况,扫描数组元素,将扫描位置定位到下一个元素,需要将下标加1,使用自增运算符.
    (2)主要考查考生对数组元素的访问和比较运算符的掌握,pos初值为数组元素个数,所以访问element元素使用pos-1,避免访问数组越界;另外需要判断插入元素与当前元素是否相等来决定程序是否返回,使用相等运算符。
    (3)主要考查考生对动态内存分配的掌握,题意需要申请一个新的数组,并将当前数组容量size扩大100个,所以答案为new Element[size+100]。
    (4)主要考查考生对类成员函数的掌握,show函数用来输出数组的所有元素,所以从首元素开始一次输出,输出一个元素需要将扫描定位到下一个元素,对应于前面的scanFirst(),使用成员函数scanNext()最合适不过了。
转载请注明原文地址:https://jikaoti.com/ti/1Al0FFFM
0

最新回复(0)