p2p网站建设多少钱,一级做a免费观看视频网站,willfast优化工具下载,网站开发需要什么配置的电脑1.1 C 题目六
阅读下列说明和C代码#xff0c;填写程序中的空#xff08;1#xff09; #xff5e;#xff08;5#xff09;#xff0c;将解答写入答题纸的对应栏内。
【说明】 以下C代码实现一个简单乐器系统#xff0c;音乐类#xff08;Music#xff09;可以使用…1.1 C 题目六
阅读下列说明和C代码填写程序中的空1 5将解答写入答题纸的对应栏内。
【说明】 以下C代码实现一个简单乐器系统音乐类Music可以使用各类乐器Instument进行演奏和调音等操作。对部分乐器进行建模其类图如图6-1所示包括乐器Instrument、打击乐器Perussion、 弦乐器Stringed、 管乐器 Wind、木管乐器Woodwind、铜管乐器Brass 。
#includeiostream
#includevector
using namespace std;
enum Note{ /*枚举各种高调*/MIDDLE_C,C_SHARP,B_FLAT //其它略
}class Instrument { /*抽象基类乐器*/public:( 1 ) ; //纯虚函数playvirtual void adjust()0; //adjust函数接口
};class Wind:( 2 ) {public:void play(Note n){cout Wind.play() nendl; }void adjust(){cout Wind.adjust() endl; }
}/*类Percussion 和Stringed实现代码略*/class Brass: ( 3 ) {public:void play(Note n){cout Brass.play() nendl: }void adjust(){cout Brass.adjust() endl; }
};class Woodwind:public Wind {public:void play(Note n){cout Woodwind.play() nendl: }
};class Music{public:void tune(Instrument*i){ i-play(MIDDLE_C); }void adjust(Instrument*i){ i-adjust(); }void tuneAll( ( 4 ) v ) { /*为每个乐器定调*/vectorInstrument*::iterator it;for(itv.begin();it!v.end();it) {this-adjust(*it);this-tune(*it);}}
}int main()
{( 5 ) musicnew Music();vectorInstrument*orchestra;orchestra.push_back(new Wind());music-tuneAll(orchestra);
} 1.1.1 填空1
由于空1已经注释为 存虚函数所以我们知道这个函数肯定会在它的子类中实现所以只需要到子类中找到该该函数的参数类型及返回值类型即可。
class Instrument{ /*抽象基类乐器*/public:( 1 ) ; //纯虚函数playvirtual void adjust()0; //adjust函数接口
};class Wind: ( 2 ) {public:void play(Note n){cout Wind.play() nendl; }void adjust(){cout Wind.adjust() endl; }
}所以空1填 virtual void plya(Note) { }0因为类Wind 基层基类Instrument。
1.1.2 填空2
由于类Wind 中实现了 类Instrucment 中定义的存虚函数所以我们可以知道Wind 是Instrucment 的子类所以空2应该填继承方式public Instrument。
1.1.3 填空3
有题目总中给出的图我们也可以知道 Brass是Wind子类所以空3也应该填写继承方式public Wind。
class Wind: ( 2 ) {public:void play(Note n){cout Wind.play() nendl; }void adjust(){cout Wind.adjust() endl; }
}/*类Percussion 和Stringed实现代码略*/class Brass: ( 3 ) {public:void play(Note n){cout Brass.play() nendl: }void adjust(){cout Brass.adjust() endl; }
};1.1.4 填空4
代码中可以看到Music 是一个基类tuneAll4v是一个成员函数无法从上面代码得到有用信息所以只能从函数内容获取有用信息函数内部用到了类Instrument。
class Music {public:void tune(Instrument*i){ i-play(MIDDLE_C); }void adjust(Instrument*i){ i-adjust(); }void tuneAll( ( 4 ) v ) { /*为每个乐器定调*/vectorInstrument*::iterator it;for(itv.begin();it!v.end();it) {this-adjust(*it);this-tune(*it);}}
}vectorInstrument*::iterator it定义了一个迭代器it这个迭代器用于遍历一个存储了Instrument指针 的 vector容器。下面是对这个表达式的详细解释
vectorInstrument*这是一个存储了 Instrument 类型指针的 vector容器。Instrument*是指向 Instrument类型对象的指针。iterator这是 vector 容器的一个内置类型它是一个迭代器类型用于遍历vector容器中的元素。it这是迭代器的实例的名称。
迭代器提供了一个统一的接口用于访问容器中的元素和这些元素的读取、修改等操作。在很多方面迭代器的行为类似于指针。
由上面内容可以知道空4应该是一个向量指针向量的类型为Instrument , 所以空4应该填 vectorInstrument*
1.1.4.1 C vector
学习向量之前先了解下 什么是STL? 1、STLStandard Template Library即标准模板库是一个高效的C程序库包含了诸多常用的基本数据结构和基本算法。为广大C程序员们提供了一个可扩展的应用框架高度体现了软件的可复用性。 2、从逻辑层次来看在STL中体现了泛型化程序设计的思想generic programming。在这种思想里大部分基本算法被抽象被泛化独立于与之对应的数据结构用于以相同或相近的方式处理各种不同情形。 3、从实现层次看整个STL是以一种类型参数化type parameterized的方式实现的基于模板template。
STL有六大组件但主要包含容器、迭代器和算法三个部分。
容器Containers用来管理某类对象的集合。每一种容器都有其优点和缺点所以为了应付程序中的不同需求STL 准备了七种基本容器类型。迭代器Iterators用来在一个对象集合的元素上进行遍历动作。这个对象集合或许是个容器或许是容器的一部分。每一种容器都提供了自己的迭代器而这些迭代器了解该种容器的内部结构。算法Algorithms用来处理对象集合中的元素比如 SortSearchCopyErase 那些元素。通过迭代器的协助我们只需撰写一次算法就可以将它应用于任意容器之上这是因为所有容器的迭代器都提供一致的接口。 STL 的基本观念就是将数据和操作分离。数据由容器进行管理操作则由算法进行而迭代器在两者之间充当粘合剂使任何算法都可以和任何容器交互运作。这一篇博客暂时只介绍容器下一篇介绍迭代器。 容器用来管理某类对象。为了应付程序中的不同需求STL 准备了两类共七种基本容器类型
序列式容器Sequence containers此为可序群集其中每个元素均有固定位置—取决于插入时机和地点和元素值无关。如果你以追加方式对一个群集插入六个元素它们的排列次序将和插入次序一致。STL提供了三个序列式容器 向量vector、双端队列deque、列表list此外你也可以把 string 和 array 当做一种序列式容器。 关联式容器Associative containers此为已序群集元素位置取决于特定的排序准则以及元素值和插入次序无关。如果你将六个元素置入这样的群集中它们的位置取决于元素值和插入次序无关。STL提供了四个关联式容器集合set、多重集合multiset、映射map和多重映射multimap。
1.1.4.2 vector向量
它是一种序列式容器事实上和数组差不多但它比数组更优越。一般来说数组不能动态拓展因此在程序运行的时候不是浪费内存就是造成越界。而 vector 正好弥补了这个缺陷当内存空间不够时需要重新申请一块足够大的内存并进行内存的拷贝。
C的初始化方法很多各种初始化方法有一些不同。 (1): vectorint ilist1; 默认初始化vector为空 size为0表明容器中没有元素而且 capacity 也返回 0意味着还没有分配内存空间。这种初始化方式适用于元素个数未知需要在程序中动态添加的情况。 (2): vectorint ilist2(ilist); vectorint ilist2 ilist; 两种方式等价 ilist2 初始化为ilist 的拷贝ilist必须与ilist2 类型相同也就是同为int的vector类型ilist2将具有和ilist相同的容量和元素 (3): vectorint ilist {1,2,3.0,4,5,6,7}; vectorint ilist {1,2,3.0,4,5,6,7}; ilist 初始化为列表中元素的拷贝列表中元素必须与ilist的元素类型相容本例中必须是与整数类型相容的类型整形会直接拷贝其他类型会进行类型转换。 4): vectorint ilist3(ilist.begin()2,ilist.end()-1); ilist3初始化为两个迭代器指定范围中元素的拷贝范围中的元素类型必须与ilist3 的元素类型相容在本例中ilist3被初始化为{3,4,5,6}。 5): vectorint ilist4(7); 默认值初始化ilist4中将包含7个元素每个元素进行缺省的值初始化对于int也就是被赋值为0因此ilist4被初始化为包含7个0。 (6):vectorint ilist5(7,3); 指定值初始化ilist5被初始化为包含7个值为3的int
1.1.5 填空5
从下面代码中可以看到在main 函数中创建了一个类型为Instrument*的向量orchestra, 然后通过push_back(new Wind())它向向量orchestra中插入元素。再调用成员函数tuneAll由于这个函数只在Music 类中实现的所以空5应该填Music *
int main()
{( 5 ) musicnew Music();vectorInstrument*orchestra;orchestra.push_back(new Wind());music-tuneAll(orchestra);
} pop_back()push_back(elem)实例在容器最后移除和插入数据如下
#include string.h
#include vector
#include iostream
using namespace std;int main()
{vectorintobj;//创建一个向量存储容器 intfor(int i0;i10;i) // push_back(elem)在数组最后添加数据 {obj.push_back(i);coutobj[i],; }for(int i0;i5;i)//去掉数组最后一个数据 {obj.pop_back();}cout\nendl;for(int i0;iobj.size();i)//size()容器中实际数据个数 {coutobj[i],;}return 0;
}输出结果为
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,